opentrons 8.3.0a2__py2.py3-none-any.whl → 8.3.0a5__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 (57) hide show
  1. opentrons/hardware_control/api.py +5 -1
  2. opentrons/hardware_control/ot3api.py +18 -8
  3. opentrons/hardware_control/protocols/liquid_handler.py +4 -1
  4. opentrons/hardware_control/protocols/motion_controller.py +1 -0
  5. opentrons/legacy_commands/commands.py +37 -0
  6. opentrons/legacy_commands/types.py +39 -0
  7. opentrons/protocol_api/core/engine/instrument.py +109 -0
  8. opentrons/protocol_api/core/instrument.py +27 -0
  9. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +50 -0
  10. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +24 -0
  11. opentrons/protocol_api/instrument_context.py +141 -0
  12. opentrons/protocol_api/labware.py +17 -2
  13. opentrons/protocol_engine/commands/__init__.py +40 -0
  14. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +1 -1
  15. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +1 -1
  16. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +1 -1
  17. opentrons/protocol_engine/commands/absorbance_reader/read.py +4 -1
  18. opentrons/protocol_engine/commands/air_gap_in_place.py +1 -1
  19. opentrons/protocol_engine/commands/command_unions.py +39 -0
  20. opentrons/protocol_engine/commands/evotip_dispense.py +156 -0
  21. opentrons/protocol_engine/commands/evotip_seal_pipette.py +331 -0
  22. opentrons/protocol_engine/commands/evotip_unseal_pipette.py +160 -0
  23. opentrons/protocol_engine/commands/get_next_tip.py +1 -1
  24. opentrons/protocol_engine/commands/liquid_probe.py +63 -12
  25. opentrons/protocol_engine/commands/load_labware.py +5 -0
  26. opentrons/protocol_engine/commands/load_lid.py +1 -1
  27. opentrons/protocol_engine/commands/load_lid_stack.py +1 -1
  28. opentrons/protocol_engine/commands/load_liquid_class.py +1 -1
  29. opentrons/protocol_engine/commands/move_labware.py +9 -0
  30. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +1 -1
  31. opentrons/protocol_engine/commands/robot/move_axes_relative.py +1 -1
  32. opentrons/protocol_engine/commands/robot/move_axes_to.py +1 -1
  33. opentrons/protocol_engine/commands/robot/move_to.py +1 -1
  34. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +1 -1
  35. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +1 -1
  36. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +1 -1
  37. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +1 -1
  38. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +1 -1
  39. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +1 -1
  40. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +1 -1
  41. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +1 -1
  42. opentrons/protocol_engine/errors/__init__.py +4 -0
  43. opentrons/protocol_engine/errors/exceptions.py +26 -0
  44. opentrons/protocol_engine/execution/gantry_mover.py +5 -0
  45. opentrons/protocol_engine/execution/hardware_stopper.py +7 -7
  46. opentrons/protocol_engine/execution/tip_handler.py +30 -9
  47. opentrons/protocol_engine/resources/labware_validation.py +13 -0
  48. opentrons/protocol_engine/state/commands.py +6 -2
  49. opentrons/protocol_engine/state/frustum_helpers.py +13 -44
  50. opentrons/protocol_engine/state/labware.py +13 -1
  51. opentrons/protocol_engine/state/pipettes.py +5 -0
  52. {opentrons-8.3.0a2.dist-info → opentrons-8.3.0a5.dist-info}/METADATA +4 -4
  53. {opentrons-8.3.0a2.dist-info → opentrons-8.3.0a5.dist-info}/RECORD +57 -54
  54. {opentrons-8.3.0a2.dist-info → opentrons-8.3.0a5.dist-info}/LICENSE +0 -0
  55. {opentrons-8.3.0a2.dist-info → opentrons-8.3.0a5.dist-info}/WHEEL +0 -0
  56. {opentrons-8.3.0a2.dist-info → opentrons-8.3.0a5.dist-info}/entry_points.txt +0 -0
  57. {opentrons-8.3.0a2.dist-info → opentrons-8.3.0a5.dist-info}/top_level.txt +0 -0
@@ -65,7 +65,7 @@ class HardwareStopper:
65
65
  axes=[MotorAxis.X, MotorAxis.Y, MotorAxis.LEFT_Z, MotorAxis.RIGHT_Z]
66
66
  )
67
67
 
68
- async def _drop_tip(self) -> None:
68
+ async def _try_to_drop_tips(self) -> None:
69
69
  """Drop currently attached tip, if any, into trash after a run cancel."""
70
70
  attached_tips = self._state_store.pipettes.get_all_attached_tips()
71
71
 
@@ -134,9 +134,9 @@ class HardwareStopper:
134
134
  PostRunHardwareState.HOME_THEN_DISENGAGE,
135
135
  )
136
136
  if drop_tips_after_run:
137
- await self._drop_tip()
138
- await self._hardware_api.stop(home_after=home_after_stop)
139
- else:
140
- await self._hardware_api.stop(home_after=False)
141
- if home_after_stop:
142
- await self._home_everything_except_plungers()
137
+ await self._try_to_drop_tips()
138
+
139
+ await self._hardware_api.stop(home_after=False)
140
+
141
+ if home_after_stop:
142
+ await self._home_everything_except_plungers()
@@ -62,6 +62,7 @@ class TipHandler(TypingProtocol):
62
62
  pipette_id: str,
63
63
  labware_id: str,
64
64
  well_name: str,
65
+ do_not_ignore_tip_presence: bool = True,
65
66
  ) -> TipGeometry:
66
67
  """Pick up the named tip.
67
68
 
@@ -75,7 +76,13 @@ class TipHandler(TypingProtocol):
75
76
  """
76
77
  ...
77
78
 
78
- async def drop_tip(self, pipette_id: str, home_after: Optional[bool]) -> None:
79
+ async def drop_tip(
80
+ self,
81
+ pipette_id: str,
82
+ home_after: Optional[bool],
83
+ do_not_ignore_tip_presence: bool = True,
84
+ ignore_plunger: bool = False,
85
+ ) -> None:
79
86
  """Drop the attached tip into the current location.
80
87
 
81
88
  Pipette should be in place over the destination prior to calling this method.
@@ -230,6 +237,7 @@ class HardwareTipHandler(TipHandler):
230
237
  pipette_id: str,
231
238
  labware_id: str,
232
239
  well_name: str,
240
+ do_not_ignore_tip_presence: bool = True,
233
241
  ) -> TipGeometry:
234
242
  """See documentation on abstract base class."""
235
243
  hw_mount = self._get_hw_mount(pipette_id)
@@ -253,10 +261,11 @@ class HardwareTipHandler(TipHandler):
253
261
  await self._hardware_api.tip_pickup_moves(
254
262
  mount=hw_mount, presses=None, increment=None
255
263
  )
256
- try:
257
- await self.verify_tip_presence(pipette_id, TipPresenceStatus.PRESENT)
258
- except TipNotAttachedError as e:
259
- raise PickUpTipTipNotAttachedError(tip_geometry=tip_geometry) from e
264
+ if do_not_ignore_tip_presence:
265
+ try:
266
+ await self.verify_tip_presence(pipette_id, TipPresenceStatus.PRESENT)
267
+ except TipNotAttachedError as e:
268
+ raise PickUpTipTipNotAttachedError(tip_geometry=tip_geometry) from e
260
269
 
261
270
  self.cache_tip(pipette_id, tip_geometry)
262
271
 
@@ -264,7 +273,13 @@ class HardwareTipHandler(TipHandler):
264
273
 
265
274
  return tip_geometry
266
275
 
267
- async def drop_tip(self, pipette_id: str, home_after: Optional[bool]) -> None:
276
+ async def drop_tip(
277
+ self,
278
+ pipette_id: str,
279
+ home_after: Optional[bool],
280
+ do_not_ignore_tip_presence: bool = True,
281
+ ignore_plunger: bool = False,
282
+ ) -> None:
268
283
  """See documentation on abstract base class."""
269
284
  hw_mount = self._get_hw_mount(pipette_id)
270
285
 
@@ -275,10 +290,13 @@ class HardwareTipHandler(TipHandler):
275
290
  else:
276
291
  kwargs = {}
277
292
 
278
- await self._hardware_api.tip_drop_moves(mount=hw_mount, **kwargs)
293
+ await self._hardware_api.tip_drop_moves(
294
+ mount=hw_mount, ignore_plunger=ignore_plunger, **kwargs
295
+ )
279
296
 
280
- # Allow TipNotAttachedError to propagate.
281
- await self.verify_tip_presence(pipette_id, TipPresenceStatus.ABSENT)
297
+ if do_not_ignore_tip_presence:
298
+ # Allow TipNotAttachedError to propagate.
299
+ await self.verify_tip_presence(pipette_id, TipPresenceStatus.ABSENT)
282
300
 
283
301
  self.remove_tip(pipette_id)
284
302
 
@@ -383,6 +401,7 @@ class VirtualTipHandler(TipHandler):
383
401
  pipette_id: str,
384
402
  labware_id: str,
385
403
  well_name: str,
404
+ do_not_ignore_tip_presence: bool = True,
386
405
  ) -> TipGeometry:
387
406
  """Pick up a tip at the current location using a virtual pipette.
