bloqade-circuit 0.7.6__py3-none-any.whl → 0.7.8__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.

Potentially problematic release.


This version of bloqade-circuit might be problematic. Click here for more details.

@@ -2,7 +2,7 @@ from . import noise as noise
2
2
  from .parallelize import (
3
3
  transpile as transpile,
4
4
  parallelize as parallelize,
5
- no_similarity as no_similarity,
5
+ remove_tags as remove_tags,
6
6
  auto_similarity as auto_similarity,
7
7
  block_similarity as block_similarity,
8
8
  moment_similarity as moment_similarity,
@@ -357,9 +357,10 @@ class GeminiOneZoneNoiseModelConflictGraphMoves(GeminiOneZoneNoiseModel):
357
357
  def noisy_moment(self, moment, system_qubits):
358
358
  # Moment with original ops
359
359
  original_moment = moment
360
- assert np.all(
361
- [isinstance(q, cirq.GridQubit) for q in system_qubits]
362
- ), "Found a qubit that is not a GridQubit."
360
+ assert np.all([isinstance(q, cirq.GridQubit) for q in system_qubits]), (
361
+ "Found a qubit that is not a GridQubit. In order for the conflict graph to know the qubit geometry, "
362
+ "all qubits in the circuit must be defined as cirq.GridQubit objects."
363
+ )
363
364
  # Check if the moment is empty
364
365
  if len(moment.operations) == 0:
365
366
  move_moments = []
@@ -136,7 +136,7 @@ def auto_similarity(
136
136
  return cirq.Circuit(flattened_circuit), weights
137
137
 
138
138
 
139
- def no_similarity(circuit: cirq.Circuit) -> cirq.Circuit:
139
+ def remove_tags(circuit: cirq.Circuit) -> cirq.Circuit:
140
140
  """
141
141
  Removes all tags from the circuit
142
142
 
@@ -146,10 +146,11 @@ def no_similarity(circuit: cirq.Circuit) -> cirq.Circuit:
146
146
  Returns:
147
147
  [0] - cirq.Circuit - the circuit with all tags removed.
148
148
  """
149
- new_moments = []
150
- for moment in circuit.moments:
151
- new_moments.append([gate.untagged for gate in moment.operations])
152
- return cirq.Circuit(new_moments)
149
+
150
+ def remove_tag(op: cirq.Operation, _):
151
+ return op.untagged
152
+
153
+ return cirq.map_operations(circuit, remove_tag)
153
154
 
154
155
 
155
156
  def to_dag_circuit(circuit: cirq.Circuit, can_reorder=None) -> nx.DiGraph:
@@ -399,4 +400,6 @@ def parallelize(
399
400
  )
400
401
  # Convert the epochs to a cirq circuit.
401
402
  moments = map(cirq.Moment, epochs)
402
- return cirq.Circuit(moments)
403
+ circuit = cirq.Circuit(moments)
404
+
405
+ return remove_tags(circuit)
bloqade/pyqrack/base.py CHANGED
@@ -146,7 +146,13 @@ class PyQrackInterpreter(Interpreter, typing.Generic[MemoryType]):
146
146
  loss_m_result: Measurement = field(default=Measurement.One, kw_only=True)
147
147
  """The value of a measurement result when a qubit is lost."""
148
148
 
149
+ global_measurement_id: int = field(init=False, default=0)
150
+
149
151
  def initialize(self) -> Self:
150
152
  super().initialize()
151
153
  self.memory.reset() # reset allocated qubits
152
154
  return self
155
+
156
+ def set_global_measurement_id(self, m: Measurement):
157
+ m.measurement_id = self.global_measurement_id
158
+ self.global_measurement_id += 1
bloqade/pyqrack/reg.py CHANGED
@@ -2,15 +2,20 @@ import enum
2
2
  from typing import TYPE_CHECKING
3
3
  from dataclasses import dataclass
4
4
 
5
+ from bloqade.types import MeasurementResult
5
6
  from bloqade.qasm2.types import Qubit
6
7
 
7
8
  if TYPE_CHECKING:
8
9
  from pyqrack import QrackSimulator
9
10
 
10
11
 
11
- class Measurement(enum.IntEnum):
12
+ class Measurement(MeasurementResult, enum.IntEnum):
12
13
  """Enumeration of measurement results."""
13
14
 
15
+ def __init__(self, measurement_id: int = 0) -> None:
16
+ super().__init__()
17
+ self.measurement_id = measurement_id
18
+
14
19
  Zero = 0
15
20
  One = 1
16
21
  Lost = enum.auto()
@@ -46,7 +46,7 @@ class QubitLossRuntime(OperatorRuntimeABC):
46
46
  return 1
47
47
 
48
48
  def apply(self, qubit: PyQrackQubit, adjoint: bool = False) -> None:
49
- if random.uniform(0.0, 1.0) < self.p:
49
+ if random.uniform(0.0, 1.0) <= self.p:
50
50
  qubit.state = QubitState.Lost
51
51
 
52
52
 
@@ -4,7 +4,7 @@ from kirin import interp
4
4
  from kirin.dialects import ilist
5
5
 
6
6
  from bloqade.squin import qubit
7
- from bloqade.pyqrack.reg import QubitState, PyQrackQubit
7
+ from bloqade.pyqrack.reg import QubitState, Measurement, PyQrackQubit
8
8
  from bloqade.pyqrack.base import PyQrackInterpreter
9
9
 
10
10
  from .runtime import OperatorRuntimeABC
@@ -41,9 +41,12 @@ class PyQrackMethods(interp.MethodTable):
41
41
 
42
42
  def _measure_qubit(self, qbit: PyQrackQubit, interp: PyQrackInterpreter):
43
43
  if qbit.is_active():
44
- return bool(qbit.sim_reg.m(qbit.addr))
44
+ m = Measurement(bool(qbit.sim_reg.m(qbit.addr)))
45
45
  else:
46
- return interp.loss_m_result
46
+ m = Measurement(interp.loss_m_result)
47
+
48
+ interp.set_global_measurement_id(m)
49
+ return m
47
50
 
48
51
  @interp.impl(qubit.MeasureQubitList)
49
52
  def measure_qubit_list(
@@ -63,3 +66,17 @@ class PyQrackMethods(interp.MethodTable):
63
66
  qbit: PyQrackQubit = frame.get(stmt.qubit)
64
67
  result = self._measure_qubit(qbit, interp)
65
68
  return (result,)
69
+
70
+ @interp.impl(qubit.QubitId)
71
+ def qubit_id(
72
+ self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: qubit.QubitId
73
+ ):
74
+ qbit: PyQrackQubit = frame.get(stmt.qubit)
75
+ return (qbit.addr,)
76
+
77
+ @interp.impl(qubit.MeasurementId)
78
+ def measurement_id(
79
+ self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: qubit.MeasurementId
80
+ ):
81
+ measurement: Measurement = frame.get(stmt.measurement)
82
+ return (measurement.measurement_id,)
@@ -144,6 +144,11 @@ class Squin(lowering.LoweringABC[CirqNode]):
144
144
  qbits = self.lower_qubit_getindices(state, node.qubits)
145
145
  return state.current_frame.push(qubit.Apply(operator=op_, qubits=qbits))
146
146
 
147
+ def visit_TaggedOperation(
148
+ self, state: lowering.State[CirqNode], node: cirq.TaggedOperation
149
+ ):
150
+ state.lower(node.untagged)
151
+
147
152
  def lower_measurement(
148
153
  self, state: lowering.State[CirqNode], node: cirq.GateOperation
149
154
  ):
bloqade/squin/qubit.py CHANGED
@@ -79,6 +79,20 @@ class MeasureQubitList(ir.Statement):
79
79
  result: ir.ResultValue = info.result(ilist.IListType[MeasurementResultType])
80
80
 
81
81
 
82
+ @statement(dialect=dialect)
83
+ class QubitId(ir.Statement):
84
+ traits = frozenset({lowering.FromPythonCall(), ir.Pure()})
85
+ qubit: ir.SSAValue = info.argument(QubitType)
86
+ result: ir.ResultValue = info.result(types.Int)
87
+
88
+
89
+ @statement(dialect=dialect)
90
+ class MeasurementId(ir.Statement):
91
+ traits = frozenset({lowering.FromPythonCall(), ir.Pure()})
92
+ measurement: ir.SSAValue = info.argument(MeasurementResultType)
93
+ result: ir.ResultValue = info.result(types.Int)
94
+
95
+
82
96
  # NOTE: no dependent types in Python, so we have to mark it Any...
83
97
  @wraps(New)
84
98
  def new(n_qubits: int) -> ilist.IList[Qubit, Any]:
@@ -127,9 +141,10 @@ def measure(input: Any) -> Any:
127
141
  input: A qubit or a list of qubits to measure.
128
142
 
129
143
  Returns:
130
- bool | list[bool]: The result of the measurement. If a single qubit is measured,
131
- a single boolean is returned. If a list of qubits is measured, a list of booleans
144
+ MeasurementResult | list[MeasurementResult]: The result of the measurement. If a single qubit is measured,
145
+ a single result is returned. If a list of qubits is measured, a list of results
132
146
  is returned.
147
+ A MeasurementResult can represent both 0 and 1, but also atoms that are lost.
133
148
  """
134
149
  ...
135
150
 
@@ -169,3 +184,11 @@ def broadcast(operator: Op, *qubits: ilist.IList[Qubit, OpSize] | list[Qubit]) -
169
184
  None
170
185
  """
171
186
  ...
187
+
188
+
189
+ @wraps(QubitId)
190
+ def get_qubit_id(qubit: Qubit) -> int: ...
191
+
192
+
193
+ @wraps(MeasurementId)
194
+ def get_measurement_id(measurement: MeasurementResult) -> int: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bloqade-circuit
3
- Version: 0.7.6
3
+ Version: 0.7.8
4
4
  Summary: The software development toolkit for neutral atom arrays.
5
5
  Author-email: Roger-luo <rluo@quera.com>, kaihsin <khwu@quera.com>, weinbe58 <pweinberg@quera.com>, johnzl-777 <jlong@quera.com>
6
6
  License-File: LICENSE
@@ -9,8 +9,7 @@ Requires-Dist: kirin-toolchain~=0.17.23
9
9
  Requires-Dist: numpy>=1.22.0
10
10
  Requires-Dist: pandas>=2.2.3
11
11
  Requires-Dist: pydantic<2.11.0,>=1.3.0
12
- Requires-Dist: pyqrack-cpu<1.41,>=1.38.2; sys_platform != 'darwin'
13
- Requires-Dist: pyqrack<1.41,>=1.38.2; sys_platform == 'darwin'
12
+ Requires-Dist: pyqrack-cpu>=1.69.1
14
13
  Requires-Dist: rich>=13.9.4
15
14
  Requires-Dist: scipy>=1.13.1
16
15
  Provides-Extra: cirq
@@ -18,9 +17,9 @@ Requires-Dist: cirq-core>=1.4.1; extra == 'cirq'
18
17
  Requires-Dist: cirq-core[contrib]>=1.4.1; extra == 'cirq'
19
18
  Requires-Dist: qpsolvers[clarabel]>=4.7.0; extra == 'cirq'
20
19
  Provides-Extra: pyqrack-cuda
21
- Requires-Dist: pyqrack-cuda>=1.38.2; extra == 'pyqrack-cuda'
20
+ Requires-Dist: pyqrack-cuda>=1.69.1; extra == 'pyqrack-cuda'
22
21
  Provides-Extra: pyqrack-opencl
23
- Requires-Dist: pyqrack>=1.38.2; (sys_platform != 'darwin') and extra == 'pyqrack-opencl'
22
+ Requires-Dist: pyqrack>=1.69.1; extra == 'pyqrack-opencl'
24
23
  Provides-Extra: qasm2
25
24
  Requires-Dist: lark>=1.2.2; extra == 'qasm2'
26
25
  Provides-Extra: qbraid
@@ -13,13 +13,13 @@ bloqade/analysis/measure_id/__init__.py,sha256=r_R_br1e3H7ZzwkeQw4TnDAP4M_bUaRlR
13
13
  bloqade/analysis/measure_id/analysis.py,sha256=D8KcV8aL1yrqKhtqgaqMArX-PGXYcFXumEC5tx36plU,1974
14
14
  bloqade/analysis/measure_id/impls.py,sha256=q_HKSxptGfOvvGrRcpl42UGoe7eRL2-5dIGiA0tDyrA,6866
15
15
  bloqade/analysis/measure_id/lattice.py,sha256=WPrn0R79umCH909BFWsUJ64qx9n_3KYimIW5UaXNuGU,1891
16
- bloqade/cirq_utils/__init__.py,sha256=1DRDCF3PpgJCOr0z7iULdrn3dqm7GLpRGs9AlqE7XA8,280
16
+ bloqade/cirq_utils/__init__.py,sha256=NOChrzb4vxb3xHKxM0gg7HdZ7R76X5yU8RJZ9hECXWs,276
17
17
  bloqade/cirq_utils/lineprog.py,sha256=JosrhfeOHI9FycUT_sYFj8TBzLpo97TL8zK-Ap2U4eQ,11021
18
- bloqade/cirq_utils/parallelize.py,sha256=E2MsPm61Dkm3n0v4EFPJFGOc4B_Aw01yfhu-ViOKGiA,13812
18
+ bloqade/cirq_utils/parallelize.py,sha256=u9AP6l7YwBatFfIvrcCjbcYMiavk7MU6HKSKPkqlxtY,13803
19
19
  bloqade/cirq_utils/noise/__init__.py,sha256=hUBi53U0wE4u3AqGh5cNdgdCspt3O-Vw-SR68cfBZYc,421
20
20
  bloqade/cirq_utils/noise/_two_zone_utils.py,sha256=iq4nwdJQITFlGB61wfrV7vyPA2194p-i_nv36powZ90,17883
21
21
  bloqade/cirq_utils/noise/conflict_graph.py,sha256=ZUwPWTknrb6SgtZUVPeICn3YA-nUeWQJDuKKX5jL9tE,7179
22
- bloqade/cirq_utils/noise/model.py,sha256=8qovvB50oHzDszXkuMAs2I9BQV3eS1IU2D7Wux_dsGE,18459
22
+ bloqade/cirq_utils/noise/model.py,sha256=tKzK_d1u81miQu1LMeum7wKRXeuyP1M182SEJ8lNTbo,18605
23
23
  bloqade/cirq_utils/noise/transform.py,sha256=pauFnOKbk2QjxeyXEV_x2zyRGypr5wiQ6ySirU7C2zg,2278
24
24
  bloqade/native/__init__.py,sha256=MtQZmq7KqNGkjxsO_22DpY-13X23Ovw8JKs7lfuv55w,443
25
25
  bloqade/native/_prelude.py,sha256=znle4mSTLZtRMCmmiZ-bCPfHqNdgVxsKuY64Fgj2kko,1258
@@ -32,10 +32,10 @@ bloqade/native/stdlib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
32
32
  bloqade/native/stdlib/broadcast.py,sha256=0DEK6pRcz0IG5BZHt0sV1wZpDvlJgvw4-Qwd1xYLSYM,6141
33
33
  bloqade/native/stdlib/simple.py,sha256=mK_p9x_TUr4g-q-Q4LfbVBtXxBS21XPh1meyCC4to_k,5416
34
34
  bloqade/pyqrack/__init__.py,sha256=OV8-2fw44gP_JgY8mAUiwISO_qYxS-t0fKsbuUB-r9Y,861
35
- bloqade/pyqrack/base.py,sha256=g0GRlEgyJ_P8z-lR8RK2CAuRTj6KPfglKX0iwrgg4DM,4408
35
+ bloqade/pyqrack/base.py,sha256=Q2GjAcqEZBo-Lhe2jpXuNCB0xXVIdwtdy6cUmDM_OZI,4623
36
36
  bloqade/pyqrack/device.py,sha256=ruseNWt3scvjw0KyHZjwnM6Z6lFjROgmW3Zdi1lucgQ,15195
37
37
  bloqade/pyqrack/native.py,sha256=ErbVQCatn_JT3Ej-iQzMMfb_q50JF_K1Iv1vRYvu5VA,1857
38
- bloqade/pyqrack/reg.py,sha256=uTL07CT1R0xUsInLmwU9YuuNdV6lV0lCs1zhdUz1qIs,1660
38
+ bloqade/pyqrack/reg.py,sha256=75XW6qJLYOJp9BtpyYMUFmpqFfGrCydNLS40bKcghGM,1853
39
39
  bloqade/pyqrack/target.py,sha256=c78VtLWAiDNp_0sXwvVzhaEoeFsr1fUVsupxWuo6p3s,3661
40
40
  bloqade/pyqrack/task.py,sha256=nRmI3tM_y4134_Uld-D9xwNXG9ie-OHNAqwRT5Ss-Y0,5266
41
41
  bloqade/pyqrack/noise/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -47,11 +47,11 @@ bloqade/pyqrack/qasm2/parallel.py,sha256=ITetuXOH2KUDpDOBuFnJoz2DhduvyBC72cOAOOi
47
47
  bloqade/pyqrack/qasm2/uop.py,sha256=bLZONsEK15ymFGIQwy7muQv-TX0mvLrECuMp1Y3XTfA,8612
48
48
  bloqade/pyqrack/squin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  bloqade/pyqrack/squin/op.py,sha256=m9QiQgQnKy1tYvrieU6MjXf_b9i2fovj4r2novcQwIc,5535
50
- bloqade/pyqrack/squin/qubit.py,sha256=IXoAN_wOAzmKsKMKUakTQd_TbeJrFrtvH5Fd9SlQVLo,2277
50
+ bloqade/pyqrack/squin/qubit.py,sha256=M32AhO3HRc_-FrOj7h_1Arj6jr9WiaHoxc4aeU1KoIY,2859
51
51
  bloqade/pyqrack/squin/runtime.py,sha256=3iVCN3XMUL8uk-bm0y4HSaVU7i5xZsNm5sY285rUKQE,15583
52
52
  bloqade/pyqrack/squin/wire.py,sha256=rqlAeU-r_EHOwJMqHrEAxpZ_rKsvUpwGG7MP4BW75Nw,1658
53
53
  bloqade/pyqrack/squin/noise/__init__.py,sha256=uXgRQPOrHNRp3k2ff2HD8mheUEaqxZPKEnwV-s4BiV4,31
54
- bloqade/pyqrack/squin/noise/native.py,sha256=KF4VGzU5Ps92DeLcIDIMsxQQtQ97z_3KUHqBPPkZFaM,2286
54
+ bloqade/pyqrack/squin/noise/native.py,sha256=gs2At4fDKTN3LJl5DVZ-Z3Pn3YTSwZCQCAoPrMJxEcQ,2287
55
55
  bloqade/qasm2/__init__.py,sha256=W9dR4Qnvigc7e7Ay7puSJHAIuiQk8vWqY-W64SMu5oU,515
56
56
  bloqade/qasm2/_qasm_loading.py,sha256=dSfjlB6Bm1ednfxc9L42dEa48s5q4N5SGQ9Iw21sBZQ,4753
57
57
  bloqade/qasm2/_wrappers.py,sha256=4x3fldC4sV2K_XZ0FPZOorQKAbs_7pualListXtak4A,11148
@@ -141,7 +141,7 @@ bloqade/squin/_typeinfer.py,sha256=bilWfC6whTMwewFCqDgB6vDHZsgXPr3azNOYqqnvtB4,7
141
141
  bloqade/squin/groups.py,sha256=RXGJnNZUSXF_f5ljjhZ9At8UhaijayoxFoWvxEsUOWc,1310
142
142
  bloqade/squin/lowering.py,sha256=bfrPjx6t2mnd1qoBshF_RW-FXMWg3TOUA6XKUeONyig,2560
143
143
  bloqade/squin/parallel.py,sha256=X6Ps9kQIgnFMlZO14y2ntdxvivqbIP28PAWF8KmxByM,5172
144
- bloqade/squin/qubit.py,sha256=cRy2a2jFLlor4KPHWk_05fMqr8Gmj5ixk624dLdWKmY,4911
144
+ bloqade/squin/qubit.py,sha256=eX24PLk0CILaooQZDD6gv5MwSAXSncazv86M-cyT3cc,5649
145
145
  bloqade/squin/types.py,sha256=T3lkqid4HEWuAK_wRns_p-K5DbLDwlldoyZtVay7A3o,119
146
146
  bloqade/squin/wire.py,sha256=GZhF0EHCu7OU70zTV_N83yann-eQnYG_lM2u0QYFoAs,6596
147
147
  bloqade/squin/analysis/__init__.py,sha256=DvnFHmEqMxRG92jVT3ZWwAQDTb6DC4fZDTV8ZSLZgP0,43
@@ -152,7 +152,7 @@ bloqade/squin/analysis/nsites/analysis.py,sha256=rIe1RU1MZRItcE2aB8DYahLrv73HfD3
152
152
  bloqade/squin/analysis/nsites/impls.py,sha256=wSNWjNmgwCP35FgmreyLKmRYedxlebWi7LhsEq9jPs4,3097
153
153
  bloqade/squin/analysis/nsites/lattice.py,sha256=ruh0808SHtj3ecuT-C3AZTsLY2j3DRhtezGiTZvcuVs,942
154
154
  bloqade/squin/cirq/__init__.py,sha256=7OYYboSl5lPwdWOKk4AJgm1s1lBX_WAstVqPfaynSv8,10156
155
- bloqade/squin/cirq/lowering.py,sha256=trrcBDQQzy2r3JVKb2x6i2BdzBMYkjQNBzH_Va6JOu0,17789
155
+ bloqade/squin/cirq/lowering.py,sha256=i5-IakuJGo3CYw7VNHqB0uM3AiFMw__a3oizKce3F7I,17937
156
156
  bloqade/squin/cirq/emit/emit_circuit.py,sha256=JVFXiaSB7A9kamRwCjLqs03Sel4PVCBT-6kRNRWX-jo,4393
157
157
  bloqade/squin/cirq/emit/noise.py,sha256=rESjGC_66s2Y4FwwYda4rY3mYHYjbqLlKE_vnqpZDYI,1534
158
158
  bloqade/squin/cirq/emit/op.py,sha256=u1FoOlbz7NNXPlU-hMbnX_yRB5suKbsEm2jF3Ts4f68,5764
@@ -243,7 +243,7 @@ bloqade/visual/animation/runtime/atoms.py,sha256=EmjxhujLiHHPS_HtH_B-7TiqeHgvW5u
243
243
  bloqade/visual/animation/runtime/ppoly.py,sha256=JB9IP53N1w6adBJEue6J5Nmj818Id9JvrlgrmiQTU1I,1385
244
244
  bloqade/visual/animation/runtime/qpustate.py,sha256=rlmxQeJSvaohXrTpXQL5y-NJcpvfW33xPaYM1slv7cc,4270
245
245
  bloqade/visual/animation/runtime/utils.py,sha256=ju9IzOWX-vKwfpqUjlUKu3Ssr_UFPFFq-tzH_Nqyo_c,1212
246
- bloqade_circuit-0.7.6.dist-info/METADATA,sha256=KBi8hGUeoSp9gEeZUOTjO7QQxUaZHk5pYH7gWCUqB3E,3850
247
- bloqade_circuit-0.7.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
248
- bloqade_circuit-0.7.6.dist-info/licenses/LICENSE,sha256=S5GIJwR6QCixPA9wryYb44ZEek0Nz4rt_zLUqP05UbU,13160
249
- bloqade_circuit-0.7.6.dist-info/RECORD,,
246
+ bloqade_circuit-0.7.8.dist-info/METADATA,sha256=svrqjS1xWz1xDQDyERLzAfIUnKfY-9uVedF-S_aGS3U,3724
247
+ bloqade_circuit-0.7.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
248
+ bloqade_circuit-0.7.8.dist-info/licenses/LICENSE,sha256=S5GIJwR6QCixPA9wryYb44ZEek0Nz4rt_zLUqP05UbU,13160
249
+ bloqade_circuit-0.7.8.dist-info/RECORD,,