388
407
 
@@ -424,6 +443,8 @@ class VirtualTipHandler(TipHandler):
424
443
  self,
425
444
  pipette_id: str,
426
445
  home_after: Optional[bool],
446
+ do_not_ignore_tip_presence: bool = True,
447
+ ignore_plunger: bool = False,
427
448
  ) -> None:
428
449
  """Pick up a tip at the current location using a virtual pipette.
429
450
 
@@ -14,6 +14,11 @@ def is_absorbance_reader_lid(load_name: str) -> bool:
14
14
  return load_name == "opentrons_flex_lid_absorbance_plate_reader_module"
15
15
 
16
16
 
17
+ def is_evotips(load_name: str) -> bool:
18
+ """Check if a labware is an evotips tiprack."""
19
+ return load_name == "evotips_opentrons_96_labware"
20
+
21
+
17
22
  def validate_definition_is_labware(definition: LabwareDefinition) -> bool:
18
23
  """Validate that one of the definition's allowed roles is `labware`.
19
24
 
@@ -44,6 +49,14 @@ def validate_labware_can_be_stacked(
44
49
  return below_labware_load_name in top_labware_definition.stackingOffsetWithLabware
45
50
 
46
51
 
52
+ def validate_labware_can_be_ondeck(definition: LabwareDefinition) -> bool:
53
+ """Validate that the labware being loaded onto the deck can sit in a slot."""
54
+ return (
55
+ definition.parameters.quirks is None
56
+ or "stackingOnly" not in definition.parameters.quirks
57
+ )
58
+
59
+
47
60
  def validate_gripper_compatible(definition: LabwareDefinition) -> bool:
48
61
  """Validate that the labware definition does not have a quirk disallowing movement with gripper."""
49
62
  return (
@@ -1,4 +1,5 @@
1
1
  """Protocol engine commands sub-state."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import enum
@@ -304,7 +305,7 @@ class CommandStore(HasState[CommandState], HandlesActions):
304
305
  # TODO(mc, 2021-06-22): mypy has trouble with this automatic
305
306
  # request > command mapping, figure out how to type precisely
306
307
  # (or wait for a future mypy version that can figure it out).
307
- queued_command = action.request._CommandCls.model_construct( # type: ignore[call-arg]
308
+ queued_command = action.request._CommandCls.model_construct(
308
309
  id=action.command_id,
309
310
  key=(
310
311
  action.request.key
@@ -506,7 +507,10 @@ class CommandStore(HasState[CommandState], HandlesActions):
506
507
  pass
507
508
  case QueueStatus.RUNNING | QueueStatus.PAUSED:
508
509
  self._state.queue_status = QueueStatus.PAUSED
509
- case QueueStatus.AWAITING_RECOVERY | QueueStatus.AWAITING_RECOVERY_PAUSED:
510
+ case (
511
+ QueueStatus.AWAITING_RECOVERY
512
+ | QueueStatus.AWAITING_RECOVERY_PAUSED
513
+ ):
510
514
  self._state.queue_status = QueueStatus.AWAITING_RECOVERY_PAUSED
511
515
  elif action.door_state == DoorState.CLOSED:
512
516
  self._state.is_door_blocking = False
@@ -82,19 +82,12 @@ def _circular_frustum_polynomial_roots(
82
82
 
83
83
 
84
84
  def _volume_from_height_circular(
85
- target_height: float,
86
- total_frustum_height: float,
87
- bottom_radius: float,
88
- top_radius: float,
85
+ target_height: float, segment: ConicalFrustum
89
86
  ) -> float:
90
87
  """Find the volume given a height within a circular frustum."""
91
- a, b, c = _circular_frustum_polynomial_roots(
92
- bottom_radius=bottom_radius,
93
- top_radius=top_radius,
94
- total_frustum_height=total_frustum_height,
95
- )
96
- volume = a * (target_height**3) + b * (target_height**2) + c * target_height
97
- return volume
88
+ heights = segment.height_to_volume_table.keys()
89
+ best_fit_height = min(heights, key=lambda x: abs(x - target_height))
90
+ return segment.height_to_volume_table[best_fit_height]
98
91
 
99
92
 
100
93
  def _volume_from_height_rectangular(
@@ -138,26 +131,12 @@ def _volume_from_height_squared_cone(
138
131
 
139
132
 
140
133
  def _height_from_volume_circular(
141
- volume: float,
142
- total_frustum_height: float,
143
- bottom_radius: float,
144
- top_radius: float,
134
+ target_volume: float, segment: ConicalFrustum
145
135
  ) -> float:
146
- """Find the height given a volume within a circular frustum."""
147
- a, b, c = _circular_frustum_polynomial_roots(
148
- bottom_radius=bottom_radius,
149
- top_radius=top_radius,
150
- total_frustum_height=total_frustum_height,
151
- )
152
- d = volume * -1
153
- x_intercept_roots = (a, b, c, d)
154
-
155
- height_from_volume_roots = roots(x_intercept_roots)
156
- height = _reject_unacceptable_heights(
157
- potential_heights=list(height_from_volume_roots),
158
- max_height=total_frustum_height,
159
- )
160
- return height
136
+ """Find the height given a volume within a squared cone segment."""
137
+ volumes = segment.volume_to_height_table.keys()
138
+ best_fit_volume = min(volumes, key=lambda x: abs(x - target_volume))
139
+ return segment.volume_to_height_table[best_fit_volume]
161
140
 
162
141
 
163
142
  def _height_from_volume_rectangular(
@@ -243,9 +222,7 @@ def _get_segment_capacity(segment: WellSegment) -> float:
243
222
  return (
244
223
  _volume_from_height_circular(
245
224
  target_height=section_height,
246
- total_frustum_height=section_height,
247
- bottom_radius=(segment.bottomDiameter / 2),
248
- top_radius=(segment.topDiameter / 2),
225
+ segment=segment,
249
226
  )
250
227
  * segment.count
251
228
  )
@@ -293,12 +270,7 @@ def height_at_volume_within_section(
293
270
  radius_of_curvature=section.radiusOfCurvature,
294
271
  )
295
272
  case ConicalFrustum():
296
- return _height_from_volume_circular(
297
- volume=target_volume_relative,
298
- top_radius=(section.bottomDiameter / 2),
299
- bottom_radius=(section.topDiameter / 2),
300
- total_frustum_height=section_height,
301
- )
273
+ return _height_from_volume_circular(target_volume_relative, section)
302
274
  case CuboidalFrustum():
303
275
  return _height_from_volume_rectangular(
304
276
  volume=target_volume_relative,
@@ -334,10 +306,7 @@ def volume_at_height_within_section(
334
306
  case ConicalFrustum():
335
307
  return (
336
308
  _volume_from_height_circular(
337
- target_height=target_height_relative,
338
- total_frustum_height=section_height,
339
- bottom_radius=(section.bottomDiameter / 2),
340
- top_radius=(section.topDiameter / 2),
309
+ target_height=target_height_relative, segment=section
341
310
  )
342
311
  * section.count
343
312
  )
@@ -427,7 +396,7 @@ def _find_height_in_partial_frustum(
427
396
  if (
428
397
  bottom_section_volume
429
398
  < target_volume
430
- < (bottom_section_volume + section_volume)
399
+ <= (bottom_section_volume + section_volume)
431
400
  ):
432
401
  relative_target_volume = target_volume - bottom_section_volume
433
402
  section_height = section.topHeight - section.bottomHeight
@@ -524,7 +524,6 @@ class LabwareView:
524
524
  will be used.
525
525
  """
526
526
  definition = self.get_definition(labware_id)
527
-
528
527
  if well_name is None:
529
528
  well_name = definition.ordering[0][0]
530
529
 
@@ -887,6 +886,19 @@ class LabwareView:
887
886
  f"Labware {labware.loadName} is already present at {location}."
888
887
  )
889
888
 
889
+ def raise_if_labware_cannot_be_ondeck(
890
+ self,
891
+ location: LabwareLocation,
892
+ labware_definition: LabwareDefinition,
893
+ ) -> None:
894
+ """Raise an error if the labware cannot be in the specified location."""
895
+ if isinstance(
896
+ location, (DeckSlotLocation, AddressableAreaLocation)
897
+ ) and not labware_validation.validate_labware_can_be_ondeck(labware_definition):
898
+ raise errors.LabwareCannotSitOnDeckError(
899
+ f"{labware_definition.parameters.loadName} cannot sit in a slot by itself."
900
+ )
901
+
890
902
  def raise_if_labware_incompatible_with_plate_reader(
891
903
  self,
892
904
  labware_definition: LabwareDefinition,
@@ -331,6 +331,11 @@ class PipetteStore(HasState[PipetteState], HandlesActions):
331
331
  def _update_aspirated(
332
332
  self, update: update_types.PipetteAspiratedFluidUpdate
333
333
  ) -> None:
334
+ if self._state.pipette_contents_by_id[update.pipette_id] is None:
335
+ self._state.pipette_contents_by_id[
336
+ update.pipette_id
337
+ ] = fluid_stack.FluidStack()
338
+
334
339
  self._fluid_stack_log_if_empty(update.pipette_id).add_fluid(update.fluid)
335
340
 
336
341
  def _update_ejected(self, update: update_types.PipetteEjectedFluidUpdate) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.3.0a2
3
+ Version: 8.3.0a5
4
4
  Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
5
5
  Author: Opentrons
6
6
  Author-email: engineering@opentrons.com
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Topic :: Scientific/Engineering
22
22
  Requires-Python: >=3.10
23
23
  License-File: ../LICENSE
24
- Requires-Dist: opentrons-shared-data (==8.3.0a2)
24
+ Requires-Dist: opentrons-shared-data (==8.3.0a5)
25
25
  Requires-Dist: aionotify (==0.3.1)
26
26
  Requires-Dist: anyio (<4.0.0,>=3.6.1)
27
27
  Requires-Dist: jsonschema (<4.18.0,>=3.0.1)
@@ -35,9 +35,9 @@ Requires-Dist: pyusb (==1.2.1)
35
35
  Requires-Dist: packaging (>=21.0)
36
36
  Requires-Dist: importlib-metadata (>=1.0) ; python_version < "3.8"
37
37
  Provides-Extra: flex-hardware
38
- Requires-Dist: opentrons-hardware[flex] (==8.3.0a2) ; extra == 'flex-hardware'
38
+ Requires-Dist: opentrons-hardware[flex] (==8.3.0a5) ; extra == 'flex-hardware'
39
39
  Provides-Extra: ot2-hardware
40
- Requires-Dist: opentrons-hardware (==8.3.0a2) ; extra == 'ot2-hardware'
40
+ Requires-Dist: opentrons-hardware (==8.3.0a5) ; extra == 'ot2-hardware'
41
41
 
42
42
  .. _Full API Documentation: http://docs.opentrons.com
43
43
 
@@ -96,7 +96,7 @@ opentrons/drivers/thermocycler/simulator.py,sha256=2yVZVar5z1o6K5nRE-IQS9KFXJ3dg
96
96
  opentrons/hardware_control/__init__.py,sha256=5t_YhGQ1uw4iB6QYtNz7qV8AcwLjaWtjmMP5B4YekEE,2353
97
97
  opentrons/hardware_control/__main__.py,sha256=DnlYdphZKLHiLCeXmnMDer6CclhberfTk_wCAbiy9Gc,2585
98
98
  opentrons/hardware_control/adapters.py,sha256=mm-gumoaF7CFrP0ad6W4xafbJRq6RaOD0GffSibWR-Q,3888
99
- opentrons/hardware_control/api.py,sha256=DtFUoOZ3ikbf4XU81TlkOhgC4ozKZuD1ENFfdoMblQI,50805
99
+ opentrons/hardware_control/api.py,sha256=btjNm4GmPT2JYc-xasJ7-GFe6UFsxd0SLvSVz6xfhd8,50897
100
100
  opentrons/hardware_control/constants.py,sha256=Ku-XABo7AN9JQ0tef8oPk-JlUuhQQLeP9S0h7kx5GEA,227
101
101
  opentrons/hardware_control/dev_types.py,sha256=GFOe3U3Xi_SpcGm5xuMTJobLeJC0ncmRbONjRAiJLsg,3446
102
102
  opentrons/hardware_control/errors.py,sha256=NMF5_AvX22ENTHPpUlElgF-0aeaxEhYXnOq2lfIzuiM,1433
@@ -105,7 +105,7 @@ opentrons/hardware_control/module_control.py,sha256=u0RpbOgr5pV5exgKg3qvNQdwdVuy
105
105
  opentrons/hardware_control/motion_utilities.py,sha256=rD0sP_hfrGbsafKQvK7qp7_hn4u7h_RVBAT3wk-dESQ,9482
106
106
  opentrons/hardware_control/nozzle_manager.py,sha256=dqD8XlYsOu0PFFyxvmsMypBB52Gi6x-VIwhykV7JhuU,16868
107
107
  opentrons/hardware_control/ot3_calibration.py,sha256=NkR2EoNq47dkHEXAdF6PI9atuPTxW0X51TFnRrMq5JU,44723
108
- opentrons/hardware_control/ot3api.py,sha256=D817iP5B6u89-fpt4ikVgQ6Fag9Y87GD4xq6o3sGH38,119347
108
+ opentrons/hardware_control/ot3api.py,sha256=k9nizxiHBs_B93izfYDQbQP9GyPvIwXTlaOPAqMGKsU,119580
109
109
  opentrons/hardware_control/pause_manager.py,sha256=wmNmraimE2yZQVqCxX_rtQHUWRzpzyQEaym9fLMgyww,888
110
110
  opentrons/hardware_control/poller.py,sha256=rx6Q-UxbUIj3ek69IlYenFh7BFuasszRO-GzzhRPuHQ,3885
111
111
  opentrons/hardware_control/robot_calibration.py,sha256=ilszGjZPspKiEk8MQPaHm2B-ljeisAYflKl8UyQ_D0U,7155
@@ -191,9 +191,9 @@ opentrons/hardware_control/protocols/gripper_controller.py,sha256=SUFoSDu3Qri4en
191
191
  opentrons/hardware_control/protocols/hardware_manager.py,sha256=S9BSJ0XsnU5A9nFLMDZfmiizx3T41WhU_91VYj4bUVE,1629
192
192
  opentrons/hardware_control/protocols/identifiable.py,sha256=YmhScb4Tr4mxVObL1i7pI-EouTMAmV-2oqKbovhdnrE,575
193
193
  opentrons/hardware_control/protocols/instrument_configurer.py,sha256=5zUCAchtoJ6QPFqcGRb7FOsnt2nxjxlRJdt18IidKqQ,7729
194
- opentrons/hardware_control/protocols/liquid_handler.py,sha256=JXtFCa7EkZ8IDzW1olL9kDyOERPOSnppV45FVrhMqEM,8348
194
+ opentrons/hardware_control/protocols/liquid_handler.py,sha256=vgeDOaPD-wNP3mJ69j0ATT9saMs4Hj7MQVAOFI-LduM,8403
195
195
  opentrons/hardware_control/protocols/module_provider.py,sha256=QDKCWqrW-6IeI91IICBTJClK0C__mgq3A0-M3Wa9ee8,487
196
- opentrons/hardware_control/protocols/motion_controller.py,sha256=xP-7A1-K-Jfu5IH91x765ieo9_HCJTxUDflsfKfr5s0,9700
196
+ opentrons/hardware_control/protocols/motion_controller.py,sha256=mWUHVDqju9gcMDU9adk6UzueZ9i-x2nU5hmcd_fHHyk,9737
197
197
  opentrons/hardware_control/protocols/position_estimator.py,sha256=BrqK5AJn9747c4LX0ZWBJWgWHjyX977CHBI7WVvO-9Q,1922
198
198
  opentrons/hardware_control/protocols/simulatable.py,sha256=ED3VHoO8q1h9FhBDv31g5N7YdTKB5hj7lp7BZcCaL7o,247
199
199
  opentrons/hardware_control/protocols/stoppable.py,sha256=ukI1WrJzXwsJm5ty2trhMqGJr0sT13ttlv914YMAUt8,226
@@ -203,12 +203,12 @@ opentrons/hardware_control/scripts/gripper_control.py,sha256=aUt9MAo6DXDhY4BfJRe
203
203
  opentrons/hardware_control/scripts/repl.py,sha256=RojtHjYV6sa6O4SeNEgs5SvnAK0imQK_XqoLQTKlzWU,5982
204
204
  opentrons/hardware_control/scripts/tc_control.py,sha256=V6hOzoRXL3xqIUEz8Raldd45aO2JgN5m5Hr08c1G8Ko,2741
205
205
  opentrons/legacy_commands/__init__.py,sha256=erkaz7hc2iHsTtjpFDWrR1V5n47it3U1qxD2zL9CkuE,63
206
- opentrons/legacy_commands/commands.py,sha256=evB4X1dx9jnPwY-QKeA0Z5aX0gV0EG8m-a6qTVxTErU,8966
206
+ opentrons/legacy_commands/commands.py,sha256=e2xYTc3lNqDD0DKPDsfORkzRj_zKpptKE5oXCLABd4o,10063
207
207
  opentrons/legacy_commands/helpers.py,sha256=dRtOWQdeRnDn23yBHdPQfahug5OFwuUzdkT7qRj1gRM,2675
208
208
  opentrons/legacy_commands/module_commands.py,sha256=EO2YtrfzCCaGPYjGXWfk6jjSHiEqk1E6D8Ef2qDi1qI,7769
209
209
  opentrons/legacy_commands/protocol_commands.py,sha256=nPYBrm7j9co83IGWjzae2GOVkEZdu58pXQv3eOdpLzg,1383
210
210
  opentrons/legacy_commands/publisher.py,sha256=n7hT9n4zahM3N2LNIAEs7hqs5RbHHie_tev2M8pke4Y,5441
211
- opentrons/legacy_commands/types.py,sha256=VkdjdG9n08BudOrlUfMSQSVFJ_sn5Aqzx4PZrrl7ezs,23539
211
+ opentrons/legacy_commands/types.py,sha256=miO8RDnnyxN61IC1CGuhNslYqbWsTbAONXY_wvnZuFk,24429
212
212
  opentrons/motion_planning/__init__.py,sha256=Gma3SLAvKbL7QuhVGtL9zFx5vlk_7YBF0TjYZQSiv9s,755
213
213
  opentrons/motion_planning/adjacent_slots_getters.py,sha256=z7HkfC8ymAdGHdFq-sC_1_cERX_v29b9x4HKtJ6gp9I,5390
214
214
  opentrons/motion_planning/deck_conflict.py,sha256=gJG0dCQOvdEP-rr9EbVSGJCQPDXgvd04Jn4crGEbYLo,12604
@@ -226,8 +226,8 @@ opentrons/protocol_api/config.py,sha256=r9lyvXjagTX_g3q5FGURPpcz2IA9sSF7Oa_1mKx-
226
226
  opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau320_f-ASloR9eL1QCtkOh8,7612
227
227
  opentrons/protocol_api/deck.py,sha256=94vFceg1SC1bAGd7TvC1ZpYwnJR-VlzurEZ6jkacYeg,8910
228
228
  opentrons/protocol_api/disposal_locations.py,sha256=NRiSGmDR0LnbyEkWSOM-o64uR2fUoB1NWJG7Y7SsJSs,7920
229
- opentrons/protocol_api/instrument_context.py,sha256=Z3CXNF_xkNYvIagx-X97Mndx2t9ftMbAI5V7HuTU5RU,102334
230
- opentrons/protocol_api/labware.py,sha256=3pTaZlk7tbhY0wU9eNoq8ivaRC1uBo1h2f7eAZoLmHY,58879
229
+ opentrons/protocol_api/instrument_context.py,sha256=m6J8W5J9jy-gHU5f5A_hoFtAt1v3iP7Q0uKKgL8bEWo,107284
230
+ opentrons/protocol_api/labware.py,sha256=mgnk1SiiN4CnBwBUolE4C4gRaBZqAoLylsJANPCyWHU,59241
231
231
  opentrons/protocol_api/module_contexts.py,sha256=jU3IMPE5L78-KuZRfaPwB6xO0kiTup65IteqMPFOFR0,42262
232
232
  opentrons/protocol_api/module_validation_and_errors.py,sha256=XL_m72P8rcvGO2fynY7UzXLcpGuI6X4s0V6Xf735Iyc,1464
233
233
  opentrons/protocol_api/protocol_context.py,sha256=Y9jCj1t3wzawarPyOVcp-8qUmEnIhpyVSaHujVfT9Nk,60601
@@ -236,7 +236,7 @@ opentrons/protocol_api/validation.py,sha256=DBwHNSI8c6konumlahq7B-Q-4Ipjs2yfGuza
236
236
  opentrons/protocol_api/core/__init__.py,sha256=-g74o8OtBB0LmmOvwkRvPgrHt7fF7T8FRHDj-x_-Onk,736
237
237
  opentrons/protocol_api/core/common.py,sha256=AR-V6nsK6jnw9olO_sTRO0rNqOg5FPQOoNbLx7m_OZ8,1088
238
238
  opentrons/protocol_api/core/core_map.py,sha256=gq3CIYPxuPvozf8yj8FprqBfs3e4ZJGQ6s0ViPbwV08,1757
239
- opentrons/protocol_api/core/instrument.py,sha256=J9fRk-bVivOsQtuhAYpkX_lPahI1Qa2MDKVUqwF9Jck,10910
239
+ opentrons/protocol_api/core/instrument.py,sha256=zipwHqXBSJwTBwAteyC3T7cJFY7n-5IKObToUzBySm8,11500
240
240
  opentrons/protocol_api/core/labware.py,sha256=EtDbwtlN-ZXH6W2aXE4FnbXl-Lxpifj1niF_pqTGoNM,4222
241
241
  opentrons/protocol_api/core/module.py,sha256=p02IstVzfSqTpwbfiCYkPv_xpeb78Hi__PQKJPePxNs,12548
242
242
  opentrons/protocol_api/core/protocol.py,sha256=WdbSFxVr_04Kef1DWbdZJ4zMPq0BvuM7uJyXs7f6cU8,8096
@@ -246,7 +246,7 @@ opentrons/protocol_api/core/well_grid.py,sha256=BU28DKaBgEU_JdZ6pEzrwNxmuh6TkO4z
246
246
  opentrons/protocol_api/core/engine/__init__.py,sha256=B_5T7zgkWDb1mXPg4NbT-wBkQaK-WVokMMnJRNu7xiM,582
247
247
  opentrons/protocol_api/core/engine/deck_conflict.py,sha256=0viwOidafVd0XhS8C7V72i68-ZYzHfDUNeqGozTA1G8,12012
248
248
  opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
249
- opentrons/protocol_api/core/engine/instrument.py,sha256=kJRQOgGyXhQKybmazghTpurDgqDeYvZg_kxdYe3vPZI,38872
249
+ opentrons/protocol_api/core/engine/instrument.py,sha256=WDNVbNAfOre01xYttuWA1VLAbEyHcq9n6xoX15ll8BU,42842
250
250
  opentrons/protocol_api/core/engine/labware.py,sha256=RLlBnFPrnbud5vCSDmjCosw-bDMq0Xijf7BURfvLsK0,8276
251
251
  opentrons/protocol_api/core/engine/load_labware_params.py,sha256=cwbmGyYp5ZOyANtEm6KKwT_n8fnYc5RysBst9nRh7Ls,4607
252
252
  opentrons/protocol_api/core/engine/module_core.py,sha256=TWqMqRgekBISMOEtlveDByJQI6JfSu-rvYOnqQbTgGY,26923
@@ -260,7 +260,7 @@ opentrons/protocol_api/core/engine/well.py,sha256=I63FOBGaEW061HYF1kMbvQhyBbWEu5
260
260
  opentrons/protocol_api/core/legacy/__init__.py,sha256=_9jCJNKG3SlS_vljVu8HHkZmtLf4F-f-JHALLF5d5go,401
261
261
  opentrons/protocol_api/core/legacy/deck.py,sha256=qHqcGo-Kdkl9L1aOE0pwrm9tsAnwkXbt4rIOr_VEP-s,13955
262
262
  opentrons/protocol_api/core/legacy/labware_offset_provider.py,sha256=uNNeHecIz_A9u19QalpVKF7pxloHqLg27EFcD9dbYtc,3735
263
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py,sha256=GYxo4uvLFkfXXNjRCcGUCTX8k76V8H9sRWRxNpAoE7Q,23393
263
+ opentrons/protocol_api/core/legacy/legacy_instrument_core.py,sha256=bX43ZnvQM9a1DjhLXGdHyo1boGBrvxbPNmasPXd7ZGw,25060
264
264
  opentrons/protocol_api/core/legacy/legacy_labware_core.py,sha256=eAnwAHwmX76-1ZRWMmiDABS1fmPRvuTTsx4fI-V5uJU,8295
265
265
  opentrons/protocol_api/core/legacy/legacy_module_core.py,sha256=tUhj88NKBMjCmCg6wjh1e2HX4d5hxjh8ZeJiYXaTaGY,23111
266
266
  opentrons/protocol_api/core/legacy/legacy_protocol_core.py,sha256=1f-niL47WAZItbFJ9IQubGUfKPRYFScBelzh6H5stwc,22429
@@ -270,7 +270,7 @@ opentrons/protocol_api/core/legacy/load_info.py,sha256=j-fzoUKwvXNS_5CQsE43XI5YO
270
270
  opentrons/protocol_api/core/legacy/module_geometry.py,sha256=wbWeHomppdCDmp_nKrnNWbnRAapOamkhFMnaoY7ShTw,20886
271
271
  opentrons/protocol_api/core/legacy/well_geometry.py,sha256=dCsDIpMbaIpb0AW_VrnSIJdRYi8ombyMpaA7n1X46Jg,4643
272
272
  opentrons/protocol_api/core/legacy_simulator/__init__.py,sha256=m9bLHGDJ6LSYC2WPm8tpOuu0zWSOPIrlybQgjRQBw9k,647
273
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py,sha256=8r20vNTAmuiZAQJD17katTawsRBcKsaeG0iM7ntyiM8,20078
273
+ opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py,sha256=l8CnI9dZSi8jIMSme7bcQx4g_HU43_jyFDn40MMwI_c,20772
274
274
  opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py,sha256=28HrrHzeUfnGKXpZqQ-VM8WbPiadqVhKj2S9y33q6Lo,2910
275
275
  opentrons/protocol_engine/__init__.py,sha256=XJbITFkal0o_5izTZ4IMnNUabhDZw4puRolaI7drAkA,3361
276
276
  opentrons/protocol_engine/create_protocol_engine.py,sha256=tfDIsC7_JKlRiCXPB_8tuxRsssU6o0ViRmWbGPtX9QA,7582
@@ -288,14 +288,14 @@ opentrons/protocol_engine/actions/get_state_update.py,sha256=tsnfhZDFHWER6y6UV57
288
288
  opentrons/protocol_engine/clients/__init__.py,sha256=ILmfVL5SOkWzRpL2XXh0Q0MizOj7E2i-WObVuIsWAQE,161
289
289
  opentrons/protocol_engine/clients/sync_client.py,sha256=hOwDYOo5-UrmpvZXbDi8-JMDKtO0fKfHiPo6mcGYNHM,5591
290
290
  opentrons/protocol_engine/clients/transports.py,sha256=QejmtG5TjgOLUXpNhOzor_q-7MFI1qNfsguwkzY6Rxc,7177
291
- opentrons/protocol_engine/commands/__init__.py,sha256=eJ6TByPSX3dTC7iB7k2q5uPei9vEANJZ6-Jof7V_fAo,15846
292
- opentrons/protocol_engine/commands/air_gap_in_place.py,sha256=pQAYkg6fzRcAEycgTeJg8ZwBWJPWQcR05LBH8CXlPOQ,5263
291
+ opentrons/protocol_engine/commands/__init__.py,sha256=xvEbKtPOtL--FrUwjpBP-s2an8-HQJQtakMnXpnuWKE,16945
292
+ opentrons/protocol_engine/commands/air_gap_in_place.py,sha256=0pHGdUitN2si1Evj-2uTeC9qUYcUANs8igzrfUSDi7s,5270
293
293
  opentrons/protocol_engine/commands/aspirate.py,sha256=gWZaI0TL_CMU-OvcjEur2K6Fz2_5s2Am_AN8Iohp_c8,7793
294
294
  opentrons/protocol_engine/commands/aspirate_in_place.py,sha256=1oAq0QYSJqeTcPAcxvZ-Uwy-4pri0Gf-3I-HBN_hpIk,6416
295
295
  opentrons/protocol_engine/commands/blow_out.py,sha256=5HyPqRFTDEIulrCvNUBGCgdpYsIoh0fCcsIP-NHpe3I,4216
296
296
  opentrons/protocol_engine/commands/blow_out_in_place.py,sha256=C9tu4m5QnlKXew38g_gGLlCqJWH4I8o6Zd2qBgzuWg4,3264
297
297
  opentrons/protocol_engine/commands/command.py,sha256=1hWH_KWg_WDL4R4VXe1ZH2vO6pYt5SA-ZpuPPF1oV5E,10149
298
- opentrons/protocol_engine/commands/command_unions.py,sha256=EvjVxW7Qyoqa_JmRhN6lUoVieQtoCaENLjis67OekEs,23069
298
+ opentrons/protocol_engine/commands/command_unions.py,sha256=qNGcHlHEqYVoIBhJR5nloK5Om2nIlaVQIuoF0a4d4M0,24059
299
299
  opentrons/protocol_engine/commands/comment.py,sha256=-6o07x-MZ6-IvZas84OVFmqF0gAbbKWJZIlGVYThCqM,1638
300
300
  opentrons/protocol_engine/commands/configure_for_volume.py,sha256=bEjRuGDQW2ks1YU3ktnIdy6GgtLAtgdCUm_NhKuWWc8,3487
301
301
  opentrons/protocol_engine/commands/configure_nozzle_layout.py,sha256=M_s5Ee03a7sSnbvkibDHzEqZwkca0y8J7F60EnSEq7A,3849
@@ -304,20 +304,23 @@ opentrons/protocol_engine/commands/dispense.py,sha256=wbDBDpc80c14AudywUoFTQYWPL
304
304
  opentrons/protocol_engine/commands/dispense_in_place.py,sha256=h2ASkZW-PlrJViN7ZNBDaaklIeF5n3sZkIAdrPcTqgA,6147
305
305
  opentrons/protocol_engine/commands/drop_tip.py,sha256=2L4tGsDFh8xQwro5FKiZ6onVgo5FRpGVe708vvhsDs4,6900
306
306
  opentrons/protocol_engine/commands/drop_tip_in_place.py,sha256=pVC0Yh_LkRTuTjzmFJufBWDlgRyMT8sJBl3TLAZFSUc,4497
307
+ opentrons/protocol_engine/commands/evotip_dispense.py,sha256=RKnItIOHJHTa0J_SioyWI2s4DuRrbnakA6lGp6UrPXI,4847
308
+ opentrons/protocol_engine/commands/evotip_seal_pipette.py,sha256=N2vCLnH9TQ9AuRfikHk7StJ_LU1wQFd8U3ppP-0BcD4,11474
309
+ opentrons/protocol_engine/commands/evotip_unseal_pipette.py,sha256=JBhG8Kbu5PFrDa5b_Q8n-O582oq55ZgPn65kUAZwh0A,5363
307
310
  opentrons/protocol_engine/commands/generate_command_schema.py,sha256=OzjMuHNJ7uCyjA7XBrQ18-j0L48W2kLPDFJ6FBM5aUo,1184
308
- opentrons/protocol_engine/commands/get_next_tip.py,sha256=OSh0qLJPvnxQNBVRyDRX5HAdfDBoelYWMHNl3p2BnE0,4821
311
+ opentrons/protocol_engine/commands/get_next_tip.py,sha256=JS5hN_UScAiUIo_j7KT2cR1GDj3hDvaNPTSovWbgTHo,4828
309
312
  opentrons/protocol_engine/commands/get_tip_presence.py,sha256=vK80XN5qCzK44SOSxH3QJkIj9dPmvri4J4FZJeP1X08,2543
310
313
  opentrons/protocol_engine/commands/hash_command_params.py,sha256=obWy4TbVH97SyhNqrSD6iP1wgZ20JoaH1rilZCjXxIs,1530
311
314
  opentrons/protocol_engine/commands/home.py,sha256=g77hewv-puMxEHFy0PPnl8-Nkbb7K-2qk36HbWG_Nik,3326
312
- opentrons/protocol_engine/commands/liquid_probe.py,sha256=Oq9-8ABGv8HqQ9N0pPcJRYpf8vT1ZK_CMW7QmfSBC-M,13444
313
- opentrons/protocol_engine/commands/load_labware.py,sha256=y6SjRCFqkEHoyB98SU0k856GyiV3oJx4Sw7npqel1i4,8659
314
- opentrons/protocol_engine/commands/load_lid.py,sha256=ZOCNyEttuQfTZYnCZ32rnuGAhZmd1vgAhka7XkcRrY4,5111
315
- opentrons/protocol_engine/commands/load_lid_stack.py,sha256=es7QOwnqz_8YvzPq3OK16KvfBBVHG1Fjan3YZclRCR8,6889
315
+ opentrons/protocol_engine/commands/liquid_probe.py,sha256=pC_wbfOm8kEtm345TutvzMDffLB41myHA2goEJMvskg,15286
316
+ opentrons/protocol_engine/commands/load_labware.py,sha256=hE1JFK1UvSkcgfWSIMZ15lXUZ2xJEbzWWpZrKoTD0DU,8822
317
+ opentrons/protocol_engine/commands/load_lid.py,sha256=AduXlkH8NDnnfE4egahKZ5vKFtlLPAhzfhK8Eigx2s4,5118
318
+ opentrons/protocol_engine/commands/load_lid_stack.py,sha256=ia554JXnoBmU1M5IkVovQ92WB-xCKSnsL0geFbHBZgo,6896
316
319
  opentrons/protocol_engine/commands/load_liquid.py,sha256=KSS3Ps4PDdSrqHTStbioQP7P1xVzParlOH_AXLy2B1A,3417
317
- opentrons/protocol_engine/commands/load_liquid_class.py,sha256=6Tm4z5-8u2E78iwUrjZRiUjhwtnQfJIUnVQj9xnkt1o,4937
320
+ opentrons/protocol_engine/commands/load_liquid_class.py,sha256=NTm7kyvlZNSItWj3RTnQg7JkyPcPNvWhysUo3s4sMg4,4944
318
321
  opentrons/protocol_engine/commands/load_module.py,sha256=pQhBhiRIGsGFpxhAaCgMbZZvxiwMwGNpJpsJegDkIKA,8383
319
322
  opentrons/protocol_engine/commands/load_pipette.py,sha256=4Pgu8IF_chAHtLB4KJszSUY6dsI92u8WQfBU2HzuHAM,5879
320
- opentrons/protocol_engine/commands/move_labware.py,sha256=vvuuOk-s1RR-hFQ_MYTCHMA1CiL4kGA7UpdatWqNKh0,15991
323
+ opentrons/protocol_engine/commands/move_labware.py,sha256=Iucon7NzRk2bHagVH4kSs8dMUJkkVvZCLiDyaZ7VX1Y,16325
321
324
  opentrons/protocol_engine/commands/move_relative.py,sha256=EczlVmwUvQc-bPpcXMW-fmH8PpPxdLxAVGdrWddiHvc,3057
322
325
  opentrons/protocol_engine/commands/move_to_addressable_area.py,sha256=JtHftnSjbLpTJUrVP44D2kTUr8Bcq8Le4p1IziNFp3c,6453
323
326
  opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py,sha256=aVbxdVwCqhZxOn9ByAseqgaOl5TUd42bcyBMbuQu-8Q,7479
@@ -337,10 +340,10 @@ opentrons/protocol_engine/commands/verify_tip_presence.py,sha256=UUwUWdlryfh-mU8
337
340
  opentrons/protocol_engine/commands/wait_for_duration.py,sha256=G-Lmo97BoqW8KA-cZDGQkqUmEE7lrLdw5j-2_LBF5gg,2396
338
341
  opentrons/protocol_engine/commands/wait_for_resume.py,sha256=IE_I7fqoKBrlBumaCp5Tm5ihyA6i5VAzG25xdVdRnVw,2372
339
342
  opentrons/protocol_engine/commands/absorbance_reader/__init__.py,sha256=umS98LlkBEAToRCvxLpr4k43tRPPTfkYu-81-bLy5DU,1251
340
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py,sha256=mRJ03ropmLTY8dpp8ZAOE9RJeOqVhT2wDtuSnECS6M0,5474
341
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py,sha256=PjOfXV-NEiJL2FBndQSMM0Osp1kZ4hGloN_IzInvv8E,5871
342
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py,sha256=-Sk2oufQhGMgQhV8mH8SZ5E2--wTIuI2sA95vXd2lJY,5466
343
- opentrons/protocol_engine/commands/absorbance_reader/read.py,sha256=y5LiKzAFcb7PO14VjAOEBMdV1DUo94NJ8J5T83Kfbgo,9196
343
+ opentrons/protocol_engine/commands/absorbance_reader/close_lid.py,sha256=Z3tdTzr8dXXG_LBrFMa6XCJ0pgiyGMxS-DirCOEPOeY,5481
344
+ opentrons/protocol_engine/commands/absorbance_reader/initialize.py,sha256=XzUyZ7tEUw_TNqrzzU4GorV6rY7w16WzRgpk-Ylkpuk,5878
345
+ opentrons/protocol_engine/commands/absorbance_reader/open_lid.py,sha256=u8iFbWgWtptcCCCczKoVROAEVAiRdPHvM9SSWyED5Rg,5473
346
+ opentrons/protocol_engine/commands/absorbance_reader/read.py,sha256=5nTs1z1_Wuslx6Rm1XYYm_zZs1fVQii_FUSaVxB6eZY,9333
344
347
  opentrons/protocol_engine/commands/calibration/__init__.py,sha256=JjNnULLBM3j8VtpfHOvH51em9jVLR_ezyrUJUWqxuYI,1611
345
348
  opentrons/protocol_engine/commands/calibration/calibrate_gripper.py,sha256=b9NM4Qj8w1z1Hh6iiH11JDklvUEF-MkMP5FfEz5091g,5831
346
349
  opentrons/protocol_engine/commands/calibration/calibrate_module.py,sha256=0PfDsnk97mQjKeRz9iULTcwnx4A4iMh-xGLNrKICQzE,4179
@@ -358,12 +361,12 @@ opentrons/protocol_engine/commands/magnetic_module/__init__.py,sha256=Y9RCovlGHc
358
361
  opentrons/protocol_engine/commands/magnetic_module/disengage.py,sha256=yS4vXR_ajLpuk8TDGtTcnL5TvkJG7KRf1G113EyPQdk,3181
359
362
  opentrons/protocol_engine/commands/magnetic_module/engage.py,sha256=O9lDRSfcvWD5MZVpeL_heq1vk4e3C1htDYduI3OKVCk,4169
360
363
  opentrons/protocol_engine/commands/robot/__init__.py,sha256=Qnt1wwq5-dveHoJlIUqQvYmc-DyDMgmxFys7vDI6Mow,1583
361
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py,sha256=Til8y2kRqneA4BWjWzBuI0FxMq0C-Ybf6J1kmg7quPY,2501
364
+ opentrons/protocol_engine/commands/robot/close_gripper_jaw.py,sha256=7RcAX5ayZle81A9HSMJQ1nipOPALvGcJOmlmp1RlKiI,2508
362
365
  opentrons/protocol_engine/commands/robot/common.py,sha256=CFJl5rwMwYsBr2_3-RGmJ4GJS6tF2j7MSrXkLV9HQjA,589
363
- opentrons/protocol_engine/commands/robot/move_axes_relative.py,sha256=eW2DoRwQTDyGjme0a0T4w5idcpVNdwInpKG4XLaxkWE,3173
364
- opentrons/protocol_engine/commands/robot/move_axes_to.py,sha256=EoBiL8vouUwkQbHPgZOH26NvZ-BgWO82GljYXP9Q4Rk,3229
365
- opentrons/protocol_engine/commands/robot/move_to.py,sha256=b3HWlF6Lc-rPleLtQpvfBl09GGtn0eKgARfQPEaDcPk,2719
366
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py,sha256=MszjR9t__4NuFqte9qddXLKiiw95w8769FmEA6Ui0t0,2099
366
+ opentrons/protocol_engine/commands/robot/move_axes_relative.py,sha256=lV6O-UE3-RveCKIx6iyc8_6RhBXyixBgw9ehQkWkxho,3180
367
+ opentrons/protocol_engine/commands/robot/move_axes_to.py,sha256=furx9WyRwauk3i5tKF7SmmI9Au44Co8YWH0ItTjTaW4,3236
368
+ opentrons/protocol_engine/commands/robot/move_to.py,sha256=Wzj7Wlk-fVgM1hrpI-vV4zYWIzzRCKfOwHoDN_OjNZ0,2726
369
+ opentrons/protocol_engine/commands/robot/open_gripper_jaw.py,sha256=go0FHP2wBej0lVs1x3XhKTrdxg567l8AXNeBaw-5gsA,2106
367
370
  opentrons/protocol_engine/commands/temperature_module/__init__.py,sha256=DKzhgXNdCHop_U4ogP8AMcAVq90pBQX0MVZjkiDH-Ds,1276
368
371
  opentrons/protocol_engine/commands/temperature_module/deactivate.py,sha256=IIEIKle1Ac_qPB-hUqvWu9qPlpNIHaj9ncpRuxz_hbU,2892
369
372
  opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py,sha256=A0WaSxbyrU5uMV-eRHz38QOpFtD2yNRYEY89jKBya1k,3462
@@ -373,30 +376,30 @@ opentrons/protocol_engine/commands/thermocycler/close_lid.py,sha256=K83l4SkqVgZn
373
376
  opentrons/protocol_engine/commands/thermocycler/deactivate_block.py,sha256=7mp7HR8tBRqTUmH0326kL8tNe1O6Zcrhyw_kR8QHOfU,2680
374
377
  opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py,sha256=I1nKZpmauO-6h5o3baZtr7NubDmRg2EHbkWAr7PyPPk,2612
375
378
  opentrons/protocol_engine/commands/thermocycler/open_lid.py,sha256=Aw29xFLL92xBV107gwmEfcdl1VpkLWQq5PDAzqHl34I,2900
376
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py,sha256=gom7Nd0NxGNEh-96SdXEC9XwbwcOkwZUWVmDvB1wjOg,5762
379
+ opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py,sha256=C1bH-jmd66X8CusTsO0zGcUWE_Mcnx2J4joRifviz7w,5769
377
380
  opentrons/protocol_engine/commands/thermocycler/run_profile.py,sha256=l3A1cIJJsTMMYJrHHUa38UEN-SGPipxWaiojZkO8JSM,4169
378
381
  opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py,sha256=V6BmoNKBuWDOlFmF9sTJCCz-QZKOQH7fXKzFgyt9H4I,4756
379
382
  opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py,sha256=3qsG2WBatgD53vdsFR-GZU2VXwydmD-r_0J2Uj8mM1M,3384
380
383
  opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py,sha256=Wc8NQBIOcSl5nwsts6KlUfJXHcvXnSF1td_olzqJGec,3101
381
384
  opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py,sha256=KZHt1dUWPrWUk_d0hl0TiAQhfaVdc_YZcxyMcZ0FLq8,2971
382
385
  opentrons/protocol_engine/commands/unsafe/__init__.py,sha256=lx3TFW_78XK0bdtLFuGXrvUGaeYrSFj5pHucEL-IYHI,2499
383
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py,sha256=JqEKWQnycM8ZO3yLBJXpa4hwlZZdpidNyqjRfuo3CCM,3241
384
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py,sha256=U7ydX0SxHJtm_H-sob4acrAj9Vfbr1QJRuHTmphM5ks,3891
385
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py,sha256=J-CAWNScIo6VFfeh-jizioXKvVtfvfeOeuuXKEcOIuM,2495
386
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py,sha256=etNdLxj0TtmBA5fTLR-OSfbnRNbXKDzE__aKRAkvWMM,7866
387
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py,sha256=408KbcJgroOA7Qhs-qih-ce-2n-ixGKu6mhv33TplJ0,2454
388
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py,sha256=wN02jiLMRpbQU24Ntj-JUwqrztVeUMlM3GC6oGrrWs0,2987
389
- opentrons/protocol_engine/errors/__init__.py,sha256=i7fPhjybq5V0xyEV3ue3aRzWgGEqKAs8YeEOd0A1MjU,5504
386
+ opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py,sha256=UkwMnxSY-r-r5AoRecJs06MU1AupTshy4QaDWdi04zE,3248
387
+ opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py,sha256=F-JEMbZYpSPPIT41SIXDUj_9eiVNtp91_yRZDdT7az0,3898
388
+ opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py,sha256=Ze5hLslsXdd7l3lF0GKOPoWCdTmqTTGIjiTQyNhL-W4,2502
389
+ opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py,sha256=mcIPhcQvVCUL_wfb2-JPrCvIFTXMVD93VeJb4H1LmhM,7873
390
+ opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py,sha256=9Sjx92JZhi-tRY1P77M--jJp4JzIGESXUakIpstESwQ,2461
391
+ opentrons/protocol_engine/commands/unsafe/update_position_estimators.py,sha256=xLe3u3rYu1eOvWxDtA2xsvNy7H6TVtljqo-78nOtFLI,2994
392
+ opentrons/protocol_engine/errors/__init__.py,sha256=5IfgGt6Xf2OJ-GdT3a9ykL16q_-kaHteyVAaJhlylVc,5650
390
393
  opentrons/protocol_engine/errors/error_occurrence.py,sha256=ODyXHxVO4iXDxpcLaC3uO7ocTOOGPqWwcC1uaiytv0c,7846
391
- opentrons/protocol_engine/errors/exceptions.py,sha256=Uxm4riarrH3QjPoGZMHbqM1pPhr5vut6UqxgT4SdqbU,42407
394
+ opentrons/protocol_engine/errors/exceptions.py,sha256=WhsIoHKs-B3hEYV5ZW-YIdL8vOQElYs6eDHfSLH5Oic,43331
392
395
  opentrons/protocol_engine/execution/__init__.py,sha256=X8qTYYOc1v84JIDM1xYpIo3VG_BPnsrfl2jm9UUQGwQ,1384
393
396
  opentrons/protocol_engine/execution/command_executor.py,sha256=SxE6W9_8HgiCLiPu6Q8hJr2HKsO1Ta-V1PdmFDxa7rQ,8208
394
397
  opentrons/protocol_engine/execution/create_queue_worker.py,sha256=6hMuOqbqwfMn63idsrAgro0NJZoyX4VVH7AV3le2EWM,3372
395
398
  opentrons/protocol_engine/execution/door_watcher.py,sha256=WxPdM3ZKL69cI9-UAzCNNmiYk8vdcxd6Grki-heNLg4,4577
396
399
  opentrons/protocol_engine/execution/equipment.py,sha256=Cf17VX8itFMX85KDgESepgihj2Xu_T1_GelNgPunlXk,26143
397
400
  opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py,sha256=tLhMbYOetXSSWF8B6wCL4ksxvs71IGqJD6syMbB9A1E,4352
398
- opentrons/protocol_engine/execution/gantry_mover.py,sha256=T3HhD7yp_WDqGXO2wrWUMjQc3atglC7kg8tc77jTcAY,26233
399
- opentrons/protocol_engine/execution/hardware_stopper.py,sha256=OXZK7AjkZSPu5A7TbqW-dscR4ErOOrr8ao3stcjsClM,5935
401
+ opentrons/protocol_engine/execution/gantry_mover.py,sha256=LFTPmzuGRuP6IspgXxIEyJIXV0tHkc4UWDDjWFCClYo,26477
402
+ opentrons/protocol_engine/execution/hardware_stopper.py,sha256=wlIl7U3gvnOiCvwrixHDcrfqXy3l4GFp0G232nASL8g,5857
400
403
  opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py,sha256=BSFLzSSeELAYZCrCUfJZx5DdlrwU06Ur92TYd0T-hzM,9084
401
404
  opentrons/protocol_engine/execution/labware_movement.py,sha256=-qnohEyIt9AxsFjhbg_IZiO_1ZwlDqmuWhWirkeo9wc,12269
402
405
  opentrons/protocol_engine/execution/movement.py,sha256=AWcj7xlrOh3QrvoaH0sZO63yrPCEc7VE8hKfJNxxtP0,12527
@@ -407,7 +410,7 @@ opentrons/protocol_engine/execution/run_control.py,sha256=ksvI2zkguC4G3lR3HJgAF8
407
410
  opentrons/protocol_engine/execution/status_bar.py,sha256=tR7CHS_y1ARQxcSKDO4YFU2cqVQhePzalmzsyH8b23A,970
408
411
  opentrons/protocol_engine/execution/thermocycler_movement_flagger.py,sha256=Ouljgjtm7-sCXwDcpfbir84dAZh5y89DNiuKedYimyg,6790
409
412
  opentrons/protocol_engine/execution/thermocycler_plate_lifter.py,sha256=j33nYV8rkeAYUOau8wFIyJVWjWkjyildleYHCysez-o,3375
410
- opentrons/protocol_engine/execution/tip_handler.py,sha256=k6nYCUcqE15typwPwcC0Y24Qab7VLL2HMVt_EVoKRXQ,17528
413
+ opentrons/protocol_engine/execution/tip_handler.py,sha256=mn8RakB9LAJMy8hIYB4o-nqd2DoIpJjZj2rab1a7O1c,18153
411
414
  opentrons/protocol_engine/notes/__init__.py,sha256=G0bIQswsov7MrJU0ArrOaWcOTxJU9BCUmNR3LRoNg-Q,311
412
415
  opentrons/protocol_engine/notes/notes.py,sha256=A5C9xHExlS9GAK7o_mYiKJgibBm6EEgHQ4PJor0IET0,1993
413
416
  opentrons/protocol_engine/resources/__init__.py,sha256=yvGFYpmLoxHYQff_IwiaEH9viZUfal5D5K91UjYLwwY,805
@@ -416,7 +419,7 @@ opentrons/protocol_engine/resources/deck_data_provider.py,sha256=iw4oKv6-dSxF4hZ
416
419
  opentrons/protocol_engine/resources/file_provider.py,sha256=6btMCDN7NsyFlV7Icy5vDO7xsgbmtkeAM_KCuQ-GvRo,5903
417
420
  opentrons/protocol_engine/resources/fixture_validation.py,sha256=WBGWFTmBwLPjOBFeqJYxnaSRHvo4pwxvdhT4XUW_FMY,1857
418
421
  opentrons/protocol_engine/resources/labware_data_provider.py,sha256=Ks-_iUNZQWcmZWp5aMGVQc0bVmCOp9bwte7ADycwKHs,2726
419
- opentrons/protocol_engine/resources/labware_validation.py,sha256=AQvvPR4nHhWsV_nI145t0YAys_fnfNtYfzB1mKp8tj0,2134
422
+ opentrons/protocol_engine/resources/labware_validation.py,sha256=Q6Zii0ju_s4zhrrKEn9KWUHeNGKMaKFiO_XCAXxdEuM,2568
420
423
  opentrons/protocol_engine/resources/model_utils.py,sha256=C3OHUi-OtuFUm3dS5rApSU3EJ0clnaCZEyBku5sTjzA,941
421
424
  opentrons/protocol_engine/resources/module_data_provider.py,sha256=DaTv3QqrlpKEXlIfBCSgXwlyOrV2YqWcxlHD0MGKWWw,1558
422
425
  opentrons/protocol_engine/resources/ot3_validation.py,sha256=0x81JoZBXcj2xUVcOF7v5ETc8y5T_sbs-jTPxuSnooE,744
@@ -427,18 +430,18 @@ opentrons/protocol_engine/state/_move_types.py,sha256=STLssWsXMY92F_asAQrixv10A6
427
430
  opentrons/protocol_engine/state/_well_math.py,sha256=HWVy4ezd-tRWIgAXtXTLXbzZiPec3mOzQFtNZQoo_d4,9705
428
431
  opentrons/protocol_engine/state/addressable_areas.py,sha256=XXfdwjiBQAidDPhs_dQs-QaqYZYQe8BXhMf5u6h-eY0,26758
429
432
  opentrons/protocol_engine/state/command_history.py,sha256=ZwP7DD8AMohoo1iDZgnpV50_RZvlSrYpEFzcc2kKXyA,11574
430
- opentrons/protocol_engine/state/commands.py,sha256=SkiyHKsJniXydijIhmVWc9rPJICmY9pMUJOxVBsacqo,45324
433
+ opentrons/protocol_engine/state/commands.py,sha256=aoON_C5DbiIEPxOGATvwCsSG9eHsFe-_f798WZPh0NI,45371
431
434
  opentrons/protocol_engine/state/config.py,sha256=7jSGxC6Vqj1eA8fqZ2I3zjlxVXg8pxvcBYMztRIx9Mg,1515
432
435
  opentrons/protocol_engine/state/files.py,sha256=w8xxxg8HY0RqKKEGSfHWfrjV54Gb02O3dwtisJ-9j8E,1753
433
436
  opentrons/protocol_engine/state/fluid_stack.py,sha256=uwkf0qYk1UX5iU52xmk-e3yLPK8OG-TtMCcBqrkVFpM,5932
434
- opentrons/protocol_engine/state/frustum_helpers.py,sha256=aC6EBIZSyE7b1CW98l7O4Q-vMB2qulycIlIFqQtyaZw,17215
437
+ opentrons/protocol_engine/state/frustum_helpers.py,sha256=RmhSGPPuHS026K9XF_VkmCTZIcAe4FNtpDaKVtd35HE,16249
435
438
  opentrons/protocol_engine/state/geometry.py,sha256=q9iPDS7k9ZLof_HBDFm0VLXQ97ZZEub7C9zXPgmO7kg,70127
436
- opentrons/protocol_engine/state/labware.py,sha256=9HZv55CNhkPKZinKyicBjpSCcJWPbiMl-eolinzZu_I,47735
439
+ opentrons/protocol_engine/state/labware.py,sha256=Vq1Usz0Y0-NJhD-m7SeMy0ES-Jmnig1zn-jmIY57HAc,48308
437
440
  opentrons/protocol_engine/state/liquid_classes.py,sha256=u_z75UYdiFAKG0yB3mr1il4T3qaS0Sotq8sL7KLODP8,2990
438
441
  opentrons/protocol_engine/state/liquids.py,sha256=NoesktcQdJUjIVmet1uqqJPf-rzbo4SGemXwQC295W0,2338
439
442
  opentrons/protocol_engine/state/modules.py,sha256=HwKqul6utVlwUlQuJFVNMvyfpnwJ8fyCCelby9NE0Yg,53229
440
443
  opentrons/protocol_engine/state/motion.py,sha256=pWt28-vBaO6dz_rtvoliUsGDvls_ML6sRfDOwmD0F7g,15086
441
- opentrons/protocol_engine/state/pipettes.py,sha256=i_Oeuf7w4RQ3dZjx1u7O-29GSaGdP8qeUg1_qL2Ipqo,34476
444
+ opentrons/protocol_engine/state/pipettes.py,sha256=dDak7RGVTUIJxhdOd02qMZrI1ZQX_gdYyI5m6xsbYQ0,34674
442
445
  opentrons/protocol_engine/state/state.py,sha256=oPqJgE3kze7uZJ37xvhU1XfULk8VLCQgnxlHK606gXg,15462
443
446
  opentrons/protocol_engine/state/state_summary.py,sha256=tu-xJYKbKzeLk9Z0RwSaz0tUs6blYuxSA5V2n7_zSGk,1180
444
447
  opentrons/protocol_engine/state/tips.py,sha256=nXLmOsXx2pCQmA5H5HskTnU4IMcKAc6u2LbI2BCQaWc,19396
@@ -539,9 +542,9 @@ opentrons/util/helpers.py,sha256=3hr801bWGbxEcOFAS7f-iOhmnUhoK5qahbB8SIvaCfY,165
539
542
  opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
540
543
  opentrons/util/logging_config.py,sha256=UHoY7dyD6WMYNP5GKowbMxUSG_hlXeI5TaIwksR5u-U,6887
541
544
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
542
- opentrons-8.3.0a2.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
543
- opentrons-8.3.0a2.dist-info/METADATA,sha256=N6FK95vBL2iTWYoENZJ4mqas-qArDOGOhgq1ZLpbPFk,5084
544
- opentrons-8.3.0a2.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
545
- opentrons-8.3.0a2.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
546
- opentrons-8.3.0a2.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
547
- opentrons-8.3.0a2.dist-info/RECORD,,
545
+ opentrons-8.3.0a5.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
546
+ opentrons-8.3.0a5.dist-info/METADATA,sha256=075Ncjn22SffDSSPBIimlfK2Nk0MBEYlui7F7G91CTQ,5084
547
+ opentrons-8.3.0a5.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109
548
+ opentrons-8.3.0a5.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
549
+ opentrons-8.3.0a5.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
550
+ opentrons-8.3.0a5.dist-info/RECORD,,