From 82c85d859be00659b0ab0214bee89456a9cee195 Mon Sep 17 00:00:00 2001 From: "Israel F. Araujo" Date: Sun, 14 Aug 2022 12:37:03 -0300 Subject: [PATCH 01/54] Fix global phase in inverse of UCGate (#8508) * Defines the inverse of the global phase The inverse of UCGate is defined by simply inverting the existing decomposition, but the inverse of the global phase was missing. * Tests the UCGate.inverse() function * Lint * Seed for building the matrices * Replace `unitary_simulator` by using `qiskit.quantum_info.Operator`. Co-authored-by: Julien Gacon * Import `Operator` class * Release notes * Lint * Test the phase of isometry decomposition * Removes the `prelude` from the release notes file * Replaces `matrix_equal` with `np.allclose` Co-authored-by: Julien Gacon --- qiskit/extensions/quantum_initializer/uc.py | 3 +++ ...-inverse-global_phase-c9655c13c22e5cf4.yaml | 9 +++++++++ test/python/circuit/test_isometry.py | 5 ++--- test/python/circuit/test_uc.py | 18 +++++++++++++++++- 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 releasenotes/notes/bugfix-ucgate-inverse-global_phase-c9655c13c22e5cf4.yaml diff --git a/qiskit/extensions/quantum_initializer/uc.py b/qiskit/extensions/quantum_initializer/uc.py index 61618efb3563..d859ed4a96de 100644 --- a/qiskit/extensions/quantum_initializer/uc.py +++ b/qiskit/extensions/quantum_initializer/uc.py @@ -110,6 +110,9 @@ def inverse(self): definition = QuantumCircuit(*self.definition.qregs) for inst in reversed(self._definition): definition._append(inst.replace(operation=inst.operation.inverse())) + + definition.global_phase = -self.definition.global_phase + inverse_gate.definition = definition return inverse_gate diff --git a/releasenotes/notes/bugfix-ucgate-inverse-global_phase-c9655c13c22e5cf4.yaml b/releasenotes/notes/bugfix-ucgate-inverse-global_phase-c9655c13c22e5cf4.yaml new file mode 100644 index 000000000000..eae30452782b --- /dev/null +++ b/releasenotes/notes/bugfix-ucgate-inverse-global_phase-c9655c13c22e5cf4.yaml @@ -0,0 +1,9 @@ +--- +fixes: + - | + Fixes the :meth:`.UCGate.inverse` method which previously did not invert the + global phase. + - | + Fixes the global phase problem of the isometry decomposition. Refer to + `#4687 ` for more + details. diff --git a/test/python/circuit/test_isometry.py b/test/python/circuit/test_isometry.py index c411836da5fb..bffd9c69bac3 100644 --- a/test/python/circuit/test_isometry.py +++ b/test/python/circuit/test_isometry.py @@ -24,7 +24,6 @@ from qiskit import execute from qiskit.test import QiskitTestCase from qiskit.compiler import transpile -from qiskit.quantum_info.operators.predicates import matrix_equal from qiskit.quantum_info import Operator from qiskit.extensions.quantum_initializer.isometry import Isometry @@ -69,7 +68,7 @@ def test_isometry(self, iso): unitary = result.get_unitary(qc) iso_from_circuit = unitary[::, 0 : 2**num_q_input] iso_desired = iso - self.assertTrue(matrix_equal(iso_from_circuit, iso_desired, ignore_phase=True)) + self.assertTrue(np.allclose(iso_from_circuit, iso_desired)) @data( np.eye(2, 2), @@ -108,7 +107,7 @@ def test_isometry_tolerance(self, iso): result = execute(qc, simulator).result() unitary = result.get_unitary(qc) iso_from_circuit = unitary[::, 0 : 2**num_q_input] - self.assertTrue(matrix_equal(iso_from_circuit, iso, ignore_phase=True)) + self.assertTrue(np.allclose(iso_from_circuit, iso)) @data( np.eye(2, 2), diff --git a/test/python/circuit/test_uc.py b/test/python/circuit/test_uc.py index cedff9f4ac41..1f50b650623c 100644 --- a/test/python/circuit/test_uc.py +++ b/test/python/circuit/test_uc.py @@ -30,6 +30,7 @@ from qiskit.quantum_info.random import random_unitary from qiskit.compiler import transpile from qiskit.quantum_info.operators.predicates import matrix_equal +from qiskit.quantum_info import Operator _id = np.eye(2, 2) _not = np.matrix([[0, 1], [1, 0]]) @@ -71,7 +72,7 @@ def test_ucg(self, squs, up_to_diagonal): self.assertTrue(matrix_equal(unitary_desired, unitary, ignore_phase=True)) def test_global_phase_ucg(self): - """ "Test global phase of uniformly controlled gates""" + """Test global phase of uniformly controlled gates""" gates = [random_unitary(2).data for _ in range(2**2)] num_con = int(np.log2(len(gates))) q = QuantumRegister(num_con + 1) @@ -85,6 +86,21 @@ def test_global_phase_ucg(self): self.assertTrue(np.allclose(unitary_desired, unitary)) + def test_inverse_ucg(self): + """Test inverse function of uniformly controlled gates""" + gates = [random_unitary(2, seed=42 + s).data for s in range(2**2)] + num_con = int(np.log2(len(gates))) + q = QuantumRegister(num_con + 1) + qc = QuantumCircuit(q) + + qc.uc(gates, q[1:], q[0], up_to_diagonal=False) + qc.append(qc.inverse(), qc.qubits) + + unitary = Operator(qc).data + unitary_desired = np.identity(2**qc.num_qubits) + + self.assertTrue(np.allclose(unitary_desired, unitary)) + def _get_ucg_matrix(squs): return block_diag(*squs) From eaf55816470fd64c934b36b7684a02e133dfbc5f Mon Sep 17 00:00:00 2001 From: Rohit Taeja <108047286+r-taeja@users.noreply.github.com> Date: Mon, 15 Aug 2022 19:39:32 +0530 Subject: [PATCH 02/54] Fixed Issue 8244 by updating unitary_simulator error message (#8249) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/providers/basicaer/unitary_simulator.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/qiskit/providers/basicaer/unitary_simulator.py b/qiskit/providers/basicaer/unitary_simulator.py index a4a0328a1007..63745f7967ee 100644 --- a/qiskit/providers/basicaer/unitary_simulator.py +++ b/qiskit/providers/basicaer/unitary_simulator.py @@ -392,8 +392,6 @@ def _validate(self, qobj): for operation in experiment.instructions: if operation.name in ["measure", "reset"]: raise BasicAerError( - 'Unsupported "%s" instruction "%s" ' + 'in circuit "%s" ', - self.name(), - operation.name, - name, + f'Unsupported "{self.name()}" instruction "{operation.name}"' + f' in circuit "{name}".' ) From d68e15547a4e0ee07fd0d33baee7bc60a335f3d0 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Mon, 15 Aug 2022 13:23:34 -0400 Subject: [PATCH 03/54] Update macOS image version in azure pipelines ci (#8431) The macOS 10.15 image we're using in azure pipelines has been deprecated for some time (as Apple has dropped support for the version) and they've started periodic brownouts on the version to accelerate the transition off of the image. We have stayed pinned at the older version because we had compatibility issues with the newer releases in the past. But, since this is no longer an option this commit bumps us one version from 10.15 to 11. This doesn't go straight to 12 as Apple proactively disables support for older platforms in newer OS releases and in Qiskit we try to maximize platform support, even those using older Apple hardware, so the minimal version update is made. Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .azure/test-macos.yml | 2 +- azure-pipelines.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.azure/test-macos.yml b/.azure/test-macos.yml index 4417dd8add68..d7d98c3ef3be 100644 --- a/.azure/test-macos.yml +++ b/.azure/test-macos.yml @@ -6,7 +6,7 @@ parameters: jobs: - job: "MacOS_Tests_Python${{ replace(parameters.pythonVersion, '.', '') }}" displayName: "Test macOS Python ${{ parameters.pythonVersion }}" - pool: {vmImage: 'macOS-10.15'} + pool: {vmImage: 'macOS-11'} variables: QISKIT_SUPPRESS_PACKAGING_WARNINGS: Y diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a0947861a159..de6655e02348 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -212,12 +212,12 @@ stages: - template: ".azure/wheels.yml" parameters: jobName: "macos" - pool: {vmImage: 'macOS-10.15'} + pool: {vmImage: 'macOS-11'} - template: ".azure/wheels.yml" parameters: jobName: "macos_arm" - pool: {vmImage: 'macOS-10.15'} + pool: {vmImage: 'macOS-11'} env: CIBW_BEFORE_ALL: rustup target add aarch64-apple-darwin CIBW_ARCHS_MACOS: arm64 universal2 From f37dcf9d9c879867140b3072483a3dbd36cb5c1f Mon Sep 17 00:00:00 2001 From: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> Date: Mon, 15 Aug 2022 14:29:38 -0400 Subject: [PATCH 04/54] Add Minimizer to API ref. (#8533) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/algorithms/optimizers/__init__.py | 3 +++ qiskit/algorithms/optimizers/optimizer.py | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/qiskit/algorithms/optimizers/__init__.py b/qiskit/algorithms/optimizers/__init__.py index a6efc11c49d8..c0f30d86dd32 100644 --- a/qiskit/algorithms/optimizers/__init__.py +++ b/qiskit/algorithms/optimizers/__init__.py @@ -37,6 +37,7 @@ OptimizerResult OptimizerSupportLevel Optimizer + Minimizer Local Optimizers ================ @@ -133,6 +134,8 @@ __all__ = [ "Optimizer", "OptimizerSupportLevel", + "OptimizerResult", + "Minimizer", "ADAM", "AQGD", "CG", diff --git a/qiskit/algorithms/optimizers/optimizer.py b/qiskit/algorithms/optimizers/optimizer.py index b8acefbf9d2c..6f2e4e1077f9 100644 --- a/qiskit/algorithms/optimizers/optimizer.py +++ b/qiskit/algorithms/optimizers/optimizer.py @@ -110,7 +110,25 @@ def nit(self, nit: Optional[int]) -> None: class Minimizer(Protocol): - """Callback Protocol for minimizer.""" + """Callable Protocol for minimizer. + + This interface is based on `SciPy's optimize module + `__. + + This protocol defines a callable taking the following parameters: + + fun + The objective function to minimize (for example the energy in the case of the VQE). + x0 + The initial point for the optimization. + jac + The gradient of the objective function. + bounds + Parameters bounds for the optimization. Note that these might not be supported + by all optimizers. + + and which returns a minimization result object (either SciPy's or Qiskit's). + """ # pylint: disable=invalid-name def __call__( From 4fac3f4bea52aae80797cd01ca86545cbfb32e9b Mon Sep 17 00:00:00 2001 From: Emilio <63567458+epelaaez@users.noreply.github.com> Date: Tue, 16 Aug 2022 11:07:13 -0500 Subject: [PATCH 05/54] accept single qubit in initialize to fix #8408 (#8463) * accept single qubit in initialize * only call conversion when not iterable * add single Qubit to if statement * add test * fix imports * modify docs; add release note * accept single qubit in state preparation Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .../library/data_preparation/state_preparation.py | 7 ++++--- qiskit/extensions/quantum_initializer/initializer.py | 6 ++++-- ...ze-and-prepare-single-qubit-e25dacc8f873bc01.yaml | 5 +++++ .../python/circuit/library/test_state_preparation.py | 11 ++++++++++- test/python/circuit/test_registerless_circuit.py | 12 ++++++++++++ 5 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 releasenotes/notes/circuit-initialize-and-prepare-single-qubit-e25dacc8f873bc01.yaml diff --git a/qiskit/circuit/library/data_preparation/state_preparation.py b/qiskit/circuit/library/data_preparation/state_preparation.py index 43592514da1f..943e74f445b5 100644 --- a/qiskit/circuit/library/data_preparation/state_preparation.py +++ b/qiskit/circuit/library/data_preparation/state_preparation.py @@ -17,7 +17,7 @@ import numpy as np from qiskit.exceptions import QiskitError -from qiskit.circuit import QuantumCircuit, QuantumRegister +from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit from qiskit.circuit.gate import Gate from qiskit.circuit.library.standard_gates.x import CXGate, XGate from qiskit.circuit.library.standard_gates.h import HGate @@ -427,8 +427,9 @@ def prepare_state(self, state, qubits=None, label=None): to :math:`|1\rangle`. Example: setting params to 5 would initialize qubit 0 and qubit 2 to :math:`|1\rangle` and qubit 1 to :math:`|0\rangle`. - qubits (QuantumRegister or int): + qubits (QuantumRegister or Qubit or int): * QuantumRegister: A list of qubits to be initialized [Default: None]. + * Qubit: Single qubit to be initialized [Default: None]. * int: Index of qubit to be initialized [Default: None]. * list: Indexes of qubits to be initialized [Default: None]. label (str): An optional label for the gate @@ -505,7 +506,7 @@ def prepare_state(self, state, qubits=None, label=None): if qubits is None: qubits = self.qubits - elif isinstance(qubits, (int, np.integer, slice)): + elif isinstance(qubits, (int, np.integer, slice, Qubit)): qubits = [qubits] num_qubits = len(qubits) if isinstance(state, int) else None diff --git a/qiskit/extensions/quantum_initializer/initializer.py b/qiskit/extensions/quantum_initializer/initializer.py index 67b1dfa4baf6..7d6c658174ad 100644 --- a/qiskit/extensions/quantum_initializer/initializer.py +++ b/qiskit/extensions/quantum_initializer/initializer.py @@ -18,6 +18,7 @@ from qiskit.circuit import QuantumCircuit from qiskit.circuit import QuantumRegister from qiskit.circuit import Instruction +from qiskit.circuit import Qubit from qiskit.circuit.library.data_preparation import StatePreparation _EPS = 1e-10 # global variable used to chop very small numbers to zero @@ -106,8 +107,9 @@ class to prepare the qubits in a specified state. to :math:`|1\rangle`. Example: setting params to 5 would initialize qubit 0 and qubit 2 to :math:`|1\rangle` and qubit 1 to :math:`|0\rangle`. - qubits (QuantumRegister or int): + qubits (QuantumRegister or Qubit or int): * QuantumRegister: A list of qubits to be initialized [Default: None]. + * Qubit: Single qubit to be initialized [Default: None]. * int: Index of qubit to be initialized [Default: None]. * list: Indexes of qubits to be initialized [Default: None]. @@ -182,7 +184,7 @@ class to prepare the qubits in a specified state. """ if qubits is None: qubits = self.qubits - elif isinstance(qubits, (int, np.integer, slice)): + elif isinstance(qubits, (int, np.integer, slice, Qubit)): qubits = [qubits] num_qubits = len(qubits) if isinstance(params, int) else None diff --git a/releasenotes/notes/circuit-initialize-and-prepare-single-qubit-e25dacc8f873bc01.yaml b/releasenotes/notes/circuit-initialize-and-prepare-single-qubit-e25dacc8f873bc01.yaml new file mode 100644 index 000000000000..0648666c6147 --- /dev/null +++ b/releasenotes/notes/circuit-initialize-and-prepare-single-qubit-e25dacc8f873bc01.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed a bug in :meth:`.QuantumCircuit.initialize` and :meth:`.QuantumCircuit.prepare_state` + that caused them to not accept a single :class:`Qubit` as argument to initialize. diff --git a/test/python/circuit/library/test_state_preparation.py b/test/python/circuit/library/test_state_preparation.py index 430d462fa745..f34141ce596c 100644 --- a/test/python/circuit/library/test_state_preparation.py +++ b/test/python/circuit/library/test_state_preparation.py @@ -19,7 +19,7 @@ import numpy as np from ddt import ddt, data -from qiskit import QuantumCircuit +from qiskit import QuantumCircuit, QuantumRegister from qiskit.quantum_info import Statevector, Operator from qiskit.test import QiskitTestCase from qiskit.exceptions import QiskitError @@ -54,6 +54,15 @@ def test_prepare_from_list(self): actual_sv = Statevector(qc) self.assertTrue(desired_sv == actual_sv) + def test_prepare_single_qubit(self): + """Prepare state in single qubit.""" + qreg = QuantumRegister(2) + circuit = QuantumCircuit(qreg) + circuit.prepare_state([1 / math.sqrt(2), 1 / math.sqrt(2)], qreg[1]) + expected = QuantumCircuit(qreg) + expected.prepare_state([1 / math.sqrt(2), 1 / math.sqrt(2)], [qreg[1]]) + self.assertEqual(circuit, expected) + def test_nonzero_state_incorrect(self): """Test final state incorrect if initial state not zero""" desired_sv = Statevector([1 / math.sqrt(2), 0, 0, 1 / math.sqrt(2)]) diff --git a/test/python/circuit/test_registerless_circuit.py b/test/python/circuit/test_registerless_circuit.py index 6a4d0a401744..865b80e78034 100644 --- a/test/python/circuit/test_registerless_circuit.py +++ b/test/python/circuit/test_registerless_circuit.py @@ -230,6 +230,18 @@ def test_circuit_initialize(self): self.assertEqual(circuit, expected) + def test_circuit_initialize_single_qubit(self): + """Test initialize on single qubit.""" + init_vector = [numpy.sqrt(0.5), numpy.sqrt(0.5)] + qreg = QuantumRegister(2) + circuit = QuantumCircuit(qreg) + circuit.initialize(init_vector, qreg[0]) + + expected = QuantumCircuit(qreg) + expected.initialize(init_vector, [qreg[0]]) + + self.assertEqual(circuit, expected) + def test_mixed_register_and_registerless_indexing(self): """Test indexing if circuit contains bits in and out of registers.""" From 9bcc9d8b11abc59e834d95a6faf7e7a093d7d521 Mon Sep 17 00:00:00 2001 From: Julien Gacon Date: Tue, 16 Aug 2022 20:31:42 +0200 Subject: [PATCH 06/54] Detailed explanation of circuit parameter order in docs (#8404) * Detailed explanation of circuit parameter order * try to fix sphinx 1/? * rm return type doc Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/circuit/quantumcircuit.py | 94 ++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 17 deletions(-) diff --git a/qiskit/circuit/quantumcircuit.py b/qiskit/circuit/quantumcircuit.py index 2254a9b0ce7a..381d9cba68b3 100644 --- a/qiskit/circuit/quantumcircuit.py +++ b/qiskit/circuit/quantumcircuit.py @@ -2499,7 +2499,63 @@ def global_phase(self, angle: ParameterValueType): @property def parameters(self) -> ParameterView: - """Convenience function to get the parameters defined in the parameter table.""" + """The parameters defined in the circuit. + + This attribute returns the :class:`.Parameter` objects in the circuit sorted + alphabetically. Note that parameters instantiated with a :class:`.ParameterVector` + are still sorted numerically. + + Examples: + + The snippet below shows that insertion order of parameters does not matter. + + .. code-block:: python + + >>> from qiskit.circuit import QuantumCircuit, Parameter + >>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant") + >>> circuit = QuantumCircuit(1) + >>> circuit.rx(b, 0) + >>> circuit.rz(elephant, 0) + >>> circuit.ry(a, 0) + >>> circuit.parameters # sorted alphabetically! + ParameterView([Parameter(a), Parameter(b), Parameter(elephant)]) + + Bear in mind that alphabetical sorting might be unituitive when it comes to numbers. + The literal "10" comes before "2" in strict alphabetical sorting. + + .. code-block:: python + + >>> from qiskit.circuit import QuantumCircuit, Parameter + >>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")] + >>> circuit = QuantumCircuit(1) + >>> circuit.u(*angles, 0) + >>> circuit.draw() + ┌─────────────────────────────┐ + q: ┤ U(angle_1,angle_2,angle_10) ├ + └─────────────────────────────┘ + >>> circuit.parameters + ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)]) + + To respect numerical sorting, a :class:`.ParameterVector` can be used. + + .. code-block:: python + + >>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector + >>> x = ParameterVector("x", 12) + >>> circuit = QuantumCircuit(1) + >>> for x_i in x: + ... circuit.rx(x_i, 0) + >>> circuit.parameters + ParameterView([ + ParameterVectorElement(x[0]), ParameterVectorElement(x[1]), + ParameterVectorElement(x[2]), ParameterVectorElement(x[3]), + ..., ParameterVectorElement(x[11]) + ]) + + + Returns: + The sorted :class:`.Parameter` objects in the circuit. + """ # parameters from gates if self._parameters is None: unsorted = self._unsorted_parameters() @@ -2510,7 +2566,7 @@ def parameters(self) -> ParameterView: @property def num_parameters(self) -> int: - """Convenience function to get the number of parameter objects in the circuit.""" + """The number of parameter objects in the circuit.""" return len(self._unsorted_parameters()) def _unsorted_parameters(self) -> Set[Parameter]: @@ -2528,18 +2584,20 @@ def assign_parameters( ) -> Optional["QuantumCircuit"]: """Assign parameters to new parameters or values. - The keys of the parameter dictionary must be Parameter instances in the current circuit. The - values of the dictionary can either be numeric values or new parameter objects. + If ``parameters`` is passed as a dictionary, the keys must be :class:`.Parameter` + instances in the current circuit. The values of the dictionary can either be numeric values + or new parameter objects. + + If ``parameters`` is passed as a list or array, the elements are assigned to the + current parameters in the order of :attr:`parameters` which is sorted + alphabetically (while respecting the ordering in :class:`.ParameterVector` objects). + The values can be assigned to the current circuit object or to a copy of it. Args: - parameters (dict or iterable): Either a dictionary or iterable specifying the new - parameter values. If a dict, it specifies the mapping from ``current_parameter`` to - ``new_parameter``, where ``new_parameter`` can be a new parameter object or a - numeric value. If an iterable, the elements are assigned to the existing parameters - in the order of ``QuantumCircuit.parameters``. - inplace (bool): If False, a copy of the circuit with the bound parameters is - returned. If True the circuit instance itself is modified. + parameters: Either a dictionary or iterable specifying the new parameter values. + inplace: If False, a copy of the circuit with the bound parameters is returned. + If True the circuit instance itself is modified. Raises: CircuitError: If parameters is a dict and contains parameters not present in the @@ -2548,8 +2606,7 @@ def assign_parameters( parameters in the circuit. Returns: - Optional(QuantumCircuit): A copy of the circuit with bound parameters, if - ``inplace`` is False, otherwise None. + A copy of the circuit with bound parameters, if ``inplace`` is False, otherwise None. Examples: @@ -2572,7 +2629,7 @@ def assign_parameters( print('Assigned in-place:') print(circuit.draw()) - Bind the values out-of-place and get a copy of the original circuit. + Bind the values out-of-place by list and get a copy of the original circuit. .. jupyter-execute:: @@ -2583,7 +2640,7 @@ def assign_parameters( circuit.ry(params[0], 0) circuit.crx(params[1], 0, 1) - bound_circuit = circuit.assign_parameters({params[0]: 1, params[1]: 2}) + bound_circuit = circuit.assign_parameters([1, 2]) print('Bound circuit:') print(bound_circuit.draw()) @@ -2638,18 +2695,21 @@ def bind_parameters( ) -> "QuantumCircuit": """Assign numeric parameters to values yielding a new circuit. + If the values are given as list or array they are bound to the circuit in the order + of :attr:`parameters` (see the docstring for more details). + To assign new Parameter objects or bind the values in-place, without yielding a new circuit, use the :meth:`assign_parameters` method. Args: - values (dict or iterable): {parameter: value, ...} or [value1, value2, ...] + values: ``{parameter: value, ...}`` or ``[value1, value2, ...]`` Raises: CircuitError: If values is a dict and contains parameters not present in the circuit. TypeError: If values contains a ParameterExpression. Returns: - QuantumCircuit: copy of self with assignment substitution. + Copy of self with assignment substitution. """ if isinstance(values, dict): if any(isinstance(value, ParameterExpression) for value in values.values()): From f2d228ecd288c928d074b1f61702b96eb5b66e87 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Tue, 16 Aug 2022 16:01:43 -0400 Subject: [PATCH 07/54] Remove stale dev dependencies from requirements-dev.txt (#8501) * Remove stale dev dependencies from requirements-dev.txt In looking at the requirements-dev.txt list as part of #8498 there were a few entries which were not needed and/or are being used anymore. This commit cleans those up and also removes an unused script for reporting ci failures. The report script has been completed supersceded by native comment actions in azure pipelines and github actions so we no longer need to manually call the github api to report CI failures on periodic jobs. * Use pip to install extension for lint * Update CI config to avoid explicit setup.py usage where not needed Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .azure/lint-linux.yml | 2 +- .azure/test-linux.yml | 2 + .azure/test-macos.yml | 1 - .azure/test-windows.yml | 1 - .azure/tutorials-linux.yml | 1 - requirements-dev.txt | 3 - tools/report_ci_failure.py | 158 ------------------------------------- 7 files changed, 3 insertions(+), 165 deletions(-) delete mode 100644 tools/report_ci_failure.py diff --git a/.azure/lint-linux.yml b/.azure/lint-linux.yml index 5fddd6afef3f..f184ccd7470f 100644 --- a/.azure/lint-linux.yml +++ b/.azure/lint-linux.yml @@ -34,7 +34,7 @@ jobs: pip install -U -r requirements.txt -r requirements-dev.txt -c constraints.txt pip install -U -c constraints.txt -e . pip install -U "qiskit-aer" -c constraints.txt - python setup.py build_ext --inplace + pip install -e . displayName: 'Install dependencies' env: SETUPTOOLS_ENABLE_FEATURES: "legacy-editable" diff --git a/.azure/test-linux.yml b/.azure/test-linux.yml index 14d1c090f822..57b18e698373 100644 --- a/.azure/test-linux.yml +++ b/.azure/test-linux.yml @@ -71,6 +71,8 @@ jobs: set -e source test-job/bin/activate pip install -U -r requirements.txt -r requirements-dev.txt -c constraints.txt + # Install setuptools-rust for building sdist + pip install -U -c constraints.txt setuptools-rust python setup.py sdist pip install -U -c constraints.txt dist/qiskit-terra*.tar.gz displayName: "Install Terra from sdist" diff --git a/.azure/test-macos.yml b/.azure/test-macos.yml index d7d98c3ef3be..895197098f5e 100644 --- a/.azure/test-macos.yml +++ b/.azure/test-macos.yml @@ -46,7 +46,6 @@ jobs: source test-job/bin/activate pip install -U -r requirements.txt -r requirements-dev.txt -c constraints.txt pip install -U -c constraints.txt -e . - python setup.py build_ext --inplace pip check displayName: 'Install dependencies' env: diff --git a/.azure/test-windows.yml b/.azure/test-windows.yml index 8140a6ce4fbb..31cca7ba2ed6 100644 --- a/.azure/test-windows.yml +++ b/.azure/test-windows.yml @@ -36,7 +36,6 @@ jobs: pip install -r requirements.txt -r requirements-dev.txt -c constraints.txt pip install -c constraints.txt -e . pip install "z3-solver" -c constraints.txt - python setup.py build_ext --inplace pip check displayName: 'Install dependencies' env: diff --git a/.azure/tutorials-linux.yml b/.azure/tutorials-linux.yml index 2ce7cb9026c8..fe49db79bf1d 100644 --- a/.azure/tutorials-linux.yml +++ b/.azure/tutorials-linux.yml @@ -34,7 +34,6 @@ jobs: pip install -U -r requirements.txt -r requirements-dev.txt -c constraints.txt pip install -c constraints.txt -e . pip install "qiskit-ibmq-provider" "qiskit-aer" "z3-solver" "qiskit-ignis" "matplotlib>=3.3.0" sphinx nbsphinx sphinx_rtd_theme cvxpy -c constraints.txt - python setup.py build_ext --inplace sudo apt-get update sudo apt-get install -y graphviz pandoc pip check diff --git a/requirements-dev.txt b/requirements-dev.txt index fb5e2cbeae18..72da159e4ff5 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,3 @@ -setuptools-rust<1.5.0 coverage>=4.4.0 hypothesis>=4.24.3 python-constraint>=1.4 @@ -13,8 +12,6 @@ pydot astroid==2.5.6 pylint==2.8.3 stestr>=2.0.0 -PyGithub -wheel pylatexenc>=1.4 ddt>=1.2.0,!=1.4.0,!=1.4.3 seaborn>=0.9.0 diff --git a/tools/report_ci_failure.py b/tools/report_ci_failure.py deleted file mode 100644 index b9be8243560d..000000000000 --- a/tools/report_ci_failure.py +++ /dev/null @@ -1,158 +0,0 @@ -# This code is part of Qiskit. -# -# (C) Copyright IBM 2017, 2018. -# -# This code is licensed under the Apache License, Version 2.0. You may -# obtain a copy of this license in the LICENSE.txt file in the root directory -# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. -# -# Any modifications or derivative works of this code must retain this -# copyright notice, and modified files need to carry a notice indicating -# that they have been altered from the originals. -"""Utility module to open an issue on the repository when CIs fail.""" - -import os -import re - -from github import Github - - -class CIFailureReporter: - """Instances of this class can report to GitHub that the CI is failing.""" - - stable_branch_regex = re.compile(r"^stable/\d+\.\d+") - - def __init__(self, repository, token): - """ - Args: - repository (str): a string in the form 'owner/repository-name' - indicating the GitHub repository to report against. - token (str): a GitHub token obtained following: - https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/ - """ - self._repo = repository - self._api = Github(token) - - def report(self, branch, commit, infourl=None, job_name=None): - """Report on GitHub that the specified branch is failing to build at - the specified commit. The method will open an issue indicating that - the branch is failing. If there is an issue already open, it will add a - comment avoiding to report twice about the same failure. - - Args: - branch (str): branch name to report about. - commit (str): commit hash at which the build fails. - infourl (str): URL with extra info about the failure such as the - build logs. - job_name (str): name of the failed ci job. - """ - if branch != "main" and not self.stable_branch_regex.search(branch): - return - key_label = self._key_label(branch, job_name) - issue_number = self._get_report_issue_number(key_label) - if issue_number: - self._report_as_comment(issue_number, branch, commit, infourl) - else: - self._report_as_issue(branch, commit, infourl, job_name) - - def _key_label(self, branch_name, job_name): - if job_name == "Randomized tests": - return "randomized test" - elif job_name == "Benchmarks": - return "benchmarks failing" - elif branch_name == "main": - return "main failing" - elif branch_name.startswith("stable/"): - return "stable failing" - else: - return "" - - def _get_report_issue_number(self, key_label): - query = f'state:open label:"{key_label}" repo:{self._repo}' - results = self._api.search_issues(query=query) - try: - return results[0].number - except IndexError: - return None - - def _report_as_comment(self, issue_number, branch, commit, infourl): - stamp = _branch_is_failing_stamp(branch, commit) - report_exists = self._check_report_existence(issue_number, stamp) - if not report_exists: - _, body = _branch_is_failing_template(branch, commit, infourl) - message_body = f"{stamp}\n{body}" - self._post_new_comment(issue_number, message_body) - - def _check_report_existence(self, issue_number, target): - repo = self._api.get_repo(self._repo) - issue = repo.get_issue(issue_number) - if target in issue.body: - return True - - for comment in issue.get_comments(): - if target in comment.body: - return True - - return False - - def _report_as_issue(self, branch, commit, infourl, key_label): - repo = self._api.get_repo(self._repo) - stamp = _branch_is_failing_stamp(branch, commit) - title, body = _branch_is_failing_template(branch, commit, infourl) - message_body = f"{stamp}\n{body}" - repo.create_issue(title=title, body=message_body, labels=[key_label]) - - def _post_new_comment(self, issue_number, body): - repo = self._api.get_repo(self._repo) - issue = repo.get_issue(issue_number) - issue.create_comment(body) - - -def _branch_is_failing_template(branch, commit, infourl): - title = f"Branch `{branch}` is failing" - body = f"Trying to build `{branch}` at commit {commit} failed." - if infourl: - body += f"\nMore info at: {infourl}" - return title, body - - -def _branch_is_failing_stamp(branch, commit): - return f"" - - -_REPOSITORY = "Qiskit/qiskit-terra" -_GH_TOKEN = os.getenv("GH_TOKEN") - - -def _get_repo_name(): - return os.getenv("TRAVIS_REPO_SLUG") or os.getenv("APPVEYOR_REPO_NAME") - - -def _get_branch_name(): - return os.getenv("TRAVIS_BRANCH") or os.getenv("APPVEYOR_REPO_BRANCH") - - -def _get_commit_hash(): - return os.getenv("TRAVIS_COMMIT") or os.getenv("APPVEYOR_REPO_COMMIT") - - -def _get_job_name(): - return os.getenv("TRAVIS_JOB_NAME") or os.getenv("APPVEYOR_JOB_NAME") - - -def _get_info_url(): - if os.getenv("TRAVIS"): - job_id = os.getenv("TRAVIS_JOB_ID") - return f"https://travis-ci.com/{_REPOSITORY}/jobs/{job_id}" - - if os.getenv("APPVEYOR"): - build_id = os.getenv("APPVEYOR_BUILD_ID") - return f"https://ci.appveyor.com/project/{_REPOSITORY}/build/{build_id}" - - return None - - -if __name__ == "__main__": - if os.getenv("TRAVIS_EVENT_TYPE", "") == "push": - _REPORTER = CIFailureReporter(_get_repo_name(), _GH_TOKEN) - _REPORTER.report(_get_branch_name(), _get_commit_hash(), _get_info_url(), _get_job_name()) From 74c27f831ccd966965caff6e6892c6528c08f35b Mon Sep 17 00:00:00 2001 From: Guillermo-Mijares-Vilarino <106545082+Guillermo-Mijares-Vilarino@users.noreply.github.com> Date: Tue, 16 Aug 2022 23:39:01 +0200 Subject: [PATCH 08/54] Added Hinton explanation (#8412) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/visualization/state_visualization.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/qiskit/visualization/state_visualization.py b/qiskit/visualization/state_visualization.py index e4491a4eaf16..0f91ee078e42 100644 --- a/qiskit/visualization/state_visualization.py +++ b/qiskit/visualization/state_visualization.py @@ -43,6 +43,11 @@ def plot_state_hinton( ): """Plot a hinton diagram for the density matrix of a quantum state. + The hinton diagram represents the values of a matrix using + squares, whose size indicate the magnitude of their corresponding value + and their color, its sign. A white square means the value is positive and + a black one means negative. + Args: state (Statevector or DensityMatrix or ndarray): An N-qubit quantum state. title (str): a string that represents the plot title From 074d2ded68cf90b164fabb132d5e5b5c27983eb9 Mon Sep 17 00:00:00 2001 From: choerst-ibm <62256845+choerst-ibm@users.noreply.github.com> Date: Wed, 17 Aug 2022 01:13:59 +0200 Subject: [PATCH 09/54] Fix typo in qasm3 exporter docstring (#8557) Co-authored-by: Jake Lishman --- qiskit/qasm3/exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiskit/qasm3/exporter.py b/qiskit/qasm3/exporter.py index 74452ddde4f9..e0a956d7bfae 100644 --- a/qiskit/qasm3/exporter.py +++ b/qiskit/qasm3/exporter.py @@ -110,7 +110,7 @@ class Exporter: - """QASM3 expoter main class.""" + """QASM3 exporter main class.""" def __init__( self, From 844d426ba684373d013c3a409df65647cbf15585 Mon Sep 17 00:00:00 2001 From: Guillermo-Mijares-Vilarino <106545082+Guillermo-Mijares-Vilarino@users.noreply.github.com> Date: Wed, 17 Aug 2022 05:14:57 +0200 Subject: [PATCH 10/54] Changed plot state city code example in API reference and added another one (#8352) * changed plot_state_city code examples in API reference to better showcase the different arguments * removed refernce to Aer and transpile * removed extra imports and matplotlib inline * Added comments and removed figsize * unwrap comments and codes, remove spaces around = in function arguments, import order * reduced length to 100 Co-authored-by: Junye Huang Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/visualization/state_visualization.py | 28 +++++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/qiskit/visualization/state_visualization.py b/qiskit/visualization/state_visualization.py index 0f91ee078e42..215397633e86 100644 --- a/qiskit/visualization/state_visualization.py +++ b/qiskit/visualization/state_visualization.py @@ -365,21 +365,39 @@ def plot_state_city( ValueError: When 'color' is not a list of len=2. VisualizationError: if input is not a valid N-qubit state. - Example: + Examples: .. jupyter-execute:: + # You can choose different colors for the real and imaginary parts of the density matrix. + from qiskit import QuantumCircuit from qiskit.quantum_info import DensityMatrix from qiskit.visualization import plot_state_city - %matplotlib inline qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) - state = DensityMatrix.from_instruction(qc) - plot_state_city(state, color=['midnightblue', 'midnightblue'], - title="New State City") + state = DensityMatrix(qc) + plot_state_city(state, color=['midnightblue', 'crimson'], title="New State City") + + .. jupyter-execute:: + + # You can make the bars more transparent to better see the ones that are behind + # if they overlap. + + import numpy as np + from qiskit.quantum_info import Statevector + + qc = QuantumCircuit(2) + qc.h([0, 1]) + qc.cz(0,1) + qc.ry(np.pi/3, 0) + qc.rx(np.pi/5, 1) + + state = Statevector(qc) + plot_state_city(state, alpha=0.6) + """ from matplotlib import pyplot as plt from mpl_toolkits.mplot3d.art3d import Poly3DCollection From 14a0aaf8364e47b5c24761bcd48a7d5252ed2a8b Mon Sep 17 00:00:00 2001 From: Adenilton Silva <7927558+adjs@users.noreply.github.com> Date: Wed, 17 Aug 2022 02:48:58 -0300 Subject: [PATCH 11/54] Remove obsolete global_phase hack in UnitaryGate.control (#8537) * remove global phase hack * Create remove_hack-7f2c765e5d8d8799.yaml * Remove release note Co-authored-by: Jake Lishman Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/extensions/unitary.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/qiskit/extensions/unitary.py b/qiskit/extensions/unitary.py index ff166044e82a..b47bd80c7017 100644 --- a/qiskit/extensions/unitary.py +++ b/qiskit/extensions/unitary.py @@ -156,7 +156,7 @@ def control(self, num_ctrl_qubits=1, label=None, ctrl_state=None): mat = self.to_matrix() cmat = _compute_control_matrix(mat, num_ctrl_qubits, ctrl_state=None) iso = isometry.Isometry(cmat, 0, 0) - cunitary = ControlledGate( + return ControlledGate( "c-unitary", num_qubits=self.num_qubits + num_ctrl_qubits, params=[mat], @@ -166,18 +166,6 @@ def control(self, num_ctrl_qubits=1, label=None, ctrl_state=None): ctrl_state=ctrl_state, base_gate=self.copy(), ) - from qiskit.quantum_info import Operator - - # hack to correct global phase; should fix to prevent need for correction here - pmat = Operator(iso.inverse()).data @ cmat - diag = numpy.diag(pmat) - if not numpy.allclose(diag, diag[0]): - raise ExtensionError("controlled unitary generation failed") - phase = numpy.angle(diag[0]) - if phase: - # need to apply to _definition since open controls creates temporary definition - cunitary._definition.global_phase = phase - return cunitary def qasm(self): """The qasm for a custom unitary gate From a2ae2ed1d3af5b6a70da97b9e0bd427337521d95 Mon Sep 17 00:00:00 2001 From: Alexander Ivrii Date: Wed, 17 Aug 2022 22:40:48 +0300 Subject: [PATCH 12/54] Fix internal transpiler error in CommutativeCancellation with classical conditions (#8556) * Bug fix related to issue 8553 * Shrink regression test to minimal reproducer * Correct comments after condition change Co-authored-by: Jake Lishman Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/circuit/commutation_checker.py | 13 ++++++++----- test/python/circuit/test_commutation_checker.py | 8 +++----- .../transpiler/test_commutative_cancellation.py | 11 +++++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/qiskit/circuit/commutation_checker.py b/qiskit/circuit/commutation_checker.py index 4bc61ee33561..a975e20aec9b 100644 --- a/qiskit/circuit/commutation_checker.py +++ b/qiskit/circuit/commutation_checker.py @@ -80,6 +80,11 @@ def commute( Returns: bool: whether two operations commute. """ + # We don't support commutation of conditional gates for now due to bugs in + # CommutativeCancellation. See gh-8553. + if getattr(op1, "condition") is not None or getattr(op2, "condition") is not None: + return False + # These lines are adapted from dag_dependency and say that two gates over # different quantum and classical bits necessarily commute. This is more # permissive that the check from commutation_analysis, as for example it @@ -91,15 +96,13 @@ def commute( if not (intersection_q or intersection_c): return True - # These lines are adapted from commutation_analysis, which is more restrictive - # than the check from dag_dependency when considering nodes with "_directive" - # or "condition". It would be nice to think which optimizations - # from dag_dependency can indeed be used. + # These lines are adapted from commutation_analysis, which is more restrictive than the + # check from dag_dependency when considering nodes with "_directive". It would be nice to + # think which optimizations from dag_dependency can indeed be used. for op in [op1, op2]: if ( getattr(op, "_directive", False) or op.name in {"measure", "reset", "delay"} - or getattr(op, "condition", None) or op.is_parameterized() ): return False diff --git a/test/python/circuit/test_commutation_checker.py b/test/python/circuit/test_commutation_checker.py index 9db5de33ff0f..c44252a64f3e 100644 --- a/test/python/circuit/test_commutation_checker.py +++ b/test/python/circuit/test_commutation_checker.py @@ -311,15 +311,13 @@ def test_conditional_gates(self): qr = QuantumRegister(3) cr = ClassicalRegister(2) - # Different quantum bits (and empty classical bits). - # We should be able to swap these. + # Currently, in all cases commutativity checker should returns False. + # This is definitely suboptimal. res = comm_checker.commute( CXGate().c_if(cr[0], 0), [qr[0], qr[1]], [], XGate(), [qr[2]], [] ) - self.assertTrue(res) + self.assertFalse(res) - # In all other cases, commutativity checker currently returns False. - # This is definitely suboptimal. res = comm_checker.commute( CXGate().c_if(cr[0], 0), [qr[0], qr[1]], [], XGate(), [qr[1]], [] ) diff --git a/test/python/transpiler/test_commutative_cancellation.py b/test/python/transpiler/test_commutative_cancellation.py index 86e166ffded9..2d513951a2de 100644 --- a/test/python/transpiler/test_commutative_cancellation.py +++ b/test/python/transpiler/test_commutative_cancellation.py @@ -621,6 +621,17 @@ def test_basis_global_phase_03(self): ccirc = passmanager.run(circ) self.assertEqual(Operator(circ), Operator(ccirc)) + def test_basic_classical_wires(self): + """Test that transpile runs without internal errors when dealing with commutable operations + with classical controls. Regression test for gh-8553.""" + original = QuantumCircuit(2, 1) + original.x(0).c_if(original.cregs[0], 0) + original.x(1).c_if(original.cregs[0], 0) + # This transpilation shouldn't change anything, but it should succeed. At one point it was + # triggering an internal logic error and crashing. + transpiled = PassManager([CommutativeCancellation()]).run(original) + self.assertEqual(original, transpiled) + if __name__ == "__main__": unittest.main() From a0964c10aae11c490157fb8992108078229891a1 Mon Sep 17 00:00:00 2001 From: Jake Lishman Date: Thu, 18 Aug 2022 13:34:08 +0100 Subject: [PATCH 13/54] Fix QPY serialisation of ControlledGate with open controls (#8571) * Fix QPY serialisation of ControlledGate with open controls Previously, an incorrect definition and name would be re-instated on QPY deserialisation of a `ControlledGate` instance with open controls. The base name would include the dynamic `_o{ctrl_state}` suffix, causing the suffix to later be duplicated, and the definition would duplicate the logic that added the open controls. This fixes both by stripping the suffix on re-read before it is assigned, and serialising only the "11...1" state definition, since this is what is required and stored by `ControlledGate`. * Add QPY backwards compatibility test Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/qpy/binary_io/circuits.py | 16 +++++++++--- ...ledgate-open-control-35c8ccb4c7466f4c.yaml | 6 +++++ .../circuit/test_circuit_load_from_qpy.py | 11 ++++++++ test/qpy_compat/test_qpy.py | 26 +++++++++++++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/fix-qpy-controlledgate-open-control-35c8ccb4c7466f4c.yaml diff --git a/qiskit/qpy/binary_io/circuits.py b/qiskit/qpy/binary_io/circuits.py index ff30f00e21c4..49ca334e4a33 100644 --- a/qiskit/qpy/binary_io/circuits.py +++ b/qiskit/qpy/binary_io/circuits.py @@ -320,6 +320,9 @@ def _parse_custom_operation(custom_operations, gate_name, params, version, vecto base_gate = _read_instruction( base_gate_obj, None, registers, custom_operations, version, vectors ) + if ctrl_state < 2**num_ctrl_qubits - 1: + # If open controls, we need to discard the control suffix when setting the name. + gate_name = gate_name.rsplit("_", 1)[0] inst_obj = ControlledGate( gate_name, num_qubits, @@ -623,14 +626,21 @@ def _write_custom_operation(file_obj, name, operation, custom_operations): has_definition = True data = common.data_to_binary(operation, _write_pauli_evolution_gate) size = len(data) - elif operation.definition is not None: + elif type_key == type_keys.CircuitInstruction.CONTROLLED_GATE: + # For ControlledGate, we have to access and store the private `_definition` rather than the + # public one, because the public one is mutated to include additional logic if the control + # state is open, and the definition setter (during a subsequent read) uses the "fully + # excited" control definition only. has_definition = True - data = common.data_to_binary(operation.definition, write_circuit) + data = common.data_to_binary(operation._definition, write_circuit) size = len(data) - if type_key == type_keys.CircuitInstruction.CONTROLLED_GATE: num_ctrl_qubits = operation.num_ctrl_qubits ctrl_state = operation.ctrl_state base_gate = operation.base_gate + elif operation.definition is not None: + has_definition = True + data = common.data_to_binary(operation.definition, write_circuit) + size = len(data) if base_gate is None: base_gate_raw = b"" else: diff --git a/releasenotes/notes/fix-qpy-controlledgate-open-control-35c8ccb4c7466f4c.yaml b/releasenotes/notes/fix-qpy-controlledgate-open-control-35c8ccb4c7466f4c.yaml new file mode 100644 index 000000000000..d7a45238b2f4 --- /dev/null +++ b/releasenotes/notes/fix-qpy-controlledgate-open-control-35c8ccb4c7466f4c.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixed QPY serialisation and deserialisation of :class:`.ControlledGate` + with open controls (*i.e.* those whose ``ctrl_state`` is not all ones). + Fixed `#8549 `__. diff --git a/test/python/circuit/test_circuit_load_from_qpy.py b/test/python/circuit/test_circuit_load_from_qpy.py index 8292cee07780..9cc5f277580c 100644 --- a/test/python/circuit/test_circuit_load_from_qpy.py +++ b/test/python/circuit/test_circuit_load_from_qpy.py @@ -998,6 +998,17 @@ def test_controlled_gate(self): new_circuit = load(qpy_file)[0] self.assertEqual(qc, new_circuit) + def test_controlled_gate_open_controls(self): + """Test a controlled gate with open controls round-trips exactly.""" + qc = QuantumCircuit(3) + controlled_gate = DCXGate().control(1, ctrl_state=0) + qc.append(controlled_gate, [0, 1, 2]) + qpy_file = io.BytesIO() + dump(qc, qpy_file) + qpy_file.seek(0) + new_circuit = load(qpy_file)[0] + self.assertEqual(qc, new_circuit) + def test_nested_controlled_gate(self): """Test a custom nested controlled gate.""" custom_gate = Gate("black_box", 1, []) diff --git a/test/qpy_compat/test_qpy.py b/test/qpy_compat/test_qpy.py index 8c23af7fdb0f..418202f59d49 100755 --- a/test/qpy_compat/test_qpy.py +++ b/test/qpy_compat/test_qpy.py @@ -488,6 +488,30 @@ def generate_controlled_gates(): return circuits +def generate_open_controlled_gates(): + """Test QPY serialization with custom ControlledGates with open controls.""" + circuits = [] + qc = QuantumCircuit(3) + controlled_gate = DCXGate().control(1, ctrl_state=0) + qc.append(controlled_gate, [0, 1, 2]) + circuits.append(qc) + + custom_gate = Gate("black_box", 1, []) + custom_definition = QuantumCircuit(1) + custom_definition.h(0) + custom_definition.rz(1.5, 0) + custom_definition.sdg(0) + custom_gate.definition = custom_definition + nested_qc = QuantumCircuit(3) + nested_qc.append(custom_gate, [0]) + controlled_gate = custom_gate.control(2, ctrl_state=1) + nested_qc.append(controlled_gate, [0, 1, 2]) + nested_qc.measure_all() + circuits.append(nested_qc) + + return circuits + + def generate_circuits(version_str=None): """Generate reference circuits.""" version_parts = None @@ -525,6 +549,8 @@ def generate_circuits(version_str=None): output_circuits["controlled_gates.qpy"] = generate_controlled_gates() output_circuits["schedule_blocks.qpy"] = generate_schedule_blocks() output_circuits["pulse_gates.qpy"] = generate_calibrated_circuits() + if version_parts >= (0, 21, 2): + output_circuits["open_controlled_gates.qpy"] = generate_open_controlled_gates() return output_circuits From 26ba58ad54a23b4246553980476c4a27002e320f Mon Sep 17 00:00:00 2001 From: Jake Lishman Date: Thu, 18 Aug 2022 14:55:39 +0100 Subject: [PATCH 14/54] Fix QuantumCircuit.compose within control-flow scopes (#8570) * Fix QuantumCircuit.compose within control-flow scopes Previously, `QuantumCircuit.compose` with `inplace=True` would insert the appended instructions outside the scope due to unchecked use of `QuantumCircuit._append` (and direct modification of the `data` attribute). This now respects any active control-flow scopes. Using `front=True` in conjunction with `inplace=True` within a control-flow scope has no clear meaning, and so the behaviour is forbidden. Emitting a new circuit (`inplace=False`) while in an active scope would produce a broken circuit - the active scope would need to be cloned to ensure equivalence, but it wouldn't be part of any Python-managed context, so the scope could never be closed. * Finish writing documentation sentence * Add missing docstring in test * Add missing Sphinx directive Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/circuit/quantumcircuit.py | 33 ++++++-- ...-control-flow-scopes-a8aad3b87efbe77c.yaml | 7 ++ .../circuit/test_control_flow_builders.py | 83 +++++++++++++++++++ 3 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 releasenotes/notes/fix-QuantumCircuit.compose-in-control-flow-scopes-a8aad3b87efbe77c.yaml diff --git a/qiskit/circuit/quantumcircuit.py b/qiskit/circuit/quantumcircuit.py index 381d9cba68b3..9d6cf84c86cb 100644 --- a/qiskit/circuit/quantumcircuit.py +++ b/qiskit/circuit/quantumcircuit.py @@ -835,7 +835,8 @@ def compose( this can be anything that :obj:`.append` will accept. qubits (list[Qubit|int]): qubits of self to compose onto. clbits (list[Clbit|int]): clbits of self to compose onto. - front (bool): If True, front composition will be performed (not implemented yet). + front (bool): If True, front composition will be performed. This is not possible within + control-flow builder context managers. inplace (bool): If True, modify the object. Otherwise return composed circuit. wrap (bool): If True, wraps the other circuit into a gate (or instruction, depending on whether it contains only unitary instructions) before composing it onto self. @@ -844,12 +845,18 @@ def compose( QuantumCircuit: the composed circuit (returns None if inplace==True). Raises: - CircuitError: if composing on the front. - QiskitError: if ``other`` is wider or there are duplicate edge mappings. + CircuitError: if no correct wire mapping can be made between the two circuits, such as + if ``other`` is wider than ``self``. + CircuitError: if trying to emit a new circuit while ``self`` has a partially built + control-flow context active, such as the context-manager forms of :meth:`if_test`, + :meth:`for_loop` and :meth:`while_loop`. + CircuitError: if trying to compose to the front of a circuit when a control-flow builder + block is active; there is no clear meaning to this action. - Examples:: + Examples: + .. code-block:: python - lhs.compose(rhs, qubits=[3, 2], inplace=True) + >>> lhs.compose(rhs, qubits=[3, 2], inplace=True) .. parsed-literal:: @@ -869,6 +876,19 @@ def compose( lcr_1: 0 ═══════════ lcr_1: 0 ═══════════════════════ """ + if inplace and front and self._control_flow_scopes: + # If we're composing onto ourselves while in a stateful control-flow builder context, + # there's no clear meaning to composition to the "front" of the circuit. + raise CircuitError( + "Cannot compose to the front of a circuit while a control-flow context is active." + ) + if not inplace and self._control_flow_scopes: + # If we're inside a stateful control-flow builder scope, even if we successfully cloned + # the partial builder scope (not simple), the scope wouldn't be controlled by an active + # `with` statement, so the output circuit would be permanently broken. + raise CircuitError( + "Cannot emit a new composed circuit while a control-flow context is active." + ) if inplace: dest = self @@ -962,8 +982,9 @@ def compose( mapped_instrs += dest.data dest.data.clear() dest._parameter_table.clear() + append = dest._control_flow_scopes[-1].append if dest._control_flow_scopes else dest._append for instr in mapped_instrs: - dest._append(instr) + append(instr) for gate, cals in other.calibrations.items(): dest._calibrations[gate].update(cals) diff --git a/releasenotes/notes/fix-QuantumCircuit.compose-in-control-flow-scopes-a8aad3b87efbe77c.yaml b/releasenotes/notes/fix-QuantumCircuit.compose-in-control-flow-scopes-a8aad3b87efbe77c.yaml new file mode 100644 index 000000000000..c6674cf888df --- /dev/null +++ b/releasenotes/notes/fix-QuantumCircuit.compose-in-control-flow-scopes-a8aad3b87efbe77c.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + :meth:`.QuantumCircuit.compose` will now function correctly when used with + the ``inplace=True`` argument within control-flow builder contexts. + Previously the instructions would be added outside the control-flow scope. + Fixed `#8433 `__. diff --git a/test/python/circuit/test_control_flow_builders.py b/test/python/circuit/test_control_flow_builders.py index 369237684aac..0452ef8a701e 100644 --- a/test/python/circuit/test_control_flow_builders.py +++ b/test/python/circuit/test_control_flow_builders.py @@ -2062,6 +2062,64 @@ def test_copy_of_instruction_parameters(self): self.assertEqual(while_body, copy.copy(while_body)) self.assertEqual(while_body, copy.deepcopy(while_body)) + def test_inplace_compose_within_builder(self): + """Test that QuantumCircuit.compose used in-place works as expected within control-flow + scopes.""" + inner = QuantumCircuit(1) + inner.x(0) + + base = QuantumCircuit(1, 1) + base.h(0) + base.measure(0, 0) + + with self.subTest("if"): + outer = base.copy() + with outer.if_test((outer.clbits[0], 1)): + outer.compose(inner, inplace=True) + + expected = base.copy() + with expected.if_test((expected.clbits[0], 1)): + expected.x(0) + + self.assertCircuitsEquivalent(outer, expected) + + with self.subTest("else"): + outer = base.copy() + with outer.if_test((outer.clbits[0], 1)) as else_: + outer.compose(inner, inplace=True) + with else_: + outer.compose(inner, inplace=True) + + expected = base.copy() + with expected.if_test((expected.clbits[0], 1)) as else_: + expected.x(0) + with else_: + expected.x(0) + + self.assertCircuitsEquivalent(outer, expected) + + with self.subTest("for"): + outer = base.copy() + with outer.for_loop(range(3)): + outer.compose(inner, inplace=True) + + expected = base.copy() + with expected.for_loop(range(3)): + expected.x(0) + + self.assertCircuitsEquivalent(outer, expected) + + with self.subTest("while"): + outer = base.copy() + with outer.while_loop((outer.clbits[0], 0)): + outer.compose(inner, inplace=True) + + expected = base.copy() + with expected.while_loop((outer.clbits[0], 0)): + expected.x(0) + + self.assertCircuitsEquivalent(outer, expected) + @ddt.ddt class TestControlFlowBuildersFailurePaths(QiskitTestCase): @@ -2458,3 +2516,28 @@ def dummy_requester(resource): ) with self.assertRaisesRegex(TypeError, r"Can only add qubits or classical bits.*"): builder_block.add_bits([bit]) + + def test_compose_front_inplace_invalid_within_builder(self): + """Test that `QuantumCircuit.compose` raises a sensible error when called within a + control-flow builder block.""" + inner = QuantumCircuit(1) + inner.x(0) + + outer = QuantumCircuit(1, 1) + outer.measure(0, 0) + outer.compose(inner, front=True, inplace=True) + with outer.if_test((outer.clbits[0], 1)): + with self.assertRaisesRegex(CircuitError, r"Cannot compose to the front.*"): + outer.compose(inner, front=True, inplace=True) + + def test_compose_new_invalid_within_builder(self): + """Test that `QuantumCircuit.compose` raises a sensible error when called within a + control-flow builder block if trying to emit a new circuit.""" + inner = QuantumCircuit(1) + inner.x(0) + + outer = QuantumCircuit(1, 1) + outer.measure(0, 0) + with outer.if_test((outer.clbits[0], 1)): + with self.assertRaisesRegex(CircuitError, r"Cannot emit a new composed circuit.*"): + outer.compose(inner, inplace=False) From 93e2fc52f98246c84b3079e1655ab2e44d943749 Mon Sep 17 00:00:00 2001 From: Edwin Navarro Date: Fri, 19 Aug 2022 08:49:15 -0700 Subject: [PATCH 15/54] Add barrier labels and display in 3 circuit drawers (#8440) * Add barrier labels to mpl and text drawers * Release note * Add import * Lint * Add barrier labels to latex drawer * Remove utils changes * Cleanup * Fix merge conflict * Lint * Remove label property for barriers and snapshots and increase mpl label font size Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/circuit/barrier.py | 15 +++++++-- qiskit/circuit/quantumcircuit.py | 8 +++-- qiskit/extensions/simulator/snapshot.py | 20 ------------ qiskit/visualization/latex.py | 5 ++- qiskit/visualization/matplotlib.py | 30 +++++++++++++++--- qiskit/visualization/text.py | 11 ++++--- .../add-barrier-label-8e677979cb37461e.yaml | 18 +++++++++++ .../mpl/circuit/references/barrier_label.png | Bin 0 -> 9059 bytes .../circuit/test_circuit_matplotlib_drawer.py | 11 +++++++ .../references/test_latex_barrier_label.tex | 12 +++++++ .../test_latex_plot_barriers_true.tex | 2 +- .../visualization/test_circuit_latex.py | 18 ++++++++++- .../visualization/test_circuit_text_drawer.py | 22 +++++++++++++ 13 files changed, 135 insertions(+), 37 deletions(-) create mode 100644 releasenotes/notes/add-barrier-label-8e677979cb37461e.yaml create mode 100644 test/ipynb/mpl/circuit/references/barrier_label.png create mode 100644 test/python/visualization/references/test_latex_barrier_label.tex diff --git a/qiskit/circuit/barrier.py b/qiskit/circuit/barrier.py index 62ecc04512e4..7081fbcd6604 100644 --- a/qiskit/circuit/barrier.py +++ b/qiskit/circuit/barrier.py @@ -25,9 +25,18 @@ class Barrier(Instruction): _directive = True - def __init__(self, num_qubits): - """Create new barrier instruction.""" - super().__init__("barrier", num_qubits, 0, []) + def __init__(self, num_qubits, label=None): + """Create new barrier instruction. + + Args: + num_qubits (int): the number of qubits for the barrier type [Default: 0]. + label (str): the barrier label + + Raises: + TypeError: if barrier label is invalid. + """ + self._label = label + super().__init__("barrier", num_qubits, 0, [], label=label) def inverse(self): """Special case. Return self.""" diff --git a/qiskit/circuit/quantumcircuit.py b/qiskit/circuit/quantumcircuit.py index 9d6cf84c86cb..60ba8b80c6f3 100644 --- a/qiskit/circuit/quantumcircuit.py +++ b/qiskit/circuit/quantumcircuit.py @@ -2863,10 +2863,14 @@ def _rebind_definition( inner.operation.params[idx] = param.bind({parameter: value}) self._rebind_definition(inner.operation, parameter, value) - def barrier(self, *qargs: QubitSpecifier) -> InstructionSet: + def barrier(self, *qargs: QubitSpecifier, label=None) -> InstructionSet: """Apply :class:`~qiskit.circuit.Barrier`. If qargs is empty, applies to all qubits in the circuit. + Args: + qargs (QubitSpecifier): Specification for one or more qubit arguments. + label (str): The string label of the barrier. + Returns: qiskit.circuit.InstructionSet: handle to the added instructions. """ @@ -2889,7 +2893,7 @@ def barrier(self, *qargs: QubitSpecifier) -> InstructionSet: else: qubits.append(qarg) - return self.append(Barrier(len(qubits)), qubits, []) + return self.append(Barrier(len(qubits), label=label), qubits, []) def delay( self, diff --git a/qiskit/extensions/simulator/snapshot.py b/qiskit/extensions/simulator/snapshot.py index a5806da879e8..434b6da7c344 100644 --- a/qiskit/extensions/simulator/snapshot.py +++ b/qiskit/extensions/simulator/snapshot.py @@ -60,26 +60,6 @@ def snapshot_type(self): """Return snapshot type""" return self._snapshot_type - @property - def label(self): - """Return snapshot label""" - return self._label - - @label.setter - def label(self, name): - """Set snapshot label to name - - Args: - name (str or None): label to assign unitary - - Raises: - TypeError: name is not string or None. - """ - if isinstance(name, str): - self._label = name - else: - raise TypeError("label expects a string") - def c_if(self, classical, val): raise QiskitError("Snapshots are simulator directives and cannot be conditional.") diff --git a/qiskit/visualization/latex.py b/qiskit/visualization/latex.py index 968111352051..2818365a3904 100644 --- a/qiskit/visualization/latex.py +++ b/qiskit/visualization/latex.py @@ -603,7 +603,10 @@ def _build_barrier(self, node, col): first = last = index pos = self._wire_map[self._qubits[first]] self._latex[pos][col - 1] += " \\barrier[0em]{" + str(last - first) + "}" - self._latex[pos][col] = "\\qw" + if node.op.label is not None: + pos = indexes[0] + label = node.op.label.replace(" ", "\\,") + self._latex[pos][col] = "\\cds{0}{^{\\mathrm{%s}}}" % label def _add_controls(self, wire_list, ctrlqargs, ctrl_state, col): """Add one or more controls to a gate""" diff --git a/qiskit/visualization/matplotlib.py b/qiskit/visualization/matplotlib.py index 463a1e5b629c..5f157b42b22d 100644 --- a/qiskit/visualization/matplotlib.py +++ b/qiskit/visualization/matplotlib.py @@ -414,7 +414,9 @@ def _get_layer_widths(self): self._data[node] = {} self._data[node]["width"] = WID num_ctrl_qubits = 0 if not hasattr(op, "num_ctrl_qubits") else op.num_ctrl_qubits - if getattr(op, "_directive", False) or isinstance(op, Measure): + if ( + getattr(op, "_directive", False) and (not op.label or not self._plot_barriers) + ) or isinstance(op, Measure): self._data[node]["raw_gate_text"] = op.name continue @@ -1013,11 +1015,16 @@ def _measure(self, node): def _barrier(self, node): """Draw a barrier""" - for xy in self._data[node]["q_xy"]: + for i, xy in enumerate(self._data[node]["q_xy"]): xpos, ypos = xy + # For the topmost barrier, reduce the rectangle if there's a label to allow for the text. + if i == 0 and node.op.label is not None: + ypos_adj = -0.35 + else: + ypos_adj = 0.0 self._ax.plot( [xpos, xpos], - [ypos + 0.5, ypos - 0.5], + [ypos + 0.5 + ypos_adj, ypos - 0.5], linewidth=self._lwidth1, linestyle="dashed", color=self._style["lc"], @@ -1026,7 +1033,7 @@ def _barrier(self, node): box = self._patches_mod.Rectangle( xy=(xpos - (0.3 * WID), ypos - 0.5), width=0.6 * WID, - height=1, + height=1.0 + ypos_adj, fc=self._style["bc"], ec=None, alpha=0.6, @@ -1035,6 +1042,21 @@ def _barrier(self, node): ) self._ax.add_patch(box) + # display the barrier label at the top if there is one + if i == 0 and node.op.label is not None: + dir_ypos = ypos + 0.65 * HIG + self._ax.text( + xpos, + dir_ypos, + node.op.label, + ha="center", + va="top", + fontsize=self._fs, + color=self._data[node]["tc"], + clip_on=True, + zorder=PORDER_TEXT, + ) + def _gate(self, node, xy=None): """Draw a 1-qubit gate""" if xy is None: diff --git a/qiskit/visualization/text.py b/qiskit/visualization/text.py index 51ca5c9d568f..6fa431a1b2ad 100644 --- a/qiskit/visualization/text.py +++ b/qiskit/visualization/text.py @@ -376,18 +376,18 @@ def __init__(self, label=""): class Barrier(DirectOnQuWire): - """Draws a barrier. + """Draws a barrier with a label at the top if there is one. :: - top: ░ ░ + top: ░ label mid: ─░─ ───░─── bot: ░ ░ """ def __init__(self, label=""): super().__init__("░") - self.top_connect = "░" + self.top_connect = label if label else "░" self.bot_connect = "░" self.top_connector = {} self.bot_connector = {} @@ -1089,9 +1089,10 @@ def add_connected_gate(node, gates, layer, current_cons): if not self.plotbarriers: return layer, current_cons, current_cons_cond, connection_label - for qubit in node.qargs: + for i, qubit in enumerate(node.qargs): if qubit in self.qubits: - layer.set_qubit(qubit, Barrier()) + label = op.label if i == 0 else "" + layer.set_qubit(qubit, Barrier(label)) elif isinstance(op, SwapGate): # swap diff --git a/releasenotes/notes/add-barrier-label-8e677979cb37461e.yaml b/releasenotes/notes/add-barrier-label-8e677979cb37461e.yaml new file mode 100644 index 000000000000..9687f19bcc8e --- /dev/null +++ b/releasenotes/notes/add-barrier-label-8e677979cb37461e.yaml @@ -0,0 +1,18 @@ +--- +features: + - | + Added a ``label`` parameter to the :class:`.Barrier` which now allows + a user to enter a label for the ``barrier`` directive and the label + will be printed at the top of the ``barrier`` in the `mpl`, `latex`, + and `text` circuit drawers. Printing of existing ``snapshot`` labels + to the 3 circuit drawers was also added. + + .. code-block:: python + + from qiskit import QuantumCircuit + + circuit = QuantumCircuit(2) + circuit.h(0) + circuit.h(1) + circuit.barrier(label="After H") + circuit.draw('mpl') diff --git a/test/ipynb/mpl/circuit/references/barrier_label.png b/test/ipynb/mpl/circuit/references/barrier_label.png new file mode 100644 index 0000000000000000000000000000000000000000..c1db46dccfdddaed24bce54d1feef44752a5ec68 GIT binary patch literal 9059 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 literal 0 HcmV?d00001 diff --git a/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py b/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py index 68ecb4455e58..656d0a584a60 100644 --- a/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py +++ b/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py @@ -920,6 +920,17 @@ def test_wire_order(self): filename="wire_order.png", ) + def test_barrier_label(self): + """Test the barrier label""" + circuit = QuantumCircuit(2) + circuit.x(0) + circuit.y(1) + circuit.barrier() + circuit.y(0) + circuit.x(1) + circuit.barrier(label="End Y/X") + self.circuit_drawer(circuit, filename="barrier_label.png") + if __name__ == "__main__": unittest.main(verbosity=1) diff --git a/test/python/visualization/references/test_latex_barrier_label.tex b/test/python/visualization/references/test_latex_barrier_label.tex new file mode 100644 index 000000000000..c5f434fa903c --- /dev/null +++ b/test/python/visualization/references/test_latex_barrier_label.tex @@ -0,0 +1,12 @@ +\documentclass[border=2px]{standalone} + +\usepackage[braket, qm]{qcircuit} +\usepackage{graphicx} + +\begin{document} +\scalebox{1.0}{ +\Qcircuit @C=1.0em @R=0.2em @!R { \\ + \nghost{{q}_{0} : } & \lstick{{q}_{0} : } & \gate{\mathrm{X}} \barrier[0em]{1} & \qw & \gate{\mathrm{Y}} \barrier[0em]{1} & \cds{0}{^{\mathrm{End\,Y/X}}} & \qw & \qw\\ + \nghost{{q}_{1} : } & \lstick{{q}_{1} : } & \gate{\mathrm{Y}} & \qw & \gate{\mathrm{X}} & \qw & \qw & \qw\\ +\\ }} +\end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_plot_barriers_true.tex b/test/python/visualization/references/test_latex_plot_barriers_true.tex index 67618f16e7f8..b7679d27cd39 100644 --- a/test/python/visualization/references/test_latex_plot_barriers_true.tex +++ b/test/python/visualization/references/test_latex_plot_barriers_true.tex @@ -6,7 +6,7 @@ \begin{document} \scalebox{1.0}{ \Qcircuit @C=1.0em @R=0.2em @!R { \\ - \nghost{{q}_{0} : } & \lstick{{q}_{0} : } & \gate{\mathrm{H}} \barrier[0em]{1} & \qw & \qw \barrier[0em]{1} & \qw & \qw & \qw\\ + \nghost{{q}_{0} : } & \lstick{{q}_{0} : } & \gate{\mathrm{H}} \barrier[0em]{1} & \qw & \qw \barrier[0em]{1} & \cds{0}{^{\mathrm{sn\,1}}} & \qw & \qw\\ \nghost{{q}_{1} : } & \lstick{{q}_{1} : } & \qw & \qw & \gate{\mathrm{H}} & \qw & \qw & \qw\\ \nghost{\mathrm{{c} : }} & \lstick{\mathrm{{c} : }} & \lstick{/_{_{2}}} \cw & \cw & \cw & \cw & \cw & \cw\\ \\ }} diff --git a/test/python/visualization/test_circuit_latex.py b/test/python/visualization/test_circuit_latex.py index 3930725a5f38..447a173392b8 100644 --- a/test/python/visualization/test_circuit_latex.py +++ b/test/python/visualization/test_circuit_latex.py @@ -241,7 +241,7 @@ def test_plot_barriers(self): # this import appears to be unused, but is actually needed to get snapshot instruction import qiskit.extensions.simulator # pylint: disable=unused-import - circuit.snapshot("1") + circuit.snapshot("sn 1") # check the barriers plot properly when plot_barriers= True circuit_drawer(circuit, filename=filename1, output="latex_source", plot_barriers=True) @@ -265,6 +265,22 @@ def test_no_barriers_false(self): self.assertEqualToReference(filename) + def test_barrier_label(self): + """Test the barrier label""" + filename = self._get_resource_path("test_latex_barrier_label.tex") + qr = QuantumRegister(2, "q") + circuit = QuantumCircuit(qr) + circuit.x(0) + circuit.y(1) + circuit.barrier() + circuit.y(0) + circuit.x(1) + circuit.barrier(label="End Y/X") + + circuit_drawer(circuit, filename=filename, output="latex_source") + + self.assertEqualToReference(filename) + def test_big_gates(self): """Test large gates with params""" filename = self._get_resource_path("test_latex_big_gates.tex") diff --git a/test/python/visualization/test_circuit_text_drawer.py b/test/python/visualization/test_circuit_text_drawer.py index 25a2d79ce952..1ef9430c9a4d 100644 --- a/test/python/visualization/test_circuit_text_drawer.py +++ b/test/python/visualization/test_circuit_text_drawer.py @@ -1052,6 +1052,28 @@ def test_text_justify_right_barrier(self): circuit.h(qr1[1]) self.assertEqual(str(_text_circuit_drawer(circuit, justify="right")), expected) + def test_text_barrier_label(self): + """Show barrier label""" + expected = "\n".join( + [ + " ┌───┐ ░ ┌───┐ End Y/X ", + "q_0: |0>┤ X ├─░─┤ Y ├────░────", + " ├───┤ ░ ├───┤ ░ ", + "q_1: |0>┤ Y ├─░─┤ X ├────░────", + " └───┘ ░ └───┘ ░ ", + ] + ) + + qr = QuantumRegister(2, "q") + circuit = QuantumCircuit(qr) + circuit.x(0) + circuit.y(1) + circuit.barrier() + circuit.y(0) + circuit.x(1) + circuit.barrier(label="End Y/X") + self.assertEqual(str(_text_circuit_drawer(circuit)), expected) + def test_text_overlap_cx(self): """Overlapping CX gates are drawn not overlapping""" expected = "\n".join( From 8ce6e0a2566c4c045d8053687503b87643b46dae Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Mon, 22 Aug 2022 11:46:23 -0400 Subject: [PATCH 16/54] Further oxidize sabre (#8388) * Further oxidize sabre In #7977 we started the process of oxidizing SabreSwap by replacing the inner-most scoring heuristic loop with a rust routine. This greatly improved the overall performance and scaling of the transpiler pass. Continuing from where that started this commit migrates more of the pass into the Rust domain so that almost all the pass's operations are done inside a rust module and all that is returned is a list of swaps to run prior to each 2q gate. This should further improve the runtime performance of the pass and scaling because the only steps performed in Python are generating the input data structures and then replaying the circuit with SWAPs inserted at the appropriate points. While we could have stuck with #7977 as the performance of the pass was more than sufficient after it. What this commit really enables by moving most of the pass to the rust domain is to expand with improvments and expansion of the sabre algorithm which will require multithreaded to be efficiently implemented. So while this will have some modest performance improvements this is more about setting the stage for introducing variants of SabreSwap that do more thorough analysis in the future (which were previously preculded by the parallelism limitations of python). * Fix most test failures This commit fixes a small typo/logic error in the algorithm implementation that was preventing sabre from making forward progress because it wasn't correctly identifying successors for the next layer. By fixing this all the hard errors in the SabreSwap tests are fixed. The only failures left seem to be related to a different layout which hopefully is not a correctness issue but just caused by different ordering. * Rework circuit reconstruction to use layer order In some tests there were subtle differences in the relative positioning of the 1q gates relative to inserted swaps (i.e. a 1q gate which was before the swap previously could move to after it). This was caused by different topological ordering being used between the hybrid python sabre implementation and the mostly rust sabre implementations. To ensure a consistent ordering fater moving mostly to rust this changes the swap insertion loop to iterate over the circuit layers which mirrors how the old sabre implementation worked. * Differentiate between empty extended_set and none * Simplify arguments passing to remove adjacency matrix storage * Only check env variables once in rust * Rust side NLayout.copy() * Preserve SabreSwap execution order This commit fixes an issue where in some cases the topological order the DAGCircuit is traversed is different from the topological order that sabre uses internally. The build_swap_map sabre swap function is only valid if the 2q gates are replayed in the same exact order when rebuilding the DAGCircuit. If a 2q gate gets replayed in a different order the layout mapping will cause the circuit to diverge and potentially be invalid. This commit updates the replay logic in the python side to detect when the topological order over the dagcircuit differs from the sabre traversal order and attempts to correct it. * Rework SabreDAG to include full DAGCircuit structure Previously we attempted to just have the rust component of sabre deal solely with the 2q component of the input circuit. However, while this works for ~80% of the cases it fails to account ordering and interactions between non-2q gates or instructions with classical bits. To address this the sabre dag structure is modified to contain all isntructions in the input circuit and structurally match the DAGCircuit's edges. This fixes most of the issues related to gate ordering the previous implementation was encountering. It also simplifies the swap insertion/replay of the circuit in the python side as we now get an exact application order from the rust code. * Switch back to topological_op_nodes() for SabreDAG creation * Fix lint * Fix extended set construction * Fix typo in application of decay rate * Remove unused QubitsDecay class * Remove unused EdgeList class * Remove unnecessary SabreRNG class * Cleanup SabreDAG docstring and comments * Remove unused edge weights from SabreDAG The edge weights in the SabreDAG struct were set to the qubit indices from the input DAGCircuit because the edges represent the flow of data on the qubit. However, we never actually inspect the edge weights and all having them present does is use extra memory. This commit changes SabreDAG to just not set any weight for edges as all we need is the source and target nodes for the algorithm to work. * s/_bit_indices/_qubit_indices/g * Fix sabre rust class signatures --- Cargo.lock | 106 ++++-- Cargo.toml | 1 + .../transpiler/passes/routing/sabre_swap.py | 285 +++------------- src/nlayout.rs | 4 + src/sabre_swap/edge_list.rs | 101 ------ src/sabre_swap/mod.rs | 318 +++++++++++++++--- src/sabre_swap/qubits_decay.rs | 85 ----- src/sabre_swap/sabre_dag.rs | 69 ++++ src/sabre_swap/sabre_rng.rs | 35 -- src/sabre_swap/swap_map.rs | 48 +++ tox.ini | 2 +- 11 files changed, 517 insertions(+), 537 deletions(-) delete mode 100644 src/sabre_swap/edge_list.rs delete mode 100644 src/sabre_swap/qubits_decay.rs create mode 100644 src/sabre_swap/sabre_dag.rs delete mode 100644 src/sabre_swap/sabre_rng.rs create mode 100644 src/sabre_swap/swap_map.rs diff --git a/Cargo.lock b/Cargo.lock index 9283953439c7..0f821d94ffdb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -45,9 +45,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "crossbeam-channel" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if", "crossbeam-utils", @@ -55,9 +55,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -66,9 +66,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" dependencies = [ "autocfg", "cfg-if", @@ -80,9 +80,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" dependencies = [ "cfg-if", "once_cell", @@ -90,9 +90,15 @@ dependencies = [ [[package]] name = "either" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "getrandom" @@ -105,6 +111,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.6", + "rayon", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -131,27 +147,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", "rayon", ] [[package]] name = "indoc" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05a0bd019339e5d968b37855180087b7b9d512c5046fbd244cf8c95687927d6e" +checksum = "adab1eaa3408fb7f0c777a73e7465fd5656136fc93b670eb6df3c88c2c1344e3" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" [[package]] name = "libm" -version = "0.2.2" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" +checksum = "292a948cd991e376cf75541fe5b97a1081d713c618b4f1b9500f8844e49eb565" [[package]] name = "lock_api" @@ -260,9 +276,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" [[package]] name = "parking_lot" @@ -287,6 +303,16 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "petgraph" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "ppv-lite86" version = "0.2.16" @@ -295,9 +321,9 @@ checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" dependencies = [ "unicode-ident", ] @@ -309,7 +335,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e6302e85060011447471887705bb7838f14aba43fcb06957d823739a496b3dc" dependencies = [ "cfg-if", - "hashbrown", + "hashbrown 0.12.3", "indoc", "libc", "num-bigint", @@ -369,7 +395,7 @@ name = "qiskit-terra" version = "0.22.0" dependencies = [ "ahash 0.8.0", - "hashbrown", + "hashbrown 0.12.3", "indexmap", "ndarray", "num-bigint", @@ -380,13 +406,14 @@ dependencies = [ "rand_distr", "rand_pcg", "rayon", + "retworkx-core", ] [[package]] name = "quote" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] @@ -472,13 +499,26 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] +[[package]] +name = "retworkx-core" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353bcdcdab6c754ea32bce39ee7a763c8a3c16c91a8dd648befd14fbcb0d5b68" +dependencies = [ + "ahash 0.7.6", + "hashbrown 0.11.2", + "indexmap", + "petgraph", + "rayon", +] + [[package]] name = "scopeguard" version = "1.1.0" @@ -493,9 +533,9 @@ checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" [[package]] name = "syn" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" dependencies = [ "proc-macro2", "quote", @@ -510,15 +550,15 @@ checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" [[package]] name = "unicode-ident" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" [[package]] name = "unindent" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52fee519a3e570f7df377a06a1a7775cdbfb7aa460be7e08de2b1f0e69973a44" +checksum = "58ee9362deb4a96cef4d437d1ad49cffc9b9e92d202b6995674e928ce684f112" [[package]] name = "version_check" diff --git a/Cargo.toml b/Cargo.toml index 881f7bd09a42..d0d3882db611 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ rand_distr = "0.4.3" ahash = "0.8.0" num-complex = "0.4" num-bigint = "0.4" +retworkx-core = "0.11" [dependencies.pyo3] version = "0.16.5" diff --git a/qiskit/transpiler/passes/routing/sabre_swap.py b/qiskit/transpiler/passes/routing/sabre_swap.py index 3f83d83b04dd..275864ba7fba 100644 --- a/qiskit/transpiler/passes/routing/sabre_swap.py +++ b/qiskit/transpiler/passes/routing/sabre_swap.py @@ -13,7 +13,6 @@ """Routing via SWAP insertion using the SABRE method from Li et al.""" import logging -from collections import defaultdict from copy import copy, deepcopy import numpy as np @@ -27,22 +26,15 @@ # pylint: disable=import-error from qiskit._accelerate.sabre_swap import ( - sabre_score_heuristic, + build_swap_map, Heuristic, - EdgeList, - QubitsDecay, NeighborTable, - SabreRng, + SabreDAG, ) from qiskit._accelerate.stochastic_swap import NLayout # pylint: disable=import-error logger = logging.getLogger(__name__) -EXTENDED_SET_SIZE = 20 # Size of lookahead window. TODO: set dynamically to len(current_layout) - -DECAY_RATE = 0.001 # Decay coefficient for penalizing serial swaps. -DECAY_RESET_INTERVAL = 5 # How often to reset all decay rates to 1. - class SabreSwap(TransformationPass): r"""Map input circuit onto a backend topology via insertion of SWAPs. @@ -167,9 +159,8 @@ def __init__( else: self.seed = seed self.fake_run = fake_run - self.required_predecessors = None - self.qubits_decay = None - self._bit_indices = None + self._qubit_indices = None + self._clbit_indices = None self.dist_matrix = None def run(self, dag): @@ -189,18 +180,8 @@ def run(self, dag): if len(dag.qubits) > self.coupling_map.size(): raise TranspilerError("More virtual qubits exist than physical.") - max_iterations_without_progress = 10 * len(dag.qubits) # Arbitrary. - ops_since_progress = [] - extended_set = None - - # Normally this isn't necessary, but here we want to log some objects that have some - # non-trivial cost to create. - do_expensive_logging = logger.isEnabledFor(logging.DEBUG) - self.dist_matrix = self.coupling_map.distance_matrix - rng = SabreRng(self.seed) - # Preserve input DAG's name, regs, wire_map, etc. but replace the graph. mapped_dag = None if not self.fake_run: @@ -208,244 +189,68 @@ def run(self, dag): canonical_register = dag.qregs["q"] current_layout = Layout.generate_trivial_layout(canonical_register) - self._bit_indices = {bit: idx for idx, bit in enumerate(canonical_register)} + self._qubit_indices = {bit: idx for idx, bit in enumerate(canonical_register)} + self._clbit_indices = {bit: idx for idx, bit in enumerate(dag.clbits)} layout_mapping = { - self._bit_indices[k]: v for k, v in current_layout.get_virtual_bits().items() + self._qubit_indices[k]: v for k, v in current_layout.get_virtual_bits().items() } layout = NLayout(layout_mapping, len(dag.qubits), self.coupling_map.size()) - - # A decay factor for each qubit used to heuristically penalize recently - # used qubits (to encourage parallelism). - self.qubits_decay = QubitsDecay(len(dag.qubits)) - - # Start algorithm from the front layer and iterate until all gates done. - self.required_predecessors = self._build_required_predecessors(dag) - num_search_steps = 0 - front_layer = dag.front_layer() - - while front_layer: - execute_gate_list = [] - - # Remove as many immediately applicable gates as possible - new_front_layer = [] - for node in front_layer: - if len(node.qargs) == 2: - v0 = self._bit_indices[node.qargs[0]] - v1 = self._bit_indices[node.qargs[1]] - if self.coupling_map.graph.has_edge( - layout.logical_to_physical(v0), layout.logical_to_physical(v1) - ): - execute_gate_list.append(node) - else: - new_front_layer.append(node) - else: # Single-qubit gates as well as barriers are free - execute_gate_list.append(node) - front_layer = new_front_layer - - if not execute_gate_list and len(ops_since_progress) > max_iterations_without_progress: - # Backtrack to the last time we made progress, then greedily insert swaps to route - # the gate with the smallest distance between its arguments. This is a release - # valve for the algorithm to avoid infinite loops only, and should generally not - # come into play for most circuits. - self._undo_operations(ops_since_progress, mapped_dag, layout) - self._add_greedy_swaps(front_layer, mapped_dag, layout, canonical_register) - continue - - if execute_gate_list: - for node in execute_gate_list: - self._apply_gate(mapped_dag, node, layout, canonical_register) - for successor in self._successors(node, dag): - self.required_predecessors[successor] -= 1 - if self._is_resolved(successor): - front_layer.append(successor) - - if node.qargs: - self.qubits_decay.reset() - - # Diagnostics - if do_expensive_logging: - logger.debug( - "free! %s", - [ - (n.name if isinstance(n, DAGOpNode) else None, n.qargs) - for n in execute_gate_list - ], - ) - logger.debug( - "front_layer: %s", - [ - (n.name if isinstance(n, DAGOpNode) else None, n.qargs) - for n in front_layer - ], - ) - - ops_since_progress = [] - extended_set = None - continue - - # After all free gates are exhausted, heuristically find - # the best swap and insert it. When two or more swaps tie - # for best score, pick one randomly. - - if extended_set is None: - extended_set = self._obtain_extended_set(dag, front_layer) - extended_set_list = EdgeList(len(extended_set)) - for x in extended_set: - extended_set_list.append( - self._bit_indices[x.qargs[0]], self._bit_indices[x.qargs[1]] - ) - - front_layer_list = EdgeList(len(front_layer)) - for x in front_layer: - front_layer_list.append( - self._bit_indices[x.qargs[0]], self._bit_indices[x.qargs[1]] + original_layout = layout.copy() + + dag_list = [] + for node in dag.topological_op_nodes(): + dag_list.append( + ( + node._node_id, + [self._qubit_indices[x] for x in node.qargs], + [self._clbit_indices[x] for x in node.cargs], ) - best_swap = sabre_score_heuristic( - front_layer_list, - layout, - self._neighbor_table, - extended_set_list, - self.dist_matrix, - self.qubits_decay, - self.heuristic, - rng, ) - best_swap_qargs = [canonical_register[best_swap[0]], canonical_register[best_swap[1]]] - swap_node = self._apply_gate( - mapped_dag, - DAGOpNode(op=SwapGate(), qargs=best_swap_qargs), - layout, - canonical_register, - ) - layout.swap_logical(*best_swap) - ops_since_progress.append(swap_node) - - num_search_steps += 1 - if num_search_steps % DECAY_RESET_INTERVAL == 0: - self.qubits_decay.reset() - else: - self.qubits_decay[best_swap[0]] += DECAY_RATE - self.qubits_decay[best_swap[1]] += DECAY_RATE - - # Diagnostics - if do_expensive_logging: - logger.debug("SWAP Selection...") - logger.debug("extended_set: %s", [(n.name, n.qargs) for n in extended_set]) - logger.debug("best swap: %s", best_swap) - logger.debug("qubits decay: %s", self.qubits_decay) + front_layer = np.asarray([x._node_id for x in dag.front_layer()], dtype=np.uintp) + sabre_dag = SabreDAG(len(dag.qubits), len(dag.clbits), dag_list, front_layer) + swap_map, gate_order = build_swap_map( + len(dag.qubits), + sabre_dag, + self._neighbor_table, + self.dist_matrix, + self.heuristic, + self.seed, + layout, + ) + layout_mapping = layout.layout_mapping() output_layout = Layout({dag.qubits[k]: v for (k, v) in layout_mapping}) self.property_set["final_layout"] = output_layout if not self.fake_run: + for node_id in gate_order: + node = dag._multi_graph[node_id] + self._process_swaps(swap_map, node, mapped_dag, original_layout, canonical_register) + self._apply_gate(mapped_dag, node, original_layout, canonical_register) return mapped_dag return dag + def _process_swaps(self, swap_map, node, mapped_dag, current_layout, canonical_register): + if node._node_id in swap_map: + for swap in swap_map[node._node_id]: + swap_qargs = [canonical_register[swap[0]], canonical_register[swap[1]]] + self._apply_gate( + mapped_dag, + DAGOpNode(op=SwapGate(), qargs=swap_qargs), + current_layout, + canonical_register, + ) + current_layout.swap_logical(*swap) + def _apply_gate(self, mapped_dag, node, current_layout, canonical_register): new_node = self._transform_gate_for_layout(node, current_layout, canonical_register) if self.fake_run: return new_node return mapped_dag.apply_operation_back(new_node.op, new_node.qargs, new_node.cargs) - def _build_required_predecessors(self, dag): - out = defaultdict(int) - # We don't need to count in- or out-wires: outs can never be predecessors, and all input - # wires are automatically satisfied at the start. - for node in dag.op_nodes(): - for successor in self._successors(node, dag): - out[successor] += 1 - return out - - def _successors(self, node, dag): - """Return an iterable of the successors along each wire from the given node. - - This yields the same successor multiple times if there are parallel wires (e.g. two adjacent - operations that have one clbit and qubit in common), which is important in the swapping - algorithm for detecting if each wire has been accounted for.""" - for _, successor, _ in dag.edges(node): - if isinstance(successor, DAGOpNode): - yield successor - - def _is_resolved(self, node): - """Return True if all of a node's predecessors in dag are applied.""" - return self.required_predecessors[node] == 0 - - def _obtain_extended_set(self, dag, front_layer): - """Populate extended_set by looking ahead a fixed number of gates. - For each existing element add a successor until reaching limit. - """ - extended_set = [] - decremented = [] - tmp_front_layer = front_layer - done = False - while tmp_front_layer and not done: - new_tmp_front_layer = [] - for node in tmp_front_layer: - for successor in self._successors(node, dag): - decremented.append(successor) - self.required_predecessors[successor] -= 1 - if self._is_resolved(successor): - new_tmp_front_layer.append(successor) - if len(successor.qargs) == 2: - extended_set.append(successor) - if len(extended_set) >= EXTENDED_SET_SIZE: - done = True - break - tmp_front_layer = new_tmp_front_layer - for node in decremented: - self.required_predecessors[node] += 1 - return extended_set - - def _add_greedy_swaps(self, front_layer, dag, layout, qubits): - """Mutate ``dag`` and ``layout`` by applying greedy swaps to ensure that at least one gate - can be routed.""" - target_node = min( - front_layer, - key=lambda node: self.dist_matrix[ - layout.logical_to_physical(self._bit_indices[node.qargs[0]]), - layout.logical_to_physical(self._bit_indices[node.qargs[1]]), - ], - ) - for pair in _shortest_swap_path( - tuple(target_node.qargs), self.coupling_map, layout, qubits - ): - self._apply_gate(dag, DAGOpNode(op=SwapGate(), qargs=pair), layout, qubits) - layout.swap_logical(*[self._bit_indices[x] for x in pair]) - - def _undo_operations(self, operations, dag, layout): - """Mutate ``dag`` and ``layout`` by undoing the swap gates listed in ``operations``.""" - if dag is None: - for operation in reversed(operations): - layout.swap_logical(*[self._bit_indices[x] for x in operation.qargs]) - else: - for operation in reversed(operations): - dag.remove_op_node(operation) - p0 = self._bit_indices[operation.qargs[0]] - p1 = self._bit_indices[operation.qargs[1]] - layout.swap_logical(p0, p1) - def _transform_gate_for_layout(self, op_node, layout, device_qreg): """Return node implementing a virtual op on given layout.""" mapped_op_node = copy(op_node) mapped_op_node.qargs = tuple( - device_qreg[layout.logical_to_physical(self._bit_indices[x])] for x in op_node.qargs + device_qreg[layout.logical_to_physical(self._qubit_indices[x])] for x in op_node.qargs ) return mapped_op_node - - -def _shortest_swap_path(target_qubits, coupling_map, layout, qreg): - """Return an iterator that yields the swaps between virtual qubits needed to bring the two - virtual qubits in ``target_qubits`` together in the coupling map.""" - v_start, v_goal = target_qubits - start, goal = layout.logical_to_physical(qreg.index(v_start)), layout.logical_to_physical( - qreg.index(v_goal) - ) - # TODO: remove the list call once using retworkx 0.12, as the return value can be sliced. - path = list(retworkx.dijkstra_shortest_paths(coupling_map.graph, start, target=goal)[goal]) - # Swap both qubits towards the "centre" (as opposed to applying the same swaps to one) to - # parallelise and reduce depth. - split = len(path) // 2 - forwards, backwards = path[1:split], reversed(path[split:-1]) - for swap in forwards: - yield v_start, qreg[layout.physical_to_logical(swap)] - for swap in backwards: - yield v_goal, qreg[layout.physical_to_logical(swap)] diff --git a/src/nlayout.rs b/src/nlayout.rs index e4ca1223b33d..2d4ff5a29880 100644 --- a/src/nlayout.rs +++ b/src/nlayout.rs @@ -112,4 +112,8 @@ impl NLayout { pub fn swap_physical(&mut self, bit_a: usize, bit_b: usize) { self.swap(bit_a, bit_b) } + + pub fn copy(&self) -> NLayout { + self.clone() + } } diff --git a/src/sabre_swap/edge_list.rs b/src/sabre_swap/edge_list.rs deleted file mode 100644 index a1dbf0fb55e7..000000000000 --- a/src/sabre_swap/edge_list.rs +++ /dev/null @@ -1,101 +0,0 @@ -// This code is part of Qiskit. -// -// (C) Copyright IBM 2022 -// -// This code is licensed under the Apache License, Version 2.0. You may -// obtain a copy of this license in the LICENSE.txt file in the root directory -// of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. -// -// Any modifications or derivative works of this code must retain this -// copyright notice, and modified files need to carry a notice indicating -// that they have been altered from the originals. - -use pyo3::exceptions::PyIndexError; -use pyo3::prelude::*; - -/// A simple container that contains a vector representing edges in the -/// coupling map that are found to be optimal by the swap mapper. -#[pyclass(module = "qiskit._accelerate.sabre_swap")] -#[pyo3(text_signature = "(/)")] -#[derive(Clone, Debug)] -pub struct EdgeList { - pub edges: Vec<[usize; 2]>, -} - -impl Default for EdgeList { - fn default() -> Self { - Self::new(None) - } -} - -#[pymethods] -impl EdgeList { - #[new] - pub fn new(capacity: Option) -> Self { - match capacity { - Some(size) => EdgeList { - edges: Vec::with_capacity(size), - }, - None => EdgeList { edges: Vec::new() }, - } - } - - /// Append an edge to the list. - /// - /// Args: - /// edge_start (int): The start qubit of the edge. - /// edge_end (int): The end qubit of the edge. - #[pyo3(text_signature = "(self, edge_start, edge_end, /)")] - pub fn append(&mut self, edge_start: usize, edge_end: usize) { - self.edges.push([edge_start, edge_end]); - } - - pub fn __iter__(slf: PyRef) -> PyResult> { - let iter = EdgeListIter { - inner: slf.edges.clone().into_iter(), - }; - Py::new(slf.py(), iter) - } - - pub fn __len__(&self) -> usize { - self.edges.len() - } - - pub fn __contains__(&self, object: [usize; 2]) -> bool { - self.edges.contains(&object) - } - - pub fn __getitem__(&self, object: usize) -> PyResult<[usize; 2]> { - if object >= self.edges.len() { - return Err(PyIndexError::new_err(format!( - "Index {} out of range for this EdgeList", - object - ))); - } - Ok(self.edges[object]) - } - - fn __getstate__(&self) -> Vec<[usize; 2]> { - self.edges.clone() - } - - fn __setstate__(&mut self, state: Vec<[usize; 2]>) { - self.edges = state - } -} - -#[pyclass] -pub struct EdgeListIter { - inner: std::vec::IntoIter<[usize; 2]>, -} - -#[pymethods] -impl EdgeListIter { - fn __iter__(slf: PyRef) -> PyRef { - slf - } - - fn __next__(mut slf: PyRefMut) -> Option<[usize; 2]> { - slf.inner.next() - } -} diff --git a/src/sabre_swap/mod.rs b/src/sabre_swap/mod.rs index 73323cd446d4..a2301c56e31f 100644 --- a/src/sabre_swap/mod.rs +++ b/src/sabre_swap/mod.rs @@ -12,29 +12,38 @@ #![allow(clippy::too_many_arguments)] -pub mod edge_list; pub mod neighbor_table; -pub mod qubits_decay; -pub mod sabre_rng; +pub mod sabre_dag; +pub mod swap_map; +use std::cmp::Ordering; + +use hashbrown::{HashMap, HashSet}; use ndarray::prelude::*; +use numpy::IntoPyArray; use numpy::PyReadonlyArray2; use pyo3::prelude::*; use pyo3::wrap_pyfunction; use pyo3::Python; - -use hashbrown::HashSet; use rand::prelude::SliceRandom; +use rand::prelude::*; +use rand_pcg::Pcg64Mcg; use rayon::prelude::*; +use retworkx_core::dictmap::*; +use retworkx_core::petgraph::prelude::*; +use retworkx_core::petgraph::visit::EdgeRef; +use retworkx_core::shortest_path::dijkstra; use crate::getenv_use_multiple_threads; use crate::nlayout::NLayout; -use edge_list::EdgeList; use neighbor_table::NeighborTable; -use qubits_decay::QubitsDecay; -use sabre_rng::SabreRng; +use sabre_dag::SabreDAG; +use swap_map::SwapMap; +const EXTENDED_SET_SIZE: usize = 20; // Size of lookahead window. +const DECAY_RATE: f64 = 0.001; // Decay coefficient for penalizing serial swaps. +const DECAY_RESET_INTERVAL: u8 = 5; // How often to reset all decay rates to 1. const EXTENDED_SET_WEIGHT: f64 = 0.5; // Weight of lookahead window compared to front_layer. #[pyclass] @@ -53,16 +62,15 @@ pub enum Heuristic { /// /// Candidate swaps are sorted so SWAP(i,j) and SWAP(j,i) are not duplicated. fn obtain_swaps( - front_layer: &EdgeList, + front_layer: &[[usize; 2]], neighbors: &NeighborTable, layout: &NLayout, ) -> HashSet<[usize; 2]> { // This will likely under allocate as it's a function of the number of // neighbors for the qubits in the layer too, but this is basically a // minimum allocation assuming each qubit has only 1 unique neighbor - let mut candidate_swaps: HashSet<[usize; 2]> = - HashSet::with_capacity(2 * front_layer.edges.len()); - for node in &front_layer.edges { + let mut candidate_swaps: HashSet<[usize; 2]> = HashSet::with_capacity(2 * front_layer.len()); + for node in front_layer { for v in node { let physical = layout.logic_to_phys[*v]; for neighbor in &neighbors.neighbors[physical] { @@ -79,49 +87,274 @@ fn obtain_swaps( candidate_swaps } -/// Run the sabre heuristic scoring +fn obtain_extended_set( + dag: &SabreDAG, + front_layer: &[NodeIndex], + required_predecessors: &mut [u32], +) -> Vec<[usize; 2]> { + let mut extended_set: Vec<[usize; 2]> = Vec::new(); + let mut decremented: Vec = Vec::new(); + let mut tmp_front_layer: Vec = front_layer.to_vec(); + let mut done: bool = false; + while !tmp_front_layer.is_empty() && !done { + let mut new_tmp_front_layer = Vec::new(); + for node in tmp_front_layer { + for edge in dag.dag.edges(node) { + let successor_index = edge.target(); + let successor = successor_index.index(); + decremented.push(successor); + required_predecessors[successor] -= 1; + if required_predecessors[successor] == 0 { + new_tmp_front_layer.push(successor_index); + let node_weight = dag.dag.node_weight(successor_index).unwrap(); + let qargs = &node_weight.1; + if qargs.len() == 2 { + let extended_set_edges: [usize; 2] = [qargs[0], qargs[1]]; + extended_set.push(extended_set_edges); + } + } + } + if extended_set.len() >= EXTENDED_SET_SIZE { + done = true; + break; + } + } + tmp_front_layer = new_tmp_front_layer; + } + for node in decremented { + required_predecessors[node] += 1; + } + extended_set +} + +fn cmap_from_neighor_table(neighbor_table: &NeighborTable) -> DiGraph<(), ()> { + DiGraph::<(), ()>::from_edges(neighbor_table.neighbors.iter().enumerate().flat_map( + |(u, targets)| { + targets + .iter() + .map(move |v| (NodeIndex::new(u), NodeIndex::new(*v))) + }, + )) +} + +/// Run sabre swap on a circuit /// -/// Args: -/// layers (EdgeList): The input layer edge list to score and find the -/// best swaps -/// layout (NLayout): The current layout -/// neighbor_table (NeighborTable): The table of neighbors for each node -/// in the coupling graph -/// extended_set (EdgeList): The extended set -/// distance_matrix (ndarray): The 2D array distance matrix for the coupling -/// graph -/// qubits_decay (QubitsDecay): The current qubit decay factors for -/// heuristic (Heuristic): The chosen heuristic method to use /// Returns: -/// ndarray: A 2d array of the best swap candidates all with the minimum score +/// (SwapMap, gate_order): A tuple where the first element is a mapping of +/// DAGCircuit node ids to a list of virtual qubit swaps that should be +/// added before that operation. The second element is a numpy array of +/// node ids that represents the traversal order used by sabre. #[pyfunction] +pub fn build_swap_map( + py: Python, + num_qubits: usize, + dag: &SabreDAG, + neighbor_table: &NeighborTable, + distance_matrix: PyReadonlyArray2, + heuristic: &Heuristic, + seed: u64, + layout: &mut NLayout, +) -> PyResult<(SwapMap, PyObject)> { + let mut gate_order: Vec = Vec::with_capacity(dag.dag.node_count()); + let run_in_parallel = getenv_use_multiple_threads(); + let mut out_map: HashMap> = HashMap::new(); + let mut front_layer: Vec = dag.first_layer.clone(); + let max_iterations_without_progress = 10 * neighbor_table.neighbors.len(); + let mut ops_since_progress: Vec<[usize; 2]> = Vec::new(); + let mut required_predecessors: Vec = vec![0; dag.dag.node_count()]; + let mut extended_set: Option> = None; + let mut num_search_steps: u8 = 0; + let dist = distance_matrix.as_array(); + let coupling_graph: DiGraph<(), ()> = cmap_from_neighor_table(neighbor_table); + let mut qubits_decay: Vec = vec![1.; num_qubits]; + let mut rng = Pcg64Mcg::seed_from_u64(seed); + + for node in dag.dag.node_indices() { + for edge in dag.dag.edges(node) { + required_predecessors[edge.target().index()] += 1; + } + } + while !front_layer.is_empty() { + let mut execute_gate_list: Vec = Vec::new(); + // Remove as many immediately applicable gates as possible + let mut new_front_layer: Vec = Vec::new(); + for node in front_layer { + let node_weight = dag.dag.node_weight(node).unwrap(); + let qargs = &node_weight.1; + if qargs.len() == 2 { + let physical_qargs: [usize; 2] = [ + layout.logic_to_phys[qargs[0]], + layout.logic_to_phys[qargs[1]], + ]; + if coupling_graph + .find_edge( + NodeIndex::new(physical_qargs[0]), + NodeIndex::new(physical_qargs[1]), + ) + .is_none() + { + new_front_layer.push(node); + } else { + execute_gate_list.push(node); + } + } else { + execute_gate_list.push(node); + } + } + front_layer = new_front_layer.clone(); + + // Backtrack to the last time we made progress, then greedily insert swaps to route + // the gate with the smallest distance between its arguments. This is f block a release + // valve for the algorithm to avoid infinite loops only, and should generally not + // come into play for most circuits. + if execute_gate_list.is_empty() + && ops_since_progress.len() > max_iterations_without_progress + { + // If we're stuck in a loop without making progress first undo swaps: + ops_since_progress + .drain(..) + .rev() + .for_each(|swap| layout.swap_logical(swap[0], swap[1])); + // Then pick the closest pair in the current layer + let target_qubits = front_layer + .iter() + .map(|n| { + let node_weight = dag.dag.node_weight(*n).unwrap(); + let qargs = &node_weight.1; + [qargs[0], qargs[1]] + }) + .min_by(|qargs_a, qargs_b| { + let dist_a = dist[[ + layout.logic_to_phys[qargs_a[0]], + layout.logic_to_phys[qargs_a[1]], + ]]; + let dist_b = dist[[ + layout.logic_to_phys[qargs_b[0]], + layout.logic_to_phys[qargs_b[1]], + ]]; + dist_a.partial_cmp(&dist_b).unwrap_or(Ordering::Equal) + }) + .unwrap(); + // find Shortest path between target qubits + let mut shortest_paths: DictMap> = DictMap::new(); + let u = layout.logic_to_phys[target_qubits[0]]; + let v = layout.logic_to_phys[target_qubits[1]]; + (dijkstra( + &coupling_graph, + NodeIndex::::new(u), + Some(NodeIndex::::new(v)), + |_| Ok(1.), + Some(&mut shortest_paths), + ) as PyResult>>)?; + let shortest_path: Vec = shortest_paths + .get(&NodeIndex::new(v)) + .unwrap() + .iter() + .map(|n| n.index()) + .collect(); + // Insert greedy swaps along that shortest path + let split: usize = shortest_path.len() / 2; + let forwards = &shortest_path[1..split]; + let backwards = &shortest_path[split..shortest_path.len() - 1]; + let mut greedy_swaps: Vec<[usize; 2]> = Vec::with_capacity(split); + for swap in forwards { + let logical_swap_bit = layout.phys_to_logic[*swap]; + greedy_swaps.push([target_qubits[0], logical_swap_bit]); + layout.swap_logical(target_qubits[0], logical_swap_bit); + } + backwards.iter().rev().for_each(|swap| { + let logical_swap_bit = layout.phys_to_logic[*swap]; + greedy_swaps.push([target_qubits[1], logical_swap_bit]); + layout.swap_logical(target_qubits[1], logical_swap_bit); + }); + ops_since_progress = greedy_swaps; + continue; + } + if !execute_gate_list.is_empty() { + for node in execute_gate_list { + let node_weight = dag.dag.node_weight(node).unwrap(); + gate_order.push(node_weight.0); + let out_swaps: Vec<[usize; 2]> = ops_since_progress.drain(..).collect(); + if !out_swaps.is_empty() { + out_map.insert(dag.dag.node_weight(node).unwrap().0, out_swaps); + } + for edge in dag.dag.edges(node) { + let successor = edge.target().index(); + required_predecessors[successor] -= 1; + if required_predecessors[successor] == 0 { + front_layer.push(edge.target()); + } + } + } + qubits_decay.fill_with(|| 1.); + extended_set = None; + continue; + } + let first_layer: Vec<[usize; 2]> = front_layer + .iter() + .map(|n| { + let node_weight = dag.dag.node_weight(*n).unwrap(); + let qargs = &node_weight.1; + [qargs[0], qargs[1]] + }) + .collect(); + if extended_set.is_none() { + extended_set = Some(obtain_extended_set( + dag, + &front_layer, + &mut required_predecessors, + )); + } + + let best_swap = sabre_score_heuristic( + &first_layer, + layout, + neighbor_table, + extended_set.as_ref().unwrap(), + &dist, + &qubits_decay, + heuristic, + &mut rng, + run_in_parallel, + ); + num_search_steps += 1; + if num_search_steps % DECAY_RESET_INTERVAL == 0 { + qubits_decay.fill_with(|| 1.); + } else { + qubits_decay[best_swap[0]] += DECAY_RATE; + qubits_decay[best_swap[1]] += DECAY_RATE; + } + ops_since_progress.push(best_swap); + } + Ok((SwapMap { map: out_map }, gate_order.into_pyarray(py).into())) +} + pub fn sabre_score_heuristic( - layer: EdgeList, + layer: &[[usize; 2]], layout: &mut NLayout, neighbor_table: &NeighborTable, - extended_set: EdgeList, - distance_matrix: PyReadonlyArray2, - qubits_decay: QubitsDecay, + extended_set: &[[usize; 2]], + dist: &ArrayView2, + qubits_decay: &[f64], heuristic: &Heuristic, - rng: &mut SabreRng, + rng: &mut Pcg64Mcg, + run_in_parallel: bool, ) -> [usize; 2] { // Run in parallel only if we're not already in a multiprocessing context // unless force threads is set. - let run_in_parallel = getenv_use_multiple_threads(); - let dist = distance_matrix.as_array(); - let candidate_swaps = obtain_swaps(&layer, neighbor_table, layout); + let candidate_swaps = obtain_swaps(layer, neighbor_table, layout); let mut min_score = f64::MAX; let mut best_swaps: Vec<[usize; 2]> = Vec::new(); for swap_qubits in candidate_swaps { layout.swap_logical(swap_qubits[0], swap_qubits[1]); let score = score_heuristic( heuristic, - &layer.edges, - &extended_set.edges, + layer, + extended_set, layout, &swap_qubits, - &dist, - &qubits_decay.decay, + dist, + qubits_decay, ); if score < min_score { min_score = score; @@ -137,7 +370,9 @@ pub fn sabre_score_heuristic( } else { best_swaps.sort_unstable(); } - *best_swaps.choose(&mut rng.rng).unwrap() + let best_swap = *best_swaps.choose(rng).unwrap(); + layout.swap_logical(best_swap[0], best_swap[1]); + best_swap } #[inline] @@ -196,11 +431,10 @@ fn score_heuristic( #[pymodule] pub fn sabre_swap(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_wrapped(wrap_pyfunction!(sabre_score_heuristic))?; + m.add_wrapped(wrap_pyfunction!(build_swap_map))?; m.add_class::()?; - m.add_class::()?; - m.add_class::()?; m.add_class::()?; - m.add_class::()?; + m.add_class::()?; + m.add_class::()?; Ok(()) } diff --git a/src/sabre_swap/qubits_decay.rs b/src/sabre_swap/qubits_decay.rs deleted file mode 100644 index 0a5899af1bc5..000000000000 --- a/src/sabre_swap/qubits_decay.rs +++ /dev/null @@ -1,85 +0,0 @@ -// This code is part of Qiskit. -// -// (C) Copyright IBM 2022 -// -// This code is licensed under the Apache License, Version 2.0. You may -// obtain a copy of this license in the LICENSE.txt file in the root directory -// of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. -// -// Any modifications or derivative works of this code must retain this -// copyright notice, and modified files need to carry a notice indicating -// that they have been altered from the originals. - -use numpy::IntoPyArray; -use pyo3::exceptions::PyIndexError; -use pyo3::prelude::*; -use pyo3::Python; - -/// A container for qubit decay values for each qubit -/// -/// This class tracks the qubit decay for the sabre heuristic. When initialized -/// all qubits are set to a value of ``1.``. This class implements the sequence -/// protocol and can be modified in place like any python sequence. -/// -/// Args: -/// qubit_count (int): The number of qubits -#[pyclass(module = "qiskit._accelerate.sabre_swap")] -#[pyo3(text_signature = "(qubit_indices, logical_qubits, physical_qubits, /)")] -#[derive(Clone, Debug)] -pub struct QubitsDecay { - pub decay: Vec, -} - -#[pymethods] -impl QubitsDecay { - #[new] - pub fn new(qubit_count: usize) -> Self { - QubitsDecay { - decay: vec![1.; qubit_count], - } - } - - // Mapping Protocol - pub fn __len__(&self) -> usize { - self.decay.len() - } - - pub fn __contains__(&self, object: f64) -> bool { - self.decay.contains(&object) - } - - pub fn __getitem__(&self, object: usize) -> PyResult { - match self.decay.get(object) { - Some(val) => Ok(*val), - None => Err(PyIndexError::new_err(format!( - "Index {} out of range for this EdgeList", - object - ))), - } - } - - pub fn __setitem__(mut slf: PyRefMut, object: usize, value: f64) -> PyResult<()> { - if object >= slf.decay.len() { - return Err(PyIndexError::new_err(format!( - "Index {} out of range for this EdgeList", - object - ))); - } - slf.decay[object] = value; - Ok(()) - } - - pub fn __array__(&self, py: Python) -> PyObject { - self.decay.clone().into_pyarray(py).into() - } - - pub fn __str__(&self) -> PyResult { - Ok(format!("{:?}", self.decay)) - } - - /// Reset decay for all qubits back to default ``1.`` - #[pyo3(text_signature = "(self, /)")] - pub fn reset(mut slf: PyRefMut) { - slf.decay.fill_with(|| 1.); - } -} diff --git a/src/sabre_swap/sabre_dag.rs b/src/sabre_swap/sabre_dag.rs new file mode 100644 index 000000000000..bb60b990b2f9 --- /dev/null +++ b/src/sabre_swap/sabre_dag.rs @@ -0,0 +1,69 @@ +// This code is part of Qiskit. +// +// (C) Copyright IBM 2022 +// +// This code is licensed under the Apache License, Version 2.0. You may +// obtain a copy of this license in the LICENSE.txt file in the root directory +// of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +// +// Any modifications or derivative works of this code must retain this +// copyright notice, and modified files need to carry a notice indicating +// that they have been altered from the originals. + +use hashbrown::HashMap; +use numpy::PyReadonlyArray1; +use pyo3::prelude::*; +use retworkx_core::petgraph::prelude::*; + +/// A DAG object used to represent the data interactions from a DAGCircuit +/// to run the the sabre algorithm. This is structurally identical to the input +/// DAGCircuit, but the contents of the node are a tuple of DAGCircuit node ids, +/// a list of qargs and a list of cargs +#[pyclass(module = "qiskit._accelerate.sabre_swap")] +#[pyo3(text_signature = "(num_qubits, num_clbits, nodes, front_layer, /)")] +#[derive(Clone, Debug)] +pub struct SabreDAG { + pub dag: DiGraph<(usize, Vec, Vec), ()>, + pub first_layer: Vec, +} + +#[pymethods] +impl SabreDAG { + #[new] + pub fn new( + num_qubits: usize, + num_clbits: usize, + nodes: Vec<(usize, Vec, Vec)>, + front_layer: PyReadonlyArray1, + ) -> PyResult { + let mut qubit_pos: Vec = vec![usize::MAX; num_qubits]; + let mut clbit_pos: Vec = vec![usize::MAX; num_clbits]; + let mut reverse_index_map: HashMap = HashMap::with_capacity(nodes.len()); + let mut dag: DiGraph<(usize, Vec, Vec), ()> = + Graph::with_capacity(nodes.len(), 2 * nodes.len()); + for node in &nodes { + let qargs = &node.1; + let cargs = &node.2; + let gate_index = dag.add_node(node.clone()); + reverse_index_map.insert(node.0, gate_index); + for x in qargs { + if qubit_pos[*x] != usize::MAX { + dag.add_edge(NodeIndex::new(qubit_pos[*x]), gate_index, ()); + } + qubit_pos[*x] = gate_index.index(); + } + for x in cargs { + if clbit_pos[*x] != usize::MAX { + dag.add_edge(NodeIndex::new(qubit_pos[*x]), gate_index, ()); + } + clbit_pos[*x] = gate_index.index(); + } + } + let first_layer = front_layer + .as_slice()? + .iter() + .map(|x| reverse_index_map[x]) + .collect(); + Ok(SabreDAG { dag, first_layer }) + } +} diff --git a/src/sabre_swap/sabre_rng.rs b/src/sabre_swap/sabre_rng.rs deleted file mode 100644 index 79a4a70acb13..000000000000 --- a/src/sabre_swap/sabre_rng.rs +++ /dev/null @@ -1,35 +0,0 @@ -// This code is part of Qiskit. -// -// (C) Copyright IBM 2022 -// -// This code is licensed under the Apache License, Version 2.0. You may -// obtain a copy of this license in the LICENSE.txt file in the root directory -// of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. -// -// Any modifications or derivative works of this code must retain this -// copyright notice, and modified files need to carry a notice indicating -// that they have been altered from the originals. - -use pyo3::prelude::*; -use rand::prelude::*; -use rand_pcg::Pcg64Mcg; - -/// A rng container that shares an rng state between python and sabre's rust -/// code. It should be initialized once and passed to -/// ``sabre_score_heuristic`` to avoid recreating a rng on the inner loop -#[pyclass(module = "qiskit._accelerate.sabre_swap")] -#[pyo3(text_signature = "(/)")] -#[derive(Clone, Debug)] -pub struct SabreRng { - pub rng: Pcg64Mcg, -} - -#[pymethods] -impl SabreRng { - #[new] - pub fn new(seed: u64) -> Self { - SabreRng { - rng: Pcg64Mcg::seed_from_u64(seed), - } - } -} diff --git a/src/sabre_swap/swap_map.rs b/src/sabre_swap/swap_map.rs new file mode 100644 index 000000000000..b14d9c72ecdc --- /dev/null +++ b/src/sabre_swap/swap_map.rs @@ -0,0 +1,48 @@ +// This code is part of Qiskit. +// +// (C) Copyright IBM 2022 +// +// This code is licensed under the Apache License, Version 2.0. You may +// obtain a copy of this license in the LICENSE.txt file in the root directory +// of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +// +// Any modifications or derivative works of this code must retain this +// copyright notice, and modified files need to carry a notice indicating +// that they have been altered from the originals. + +use hashbrown::HashMap; +use pyo3::exceptions::PyIndexError; +use pyo3::prelude::*; + +/// A container for required swaps before a gate qubit +#[pyclass(module = "qiskit._accelerate.sabre_swap")] +#[derive(Clone, Debug)] +pub struct SwapMap { + pub map: HashMap>, +} + +#[pymethods] +impl SwapMap { + // Mapping Protocol + pub fn __len__(&self) -> usize { + self.map.len() + } + + pub fn __contains__(&self, object: usize) -> bool { + self.map.contains_key(&object) + } + + pub fn __getitem__(&self, object: usize) -> PyResult> { + match self.map.get(&object) { + Some(val) => Ok(val.clone()), + None => Err(PyIndexError::new_err(format!( + "Node index {} not in swap mapping", + object + ))), + } + } + + pub fn __str__(&self) -> PyResult { + Ok(format!("{:?}", self.map)) + } +} diff --git a/tox.ini b/tox.ini index 0561b10732a7..d2bf7ad9f7a5 100644 --- a/tox.ini +++ b/tox.ini @@ -14,7 +14,7 @@ setenv = QISKIT_SUPRESS_PACKAGING_WARNINGS=Y QISKIT_TEST_CAPTURE_STREAMS=1 QISKIT_PARALLEL=FALSE -passenv = RAYON_NUM_THREADS OMP_NUM_THREADS QISKIT_PARALLEL SETUPTOOLS_ENABLE_FEATURES +passenv = RAYON_NUM_THREADS OMP_NUM_THREADS QISKIT_PARALLEL RUST_BACKTRACE SETUPTOOLS_ENABLE_FEATURES deps = -r{toxinidir}/requirements.txt -r{toxinidir}/requirements-dev.txt commands = From f3d885e84a96d757c0a936b9d2e0fcddce9af830 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Mon, 22 Aug 2022 15:10:34 -0400 Subject: [PATCH 17/54] Remove time_taken assertion from amplitude estimator tests (#8582) This commit removes the assertions in `test.python.algorithms.test_amplitude_estimators` for testing that time_taken is > 0. This assertion is not necessary or important for the validation of the amplitude estimation functionality being tested. Additionally, they exact behavior is dependent on local execution speed and the granularity of the system calls used for time of the particular local environment the tests are running on. We have been encountering occasional failures on Windows because of the fragile nature of these assertions. Since the assertions aren't really critical to validating the functionality and are problematic on some environments this commit just opts to remove the assertions. Fixes #8577 Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- test/python/algorithms/test_amplitude_estimators.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/python/algorithms/test_amplitude_estimators.py b/test/python/algorithms/test_amplitude_estimators.py index ce7bb6ecb599..0b41e863aed2 100644 --- a/test/python/algorithms/test_amplitude_estimators.py +++ b/test/python/algorithms/test_amplitude_estimators.py @@ -130,7 +130,6 @@ def test_statevector(self, prob, qae, expect): problem = EstimationProblem(BernoulliStateIn(prob), 0, BernoulliGrover(prob)) result = qae.estimate(problem) - self.assertGreaterEqual(self._statevector.time_taken, 0.0) self._statevector.reset_execution_results() for key, value in expect.items(): self.assertAlmostEqual( @@ -350,7 +349,6 @@ def test_statevector(self, n, qae, expect): # result = qae.run(self._statevector) result = qae.estimate(estimation_problem) - self.assertGreaterEqual(self._statevector.time_taken, 0.0) self._statevector.reset_execution_results() for key, value in expect.items(): self.assertAlmostEqual( @@ -409,7 +407,6 @@ def test_confidence_intervals(self, qae, key, expect): # statevector simulator result = qae.estimate(estimation_problem) - self.assertGreater(self._statevector.time_taken, 0.0) self._statevector.reset_execution_results() methods = ["lr", "fi", "oi"] # short for likelihood_ratio, fisher, observed_fisher alphas = [0.1, 0.00001, 0.9] # alpha shouldn't matter in statevector @@ -438,7 +435,6 @@ def test_iqae_confidence_intervals(self): # statevector simulator result = qae.estimate(estimation_problem) - self.assertGreaterEqual(self._statevector.time_taken, 0.0) self._statevector.reset_execution_results() confint = result.confidence_interval # confidence interval based on statevector should be empty, as we are sure of the result From dfca1fb90d2ba18ca6f9d27f311a468fc1f3e1bf Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Mon, 22 Aug 2022 17:20:09 -0400 Subject: [PATCH 18/54] Revert "Pin setuptools in CI (#8526)" (#8530) * Revert "Pin setuptools in CI (#8526)" With the release of setuptools 64.0.1 the issues previously blocking CI and editable installs more generally should have fixed now. This commit reverts the pins previously introduced to unblock CI and work around the broken release. This reverts commit 82e38d1de0ea950457d647955471404b044910b8. * Add back SETUPTOOLS_ENABLE_FEATURES env var for legacy editable install Co-authored-by: Jake Lishman Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .azure/docs-linux.yml | 4 ++-- .azure/lint-linux.yml | 2 +- .azure/test-linux.yml | 3 +-- .azure/test-macos.yml | 2 +- .azure/test-windows.yml | 2 +- constraints.txt | 4 ---- pyproject.toml | 2 +- 7 files changed, 7 insertions(+), 12 deletions(-) diff --git a/.azure/docs-linux.yml b/.azure/docs-linux.yml index 0f8e3015c0eb..83026963219d 100644 --- a/.azure/docs-linux.yml +++ b/.azure/docs-linux.yml @@ -30,8 +30,8 @@ jobs: - bash: | set -e - python -m pip install --upgrade pip 'setuptools<64.0.0' wheel -c constraints.txt - pip install -U tox -c constraints.txt + python -m pip install --upgrade pip setuptools wheel + pip install -U tox sudo apt-get update sudo apt-get install -y graphviz displayName: 'Install dependencies' diff --git a/.azure/lint-linux.yml b/.azure/lint-linux.yml index f184ccd7470f..fef32e8acdb7 100644 --- a/.azure/lint-linux.yml +++ b/.azure/lint-linux.yml @@ -28,7 +28,7 @@ jobs: - bash: | set -e - python -m pip install --upgrade pip 'setuptools<64.0.0' wheel virtualenv -c constraints.txt + python -m pip install --upgrade pip setuptools wheel virtualenv virtualenv test-job source test-job/bin/activate pip install -U -r requirements.txt -r requirements-dev.txt -c constraints.txt diff --git a/.azure/test-linux.yml b/.azure/test-linux.yml index 57b18e698373..4ea728d46032 100644 --- a/.azure/test-linux.yml +++ b/.azure/test-linux.yml @@ -62,7 +62,7 @@ jobs: - bash: | set -e - python -m pip install --upgrade pip 'setuptools<64.0.0' wheel virtualenv -c constraints.txt + python -m pip install --upgrade pip setuptools wheel virtualenv virtualenv test-job displayName: "Prepare venv" @@ -87,7 +87,6 @@ jobs: env: SETUPTOOLS_ENABLE_FEATURES: "legacy-editable" - - bash: | set -e source test-job/bin/activate diff --git a/.azure/test-macos.yml b/.azure/test-macos.yml index 895197098f5e..69aca4e0c1e0 100644 --- a/.azure/test-macos.yml +++ b/.azure/test-macos.yml @@ -41,7 +41,7 @@ jobs: - bash: | set -e - python -m pip install --upgrade pip 'setuptools<64.0.0' wheel virtualenv -c constraints.txt + python -m pip install --upgrade pip setuptools wheel virtualenv virtualenv test-job source test-job/bin/activate pip install -U -r requirements.txt -r requirements-dev.txt -c constraints.txt diff --git a/.azure/test-windows.yml b/.azure/test-windows.yml index 31cca7ba2ed6..a1e4e85a1f9b 100644 --- a/.azure/test-windows.yml +++ b/.azure/test-windows.yml @@ -30,7 +30,7 @@ jobs: - bash: | set -e - python -m pip install --upgrade pip 'setuptools<64.0.0' wheel virtualenv -c constraints.txt + python -m pip install --upgrade pip setuptools wheel virtualenv virtualenv test-job source test-job/Scripts/activate pip install -r requirements.txt -r requirements-dev.txt -c constraints.txt diff --git a/constraints.txt b/constraints.txt index bf4e304596c5..3cb8598cb345 100644 --- a/constraints.txt +++ b/constraints.txt @@ -13,7 +13,3 @@ pyparsing<3.0.0 # to work with the new jinja version (the jinja maintainers aren't going to # fix things) pin to the previous working version. jinja2==3.0.3 - -# setuptools 64.0.0 breaks editable installs. Pin to an old version until -# see https://github.com/pypa/setuptools/issues/3498 -setuptools==63.3.0 diff --git a/pyproject.toml b/pyproject.toml index 728e2a2be55a..9282c3b8c8d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools", "wheel", "setuptools-rust<1.5.0"] +requires = ["setuptools", "wheel", "setuptools-rust"] build-backend = "setuptools.build_meta" [tool.black] From 3f9edfc83e6effdacbcce063361878d96b5ed1d5 Mon Sep 17 00:00:00 2001 From: Naoki Kanazawa Date: Tue, 23 Aug 2022 07:35:42 +0900 Subject: [PATCH 19/54] Add logic to return channels to FakeBackendV2 (#8444) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/providers/backend.py | 2 +- .../providers/fake_provider/fake_backend.py | 101 +++++++++++++++++- ...-in--fake-backend-v2-82f0650006495fbe.yaml | 7 ++ test/python/providers/test_backend_v2.py | 44 ++++++++ 4 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/support-channels-in--fake-backend-v2-82f0650006495fbe.yaml diff --git a/qiskit/providers/backend.py b/qiskit/providers/backend.py index 2690583bd575..7ed69cadfa12 100644 --- a/qiskit/providers/backend.py +++ b/qiskit/providers/backend.py @@ -553,7 +553,7 @@ def control_channel(self, qubits: Iterable[int]): ``(control_qubit, target_qubit)``. Returns: - List[ControlChannel]: The Qubit measurement acquisition line. + List[ControlChannel]: The multi qubit control line. Raises: NotImplementedError: if the backend doesn't support querying the diff --git a/qiskit/providers/fake_provider/fake_backend.py b/qiskit/providers/fake_provider/fake_backend.py index 5bae916970f0..7554f819dce5 100644 --- a/qiskit/providers/fake_provider/fake_backend.py +++ b/qiskit/providers/fake_provider/fake_backend.py @@ -17,10 +17,12 @@ """ import warnings +import collections import json import os +import re -from typing import List +from typing import List, Iterable from qiskit import circuit from qiskit.providers.models import BackendProperties @@ -84,6 +86,36 @@ def __init__(self): self._target = None self.sim = None + if "channels" in self._conf_dict: + self._parse_channels(self._conf_dict["channels"]) + + def _parse_channels(self, channels): + type_map = { + "acquire": pulse.AcquireChannel, + "drive": pulse.DriveChannel, + "measure": pulse.MeasureChannel, + "control": pulse.ControlChannel, + } + identifier_pattern = re.compile(r"\D+(?P\d+)") + + channels_map = { + "acquire": collections.defaultdict(list), + "drive": collections.defaultdict(list), + "measure": collections.defaultdict(list), + "control": collections.defaultdict(list), + } + for identifier, spec in channels.items(): + channel_type = spec["type"] + out = re.match(identifier_pattern, identifier) + if out is None: + # Identifier is not a valid channel name format + continue + channel_index = int(out.groupdict()["index"]) + qubit_index = tuple(spec["operates"]["qubits"]) + chan_obj = type_map[channel_type](channel_index) + channels_map[channel_type][qubit_index].append(chan_obj) + setattr(self, "channels_map", channels_map) + def _setup_sim(self): if _optionals.HAS_AER: from qiskit.providers import aer @@ -193,6 +225,73 @@ def meas_map(self) -> List[List[int]]: """ return self._conf_dict.get("meas_map") + def drive_channel(self, qubit: int): + """Return the drive channel for the given qubit. + + This is required to be implemented if the backend supports Pulse + scheduling. + + Returns: + DriveChannel: The Qubit drive channel + """ + drive_channels_map = getattr(self, "channels_map", {}).get("drive", {}) + qubits = (qubit,) + if qubits in drive_channels_map: + return drive_channels_map[qubits][0] + return None + + def measure_channel(self, qubit: int): + """Return the measure stimulus channel for the given qubit. + + This is required to be implemented if the backend supports Pulse + scheduling. + + Returns: + MeasureChannel: The Qubit measurement stimulus line + """ + measure_channels_map = getattr(self, "channels_map", {}).get("measure", {}) + qubits = (qubit,) + if qubits in measure_channels_map: + return measure_channels_map[qubits][0] + return None + + def acquire_channel(self, qubit: int): + """Return the acquisition channel for the given qubit. + + This is required to be implemented if the backend supports Pulse + scheduling. + + Returns: + AcquireChannel: The Qubit measurement acquisition line. + """ + acquire_channels_map = getattr(self, "channels_map", {}).get("acquire", {}) + qubits = (qubit,) + if qubits in acquire_channels_map: + return acquire_channels_map[qubits][0] + return None + + def control_channel(self, qubits: Iterable[int]): + """Return the secondary drive channel for the given qubit + + This is typically utilized for controlling multiqubit interactions. + This channel is derived from other channels. + + This is required to be implemented if the backend supports Pulse + scheduling. + + Args: + qubits: Tuple or list of qubits of the form + ``(control_qubit, target_qubit)``. + + Returns: + List[ControlChannel]: The multi qubit control line. + """ + control_channels_map = getattr(self, "channels_map", {}).get("control", {}) + qubits = tuple(qubits) + if qubits in control_channels_map: + return control_channels_map[qubits] + return [] + def run(self, run_input, **options): """Run on the fake backend using a simulator. diff --git a/releasenotes/notes/support-channels-in--fake-backend-v2-82f0650006495fbe.yaml b/releasenotes/notes/support-channels-in--fake-backend-v2-82f0650006495fbe.yaml new file mode 100644 index 000000000000..9d01cc969f05 --- /dev/null +++ b/releasenotes/notes/support-channels-in--fake-backend-v2-82f0650006495fbe.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + All fake backends in :mod:`qiskit.providers.fake_provider.backends` have been + updated to return the corresponding pulse channel objects with the method call of + :meth:`~BackendV2.drive_channel`, :meth:`~BackendV2.measure_channel`, + :meth:`~BackendV2.acquire_channel`, :meth:`~BackendV2.control_channel`. diff --git a/test/python/providers/test_backend_v2.py b/test/python/providers/test_backend_v2.py index 1be5c96950b3..016e6feb41b7 100644 --- a/test/python/providers/test_backend_v2.py +++ b/test/python/providers/test_backend_v2.py @@ -31,7 +31,9 @@ FakeBackendSimple, FakeBackendV2LegacyQubitProps, ) +from qiskit.providers.fake_provider.backends import FakeBogotaV2 from qiskit.quantum_info import Operator +from qiskit.pulse import channels @ddt @@ -190,3 +192,45 @@ def test_transpile_parse_inst_map(self): """Test that transpiler._parse_inst_map() supports BackendV2.""" inst_map = _parse_inst_map(inst_map=None, backend=self.backend) self.assertIsInstance(inst_map, InstructionScheduleMap) + + @data(0, 1, 2, 3, 4) + def test_drive_channel(self, qubit): + """Test getting drive channel with qubit index.""" + backend = FakeBogotaV2() + chan = backend.drive_channel(qubit) + ref = channels.DriveChannel(qubit) + self.assertEqual(chan, ref) + + @data(0, 1, 2, 3, 4) + def test_measure_channel(self, qubit): + """Test getting measure channel with qubit index.""" + backend = FakeBogotaV2() + chan = backend.measure_channel(qubit) + ref = channels.MeasureChannel(qubit) + self.assertEqual(chan, ref) + + @data(0, 1, 2, 3, 4) + def test_acquire_channel(self, qubit): + """Test getting acquire channel with qubit index.""" + backend = FakeBogotaV2() + chan = backend.acquire_channel(qubit) + ref = channels.AcquireChannel(qubit) + self.assertEqual(chan, ref) + + @data((4, 3), (3, 4), (3, 2), (2, 3), (1, 2), (2, 1), (1, 0), (0, 1)) + def test_control_channel(self, qubits): + """Test getting acquire channel with qubit index.""" + bogota_cr_channels_map = { + (4, 3): 7, + (3, 4): 6, + (3, 2): 5, + (2, 3): 4, + (1, 2): 2, + (2, 1): 3, + (1, 0): 1, + (0, 1): 0, + } + backend = FakeBogotaV2() + chan = backend.control_channel(qubits)[0] + ref = channels.ControlChannel(bogota_cr_channels_map[qubits]) + self.assertEqual(chan, ref) From e6e5ff6ac6d104613666b6144092b7451cd786e6 Mon Sep 17 00:00:00 2001 From: dlasecki Date: Tue, 23 Aug 2022 08:55:07 -0700 Subject: [PATCH 20/54] Variational Quantum Time Evolution algorithm. (#8152) * Fixed requirements-dev.txt * Fixed some pylint. * Fixed some pylint. * Update Documentation variational principles * updates documentation * minor documentation * Added unit tests docs and some package docs. * Code refactoring. * Code refactoring. * Code refactoring. * Update qiskit/opflow/evolutions/pauli_trotter_evolution.py Co-authored-by: Julien Gacon * Renamed the main folder. * Code refactoring. * Update qiskit/algorithms/quantum_time_evolution/variational/calculators/evolution_grad_calculator.py Co-authored-by: Julien Gacon * Code refactoring. * Update qiskit/algorithms/time_evolution/variational/error_calculators/gradient_errors/error_calculator.py Co-authored-by: Julien Gacon * Code refactoring. * Lint fixes. * Code refactoring. * Code refactoring. * Code refactoring. * Code refactoring. * Code refactoring, docs fixed. * Code refactoring, docs fixed. * Code refactoring and docs improved. * Exposed optimizer tolerance as an argument. * Exposed allowed imaginary part as an argument. * Exposed allowed numerical instability as an argument. * Code refactoring. * Introduced evolution_result.py class. * Minor bugfix. * Integrated evolution result to VarQte algorithms. * Code refactoring. * Black formatting fix. * Fixed signatures. * Fixed random seed setup. * Fixed too long lines. * Deleted unnecessary files. * Some fixes in test_gradients.py * Copyright date updated. * Refactored getting rid of flags. * Updated unit tests after refactoring. * Removed a duplicated argument. * Implemented general Quantum Time Evolution Framework interfaces. * Updated docs. * Reno added. * Improved reno. * Code refactoring. * Code refactoring. * Typehints added. * Made variational_principle.py stateless. * Updated copyright years. * Simplified var_qte.py class. * Refactored var_qte_linear_solver.py * Refactored abstract_ode_function_generator.py * Refactored var_qte_linear_solver.py * Refactored var_qte.py * Code formatting. * ODE solvers and optimizers as objects, not strings. * Update qiskit/algorithms/time_evolution/evolution_base.py Co-authored-by: Julien Gacon * Code refactoring. * Introduced evolution problem classes. * Code refactoring. * Apply suggestions from code review Co-authored-by: Julien Gacon * Added unit tests. * Lint fixed. * Code refactoring. * Removed error_based_ode_function_generator.py for MVP. * Code refactoring * Code refactoring * Code refactoring * Code refactoring * Code refactoring * Code review changes. * Removed gradient code for now. * Evolving observable removed. Evaluating observables added. * Improved naming. * Improved folder structure; filled evolvers init file. * Added Evolvers to algorithms init file. * Fixed missing imports. * Code refactoring * Fixed cyclic imports. * Extracted ListOrDict. * Code refactoring. * Code refactoring. * Fixed release note. * Fixed inheritance order. * Code refactoring. * Code refactoring. * Fixed cyclic imports. * Name fix. * Updated the algorithm to the latest version of interfaces. * Code refactoring. * Adapted unit tests to evolution problem. * Implemented aux_ops evaluation. * Fixed position of quantum_instance. * Added algorithms to algorithms init. * Imports refactoring. * Imports refactoring. * Updated code to the latest gradient framework. * Code refactoring. * Imports refactoring. * Added gradient files. * Code review addressed. Fixed tests. * Switched to 1 sampler. * Added unit tests for expected errors. * Improved docs. * Changed folder structure. * Added test_evolution_grad_calculator.py unit test with bases. * Updated interfaces. * Added VarQite unit test with aux ops. * Added VarQite unit test with aux ops. * Added VarQrte unit test with aux ops. * Update releasenotes/notes/add-variational-quantum-time-evolution-112ffeaf62782fea.yaml Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Code refactoring. * Code refactoring. * Code refactoring. * Improved docs of variational principles. * Code refactoring. * Code refactoring. * Simplified var principles folder structure. * Opened VarQte algorithms for field modification. * Improved Sphinx docs. * Code refactoring. * Introduced ode_function_factory.py * Removed hardcoded rcond. * Renamed hamiltonian_value_dict. * Renamed hamiltonian_value_dict. * Extracted lengthy expected results in tests. * Updated unit tests. * Apply suggestions from code review Co-authored-by: Julien Gacon * Apply suggestions from code review * Extended release notes. * Removed dead code. * Improved ode solver types. * Moved evolve method for now. * Shortened Var Principles names. * Updated metric_tensor_calculator.py * Updated docs * Removed ordered_parameters. * Added and corrected code examples. * Extended unit tests. * Extended unit tests. * Extended unit tests. * Improved init files. * Improved init files. * Improved init files. * Improved init files. * Improved docs. * Import fix * Renamed sle to lse. * Code refactoring. * Replaced metric tensor calculator. * Replaced evolution gradient calculator. * Code refactoring. * Removed evolution_grad_calculator.py * Removed evolution_grad_calculator.py * Evolution grad calculator removal; code refactoring; dirty bug fix. * Added docs. * Code refactoring * Improved performance of evolution grad. * Improved performance of evolution grad, code refactoring; bug fixed. * Improved LSE solver handling. * Improved docs. * Unindented reno * Mitigated some cyclic imports. * Unindented reno * Improved docs * Lint resolutions * Fix some line-too-long in tests * Fixed lint. * Fixed lint. * Apply suggestions from code review Co-authored-by: Julien Gacon * Code review changes. * Added reno for a bug fix. * Fixed lint. * Updated docs. * Moved lse_solver to ODE factory. * Made ODE factory optional and defaults set. * Added expectation method argument and set defaults to PauliExpectation. * Limited supported methods for real_time_dependent_principle.py. * Fix imports. * Updated docs. * Implemented the Forward Euler ODE solver. Implemented a unit test. * Set Forward Euler ODE solver as a default. Updated unit tests. * Sync with main. * Exposed ODE number of steps. * Code refactoring * Code refactoring * Code refactoring * Exposed ode_num_t_steps to the user; reduced default ode_num_t_steps; added ForwardEulerSolver to docs. * Updated tests. * Fixed CI. * Fixed docs. * Hides OdeFunction from the user. * Update qiskit/algorithms/evolvers/variational/var_qrte.py Co-authored-by: Julien Gacon * Update releasenotes/notes/add-variational-quantum-time-evolution-112ffeaf62782fea.yaml Co-authored-by: Julien Gacon * Removes unsupported error-based method flag for now. * Switched num time steps to deltas in ODEs. * Code refactoring. * Fixed typhint. * Switched back to num_steps for ODE. * Slow tests and code refactoring. * Code refactoring. * Removed TD variational principle. * Apply suggestions from code review Co-authored-by: Julien Gacon * Code refactoring. * Improved signatures; support for list of parameter values. * Code refactoring. * Improved variable name. * Updated docs. Co-authored-by: CZ Co-authored-by: Julien Gacon Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> Co-authored-by: woodsp-ibm Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/algorithms/__init__.py | 18 ++ .../algorithms/evolvers/evolution_problem.py | 12 +- .../evolvers/trotterization/trotter_qrte.py | 2 +- .../evolvers/variational/__init__.py | 139 ++++++++ .../evolvers/variational/solvers/__init__.py | 44 +++ .../variational/solvers/ode/__init__.py | 13 + .../solvers/ode/abstract_ode_function.py | 52 +++ .../solvers/ode/forward_euler_solver.py | 73 +++++ .../variational/solvers/ode/ode_function.py | 43 +++ .../solvers/ode/ode_function_factory.py | 83 +++++ .../solvers/ode/var_qte_ode_solver.py | 83 +++++ .../solvers/var_qte_linear_solver.py | 160 +++++++++ .../evolvers/variational/var_qite.py | 125 ++++++++ .../evolvers/variational/var_qrte.py | 126 ++++++++ .../evolvers/variational/var_qte.py | 303 ++++++++++++++++++ .../variational_principles/__init__.py | 25 ++ .../imaginary_mc_lachlan_principle.py | 76 +++++ .../imaginary_variational_principle.py | 24 ++ .../real_mc_lachlan_principle.py | 150 +++++++++ .../real_variational_principle.py | 42 +++ .../variational_principle.py | 129 ++++++++ qiskit/opflow/gradients/derivative_base.py | 11 +- ...antum-time-evolution-112ffeaf62782fea.yaml | 50 +++ ...fix-gradient-wrapper-2f9ab45941739044.yaml | 7 + .../evolvers/test_evolution_problem.py | 24 +- .../trotterization/test_trotter_qrte.py | 6 +- .../evolvers/variational/__init__.py | 11 + .../evolvers/variational/solvers/__init__.py | 11 + .../solvers/expected_results/__init__.py | 12 + .../test_varqte_linear_solver_expected_1.py | 182 +++++++++++ .../variational/solvers/ode/__init__.py | 11 + .../solvers/ode/test_forward_euler_solver.py | 47 +++ .../solvers/ode/test_ode_function.py | 165 ++++++++++ .../solvers/ode/test_var_qte_ode_solver.py | 136 ++++++++ .../solvers/test_varqte_linear_solver.py | 115 +++++++ .../evolvers/variational/test_var_qite.py | 287 +++++++++++++++++ .../evolvers/variational/test_var_qrte.py | 234 ++++++++++++++ .../evolvers/variational/test_var_qte.py | 78 +++++ .../variational_principles/__init__.py | 11 + .../expected_results/__init__.py | 12 + ...lachlan_variational_principle_expected1.py | 182 +++++++++++ ...lachlan_variational_principle_expected2.py | 182 +++++++++++ ...lachlan_variational_principle_expected3.py | 182 +++++++++++ .../imaginary/__init__.py | 11 + .../test_imaginary_mc_lachlan_principle.py | 111 +++++++ .../variational_principles/real/__init__.py | 11 + .../real/test_real_mc_lachlan_principle.py | 114 +++++++ 47 files changed, 3896 insertions(+), 29 deletions(-) create mode 100644 qiskit/algorithms/evolvers/variational/__init__.py create mode 100644 qiskit/algorithms/evolvers/variational/solvers/__init__.py create mode 100644 qiskit/algorithms/evolvers/variational/solvers/ode/__init__.py create mode 100644 qiskit/algorithms/evolvers/variational/solvers/ode/abstract_ode_function.py create mode 100644 qiskit/algorithms/evolvers/variational/solvers/ode/forward_euler_solver.py create mode 100644 qiskit/algorithms/evolvers/variational/solvers/ode/ode_function.py create mode 100644 qiskit/algorithms/evolvers/variational/solvers/ode/ode_function_factory.py create mode 100644 qiskit/algorithms/evolvers/variational/solvers/ode/var_qte_ode_solver.py create mode 100644 qiskit/algorithms/evolvers/variational/solvers/var_qte_linear_solver.py create mode 100644 qiskit/algorithms/evolvers/variational/var_qite.py create mode 100644 qiskit/algorithms/evolvers/variational/var_qrte.py create mode 100644 qiskit/algorithms/evolvers/variational/var_qte.py create mode 100644 qiskit/algorithms/evolvers/variational/variational_principles/__init__.py create mode 100644 qiskit/algorithms/evolvers/variational/variational_principles/imaginary_mc_lachlan_principle.py create mode 100644 qiskit/algorithms/evolvers/variational/variational_principles/imaginary_variational_principle.py create mode 100644 qiskit/algorithms/evolvers/variational/variational_principles/real_mc_lachlan_principle.py create mode 100644 qiskit/algorithms/evolvers/variational/variational_principles/real_variational_principle.py create mode 100644 qiskit/algorithms/evolvers/variational/variational_principles/variational_principle.py create mode 100644 releasenotes/notes/add-variational-quantum-time-evolution-112ffeaf62782fea.yaml create mode 100644 releasenotes/notes/fix-gradient-wrapper-2f9ab45941739044.yaml create mode 100644 test/python/algorithms/evolvers/variational/__init__.py create mode 100644 test/python/algorithms/evolvers/variational/solvers/__init__.py create mode 100644 test/python/algorithms/evolvers/variational/solvers/expected_results/__init__.py create mode 100644 test/python/algorithms/evolvers/variational/solvers/expected_results/test_varqte_linear_solver_expected_1.py create mode 100644 test/python/algorithms/evolvers/variational/solvers/ode/__init__.py create mode 100644 test/python/algorithms/evolvers/variational/solvers/ode/test_forward_euler_solver.py create mode 100644 test/python/algorithms/evolvers/variational/solvers/ode/test_ode_function.py create mode 100644 test/python/algorithms/evolvers/variational/solvers/ode/test_var_qte_ode_solver.py create mode 100644 test/python/algorithms/evolvers/variational/solvers/test_varqte_linear_solver.py create mode 100644 test/python/algorithms/evolvers/variational/test_var_qite.py create mode 100644 test/python/algorithms/evolvers/variational/test_var_qrte.py create mode 100644 test/python/algorithms/evolvers/variational/test_var_qte.py create mode 100644 test/python/algorithms/evolvers/variational/variational_principles/__init__.py create mode 100644 test/python/algorithms/evolvers/variational/variational_principles/expected_results/__init__.py create mode 100644 test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected1.py create mode 100644 test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected2.py create mode 100644 test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected3.py create mode 100644 test/python/algorithms/evolvers/variational/variational_principles/imaginary/__init__.py create mode 100644 test/python/algorithms/evolvers/variational/variational_principles/imaginary/test_imaginary_mc_lachlan_principle.py create mode 100644 test/python/algorithms/evolvers/variational/variational_principles/real/__init__.py create mode 100644 test/python/algorithms/evolvers/variational/variational_principles/real/test_real_mc_lachlan_principle.py diff --git a/qiskit/algorithms/__init__.py b/qiskit/algorithms/__init__.py index 63e44798a710..30d71a59e59c 100644 --- a/qiskit/algorithms/__init__.py +++ b/qiskit/algorithms/__init__.py @@ -94,6 +94,17 @@ VQD +Variational Quantum Time Evolution +---------------------------------- + +Classes used by variational quantum time evolution algorithms - VarQITE and VarQRTE. + +.. autosummary:: + :toctree: ../stubs/ + + evolvers.variational + + Evolvers -------- @@ -108,11 +119,14 @@ RealEvolver ImaginaryEvolver TrotterQRTE + VarQITE + VarQRTE PVQD PVQDResult EvolutionResult EvolutionProblem + Factorizers ----------- @@ -248,6 +262,8 @@ from .exceptions import AlgorithmError from .aux_ops_evaluator import eval_observables from .evolvers.trotterization import TrotterQRTE +from .evolvers.variational.var_qite import VarQITE +from .evolvers.variational.var_qrte import VarQRTE from .evolvers.pvqd import PVQD, PVQDResult __all__ = [ @@ -273,6 +289,8 @@ "RealEvolver", "ImaginaryEvolver", "TrotterQRTE", + "VarQITE", + "VarQRTE", "EvolutionResult", "EvolutionProblem", "LinearSolverResult", diff --git a/qiskit/algorithms/evolvers/evolution_problem.py b/qiskit/algorithms/evolvers/evolution_problem.py index e0f9fe3063c6..175beecd6bf6 100644 --- a/qiskit/algorithms/evolvers/evolution_problem.py +++ b/qiskit/algorithms/evolvers/evolution_problem.py @@ -35,7 +35,7 @@ def __init__( aux_operators: Optional[ListOrDict[OperatorBase]] = None, truncation_threshold: float = 1e-12, t_param: Optional[Parameter] = None, - hamiltonian_value_dict: Optional[Dict[Parameter, complex]] = None, + param_value_dict: Optional[Dict[Parameter, complex]] = None, ): """ Args: @@ -50,15 +50,15 @@ def __init__( Used when ``aux_operators`` is provided. t_param: Time parameter in case of a time-dependent Hamiltonian. This free parameter must be within the ``hamiltonian``. - hamiltonian_value_dict: If the Hamiltonian contains free parameters, this - dictionary maps all these parameters to values. + param_value_dict: Maps free parameters in the problem to values. Depending on the + algorithm, it might refer to e.g. a Hamiltonian or an initial state. Raises: ValueError: If non-positive time of evolution is provided. """ self.t_param = t_param - self.hamiltonian_value_dict = hamiltonian_value_dict + self.param_value_dict = param_value_dict self.hamiltonian = hamiltonian self.time = time self.initial_state = initial_state @@ -95,9 +95,9 @@ def validate_params(self) -> None: if self.t_param is not None: t_param_set.add(self.t_param) hamiltonian_dict_param_set = set() - if self.hamiltonian_value_dict is not None: + if self.param_value_dict is not None: hamiltonian_dict_param_set = hamiltonian_dict_param_set.union( - set(self.hamiltonian_value_dict.keys()) + set(self.param_value_dict.keys()) ) params_set = t_param_set.union(hamiltonian_dict_param_set) hamiltonian_param_set = set(self.hamiltonian.parameters) diff --git a/qiskit/algorithms/evolvers/trotterization/trotter_qrte.py b/qiskit/algorithms/evolvers/trotterization/trotter_qrte.py index abe02e95c156..05b8266605b7 100644 --- a/qiskit/algorithms/evolvers/trotterization/trotter_qrte.py +++ b/qiskit/algorithms/evolvers/trotterization/trotter_qrte.py @@ -187,7 +187,7 @@ def evolve(self, evolution_problem: EvolutionProblem) -> EvolutionResult: f"PauliSumOp | SummedOp, {type(hamiltonian)} provided." ) if isinstance(hamiltonian, OperatorBase): - hamiltonian = hamiltonian.bind_parameters(evolution_problem.hamiltonian_value_dict) + hamiltonian = hamiltonian.bind_parameters(evolution_problem.param_value_dict) if isinstance(hamiltonian, SummedOp): hamiltonian = self._summed_op_to_pauli_sum_op(hamiltonian) # the evolution gate diff --git a/qiskit/algorithms/evolvers/variational/__init__.py b/qiskit/algorithms/evolvers/variational/__init__.py new file mode 100644 index 000000000000..8936d9030853 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/__init__.py @@ -0,0 +1,139 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +""" +Variational Quantum Time Evolutions (:mod:`qiskit.algorithms.evolvers.variational`) +=================================================================================== + +Algorithms for performing Variational Quantum Time Evolution of quantum states, +which can be tailored to near-term devices. +:class:`~qiskit.algorithms.evolvers.variational.VarQTE` base class exposes an interface, compliant +with the Quantum Time Evolution Framework in Qiskit Terra, that is implemented by +:class:`~qiskit.algorithms.VarQRTE` and :class:`~qiskit.algorithms.VarQITE` classes for real and +imaginary time evolution respectively. The variational approach is taken according to a variational +principle chosen by a user. + +Examples: + +.. code-block:: + + from qiskit import BasicAer + from qiskit.circuit.library import EfficientSU2 + from qiskit.opflow import SummedOp, I, Z, Y, X + from qiskit.algorithms.evolvers.variational import ( + ImaginaryMcLachlanPrinciple, + ) + from qiskit.algorithms import EvolutionProblem + from qiskit.algorithms import VarQITE + + # define a Hamiltonian + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ).reduce() + + # define a parametrized initial state to be evolved + + ansatz = EfficientSU2(observable.num_qubits, reps=1) + parameters = ansatz.parameters + + # define values of initial parameters + init_param_values = np.zeros(len(ansatz.parameters)) + for i in range(len(ansatz.parameters)): + init_param_values[i] = np.pi / 2 + param_dict = dict(zip(parameters, init_param_values)) + + # define a variational principle + var_principle = ImaginaryMcLachlanPrinciple() + + # optionally define a backend + backend = BasicAer.get_backend("statevector_simulator") + + # define evolution time + time = 1 + + # define evolution problem + evolution_problem = EvolutionProblem(observable, time) + + # instantiate the algorithm + var_qite = VarQITE(ansatz, var_principle, param_dict, quantum_instance=backend) + + # run the algorithm/evolve the state + evolution_result = var_qite.evolve(evolution_problem) + +.. currentmodule:: qiskit.algorithms.evolvers.variational + +Variational Principles +---------------------- + +Variational principles can be used to simulate quantum time evolution by propagating the parameters +of a parameterized quantum circuit. + +They can be divided into two categories: + + 1) Variational Quantum Imaginary Time Evolution + Given a Hamiltonian, a time and a variational ansatz, the variational principle describes a + variational principle according to the normalized Wick-rotated Schroedinger equation. + + 2) Variational Quantum Real Time Evolution + Given a Hamiltonian, a time and a variational ansatz, the variational principle describes a + variational principle according to the Schroedinger equation. + +.. autosummary:: + :toctree: ../stubs/ + :template: autosummary/class_no_inherited_members.rst + + VariationalPrinciple + RealVariationalPrinciple + ImaginaryVariationalPrinciple + RealMcLachlanPrinciple + ImaginaryMcLachlanPrinciple + +ODE solvers +----------- +ODE solvers that implement the SciPy ODE Solver interface. The Forward Euler Solver is +a preferred choice in the presence of noise. One might also use solvers provided by SciPy directly, +e.g. RK45. + +.. autosummary:: + :toctree: ../stubs/ + :template: autosummary/class_no_inherited_members.rst + + ForwardEulerSolver + +""" +from .solvers.ode.forward_euler_solver import ForwardEulerSolver +from .var_qte import VarQTE +from .variational_principles.variational_principle import VariationalPrinciple +from .variational_principles import RealVariationalPrinciple, ImaginaryVariationalPrinciple +from .variational_principles.imaginary_mc_lachlan_principle import ( + ImaginaryMcLachlanPrinciple, +) +from .variational_principles.real_mc_lachlan_principle import ( + RealMcLachlanPrinciple, +) + + +__all__ = [ + "ForwardEulerSolver", + "VarQTE", + "VariationalPrinciple", + "RealVariationalPrinciple", + "ImaginaryVariationalPrinciple", + "RealMcLachlanPrinciple", + "ImaginaryMcLachlanPrinciple", +] diff --git a/qiskit/algorithms/evolvers/variational/solvers/__init__.py b/qiskit/algorithms/evolvers/variational/solvers/__init__.py new file mode 100644 index 000000000000..6d273c0618c9 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/solvers/__init__.py @@ -0,0 +1,44 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +""" +Solvers (:mod:`qiskit.algorithms.evolvers.variational.solvers`) +=============================================================== + +This package contains the necessary classes to solve systems of equations arising in the +Variational Quantum Time Evolution. They include ordinary differential equations (ODE) which +describe ansatz parameter propagation and systems of linear equations. + + +Systems of Linear Equations Solver +---------------------------------- + +.. autosummary:: + :toctree: ../stubs/ + :template: autosummary/class_no_inherited_members.rst + + VarQTELinearSolver + + +ODE Solver +---------- +.. autosummary:: + :toctree: ../stubs/ + :template: autosummary/class_no_inherited_members.rst + + VarQTEOdeSolver +""" + +from qiskit.algorithms.evolvers.variational.solvers.ode.var_qte_ode_solver import VarQTEOdeSolver +from qiskit.algorithms.evolvers.variational.solvers.var_qte_linear_solver import VarQTELinearSolver + +__all__ = ["VarQTELinearSolver", "VarQTEOdeSolver"] diff --git a/qiskit/algorithms/evolvers/variational/solvers/ode/__init__.py b/qiskit/algorithms/evolvers/variational/solvers/ode/__init__.py new file mode 100644 index 000000000000..8fbaef6f85d1 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/solvers/ode/__init__.py @@ -0,0 +1,13 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""ODE Solvers""" diff --git a/qiskit/algorithms/evolvers/variational/solvers/ode/abstract_ode_function.py b/qiskit/algorithms/evolvers/variational/solvers/ode/abstract_ode_function.py new file mode 100644 index 000000000000..a443a26d1888 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/solvers/ode/abstract_ode_function.py @@ -0,0 +1,52 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Abstract class for generating ODE functions.""" + +from abc import ABC, abstractmethod +from typing import Iterable, Dict, Optional +from qiskit.circuit import Parameter +from ..var_qte_linear_solver import ( + VarQTELinearSolver, +) + + +class AbstractOdeFunction(ABC): + """Abstract class for generating ODE functions.""" + + def __init__( + self, + varqte_linear_solver: VarQTELinearSolver, + error_calculator, + param_dict: Dict[Parameter, complex], + t_param: Optional[Parameter] = None, + ) -> None: + + self._varqte_linear_solver = varqte_linear_solver + self._error_calculator = error_calculator + self._param_dict = param_dict + self._t_param = t_param + + @abstractmethod + def var_qte_ode_function(self, time: float, parameters_values: Iterable) -> Iterable: + """ + Evaluates an ODE function for a given time and parameter values. It is used by an ODE + solver. + + Args: + time: Current time of evolution. + parameters_values: Current values of parameters. + + Returns: + ODE gradient arising from solving a system of linear equations. + """ + pass diff --git a/qiskit/algorithms/evolvers/variational/solvers/ode/forward_euler_solver.py b/qiskit/algorithms/evolvers/variational/solvers/ode/forward_euler_solver.py new file mode 100644 index 000000000000..284b3106fa8a --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/solvers/ode/forward_euler_solver.py @@ -0,0 +1,73 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Forward Euler ODE solver.""" + +from typing import Sequence + +import numpy as np +from scipy.integrate import OdeSolver +from scipy.integrate._ivp.base import ConstantDenseOutput + + +class ForwardEulerSolver(OdeSolver): + """Forward Euler ODE solver.""" + + def __init__( + self, + function: callable, + t0: float, + y0: Sequence, + t_bound: float, + vectorized: bool = False, + support_complex: bool = False, + num_t_steps: int = 15, + ): + """ + Forward Euler ODE solver that implements an interface from SciPy. + + Args: + function: Right-hand side of the system. The calling signature is ``fun(t, y)``. Here + ``t`` is a scalar, and there are two options for the ndarray ``y``: + It can either have shape (n,); then ``fun`` must return array_like with + shape (n,). Alternatively it can have shape (n, k); then ``fun`` + must return an array_like with shape (n, k), i.e., each column + corresponds to a single column in ``y``. The choice between the two + options is determined by `vectorized` argument (see below). The + vectorized implementation allows a faster approximation of the Jacobian + by finite differences (required for this solver). + t0: Initial time. + y0: Initial state. + t_bound: Boundary time - the integration won't continue beyond it. It also determines + the direction of the integration. + vectorized: Whether ``fun`` is implemented in a vectorized fashion. Default is False. + support_complex: Whether integration in a complex domain should be supported. + Generally determined by a derived solver class capabilities. Default is False. + num_t_steps: Number of time steps for the forward Euler method. + """ + self.y_old = None + self.step_length = (t_bound - t0) / num_t_steps + super().__init__(function, t0, y0, t_bound, vectorized, support_complex) + + def _step_impl(self): + """ + Takes an Euler step. + """ + try: + self.y_old = self.y + self.y = list(np.add(self.y, self.step_length * self.fun(self.t, self.y))) + self.t += self.step_length + return True, None + except Exception as ex: # pylint: disable=broad-except + return False, f"Unknown ODE solver error: {str(ex)}." + + def _dense_output_impl(self): + return ConstantDenseOutput(self.t_old, self.t, self.y_old) diff --git a/qiskit/algorithms/evolvers/variational/solvers/ode/ode_function.py b/qiskit/algorithms/evolvers/variational/solvers/ode/ode_function.py new file mode 100644 index 000000000000..0d142262868c --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/solvers/ode/ode_function.py @@ -0,0 +1,43 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Class for generating ODE functions based on ODE gradients.""" +from typing import Iterable + +from ..ode.abstract_ode_function import ( + AbstractOdeFunction, +) + + +class OdeFunction(AbstractOdeFunction): + """Class for generating ODE functions based on ODE gradients.""" + + def var_qte_ode_function(self, time: float, parameters_values: Iterable) -> Iterable: + """ + Evaluates an ODE function for a given time and parameter values. It is used by an ODE + solver. + + Args: + time: Current time of evolution. + parameters_values: Current values of parameters. + + Returns: + ODE gradient arising from solving a system of linear equations. + """ + current_param_dict = dict(zip(self._param_dict.keys(), parameters_values)) + + ode_grad_res, _, _ = self._varqte_linear_solver.solve_lse( + current_param_dict, + time, + ) + + return ode_grad_res diff --git a/qiskit/algorithms/evolvers/variational/solvers/ode/ode_function_factory.py b/qiskit/algorithms/evolvers/variational/solvers/ode/ode_function_factory.py new file mode 100644 index 000000000000..2dce88a817b1 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/solvers/ode/ode_function_factory.py @@ -0,0 +1,83 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Abstract class for generating ODE functions.""" + +from abc import ABC +from enum import Enum +from typing import Dict, Any, Optional, Callable + +import numpy as np + +from qiskit.circuit import Parameter +from .abstract_ode_function import AbstractOdeFunction +from .ode_function import OdeFunction +from ..var_qte_linear_solver import ( + VarQTELinearSolver, +) + + +class OdeFunctionType(Enum): + """Types of ODE functions for VatQTE algorithms.""" + + # more will be supported in the near future + STANDARD_ODE = "STANDARD_ODE" + + +class OdeFunctionFactory(ABC): + """Factory for building ODE functions.""" + + def __init__( + self, + ode_function_type: OdeFunctionType = OdeFunctionType.STANDARD_ODE, + lse_solver: Optional[Callable[[np.ndarray, np.ndarray], np.ndarray]] = None, + ) -> None: + """ + Args: + ode_function_type: An Enum that defines a type of an ODE function to be built. If + not provided, a default ``STANDARD_ODE`` is used. + lse_solver: Linear system of equations solver callable. It accepts ``A`` and ``b`` to + solve ``Ax=b`` and returns ``x``. If ``None``, the default ``np.linalg.lstsq`` + solver is used. + """ + self.ode_function_type = ode_function_type + self.lse_solver = lse_solver + + def _build( + self, + varqte_linear_solver: VarQTELinearSolver, + error_calculator: Any, + param_dict: Dict[Parameter, complex], + t_param: Optional[Parameter] = None, + ) -> AbstractOdeFunction: + """ + Initializes an ODE function specified in the class. + + Args: + varqte_linear_solver: Solver of LSE for the VarQTE algorithm. + error_calculator: Calculator of errors for error-based ODE functions. + param_dict: Dictionary which relates parameter values to the parameters in the ansatz. + t_param: Time parameter in case of a time-dependent Hamiltonian. + + Returns: + An ODE function. + + Raises: + ValueError: If unsupported ODE function provided. + + """ + if self.ode_function_type == OdeFunctionType.STANDARD_ODE: + return OdeFunction(varqte_linear_solver, error_calculator, param_dict, t_param) + raise ValueError( + f"Unsupported ODE function provided: {self.ode_function_type}." + f" Only {[tp.value for tp in OdeFunctionType]} are supported." + ) diff --git a/qiskit/algorithms/evolvers/variational/solvers/ode/var_qte_ode_solver.py b/qiskit/algorithms/evolvers/variational/solvers/ode/var_qte_ode_solver.py new file mode 100644 index 000000000000..525769ddc96c --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/solvers/ode/var_qte_ode_solver.py @@ -0,0 +1,83 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Class for solving ODEs for Quantum Time Evolution.""" +from functools import partial +from typing import List, Union, Type, Optional + +import numpy as np +from scipy.integrate import OdeSolver, solve_ivp + +from .abstract_ode_function import ( + AbstractOdeFunction, +) +from .forward_euler_solver import ForwardEulerSolver + + +class VarQTEOdeSolver: + """Class for solving ODEs for Quantum Time Evolution.""" + + def __init__( + self, + init_params: List[complex], + ode_function: AbstractOdeFunction, + ode_solver: Union[Type[OdeSolver], str] = ForwardEulerSolver, + num_timesteps: Optional[int] = None, + ) -> None: + """ + Initialize ODE Solver. + + Args: + init_params: Set of initial parameters for time 0. + ode_function: Generates the ODE function. + ode_solver: ODE solver callable that implements a SciPy ``OdeSolver`` interface or a + string indicating a valid method offered by SciPy. + num_timesteps: The number of timesteps to take. If None, it is + automatically selected to achieve a timestep of approximately 0.01. Only + relevant in case of the ``ForwardEulerSolver``. + """ + self._init_params = init_params + self._ode_function = ode_function.var_qte_ode_function + self._ode_solver = ode_solver + self._num_timesteps = num_timesteps + + def run(self, evolution_time: float) -> List[complex]: + """ + Finds numerical solution with ODE Solver. + + Args: + evolution_time: Evolution time. + + Returns: + List of parameters found by an ODE solver for a given ODE function callable. + """ + # determine the number of timesteps and set the timestep + num_timesteps = ( + int(np.ceil(evolution_time / 0.01)) + if self._num_timesteps is None + else self._num_timesteps + ) + + if self._ode_solver == ForwardEulerSolver: + solve = partial(solve_ivp, num_t_steps=num_timesteps) + else: + solve = solve_ivp + + sol = solve( + self._ode_function, + (0, evolution_time), + self._init_params, + method=self._ode_solver, + ) + final_params_vals = [lst[-1] for lst in sol.y] + + return final_params_vals diff --git a/qiskit/algorithms/evolvers/variational/solvers/var_qte_linear_solver.py b/qiskit/algorithms/evolvers/variational/solvers/var_qte_linear_solver.py new file mode 100644 index 000000000000..1c4a61963374 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/solvers/var_qte_linear_solver.py @@ -0,0 +1,160 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Class for solving linear equations for Quantum Time Evolution.""" + +from typing import Union, List, Dict, Optional, Callable + +import numpy as np + +from qiskit import QuantumCircuit +from qiskit.algorithms.evolvers.variational.variational_principles.variational_principle import ( + VariationalPrinciple, +) +from qiskit.circuit import Parameter +from qiskit.opflow import ( + CircuitSampler, + OperatorBase, + ExpectationBase, +) +from qiskit.providers import Backend +from qiskit.utils import QuantumInstance +from qiskit.utils.backend_utils import is_aer_provider + + +class VarQTELinearSolver: + """Class for solving linear equations for Quantum Time Evolution.""" + + def __init__( + self, + var_principle: VariationalPrinciple, + hamiltonian: OperatorBase, + ansatz: QuantumCircuit, + gradient_params: List[Parameter], + t_param: Optional[Parameter] = None, + lse_solver: Optional[Callable[[np.ndarray, np.ndarray], np.ndarray]] = None, + imag_part_tol: float = 1e-7, + expectation: Optional[ExpectationBase] = None, + quantum_instance: Optional[QuantumInstance] = None, + ) -> None: + """ + Args: + var_principle: Variational Principle to be used. + hamiltonian: + Operator used for Variational Quantum Time Evolution. + The operator may be given either as a composed op consisting of a Hermitian + observable and a ``CircuitStateFn`` or a ``ListOp`` of a ``CircuitStateFn`` with a + ``ComboFn``. + The latter case enables the evaluation of a Quantum Natural Gradient. + ansatz: Quantum state in the form of a parametrized quantum circuit. + gradient_params: List of parameters with respect to which gradients should be computed. + t_param: Time parameter in case of a time-dependent Hamiltonian. + lse_solver: Linear system of equations solver callable. It accepts ``A`` and ``b`` to + solve ``Ax=b`` and returns ``x``. If ``None``, the default ``np.linalg.lstsq`` + solver is used. + imag_part_tol: Allowed value of an imaginary part that can be neglected if no + imaginary part is expected. + expectation: An instance of ``ExpectationBase`` used for calculating a metric tensor + and an evolution gradient. If ``None`` provided, a ``PauliExpectation`` is used. + quantum_instance: Backend used to evaluate the quantum circuit outputs. If ``None`` + provided, everything will be evaluated based on matrix multiplication (which is + slow). + """ + self._var_principle = var_principle + self._hamiltonian = hamiltonian + self._ansatz = ansatz + self._gradient_params = gradient_params + self._bind_params = gradient_params + [t_param] if t_param else gradient_params + self._time_param = t_param + self.lse_solver = lse_solver + self._quantum_instance = None + self._circuit_sampler = None + self._imag_part_tol = imag_part_tol + self._expectation = expectation + if quantum_instance is not None: + self.quantum_instance = quantum_instance + + @property + def lse_solver(self) -> Callable[[np.ndarray, np.ndarray], np.ndarray]: + """Returns an LSE solver callable.""" + return self._lse_solver + + @lse_solver.setter + def lse_solver( + self, lse_solver: Optional[Callable[[np.ndarray, np.ndarray], np.ndarray]] + ) -> None: + """Sets an LSE solver. Uses a ``np.linalg.lstsq`` callable if ``None`` provided.""" + if lse_solver is None: + lse_solver = lambda a, b: np.linalg.lstsq(a, b, rcond=1e-2)[0] + + self._lse_solver = lse_solver + + @property + def quantum_instance(self) -> Optional[QuantumInstance]: + """Returns quantum instance.""" + return self._quantum_instance + + @quantum_instance.setter + def quantum_instance(self, quantum_instance: Union[QuantumInstance, Backend]) -> None: + """Sets quantum_instance""" + if not isinstance(quantum_instance, QuantumInstance): + quantum_instance = QuantumInstance(quantum_instance) + + self._quantum_instance = quantum_instance + self._circuit_sampler = CircuitSampler( + quantum_instance, param_qobj=is_aer_provider(quantum_instance.backend) + ) + + def solve_lse( + self, + param_dict: Dict[Parameter, complex], + time_value: Optional[float] = None, + ) -> (Union[List, np.ndarray], Union[List, np.ndarray], np.ndarray): + """ + Solve the system of linear equations underlying McLachlan's variational principle for the + calculation without error bounds. + + Args: + param_dict: Dictionary which relates parameter values to the parameters in the ansatz. + time_value: Time value that will be bound to ``t_param``. It is required if ``t_param`` + is not ``None``. + + Returns: + Solution to the LSE, A from Ax=b, b from Ax=b. + """ + param_values = list(param_dict.values()) + if self._time_param is not None: + param_values.append(time_value) + + metric_tensor_lse_lhs = self._var_principle.metric_tensor( + self._ansatz, + self._bind_params, + self._gradient_params, + param_values, + self._expectation, + self._quantum_instance, + ) + evolution_grad_lse_rhs = self._var_principle.evolution_grad( + self._hamiltonian, + self._ansatz, + self._circuit_sampler, + param_dict, + self._bind_params, + self._gradient_params, + param_values, + self._expectation, + self._quantum_instance, + ) + + x = self._lse_solver(metric_tensor_lse_lhs, evolution_grad_lse_rhs) + + return np.real(x), metric_tensor_lse_lhs, evolution_grad_lse_rhs diff --git a/qiskit/algorithms/evolvers/variational/var_qite.py b/qiskit/algorithms/evolvers/variational/var_qite.py new file mode 100644 index 000000000000..5d53cc1eef63 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/var_qite.py @@ -0,0 +1,125 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Variational Quantum Imaginary Time Evolution algorithm.""" +from typing import Optional, Union, Type, Callable, List, Dict + +import numpy as np +from scipy.integrate import OdeSolver + +from qiskit import QuantumCircuit +from qiskit.circuit import Parameter +from qiskit.opflow import ExpectationBase, OperatorBase +from qiskit.algorithms.evolvers.imaginary_evolver import ImaginaryEvolver +from qiskit.utils import QuantumInstance +from . import ImaginaryMcLachlanPrinciple +from .solvers.ode.forward_euler_solver import ForwardEulerSolver +from .variational_principles import ImaginaryVariationalPrinciple +from .var_qte import VarQTE + + +class VarQITE(VarQTE, ImaginaryEvolver): + """Variational Quantum Imaginary Time Evolution algorithm. + + .. code-block::python + + from qiskit.algorithms import EvolutionProblem + from qiskit.algorithms import VarQITE + from qiskit import BasicAer + from qiskit.circuit.library import EfficientSU2 + from qiskit.opflow import SummedOp, I, Z, Y, X + from qiskit.algorithms.evolvers.variational import ( + ImaginaryMcLachlanPrinciple, + ) + from qiskit.algorithms import EvolutionProblem + import numpy as np + + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ).reduce() + + ansatz = EfficientSU2(observable.num_qubits, reps=1) + parameters = ansatz.parameters + init_param_values = np.zeros(len(ansatz.parameters)) + for i in range(len(ansatz.ordered_parameters)): + init_param_values[i] = np.pi / 2 + param_dict = dict(zip(parameters, init_param_values)) + var_principle = ImaginaryMcLachlanPrinciple() + backend = BasicAer.get_backend("statevector_simulator") + time = 1 + evolution_problem = EvolutionProblem(observable, time) + var_qite = VarQITE(ansatz, var_principle, param_dict, quantum_instance=backend) + evolution_result = var_qite.evolve(evolution_problem) + """ + + def __init__( + self, + ansatz: Union[OperatorBase, QuantumCircuit], + variational_principle: Optional[ImaginaryVariationalPrinciple] = None, + initial_parameters: Optional[ + Union[Dict[Parameter, complex], List[complex], np.ndarray] + ] = None, + ode_solver: Union[Type[OdeSolver], str] = ForwardEulerSolver, + lse_solver: Optional[Callable[[np.ndarray, np.ndarray], np.ndarray]] = None, + num_timesteps: Optional[int] = None, + expectation: Optional[ExpectationBase] = None, + imag_part_tol: float = 1e-7, + num_instability_tol: float = 1e-7, + quantum_instance: Optional[QuantumInstance] = None, + ) -> None: + r""" + Args: + ansatz: Ansatz to be used for variational time evolution. + variational_principle: Variational Principle to be used. Defaults to + ``ImaginaryMcLachlanPrinciple``. + initial_parameters: Initial parameter values for an ansatz. If ``None`` provided, + they are initialized uniformly at random. + ode_solver: ODE solver callable that implements a SciPy ``OdeSolver`` interface or a + string indicating a valid method offered by SciPy. + lse_solver: Linear system of equations solver callable. It accepts ``A`` and ``b`` to + solve ``Ax=b`` and returns ``x``. If ``None``, the default ``np.linalg.lstsq`` + solver is used. + num_timesteps: The number of timesteps to take. If None, it is + automatically selected to achieve a timestep of approximately 0.01. Only + relevant in case of the ``ForwardEulerSolver``. + expectation: An instance of ``ExpectationBase`` which defines a method for calculating + a metric tensor and an evolution gradient and, if provided, expectation values of + ``EvolutionProblem.aux_operators``. + imag_part_tol: Allowed value of an imaginary part that can be neglected if no + imaginary part is expected. + num_instability_tol: The amount of negative value that is allowed to be + rounded up to 0 for quantities that are expected to be non-negative. + quantum_instance: Backend used to evaluate the quantum circuit outputs. If ``None`` + provided, everything will be evaluated based on NumPy matrix multiplication + (which might be slow for larger numbers of qubits). + """ + if variational_principle is None: + variational_principle = ImaginaryMcLachlanPrinciple() + super().__init__( + ansatz, + variational_principle, + initial_parameters, + ode_solver, + lse_solver=lse_solver, + num_timesteps=num_timesteps, + expectation=expectation, + imag_part_tol=imag_part_tol, + num_instability_tol=num_instability_tol, + quantum_instance=quantum_instance, + ) diff --git a/qiskit/algorithms/evolvers/variational/var_qrte.py b/qiskit/algorithms/evolvers/variational/var_qrte.py new file mode 100644 index 000000000000..c0846a7159b7 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/var_qrte.py @@ -0,0 +1,126 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Variational Quantum Real Time Evolution algorithm.""" +from typing import Optional, Union, Type, Callable, List, Dict + +import numpy as np +from scipy.integrate import OdeSolver + +from qiskit import QuantumCircuit +from qiskit.algorithms.evolvers.real_evolver import RealEvolver +from qiskit.circuit import Parameter +from qiskit.opflow import ExpectationBase, OperatorBase +from qiskit.utils import QuantumInstance +from . import RealMcLachlanPrinciple +from .solvers.ode.forward_euler_solver import ForwardEulerSolver +from .variational_principles import RealVariationalPrinciple +from .var_qte import VarQTE + + +class VarQRTE(VarQTE, RealEvolver): + """Variational Quantum Real Time Evolution algorithm. + + .. code-block::python + + from qiskit.algorithms import EvolutionProblem + from qiskit.algorithms import VarQITE + from qiskit import BasicAer + from qiskit.circuit.library import EfficientSU2 + from qiskit.opflow import SummedOp, I, Z, Y, X + from qiskit.algorithms.evolvers.variational import ( + RealMcLachlanPrinciple, + ) + from qiskit.algorithms import EvolutionProblem + import numpy as np + + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ).reduce() + + ansatz = EfficientSU2(observable.num_qubits, reps=1) + parameters = ansatz.parameters + init_param_values = np.zeros(len(ansatz.parameters)) + for i in range(len(ansatz.parameters)): + init_param_values[i] = np.pi / 2 + param_dict = dict(zip(parameters, init_param_values)) + var_principle = RealMcLachlanPrinciple() + backend = BasicAer.get_backend("statevector_simulator") + time = 1 + evolution_problem = EvolutionProblem(observable, time) + var_qrte = VarQRTE(ansatz, var_principle, param_dict, quantum_instance=backend) + evolution_result = var_qite.evolve(evolution_problem) + """ + + def __init__( + self, + ansatz: Union[OperatorBase, QuantumCircuit], + variational_principle: Optional[RealVariationalPrinciple] = None, + initial_parameters: Optional[ + Union[Dict[Parameter, complex], List[complex], np.ndarray] + ] = None, + ode_solver: Union[Type[OdeSolver], str] = ForwardEulerSolver, + lse_solver: Optional[Callable[[np.ndarray, np.ndarray], np.ndarray]] = None, + num_timesteps: Optional[int] = None, + expectation: Optional[ExpectationBase] = None, + imag_part_tol: float = 1e-7, + num_instability_tol: float = 1e-7, + quantum_instance: Optional[QuantumInstance] = None, + ) -> None: + r""" + Args: + ansatz: Ansatz to be used for variational time evolution. + variational_principle: Variational Principle to be used. Defaults to + ``RealMcLachlanPrinciple``. + initial_parameters: Initial parameter values for an ansatz. If ``None`` provided, + they are initialized uniformly at random. + ode_solver: ODE solver callable that implements a SciPy ``OdeSolver`` interface or a + string indicating a valid method offered by SciPy. + lse_solver: Linear system of equations solver callable. It accepts ``A`` and ``b`` to + solve ``Ax=b`` and returns ``x``. If ``None``, the default ``np.linalg.lstsq`` + solver is used. + num_timesteps: The number of timesteps to take. If None, it is + automatically selected to achieve a timestep of approximately 0.01. Only + relevant in case of the ``ForwardEulerSolver``. + expectation: An instance of ``ExpectationBase`` which defines a method for calculating + a metric tensor and an evolution gradient and, if provided, expectation values of + ``EvolutionProblem.aux_operators``. + imag_part_tol: Allowed value of an imaginary part that can be neglected if no + imaginary part is expected. + num_instability_tol: The amount of negative value that is allowed to be + rounded up to 0 for quantities that are expected to be + non-negative. + quantum_instance: Backend used to evaluate the quantum circuit outputs. If ``None`` + provided, everything will be evaluated based on matrix multiplication (which is + slow). + """ + if variational_principle is None: + variational_principle = RealMcLachlanPrinciple() + super().__init__( + ansatz, + variational_principle, + initial_parameters, + ode_solver, + lse_solver=lse_solver, + num_timesteps=num_timesteps, + expectation=expectation, + imag_part_tol=imag_part_tol, + num_instability_tol=num_instability_tol, + quantum_instance=quantum_instance, + ) diff --git a/qiskit/algorithms/evolvers/variational/var_qte.py b/qiskit/algorithms/evolvers/variational/var_qte.py new file mode 100644 index 000000000000..7edc898037e0 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/var_qte.py @@ -0,0 +1,303 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""The Variational Quantum Time Evolution Interface""" +from abc import ABC +from typing import Optional, Union, Dict, List, Any, Type, Callable + +import numpy as np +from scipy.integrate import OdeSolver + +from qiskit import QuantumCircuit +from qiskit.algorithms.aux_ops_evaluator import eval_observables +from qiskit.algorithms.evolvers.evolution_problem import EvolutionProblem +from qiskit.algorithms.evolvers.evolution_result import EvolutionResult +from qiskit.circuit import Parameter +from qiskit.providers import Backend +from qiskit.utils import QuantumInstance +from qiskit.opflow import ( + CircuitSampler, + OperatorBase, + ExpectationBase, +) +from qiskit.utils.backend_utils import is_aer_provider +from .solvers.ode.forward_euler_solver import ForwardEulerSolver +from .solvers.ode.ode_function_factory import OdeFunctionFactory +from .solvers.var_qte_linear_solver import ( + VarQTELinearSolver, +) +from .variational_principles.variational_principle import ( + VariationalPrinciple, +) +from .solvers.ode.var_qte_ode_solver import ( + VarQTEOdeSolver, +) + + +class VarQTE(ABC): + """Variational Quantum Time Evolution. + + Algorithms that use variational principles to compute a time evolution for a given + Hermitian operator (Hamiltonian) and a quantum state prepared by a parameterized quantum circuit. + + References: + + [1] Benjamin, Simon C. et al. (2019). + Theory of variational quantum simulation. ``_ + """ + + def __init__( + self, + ansatz: Union[OperatorBase, QuantumCircuit], + variational_principle: VariationalPrinciple, + initial_parameters: Optional[ + Union[Dict[Parameter, complex], List[complex], np.ndarray] + ] = None, + ode_solver: Union[Type[OdeSolver], str] = ForwardEulerSolver, + lse_solver: Optional[Callable[[np.ndarray, np.ndarray], np.ndarray]] = None, + num_timesteps: Optional[int] = None, + expectation: Optional[ExpectationBase] = None, + imag_part_tol: float = 1e-7, + num_instability_tol: float = 1e-7, + quantum_instance: Optional[QuantumInstance] = None, + ) -> None: + r""" + Args: + ansatz: Ansatz to be used for variational time evolution. + variational_principle: Variational Principle to be used. + initial_parameters: Initial parameter values for an ansatz. If ``None`` provided, + they are initialized uniformly at random. + ode_solver: ODE solver callable that implements a SciPy ``OdeSolver`` interface or a + string indicating a valid method offered by SciPy. + lse_solver: Linear system of equations solver callable. It accepts ``A`` and ``b`` to + solve ``Ax=b`` and returns ``x``. If ``None``, the default ``np.linalg.lstsq`` + solver is used. + num_timesteps: The number of timesteps to take. If None, it is + automatically selected to achieve a timestep of approximately 0.01. Only + relevant in case of the ``ForwardEulerSolver``. + expectation: An instance of ``ExpectationBase`` which defines a method for calculating + a metric tensor and an evolution gradient and, if provided, expectation values of + ``EvolutionProblem.aux_operators``. + imag_part_tol: Allowed value of an imaginary part that can be neglected if no + imaginary part is expected. + num_instability_tol: The amount of negative value that is allowed to be + rounded up to 0 for quantities that are expected to be + non-negative. + quantum_instance: Backend used to evaluate the quantum circuit outputs. If ``None`` + provided, everything will be evaluated based on matrix multiplication (which is + slow). + """ + super().__init__() + self.ansatz = ansatz + self.variational_principle = variational_principle + self.initial_parameters = initial_parameters + self._quantum_instance = None + if quantum_instance is not None: + self.quantum_instance = quantum_instance + self.expectation = expectation + self.num_timesteps = num_timesteps + self.lse_solver = lse_solver + # OdeFunction abstraction kept for potential extensions - unclear at the moment; + # currently hidden from the user + self._ode_function_factory = OdeFunctionFactory(lse_solver=lse_solver) + self.ode_solver = ode_solver + self.imag_part_tol = imag_part_tol + self.num_instability_tol = num_instability_tol + + @property + def quantum_instance(self) -> Optional[QuantumInstance]: + """Returns quantum instance.""" + return self._quantum_instance + + @quantum_instance.setter + def quantum_instance(self, quantum_instance: Union[QuantumInstance, Backend]) -> None: + """Sets quantum_instance""" + if not isinstance(quantum_instance, QuantumInstance): + quantum_instance = QuantumInstance(quantum_instance) + + self._quantum_instance = quantum_instance + self._circuit_sampler = CircuitSampler( + quantum_instance, param_qobj=is_aer_provider(quantum_instance.backend) + ) + + def evolve(self, evolution_problem: EvolutionProblem) -> EvolutionResult: + """ + Apply Variational Quantum Imaginary Time Evolution (VarQITE) w.r.t. the given + operator. + + Args: + evolution_problem: Instance defining an evolution problem. + Returns: + Result of the evolution which includes a quantum circuit with bound parameters as an + evolved state and, if provided, observables evaluated on the evolved state using + a ``quantum_instance`` and ``expectation`` provided. + + Raises: + ValueError: If no ``initial_state`` is included in the ``evolution_problem``. + """ + self._validate_aux_ops(evolution_problem) + + if evolution_problem.initial_state is not None: + raise ValueError("initial_state provided but not applicable to VarQTE.") + + init_state_param_dict = self._create_init_state_param_dict( + self.initial_parameters, self.ansatz.parameters + ) + + error_calculator = None # TODO will be supported in another PR + + evolved_state = self._evolve( + init_state_param_dict, + evolution_problem.hamiltonian, + evolution_problem.time, + evolution_problem.t_param, + error_calculator, + ) + + evaluated_aux_ops = None + if evolution_problem.aux_operators is not None: + evaluated_aux_ops = eval_observables( + self.quantum_instance, + evolved_state, + evolution_problem.aux_operators, + self.expectation, + ) + + return EvolutionResult(evolved_state, evaluated_aux_ops) + + def _evolve( + self, + init_state_param_dict: Dict[Parameter, complex], + hamiltonian: OperatorBase, + time: float, + t_param: Optional[Parameter] = None, + error_calculator: Any = None, + ) -> OperatorBase: + r""" + Helper method for performing time evolution. Works both for imaginary and real case. + + Args: + init_state_param_dict: Parameter dictionary with initial values for a given + parametrized state/ansatz. If no initial parameter values are provided, they are + initialized uniformly at random. + hamiltonian: + Operator used for Variational Quantum Imaginary Time Evolution (VarQTE). + The operator may be given either as a composed op consisting of a Hermitian + observable and a ``CircuitStateFn`` or a ``ListOp`` of a ``CircuitStateFn`` with a + ``ComboFn``. + The latter case enables the evaluation of a Quantum Natural Gradient. + time: Total time of evolution. + t_param: Time parameter in case of a time-dependent Hamiltonian. + error_calculator: Not yet supported. Calculator of errors for error-based ODE functions. + + Returns: + Result of the evolution which is a quantum circuit with bound parameters as an + evolved state. + """ + + init_state_parameters = list(init_state_param_dict.keys()) + init_state_parameters_values = list(init_state_param_dict.values()) + + linear_solver = VarQTELinearSolver( + self.variational_principle, + hamiltonian, + self.ansatz, + init_state_parameters, + t_param, + self._ode_function_factory.lse_solver, + self.imag_part_tol, + self.expectation, + self._quantum_instance, + ) + + # Convert the operator that holds the Hamiltonian and ansatz into a NaturalGradient operator + ode_function = self._ode_function_factory._build( + linear_solver, error_calculator, init_state_param_dict, t_param + ) + + ode_solver = VarQTEOdeSolver( + init_state_parameters_values, ode_function, self.ode_solver, self.num_timesteps + ) + parameter_values = ode_solver.run(time) + param_dict_from_ode = dict(zip(init_state_parameters, parameter_values)) + + return self.ansatz.assign_parameters(param_dict_from_ode) + + @staticmethod + def _create_init_state_param_dict( + param_values: Union[Dict[Parameter, complex], List[complex], np.ndarray], + init_state_parameters: List[Parameter], + ) -> Dict[Parameter, complex]: + r""" + If ``param_values`` is a dictionary, it looks for parameters present in an initial state + (an ansatz) in a ``param_values``. Based on that, it creates a new dictionary containing + only parameters present in an initial state and their respective values. + If ``param_values`` is a list of values, it creates a new dictionary containing + parameters present in an initial state and their respective values. + If no ``param_values`` is provided, parameter values are chosen uniformly at random. + + Args: + param_values: Dictionary which relates parameter values to the parameters or a list of + values. + init_state_parameters: Parameters present in a quantum state. + + Returns: + Dictionary that maps parameters of an initial state to some values. + + Raises: + ValueError: If the dictionary with parameter values provided does not include all + parameters present in the initial state or if the list of values provided is not the + same length as the list of parameters. + TypeError: If an unsupported type of ``param_values`` provided. + """ + if param_values is None: + init_state_parameter_values = np.random.random(len(init_state_parameters)) + elif isinstance(param_values, dict): + init_state_parameter_values = [] + for param in init_state_parameters: + if param in param_values.keys(): + init_state_parameter_values.append(param_values[param]) + else: + raise ValueError( + f"The dictionary with parameter values provided does not " + f"include all parameters present in the initial state." + f"Parameters present in the state: {init_state_parameters}, " + f"parameters in the dictionary: " + f"{list(param_values.keys())}." + ) + elif isinstance(param_values, (list, np.ndarray)): + if len(init_state_parameters) != len(param_values): + raise ValueError( + f"Initial state has {len(init_state_parameters)} parameters and the" + f" list of values has {len(param_values)} elements. They should be" + f"equal in length." + ) + init_state_parameter_values = param_values + else: + raise TypeError(f"Unsupported type of param_values provided: {type(param_values)}.") + + init_state_param_dict = dict(zip(init_state_parameters, init_state_parameter_values)) + return init_state_param_dict + + def _validate_aux_ops(self, evolution_problem: EvolutionProblem) -> None: + if evolution_problem.aux_operators is not None: + if self.quantum_instance is None: + raise ValueError( + "aux_operators where provided for evaluations but no ``quantum_instance`` " + "was provided." + ) + + if self.expectation is None: + raise ValueError( + "aux_operators where provided for evaluations but no ``expectation`` " + "was provided." + ) diff --git a/qiskit/algorithms/evolvers/variational/variational_principles/__init__.py b/qiskit/algorithms/evolvers/variational/variational_principles/__init__.py new file mode 100644 index 000000000000..7c508f3921de --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/variational_principles/__init__.py @@ -0,0 +1,25 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Variational Principles""" + +from .imaginary_mc_lachlan_principle import ImaginaryMcLachlanPrinciple +from .imaginary_variational_principle import ImaginaryVariationalPrinciple +from .real_mc_lachlan_principle import RealMcLachlanPrinciple +from .real_variational_principle import RealVariationalPrinciple + +__all__ = [ + "ImaginaryMcLachlanPrinciple", + "ImaginaryVariationalPrinciple", + "RealMcLachlanPrinciple", + "RealVariationalPrinciple", +] diff --git a/qiskit/algorithms/evolvers/variational/variational_principles/imaginary_mc_lachlan_principle.py b/qiskit/algorithms/evolvers/variational/variational_principles/imaginary_mc_lachlan_principle.py new file mode 100644 index 000000000000..7a0c46b794f2 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/variational_principles/imaginary_mc_lachlan_principle.py @@ -0,0 +1,76 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Class for an Imaginary McLachlan's Variational Principle.""" +from typing import Dict, List, Optional + +import numpy as np + +from qiskit import QuantumCircuit +from qiskit.circuit import Parameter +from qiskit.opflow import StateFn, OperatorBase, CircuitSampler, ExpectationBase +from qiskit.utils import QuantumInstance +from .imaginary_variational_principle import ( + ImaginaryVariationalPrinciple, +) + + +class ImaginaryMcLachlanPrinciple(ImaginaryVariationalPrinciple): + """Class for an Imaginary McLachlan's Variational Principle. It aims to minimize the distance + between both sides of the Wick-rotated Schrödinger equation with a quantum state given as a + parametrized trial state. The principle leads to a system of linear equations handled by a + linear solver. The imaginary variant means that we consider imaginary time dynamics. + """ + + def evolution_grad( + self, + hamiltonian: OperatorBase, + ansatz: QuantumCircuit, + circuit_sampler: CircuitSampler, + param_dict: Dict[Parameter, complex], + bind_params: List[Parameter], + gradient_params: List[Parameter], + param_values: List[complex], + expectation: Optional[ExpectationBase] = None, + quantum_instance: Optional[QuantumInstance] = None, + ) -> np.ndarray: + """ + Calculates an evolution gradient according to the rules of this variational principle. + + Args: + hamiltonian: Operator used for Variational Quantum Time Evolution. The operator may be + given either as a composed op consisting of a Hermitian observable and a + ``CircuitStateFn`` or a ``ListOp`` of a ``CircuitStateFn`` with a ``ComboFn``. The + latter case enables the evaluation of a Quantum Natural Gradient. + ansatz: Quantum state in the form of a parametrized quantum circuit. + circuit_sampler: A circuit sampler. + param_dict: Dictionary which relates parameter values to the parameters in the ansatz. + bind_params: List of parameters that are supposed to be bound. + gradient_params: List of parameters with respect to which gradients should be computed. + param_values: Values of parameters to be bound. + expectation: An instance of ``ExpectationBase`` used for calculating an evolution + gradient. If ``None`` provided, a ``PauliExpectation`` is used. + quantum_instance: Backend used to evaluate the quantum circuit outputs. If ``None`` + provided, everything will be evaluated based on matrix multiplication (which is + slow). + + Returns: + An evolution gradient. + """ + if self._evolution_gradient_callable is None: + operator = StateFn(hamiltonian, is_measurement=True) @ StateFn(ansatz) + self._evolution_gradient_callable = self._evolution_gradient.gradient_wrapper( + operator, bind_params, gradient_params, quantum_instance, expectation + ) + evolution_grad_lse_rhs = -0.5 * self._evolution_gradient_callable(param_values) + + return evolution_grad_lse_rhs diff --git a/qiskit/algorithms/evolvers/variational/variational_principles/imaginary_variational_principle.py b/qiskit/algorithms/evolvers/variational/variational_principles/imaginary_variational_principle.py new file mode 100644 index 000000000000..bcd60241942a --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/variational_principles/imaginary_variational_principle.py @@ -0,0 +1,24 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Abstract class for an Imaginary Variational Principle.""" + +from abc import ABC + +from ..variational_principles.variational_principle import ( + VariationalPrinciple, +) + + +class ImaginaryVariationalPrinciple(VariationalPrinciple, ABC): + """Abstract class for an Imaginary Variational Principle. The imaginary variant means that we + consider imaginary time dynamics.""" diff --git a/qiskit/algorithms/evolvers/variational/variational_principles/real_mc_lachlan_principle.py b/qiskit/algorithms/evolvers/variational/variational_principles/real_mc_lachlan_principle.py new file mode 100644 index 000000000000..ddc6a17ed879 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/variational_principles/real_mc_lachlan_principle.py @@ -0,0 +1,150 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Class for a Real McLachlan's Variational Principle.""" +from typing import Union, Dict, List, Optional + +import numpy as np +from numpy import real + +from qiskit import QuantumCircuit +from qiskit.circuit import Parameter +from qiskit.opflow import ( + StateFn, + SummedOp, + Y, + I, + PauliExpectation, + CircuitQFI, + CircuitSampler, + OperatorBase, + ExpectationBase, +) +from qiskit.opflow.gradients.circuit_gradients import LinComb +from qiskit.utils import QuantumInstance +from .real_variational_principle import ( + RealVariationalPrinciple, +) + + +class RealMcLachlanPrinciple(RealVariationalPrinciple): + """Class for a Real McLachlan's Variational Principle. It aims to minimize the distance + between both sides of the Schrödinger equation with a quantum state given as a parametrized + trial state. The principle leads to a system of linear equations handled by a linear solver. + The real variant means that we consider real time dynamics. + """ + + def __init__( + self, + qfi_method: Union[str, CircuitQFI] = "lin_comb_full", + ) -> None: + """ + Args: + qfi_method: The method used to compute the QFI. Can be either + ``'lin_comb_full'`` or ``'overlap_block_diag'`` or ``'overlap_diag'`` or + ``CircuitQFI``. + """ + self._grad_method = LinComb(aux_meas_op=-Y) + self._energy_param = None + self._energy = None + + super().__init__(qfi_method) + + def evolution_grad( + self, + hamiltonian: OperatorBase, + ansatz: QuantumCircuit, + circuit_sampler: CircuitSampler, + param_dict: Dict[Parameter, complex], + bind_params: List[Parameter], + gradient_params: List[Parameter], + param_values: List[complex], + expectation: Optional[ExpectationBase] = None, + quantum_instance: Optional[QuantumInstance] = None, + ) -> np.ndarray: + """ + Calculates an evolution gradient according to the rules of this variational principle. + + Args: + hamiltonian: Operator used for Variational Quantum Time Evolution. The operator may be + given either as a composed op consisting of a Hermitian observable and a + ``CircuitStateFn`` or a ``ListOp`` of a ``CircuitStateFn`` with a ``ComboFn``. The + latter case enables the evaluation of a Quantum Natural Gradient. + ansatz: Quantum state in the form of a parametrized quantum circuit. + circuit_sampler: A circuit sampler. + param_dict: Dictionary which relates parameter values to the parameters in the ansatz. + bind_params: List of parameters that are supposed to be bound. + gradient_params: List of parameters with respect to which gradients should be computed. + param_values: Values of parameters to be bound. + expectation: An instance of ``ExpectationBase`` used for calculating an evolution + gradient. If ``None`` provided, a ``PauliExpectation`` is used. + quantum_instance: Backend used to evaluate the quantum circuit outputs. If ``None`` + provided, everything will be evaluated based on matrix multiplication (which is + slow). + + Returns: + An evolution gradient. + """ + if self._evolution_gradient_callable is None: + self._energy_param = Parameter("alpha") + modified_hamiltonian = self._construct_expectation( + hamiltonian, ansatz, self._energy_param + ) + + self._evolution_gradient_callable = self._evolution_gradient.gradient_wrapper( + modified_hamiltonian, + bind_params + [self._energy_param], + gradient_params, + quantum_instance, + expectation, + ) + + energy = StateFn(hamiltonian, is_measurement=True) @ StateFn(ansatz) + if expectation is None: + expectation = PauliExpectation() + self._energy = expectation.convert(energy) + + if circuit_sampler is not None: + energy = circuit_sampler.convert(self._energy, param_dict).eval() + else: + energy = self._energy.assign_parameters(param_dict).eval() + + param_values.append(real(energy)) + evolution_grad = 0.5 * self._evolution_gradient_callable(param_values) + + # quick fix due to an error on opflow; to be addressed in a separate PR + evolution_grad = (-1) * evolution_grad + return evolution_grad + + @staticmethod + def _construct_expectation( + hamiltonian: OperatorBase, ansatz: QuantumCircuit, energy_param: Parameter + ) -> OperatorBase: + """ + Modifies a Hamiltonian according to the rules of this variational principle. + + Args: + hamiltonian: Operator used for Variational Quantum Time Evolution. The operator may be + given either as a composed op consisting of a Hermitian observable and a + ``CircuitStateFn`` or a ``ListOp`` of a ``CircuitStateFn`` with a ``ComboFn``. The + latter case enables the evaluation of a Quantum Natural Gradient. + ansatz: Quantum state in the form of a parametrized quantum circuit. + energy_param: Parameter for energy correction. + + Returns: + An modified Hamiltonian composed with an ansatz. + """ + energy_term = I ^ hamiltonian.num_qubits + energy_term *= -1 + energy_term *= energy_param + modified_hamiltonian = SummedOp([hamiltonian, energy_term]).reduce() + return StateFn(modified_hamiltonian, is_measurement=True) @ StateFn(ansatz) diff --git a/qiskit/algorithms/evolvers/variational/variational_principles/real_variational_principle.py b/qiskit/algorithms/evolvers/variational/variational_principles/real_variational_principle.py new file mode 100644 index 000000000000..881e1f3827c7 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/variational_principles/real_variational_principle.py @@ -0,0 +1,42 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Class for a Real Variational Principle.""" + +from abc import ABC +from typing import Union + +from qiskit.opflow import ( + CircuitQFI, +) +from .variational_principle import ( + VariationalPrinciple, +) + + +class RealVariationalPrinciple(VariationalPrinciple, ABC): + """Class for a Real Variational Principle. The real variant means that we consider real time + dynamics.""" + + def __init__( + self, + qfi_method: Union[str, CircuitQFI] = "lin_comb_full", + ) -> None: + """ + Args: + qfi_method: The method used to compute the QFI. Can be either ``'lin_comb_full'`` or + ``'overlap_block_diag'`` or ``'overlap_diag'`` or ``CircuitQFI``. + """ + super().__init__( + qfi_method, + self._grad_method, + ) diff --git a/qiskit/algorithms/evolvers/variational/variational_principles/variational_principle.py b/qiskit/algorithms/evolvers/variational/variational_principles/variational_principle.py new file mode 100644 index 000000000000..d3d6cbc20b67 --- /dev/null +++ b/qiskit/algorithms/evolvers/variational/variational_principles/variational_principle.py @@ -0,0 +1,129 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Class for a Variational Principle.""" + +from abc import ABC, abstractmethod +from typing import Union, List, Optional, Dict + +import numpy as np + +from qiskit import QuantumCircuit +from qiskit.circuit import Parameter +from qiskit.opflow import ( + CircuitQFI, + CircuitGradient, + QFI, + Gradient, + CircuitStateFn, + CircuitSampler, + OperatorBase, + ExpectationBase, +) +from qiskit.utils import QuantumInstance + + +class VariationalPrinciple(ABC): + """A Variational Principle class. It determines the time propagation of parameters in a + quantum state provided as a parametrized quantum circuit (ansatz).""" + + def __init__( + self, + qfi_method: Union[str, CircuitQFI] = "lin_comb_full", + grad_method: Union[str, CircuitGradient] = "lin_comb", + ) -> None: + """ + Args: + grad_method: The method used to compute the state gradient. Can be either + ``'param_shift'`` or ``'lin_comb'`` or ``'fin_diff'`` or ``CircuitGradient``. + qfi_method: The method used to compute the QFI. Can be either + ``'lin_comb_full'`` or ``'overlap_block_diag'`` or ``'overlap_diag'`` or + ``CircuitQFI``. + """ + self._qfi_method = qfi_method + self.qfi = QFI(qfi_method) + self._grad_method = grad_method + self._evolution_gradient = Gradient(self._grad_method) + self._qfi_gradient_callable = None + self._evolution_gradient_callable = None + + def metric_tensor( + self, + ansatz: QuantumCircuit, + bind_params: List[Parameter], + gradient_params: List[Parameter], + param_values: List[complex], + expectation: Optional[ExpectationBase] = None, + quantum_instance: Optional[QuantumInstance] = None, + ) -> np.ndarray: + """ + Calculates a metric tensor according to the rules of this variational principle. + + Args: + ansatz: Quantum state in the form of a parametrized quantum circuit. + bind_params: List of parameters that are supposed to be bound. + gradient_params: List of parameters with respect to which gradients should be computed. + param_values: Values of parameters to be bound. + expectation: An instance of ``ExpectationBase`` used for calculating a metric tensor. + If ``None`` provided, a ``PauliExpectation`` is used. + quantum_instance: Backend used to evaluate the quantum circuit outputs. If ``None`` + provided, everything will be evaluated based on matrix multiplication (which is + slow). + + Returns: + Metric tensor. + """ + if self._qfi_gradient_callable is None: + self._qfi_gradient_callable = self.qfi.gradient_wrapper( + CircuitStateFn(ansatz), bind_params, gradient_params, quantum_instance, expectation + ) + metric_tensor = 0.25 * self._qfi_gradient_callable(param_values) + + return metric_tensor + + @abstractmethod + def evolution_grad( + self, + hamiltonian: OperatorBase, + ansatz: QuantumCircuit, + circuit_sampler: CircuitSampler, + param_dict: Dict[Parameter, complex], + bind_params: List[Parameter], + gradient_params: List[Parameter], + param_values: List[complex], + expectation: Optional[ExpectationBase] = None, + quantum_instance: Optional[QuantumInstance] = None, + ) -> np.ndarray: + """ + Calculates an evolution gradient according to the rules of this variational principle. + + Args: + hamiltonian: Operator used for Variational Quantum Time Evolution. The operator may be + given either as a composed op consisting of a Hermitian observable and a + ``CircuitStateFn`` or a ``ListOp`` of a ``CircuitStateFn`` with a ``ComboFn``. The + latter case enables the evaluation of a Quantum Natural Gradient. + ansatz: Quantum state in the form of a parametrized quantum circuit. + circuit_sampler: A circuit sampler. + param_dict: Dictionary which relates parameter values to the parameters in the ansatz. + bind_params: List of parameters that are supposed to be bound. + gradient_params: List of parameters with respect to which gradients should be computed. + param_values: Values of parameters to be bound. + expectation: An instance of ``ExpectationBase`` used for calculating an evolution + gradient. If ``None`` provided, a ``PauliExpectation`` is used. + quantum_instance: Backend used to evaluate the quantum circuit outputs. If ``None`` + provided, everything will be evaluated based on matrix multiplication (which is + slow). + + Returns: + An evolution gradient. + """ + pass diff --git a/qiskit/opflow/gradients/derivative_base.py b/qiskit/opflow/gradients/derivative_base.py index 7eff1e4e57c8..1e1b3fadb5b7 100644 --- a/qiskit/opflow/gradients/derivative_base.py +++ b/qiskit/opflow/gradients/derivative_base.py @@ -105,7 +105,7 @@ def gradient_wrapper( """ from ..converters import CircuitSampler - if not grad_params: + if grad_params is None: grad_params = bind_params grad = self.convert(operator, grad_params) @@ -113,15 +113,18 @@ def gradient_wrapper( expectation = PauliExpectation() grad = expectation.convert(grad) + sampler = CircuitSampler(backend=backend) if backend is not None else None + def gradient_fn(p_values): p_values_dict = dict(zip(bind_params, p_values)) if not backend: converter = grad.assign_parameters(p_values_dict) return np.real(converter.eval()) else: - p_values_dict = {k: [v] for k, v in p_values_dict.items()} - converter = CircuitSampler(backend=backend).convert(grad, p_values_dict) - return np.real(converter.eval()[0]) + p_values_list = {k: [v] for k, v in p_values_dict.items()} + sampled = sampler.convert(grad, p_values_list) + fully_bound = sampled.bind_parameters(p_values_dict) + return np.real(fully_bound.eval()[0]) return gradient_fn diff --git a/releasenotes/notes/add-variational-quantum-time-evolution-112ffeaf62782fea.yaml b/releasenotes/notes/add-variational-quantum-time-evolution-112ffeaf62782fea.yaml new file mode 100644 index 000000000000..fc4d0fb891d3 --- /dev/null +++ b/releasenotes/notes/add-variational-quantum-time-evolution-112ffeaf62782fea.yaml @@ -0,0 +1,50 @@ +--- +features: + - | + Add algorithms for Variational Quantum Time Evolution that implement a new interface for + Quantum Time Evolution. The feature supports real (:class:`qiskit.algorithms.VarQRTE`.) and + imaginary (:class:`qiskit.algorithms.VarQITE`.) quantum time evolution according to a + variational principle passed. Each algorithm accepts a variational principle and the following + are provided: + :class:`qiskit.algorithms.evolvers.variational.ImaginaryMcLachlanPrinciple`, + :class:`qiskit.algorithms.evolvers.variational.RealMcLachlanPrinciple`, + :class:`qiskit.algorithms.evolvers.variational.RealTimeDependentPrinciple`. + Both algorithms require solving ODE equations and linear equations which is handled by classes + implemented in `qiskit.algorithms.evolvers.variational.solvers` module. + + .. code-block:: python + + from qiskit.algorithms import EvolutionProblem + from qiskit.algorithms import VarQITE + from qiskit import BasicAer + from qiskit.circuit.library import EfficientSU2 + from qiskit.opflow import SummedOp, I, Z, Y, X + from qiskit.algorithms.evolvers.variational import ( + ImaginaryMcLachlanPrinciple, + ) + from qiskit.algorithms import EvolutionProblem + import numpy as np + + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ).reduce() + + ansatz = EfficientSU2(observable.num_qubits, reps=1) + parameters = ansatz.parameters + init_param_values = np.zeros(len(ansatz.parameters)) + for i in range(len(ansatz.parameters)): + init_param_values[i] = np.pi / 2 + param_dict = dict(zip(parameters, init_param_values)) + var_principle = ImaginaryMcLachlanPrinciple() + backend = BasicAer.get_backend("statevector_simulator") + time = 1 + evolution_problem = EvolutionProblem(observable, time) + var_qite = VarQITE(ansatz, var_principle, param_dict, quantum_instance=backend) + evolution_result = var_qite.evolve(evolution_problem) diff --git a/releasenotes/notes/fix-gradient-wrapper-2f9ab45941739044.yaml b/releasenotes/notes/fix-gradient-wrapper-2f9ab45941739044.yaml new file mode 100644 index 000000000000..07de4aa4eb0b --- /dev/null +++ b/releasenotes/notes/fix-gradient-wrapper-2f9ab45941739044.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed the following issues with the function + :func:`~qiskit.opflow.gradients.derivative_base.gradient_wrapper`: + - reusing a circuit sampler between the calls, + - binding nested parameters. diff --git a/test/python/algorithms/evolvers/test_evolution_problem.py b/test/python/algorithms/evolvers/test_evolution_problem.py index 0d1d18951039..d3dd2f7bc9b2 100644 --- a/test/python/algorithms/evolvers/test_evolution_problem.py +++ b/test/python/algorithms/evolvers/test_evolution_problem.py @@ -38,14 +38,14 @@ def test_init_default(self): expected_initial_state = One expected_aux_operators = None expected_t_param = None - expected_hamiltonian_value_dict = None + expected_param_value_dict = None self.assertEqual(evo_problem.hamiltonian, expected_hamiltonian) self.assertEqual(evo_problem.time, expected_time) self.assertEqual(evo_problem.initial_state, expected_initial_state) self.assertEqual(evo_problem.aux_operators, expected_aux_operators) self.assertEqual(evo_problem.t_param, expected_t_param) - self.assertEqual(evo_problem.hamiltonian_value_dict, expected_hamiltonian_value_dict) + self.assertEqual(evo_problem.param_value_dict, expected_param_value_dict) def test_init_all(self): """Tests that all fields are initialized correctly.""" @@ -54,7 +54,7 @@ def test_init_all(self): time = 2 initial_state = One aux_operators = [X, Y] - hamiltonian_value_dict = {t_parameter: 3.2} + param_value_dict = {t_parameter: 3.2} evo_problem = EvolutionProblem( hamiltonian, @@ -62,7 +62,7 @@ def test_init_all(self): initial_state, aux_operators, t_param=t_parameter, - hamiltonian_value_dict=hamiltonian_value_dict, + param_value_dict=param_value_dict, ) expected_hamiltonian = Y + t_parameter * Z @@ -70,14 +70,14 @@ def test_init_all(self): expected_initial_state = One expected_aux_operators = [X, Y] expected_t_param = t_parameter - expected_hamiltonian_value_dict = {t_parameter: 3.2} + expected_param_value_dict = {t_parameter: 3.2} self.assertEqual(evo_problem.hamiltonian, expected_hamiltonian) self.assertEqual(evo_problem.time, expected_time) self.assertEqual(evo_problem.initial_state, expected_initial_state) self.assertEqual(evo_problem.aux_operators, expected_aux_operators) self.assertEqual(evo_problem.t_param, expected_t_param) - self.assertEqual(evo_problem.hamiltonian_value_dict, expected_hamiltonian_value_dict) + self.assertEqual(evo_problem.param_value_dict, expected_param_value_dict) @data([Y, -1, One], [Y, -1.2, One], [Y, 0, One]) @unpack @@ -93,27 +93,21 @@ def test_validate_params(self): with self.subTest(msg="Parameter missing in dict."): hamiltonian = param_x * X + param_y * Y param_dict = {param_y: 2} - evolution_problem = EvolutionProblem( - hamiltonian, 2, Zero, hamiltonian_value_dict=param_dict - ) + evolution_problem = EvolutionProblem(hamiltonian, 2, Zero, param_value_dict=param_dict) with assert_raises(ValueError): evolution_problem.validate_params() with self.subTest(msg="Empty dict."): hamiltonian = param_x * X + param_y * Y param_dict = {} - evolution_problem = EvolutionProblem( - hamiltonian, 2, Zero, hamiltonian_value_dict=param_dict - ) + evolution_problem = EvolutionProblem(hamiltonian, 2, Zero, param_value_dict=param_dict) with assert_raises(ValueError): evolution_problem.validate_params() with self.subTest(msg="Extra parameter in dict."): hamiltonian = param_x * X + param_y * Y param_dict = {param_y: 2, param_x: 1, Parameter("z"): 1} - evolution_problem = EvolutionProblem( - hamiltonian, 2, Zero, hamiltonian_value_dict=param_dict - ) + evolution_problem = EvolutionProblem(hamiltonian, 2, Zero, param_value_dict=param_dict) with assert_raises(ValueError): evolution_problem.validate_params() diff --git a/test/python/algorithms/evolvers/trotterization/test_trotter_qrte.py b/test/python/algorithms/evolvers/trotterization/test_trotter_qrte.py index 7baad84fe59b..fe53f929f5f6 100644 --- a/test/python/algorithms/evolvers/trotterization/test_trotter_qrte.py +++ b/test/python/algorithms/evolvers/trotterization/test_trotter_qrte.py @@ -185,7 +185,7 @@ def test_trotter_qrte_trotter_two_qubits_with_params(self): operator = w_param * (Z ^ Z) / 2.0 + (Z ^ I) + u_param * (I ^ Z) / 3.0 time = 1 evolution_problem = EvolutionProblem( - operator, time, initial_state, hamiltonian_value_dict=params_dict + operator, time, initial_state, param_value_dict=params_dict ) expected_state = VectorStateFn( Statevector([-0.9899925 - 0.14112001j, 0.0 + 0.0j, 0.0 + 0.0j, 0.0 + 0.0j], dims=(2, 2)) @@ -222,7 +222,7 @@ def test_trotter_qrte_qdrift(self, initial_state, expected_state): @data((Parameter("t"), {}), (None, {Parameter("x"): 2}), (None, None)) @unpack - def test_trotter_qrte_trotter_errors(self, t_param, hamiltonian_value_dict): + def test_trotter_qrte_trotter_errors(self, t_param, param_value_dict): """Test TrotterQRTE with raising errors.""" operator = X * Parameter("t") + Z initial_state = Zero @@ -235,7 +235,7 @@ def test_trotter_qrte_trotter_errors(self, t_param, hamiltonian_value_dict): time, initial_state, t_param=t_param, - hamiltonian_value_dict=hamiltonian_value_dict, + param_value_dict=param_value_dict, ) _ = trotter_qrte.evolve(evolution_problem) diff --git a/test/python/algorithms/evolvers/variational/__init__.py b/test/python/algorithms/evolvers/variational/__init__.py new file mode 100644 index 000000000000..b3ac36d2a6d9 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/__init__.py @@ -0,0 +1,11 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. diff --git a/test/python/algorithms/evolvers/variational/solvers/__init__.py b/test/python/algorithms/evolvers/variational/solvers/__init__.py new file mode 100644 index 000000000000..b3ac36d2a6d9 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/solvers/__init__.py @@ -0,0 +1,11 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. diff --git a/test/python/algorithms/evolvers/variational/solvers/expected_results/__init__.py b/test/python/algorithms/evolvers/variational/solvers/expected_results/__init__.py new file mode 100644 index 000000000000..9c3165f57a2a --- /dev/null +++ b/test/python/algorithms/evolvers/variational/solvers/expected_results/__init__.py @@ -0,0 +1,12 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Stores expected results that are lengthy.""" diff --git a/test/python/algorithms/evolvers/variational/solvers/expected_results/test_varqte_linear_solver_expected_1.py b/test/python/algorithms/evolvers/variational/solvers/expected_results/test_varqte_linear_solver_expected_1.py new file mode 100644 index 000000000000..c6dcf903673f --- /dev/null +++ b/test/python/algorithms/evolvers/variational/solvers/expected_results/test_varqte_linear_solver_expected_1.py @@ -0,0 +1,182 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Stores expected results that are lengthy.""" +expected_metric_res_1 = [ + [ + 2.50000000e-01 + 0.0j, + -3.85185989e-33 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + -3.85185989e-33 + 0.0j, + -3.85185989e-33 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 2.50000000e-01 + 0.0j, + -2.77500000e-17 + 0.0j, + 4.85000000e-17 + 0.0j, + 4.77630626e-32 + 0.0j, + ], + [ + -3.85185989e-33 + 0.0j, + 2.50000000e-01 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + -3.85185989e-33 + 0.0j, + 2.50000000e-01 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + -3.85185989e-33 + 0.0j, + 2.50000000e-01 + 0.0j, + 4.85334346e-32 + 0.0j, + 4.17500000e-17 + 0.0j, + ], + [ + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 0.00000000e00 + 0.0j, + 0.00000000e00 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 0.00000000e00 + 0.0j, + 0.00000000e00 + 0.0j, + -1.38777878e-17 + 0.0j, + -7.00000000e-18 + 0.0j, + 1.38006319e-17 + 0.0j, + -1.39493681e-17 + 0.0j, + ], + [ + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 0.00000000e00 + 0.0j, + 0.00000000e00 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 0.00000000e00 + 0.0j, + 0.00000000e00 + 0.0j, + -1.38777878e-17 + 0.0j, + -7.00000000e-18 + 0.0j, + 1.38006319e-17 + 0.0j, + -1.39493681e-17 + 0.0j, + ], + [ + -3.85185989e-33 + 0.0j, + -3.85185989e-33 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 2.50000000e-01 + 0.0j, + -3.85185989e-33 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + -3.85185989e-33 + 0.0j, + 0.00000000e00 + 0.0j, + 4.85334346e-32 + 0.0j, + -7.00000000e-18 + 0.0j, + ], + [ + -3.85185989e-33 + 0.0j, + 2.50000000e-01 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + -3.85185989e-33 + 0.0j, + 2.50000000e-01 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + -3.85185989e-33 + 0.0j, + 2.50000000e-01 + 0.0j, + 4.85334346e-32 + 0.0j, + 4.17500000e-17 + 0.0j, + ], + [ + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 0.00000000e00 + 0.0j, + 0.00000000e00 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 0.00000000e00 + 0.0j, + 0.00000000e00 + 0.0j, + -1.38777878e-17 + 0.0j, + -7.00000000e-18 + 0.0j, + 1.38006319e-17 + 0.0j, + -1.39493681e-17 + 0.0j, + ], + [ + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 0.00000000e00 + 0.0j, + 0.00000000e00 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 0.00000000e00 + 0.0j, + 0.00000000e00 + 0.0j, + -1.38777878e-17 + 0.0j, + -7.00000000e-18 + 0.0j, + 1.38006319e-17 + 0.0j, + -1.39493681e-17 + 0.0j, + ], + [ + 2.50000000e-01 + 0.0j, + -3.85185989e-33 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + -3.85185989e-33 + 0.0j, + -3.85185989e-33 + 0.0j, + -1.38777878e-17 + 0.0j, + -1.38777878e-17 + 0.0j, + 2.50000000e-01 + 0.0j, + -2.77500000e-17 + 0.0j, + 4.85000000e-17 + 0.0j, + -7.00000000e-18 + 0.0j, + ], + [ + -2.77500000e-17 + 0.0j, + 2.50000000e-01 + 0.0j, + -7.00000000e-18 + 0.0j, + -7.00000000e-18 + 0.0j, + 0.00000000e00 + 0.0j, + 2.50000000e-01 + 0.0j, + -7.00000000e-18 + 0.0j, + -7.00000000e-18 + 0.0j, + -2.77500000e-17 + 0.0j, + 2.50000000e-01 + 0.0j, + 0.00000000e00 + 0.0j, + 4.17500000e-17 + 0.0j, + ], + [ + 4.85000000e-17 + 0.0j, + 4.85334346e-32 + 0.0j, + 1.38006319e-17 + 0.0j, + 1.38006319e-17 + 0.0j, + 4.85334346e-32 + 0.0j, + 4.85334346e-32 + 0.0j, + 1.38006319e-17 + 0.0j, + 1.38006319e-17 + 0.0j, + 4.85000000e-17 + 0.0j, + 0.00000000e00 + 0.0j, + 2.50000000e-01 + 0.0j, + -2.77500000e-17 + 0.0j, + ], + [ + 4.77630626e-32 + 0.0j, + 4.17500000e-17 + 0.0j, + -1.39493681e-17 + 0.0j, + -1.39493681e-17 + 0.0j, + -7.00000000e-18 + 0.0j, + 4.17500000e-17 + 0.0j, + -1.39493681e-17 + 0.0j, + -1.39493681e-17 + 0.0j, + -7.00000000e-18 + 0.0j, + 4.17500000e-17 + 0.0j, + -2.77500000e-17 + 0.0j, + 2.50000000e-01 + 0.0j, + ], +] diff --git a/test/python/algorithms/evolvers/variational/solvers/ode/__init__.py b/test/python/algorithms/evolvers/variational/solvers/ode/__init__.py new file mode 100644 index 000000000000..b3ac36d2a6d9 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/solvers/ode/__init__.py @@ -0,0 +1,11 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. diff --git a/test/python/algorithms/evolvers/variational/solvers/ode/test_forward_euler_solver.py b/test/python/algorithms/evolvers/variational/solvers/ode/test_forward_euler_solver.py new file mode 100644 index 000000000000..08d13233c76e --- /dev/null +++ b/test/python/algorithms/evolvers/variational/solvers/ode/test_forward_euler_solver.py @@ -0,0 +1,47 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test Forward Euler solver.""" + +import unittest +from test.python.algorithms import QiskitAlgorithmsTestCase +import numpy as np +from ddt import ddt, data, unpack +from scipy.integrate import solve_ivp + +from qiskit.algorithms.evolvers.variational.solvers.ode.forward_euler_solver import ( + ForwardEulerSolver, +) + + +@ddt +class TestForwardEulerSolver(QiskitAlgorithmsTestCase): + """Test Forward Euler solver.""" + + @unpack + @data((4, 16), (16, 35.52713678800501), (320, 53.261108839604795)) + def test_solve(self, timesteps, expected_result): + """Test Forward Euler solver for a simple ODE.""" + + y0 = [1] + + # pylint: disable=unused-argument + def func(time, y): + return y + + t_span = [0.0, 4.0] + sol1 = solve_ivp(func, t_span, y0, method=ForwardEulerSolver, num_t_steps=timesteps) + np.testing.assert_equal(sol1.y[-1][-1], expected_result) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/python/algorithms/evolvers/variational/solvers/ode/test_ode_function.py b/test/python/algorithms/evolvers/variational/solvers/ode/test_ode_function.py new file mode 100644 index 000000000000..1ef84204f2cc --- /dev/null +++ b/test/python/algorithms/evolvers/variational/solvers/ode/test_ode_function.py @@ -0,0 +1,165 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test ODE function generator.""" + +import unittest + +from test.python.algorithms import QiskitAlgorithmsTestCase +import numpy as np +from qiskit.algorithms.evolvers.variational.solvers.var_qte_linear_solver import ( + VarQTELinearSolver, +) +from qiskit.algorithms.evolvers.variational.solvers.ode.ode_function import ( + OdeFunction, +) +from qiskit import BasicAer +from qiskit.algorithms.evolvers.variational import ( + ImaginaryMcLachlanPrinciple, +) +from qiskit.circuit import Parameter +from qiskit.circuit.library import EfficientSU2 +from qiskit.opflow import ( + SummedOp, + X, + Y, + I, + Z, +) + + +class TestOdeFunctionGenerator(QiskitAlgorithmsTestCase): + """Test ODE function generator.""" + + def test_var_qte_ode_function(self): + """Test ODE function generator.""" + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + + d = 2 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + # Define a set of initial parameters + parameters = list(ansatz.parameters) + + param_dict = {param: np.pi / 4 for param in parameters} + backend = BasicAer.get_backend("statevector_simulator") + + var_principle = ImaginaryMcLachlanPrinciple() + + t_param = None + linear_solver = None + linear_solver = VarQTELinearSolver( + var_principle, + observable, + ansatz, + parameters, + t_param, + linear_solver, + quantum_instance=backend, + ) + + time = 2 + ode_function_generator = OdeFunction( + linear_solver, error_calculator=None, t_param=None, param_dict=param_dict + ) + + qte_ode_function = ode_function_generator.var_qte_ode_function(time, param_dict.values()) + + expected_qte_ode_function = [ + 0.442145, + -0.022081, + 0.106223, + -0.117468, + 0.251233, + 0.321256, + -0.062728, + -0.036209, + -0.509219, + -0.183459, + -0.050739, + -0.093163, + ] + + np.testing.assert_array_almost_equal(expected_qte_ode_function, qte_ode_function) + + def test_var_qte_ode_function_time_param(self): + """Test ODE function generator with time param.""" + t_param = Parameter("t") + observable = SummedOp( + [ + 0.2252 * t_param * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + + d = 2 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + # Define a set of initial parameters + parameters = list(ansatz.parameters) + + param_dict = {param: np.pi / 4 for param in parameters} + backend = BasicAer.get_backend("statevector_simulator") + + var_principle = ImaginaryMcLachlanPrinciple() + + time = 2 + + linear_solver = None + linear_solver = VarQTELinearSolver( + var_principle, + observable, + ansatz, + parameters, + t_param, + linear_solver, + quantum_instance=backend, + ) + ode_function_generator = OdeFunction( + linear_solver, error_calculator=None, t_param=t_param, param_dict=param_dict + ) + + qte_ode_function = ode_function_generator.var_qte_ode_function(time, param_dict.values()) + + expected_qte_ode_function = [ + 0.442145, + -0.022081, + 0.106223, + -0.117468, + 0.251233, + 0.321256, + -0.062728, + -0.036209, + -0.509219, + -0.183459, + -0.050739, + -0.093163, + ] + + np.testing.assert_array_almost_equal(expected_qte_ode_function, qte_ode_function, decimal=5) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/python/algorithms/evolvers/variational/solvers/ode/test_var_qte_ode_solver.py b/test/python/algorithms/evolvers/variational/solvers/ode/test_var_qte_ode_solver.py new file mode 100644 index 000000000000..5b39229ba502 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/solvers/ode/test_var_qte_ode_solver.py @@ -0,0 +1,136 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test solver of ODEs.""" + +import unittest +from test.python.algorithms import QiskitAlgorithmsTestCase +from ddt import ddt, data, unpack +import numpy as np +from qiskit.algorithms.evolvers.variational.solvers.ode.forward_euler_solver import ( + ForwardEulerSolver, +) +from qiskit.algorithms.evolvers.variational.solvers.var_qte_linear_solver import ( + VarQTELinearSolver, +) +from qiskit.algorithms.evolvers.variational.solvers.ode.var_qte_ode_solver import ( + VarQTEOdeSolver, +) +from qiskit.algorithms.evolvers.variational.solvers.ode.ode_function import ( + OdeFunction, +) +from qiskit import BasicAer +from qiskit.algorithms.evolvers.variational import ( + ImaginaryMcLachlanPrinciple, +) +from qiskit.circuit.library import EfficientSU2 +from qiskit.opflow import ( + SummedOp, + X, + Y, + I, + Z, +) + + +@ddt +class TestVarQTEOdeSolver(QiskitAlgorithmsTestCase): + """Test solver of ODEs.""" + + @data( + ( + "RK45", + [ + -0.30076755873631345, + -0.8032811383782005, + 1.1674108371914734e-15, + 3.2293849116821145e-16, + 2.541585055586039, + 1.155475184255733, + -2.966331417968169e-16, + 9.604292449638343e-17, + ], + ), + ( + ForwardEulerSolver, + [ + -3.2707e-01, + -8.0960e-01, + 3.4323e-16, + 8.9034e-17, + 2.5290e00, + 1.1563e00, + 3.0227e-16, + -2.2769e-16, + ], + ), + ) + @unpack + def test_run_no_backend(self, ode_solver, expected_result): + """Test ODE solver with no backend.""" + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + + d = 1 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + # Define a set of initial parameters + parameters = list(ansatz.parameters) + + init_param_values = np.zeros(len(parameters)) + for i in range(ansatz.num_qubits): + init_param_values[-(ansatz.num_qubits + i + 1)] = np.pi / 2 + + param_dict = dict(zip(parameters, init_param_values)) + + backend = BasicAer.get_backend("statevector_simulator") + + var_principle = ImaginaryMcLachlanPrinciple() + + time = 1 + + t_param = None + + linear_solver = None + linear_solver = VarQTELinearSolver( + var_principle, + observable, + ansatz, + parameters, + t_param, + linear_solver, + quantum_instance=backend, + ) + ode_function_generator = OdeFunction(linear_solver, None, param_dict, t_param) + + var_qte_ode_solver = VarQTEOdeSolver( + list(param_dict.values()), + ode_function_generator, + ode_solver=ode_solver, + num_timesteps=25, + ) + + result = var_qte_ode_solver.run(time) + + np.testing.assert_array_almost_equal(result, expected_result, decimal=4) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/python/algorithms/evolvers/variational/solvers/test_varqte_linear_solver.py b/test/python/algorithms/evolvers/variational/solvers/test_varqte_linear_solver.py new file mode 100644 index 000000000000..c5442447bf9c --- /dev/null +++ b/test/python/algorithms/evolvers/variational/solvers/test_varqte_linear_solver.py @@ -0,0 +1,115 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test solver of linear equations.""" + +import unittest + +from test.python.algorithms import QiskitAlgorithmsTestCase +from ddt import ddt, data +import numpy as np + +from qiskit import BasicAer +from qiskit.algorithms.evolvers.variational import ( + ImaginaryMcLachlanPrinciple, +) +from qiskit.algorithms.evolvers.variational.solvers.var_qte_linear_solver import ( + VarQTELinearSolver, +) +from qiskit.circuit.library import EfficientSU2 +from qiskit.opflow import SummedOp, X, Y, I, Z +from .expected_results.test_varqte_linear_solver_expected_1 import ( + expected_metric_res_1, +) + + +@ddt +class TestVarQTELinearSolver(QiskitAlgorithmsTestCase): + """Test solver of linear equations.""" + + @data(BasicAer.get_backend("statevector_simulator"), None) + def test_solve_lse(self, backend): + """Test SLE solver.""" + + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + + d = 2 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + parameters = list(ansatz.parameters) + init_param_values = np.zeros(len(parameters)) + for i in range(ansatz.num_qubits): + init_param_values[-(ansatz.num_qubits + i + 1)] = np.pi / 2 + + param_dict = dict(zip(parameters, init_param_values)) + + var_principle = ImaginaryMcLachlanPrinciple() + t_param = None + linear_solver = None + linear_solver = VarQTELinearSolver( + var_principle, + observable, + ansatz, + parameters, + t_param, + linear_solver, + quantum_instance=backend, + ) + + nat_grad_res, metric_res, grad_res = linear_solver.solve_lse(param_dict) + + expected_nat_grad_res = [ + 3.43500000e-01, + -2.89800000e-01, + 2.43575264e-16, + 1.31792695e-16, + -9.61200000e-01, + -2.89800000e-01, + 1.27493709e-17, + 1.12587456e-16, + 3.43500000e-01, + -2.89800000e-01, + 3.69914720e-17, + 1.95052083e-17, + ] + + expected_grad_res = [ + (0.17174999999999926 - 0j), + (-0.21735000000000085 + 0j), + (4.114902862895087e-17 - 0j), + (4.114902862895087e-17 - 0j), + (-0.24030000000000012 + 0j), + (-0.21735000000000085 + 0j), + (4.114902862895087e-17 - 0j), + (4.114902862895087e-17 - 0j), + (0.17174999999999918 - 0j), + (-0.21735000000000076 + 0j), + (1.7789936190837538e-17 - 0j), + (-8.319872568662832e-17 + 0j), + ] + + np.testing.assert_array_almost_equal(nat_grad_res, expected_nat_grad_res, decimal=4) + np.testing.assert_array_almost_equal(grad_res, expected_grad_res, decimal=4) + np.testing.assert_array_almost_equal(metric_res, expected_metric_res_1, decimal=4) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/python/algorithms/evolvers/variational/test_var_qite.py b/test/python/algorithms/evolvers/variational/test_var_qite.py new file mode 100644 index 000000000000..6c4a26e13f8c --- /dev/null +++ b/test/python/algorithms/evolvers/variational/test_var_qite.py @@ -0,0 +1,287 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test Variational Quantum Imaginary Time Evolution algorithm.""" + +import unittest + +from test.python.algorithms import QiskitAlgorithmsTestCase +from ddt import data, ddt +import numpy as np +from qiskit.test import slow_test +from qiskit.utils import algorithm_globals, QuantumInstance +from qiskit import BasicAer +from qiskit.algorithms import EvolutionProblem, VarQITE +from qiskit.algorithms.evolvers.variational import ( + ImaginaryMcLachlanPrinciple, +) +from qiskit.circuit.library import EfficientSU2 +from qiskit.opflow import ( + SummedOp, + X, + Y, + I, + Z, + ExpectationFactory, +) + + +@ddt +class TestVarQITE(QiskitAlgorithmsTestCase): + """Test Variational Quantum Imaginary Time Evolution algorithm.""" + + def setUp(self): + super().setUp() + self.seed = 11 + np.random.seed(self.seed) + backend_statevector = BasicAer.get_backend("statevector_simulator") + backend_qasm = BasicAer.get_backend("qasm_simulator") + self.quantum_instance = QuantumInstance( + backend=backend_statevector, + shots=1, + seed_simulator=self.seed, + seed_transpiler=self.seed, + ) + self.quantum_instance_qasm = QuantumInstance( + backend=backend_qasm, + shots=4000, + seed_simulator=self.seed, + seed_transpiler=self.seed, + ) + self.backends_dict = { + "qi_sv": self.quantum_instance, + "qi_qasm": self.quantum_instance_qasm, + "b_sv": backend_statevector, + } + + self.backends_names = ["qi_qasm", "b_sv", "qi_sv"] + + @slow_test + def test_run_d_1_with_aux_ops(self): + """Test VarQITE for d = 1 and t = 1 with evaluating auxiliary operator and the Forward + Euler solver..""" + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + aux_ops = [X ^ X, Y ^ Z] + d = 1 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + parameters = list(ansatz.parameters) + init_param_values = np.zeros(len(parameters)) + for i in range(len(parameters)): + init_param_values[i] = np.pi / 2 + init_param_values[0] = 1 + var_principle = ImaginaryMcLachlanPrinciple() + + param_dict = dict(zip(parameters, init_param_values)) + + time = 1 + + evolution_problem = EvolutionProblem(observable, time, aux_operators=aux_ops) + + thetas_expected_sv = [ + 1.03612467538419, + 1.91891042963193, + 2.81129500883365, + 2.78938736703301, + 2.2215151699331, + 1.61953721158502, + 2.23490753161058, + 1.97145113701782, + ] + + thetas_expected_qasm = [ + 1.03612467538419, + 1.91891042963193, + 2.81129500883365, + 2.78938736703301, + 2.2215151699331, + 1.61953721158502, + 2.23490753161058, + 1.97145113701782, + ] + + expected_aux_ops_evaluated_sv = [(-0.160899, 0.0), (0.26207, 0.0)] + expected_aux_ops_evaluated_qasm = [ + (-0.1765, 0.015563), + (0.2555, 0.015287), + ] + + for backend_name in self.backends_names: + with self.subTest(msg=f"Test {backend_name} backend."): + algorithm_globals.random_seed = self.seed + backend = self.backends_dict[backend_name] + expectation = ExpectationFactory.build( + operator=observable, + backend=backend, + ) + var_qite = VarQITE( + ansatz, + var_principle, + param_dict, + expectation=expectation, + num_timesteps=25, + quantum_instance=backend, + ) + evolution_result = var_qite.evolve(evolution_problem) + + evolved_state = evolution_result.evolved_state + aux_ops = evolution_result.aux_ops_evaluated + + parameter_values = evolved_state.data[0][0].params + + if backend_name == "qi_qasm": + thetas_expected = thetas_expected_qasm + expected_aux_ops = expected_aux_ops_evaluated_qasm + else: + thetas_expected = thetas_expected_sv + expected_aux_ops = expected_aux_ops_evaluated_sv + + for i, parameter_value in enumerate(parameter_values): + np.testing.assert_almost_equal( + float(parameter_value), thetas_expected[i], decimal=3 + ) + + np.testing.assert_array_almost_equal(aux_ops, expected_aux_ops) + + def test_run_d_1_t_7(self): + """Test VarQITE for d = 1 and t = 7 with RK45 ODE solver.""" + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + + d = 1 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + parameters = list(ansatz.parameters) + init_param_values = np.zeros(len(parameters)) + for i in range(len(parameters)): + init_param_values[i] = np.pi / 2 + init_param_values[0] = 1 + var_principle = ImaginaryMcLachlanPrinciple() + + backend = BasicAer.get_backend("statevector_simulator") + + time = 7 + var_qite = VarQITE( + ansatz, + var_principle, + init_param_values, + ode_solver="RK45", + num_timesteps=25, + quantum_instance=backend, + ) + + thetas_expected = [ + 0.828917365718767, + 1.88481074798033, + 3.14111335991238, + 3.14125849601269, + 2.33768562678401, + 1.78670990729437, + 2.04214275514208, + 2.04009918594422, + ] + + self._test_helper(observable, thetas_expected, time, var_qite, 2) + + @slow_test + @data( + SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ), + 0.2252 * (I ^ I) + + 0.5716 * (Z ^ Z) + + 0.3435 * (I ^ Z) + + -0.4347 * (Z ^ I) + + 0.091 * (Y ^ Y) + + 0.091 * (X ^ X), + ) + def test_run_d_2(self, observable): + """Test VarQITE for d = 2 and t = 1 with RK45 ODE solver.""" + d = 2 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + parameters = list(ansatz.parameters) + init_param_values = np.zeros(len(parameters)) + for i in range(len(parameters)): + init_param_values[i] = np.pi / 4 + + var_principle = ImaginaryMcLachlanPrinciple() + + param_dict = dict(zip(parameters, init_param_values)) + + backend = BasicAer.get_backend("statevector_simulator") + + time = 1 + var_qite = VarQITE( + ansatz, + var_principle, + param_dict, + ode_solver="RK45", + num_timesteps=25, + quantum_instance=backend, + ) + + thetas_expected = [ + 1.29495364023786, + 1.08970061333559, + 0.667488228710748, + 0.500122687902944, + 1.4377736672043, + 1.22881086103085, + 0.729773048146251, + 1.01698854755226, + 0.050807780587492, + 0.294828474947149, + 0.839305697704923, + 0.663689581255428, + ] + + self._test_helper(observable, thetas_expected, time, var_qite, 4) + + def _test_helper(self, observable, thetas_expected, time, var_qite, decimal): + evolution_problem = EvolutionProblem(observable, time) + evolution_result = var_qite.evolve(evolution_problem) + evolved_state = evolution_result.evolved_state + + parameter_values = evolved_state.data[0][0].params + for i, parameter_value in enumerate(parameter_values): + np.testing.assert_almost_equal( + float(parameter_value), thetas_expected[i], decimal=decimal + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/python/algorithms/evolvers/variational/test_var_qrte.py b/test/python/algorithms/evolvers/variational/test_var_qrte.py new file mode 100644 index 000000000000..22ab25394e14 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/test_var_qrte.py @@ -0,0 +1,234 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test Variational Quantum Real Time Evolution algorithm.""" + +import unittest + +from test.python.algorithms import QiskitAlgorithmsTestCase +from ddt import data, ddt +import numpy as np +from qiskit.test import slow_test +from qiskit.utils import QuantumInstance, algorithm_globals +from qiskit.algorithms import EvolutionProblem, VarQRTE +from qiskit.algorithms.evolvers.variational import ( + RealMcLachlanPrinciple, +) +from qiskit import BasicAer +from qiskit.circuit.library import EfficientSU2 +from qiskit.opflow import ( + SummedOp, + X, + Y, + I, + Z, + ExpectationFactory, +) + + +@ddt +class TestVarQRTE(QiskitAlgorithmsTestCase): + """Test Variational Quantum Real Time Evolution algorithm.""" + + def setUp(self): + super().setUp() + self.seed = 11 + np.random.seed(self.seed) + backend_statevector = BasicAer.get_backend("statevector_simulator") + backend_qasm = BasicAer.get_backend("qasm_simulator") + self.quantum_instance = QuantumInstance( + backend=backend_statevector, + shots=1, + seed_simulator=self.seed, + seed_transpiler=self.seed, + ) + self.quantum_instance_qasm = QuantumInstance( + backend=backend_qasm, + shots=4000, + seed_simulator=self.seed, + seed_transpiler=self.seed, + ) + self.backends_dict = { + "qi_sv": self.quantum_instance, + "qi_qasm": self.quantum_instance_qasm, + "b_sv": backend_statevector, + } + + self.backends_names = ["qi_qasm", "b_sv", "qi_sv"] + + @slow_test + def test_run_d_1_with_aux_ops(self): + """Test VarQRTE for d = 1 and t = 0.1 with evaluating auxiliary operators and the Forward + Euler solver.""" + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + aux_ops = [X ^ X, Y ^ Z] + d = 1 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + parameters = list(ansatz.parameters) + init_param_values = np.zeros(len(parameters)) + for i in range(len(parameters)): + init_param_values[i] = np.pi / 2 + init_param_values[0] = 1 + var_principle = RealMcLachlanPrinciple() + + time = 0.1 + + evolution_problem = EvolutionProblem(observable, time, aux_operators=aux_ops) + + thetas_expected_sv = [ + 0.88967020378258, + 1.53740751016451, + 1.57076759018861, + 1.58893301221363, + 1.60100970594142, + 1.57008242207638, + 1.63791241090936, + 1.53741371076912, + ] + + thetas_expected_qasm = [ + 0.88967811203145, + 1.53745130248168, + 1.57206794045495, + 1.58901347342829, + 1.60101431615503, + 1.57138020823337, + 1.63796000651177, + 1.53742227084076, + ] + + expected_aux_ops_evaluated_sv = [(0.06675, 0.0), (0.772636, 0.0)] + + expected_aux_ops_evaluated_qasm = [ + (0.06450000000000006, 0.01577846435810532), + (0.7895000000000001, 0.009704248425303218), + ] + + for backend_name in self.backends_names: + with self.subTest(msg=f"Test {backend_name} backend."): + algorithm_globals.random_seed = self.seed + backend = self.backends_dict[backend_name] + expectation = ExpectationFactory.build( + operator=observable, + backend=backend, + ) + var_qrte = VarQRTE( + ansatz, + var_principle, + init_param_values, + expectation=expectation, + num_timesteps=25, + quantum_instance=backend, + ) + evolution_result = var_qrte.evolve(evolution_problem) + + evolved_state = evolution_result.evolved_state + aux_ops = evolution_result.aux_ops_evaluated + + parameter_values = evolved_state.data[0][0].params + if backend_name == "qi_qasm": + thetas_expected = thetas_expected_qasm + expected_aux_ops = expected_aux_ops_evaluated_qasm + else: + thetas_expected = thetas_expected_sv + expected_aux_ops = expected_aux_ops_evaluated_sv + + for i, parameter_value in enumerate(parameter_values): + np.testing.assert_almost_equal( + float(parameter_value), thetas_expected[i], decimal=3 + ) + np.testing.assert_array_almost_equal(aux_ops, expected_aux_ops) + + @slow_test + @data( + SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ), + 0.2252 * (I ^ I) + + 0.5716 * (Z ^ Z) + + 0.3435 * (I ^ Z) + + -0.4347 * (Z ^ I) + + 0.091 * (Y ^ Y) + + 0.091 * (X ^ X), + ) + def test_run_d_2(self, observable): + """Test VarQRTE for d = 2 and t = 1 with RK45 ODE solver.""" + d = 2 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + parameters = list(ansatz.parameters) + init_param_values = np.zeros(len(parameters)) + for i in range(len(parameters)): + init_param_values[i] = np.pi / 4 + + var_principle = RealMcLachlanPrinciple() + + param_dict = dict(zip(parameters, init_param_values)) + + backend = BasicAer.get_backend("statevector_simulator") + + time = 1 + var_qrte = VarQRTE( + ansatz, + var_principle, + param_dict, + ode_solver="RK45", + num_timesteps=25, + quantum_instance=backend, + ) + + thetas_expected = [ + 0.348407744196573, + 0.919404626262464, + 1.18189219371626, + 0.771011177789998, + 0.734384256533924, + 0.965289520781899, + 1.14441687204195, + 1.17231927568571, + 1.03014771379412, + 0.867266309056347, + 0.699606368428206, + 0.610788576398685, + ] + + self._test_helper(observable, thetas_expected, time, var_qrte) + + def _test_helper(self, observable, thetas_expected, time, var_qrte): + evolution_problem = EvolutionProblem(observable, time) + evolution_result = var_qrte.evolve(evolution_problem) + evolved_state = evolution_result.evolved_state + + parameter_values = evolved_state.data[0][0].params + for i, parameter_value in enumerate(parameter_values): + np.testing.assert_almost_equal(float(parameter_value), thetas_expected[i], decimal=4) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/python/algorithms/evolvers/variational/test_var_qte.py b/test/python/algorithms/evolvers/variational/test_var_qte.py new file mode 100644 index 000000000000..1083a1564f68 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/test_var_qte.py @@ -0,0 +1,78 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Test Variational Quantum Real Time Evolution algorithm.""" + +import unittest + +from test.python.algorithms import QiskitAlgorithmsTestCase +from numpy.testing import assert_raises +from ddt import data, ddt +import numpy as np + +from qiskit.algorithms.evolvers.variational.var_qte import VarQTE +from qiskit.circuit import Parameter + + +@ddt +class TestVarQTE(QiskitAlgorithmsTestCase): + """Test Variational Quantum Time Evolution class methods.""" + + def setUp(self): + super().setUp() + self._parameters1 = [Parameter("a"), Parameter("b"), Parameter("c")] + + @data([1.4, 2, 3], np.asarray([1.4, 2, 3])) + def test_create_init_state_param_dict(self, param_values): + """Tests if a correct dictionary is created.""" + expected = dict(zip(self._parameters1, param_values)) + with self.subTest("Parameters values given as a list test."): + result = VarQTE._create_init_state_param_dict(param_values, self._parameters1) + np.testing.assert_equal(result, expected) + with self.subTest("Parameters values given as a dictionary test."): + result = VarQTE._create_init_state_param_dict( + dict(zip(self._parameters1, param_values)), self._parameters1 + ) + np.testing.assert_equal(result, expected) + with self.subTest("Parameters values given as a superset dictionary test."): + expected = dict( + zip( + [self._parameters1[0], self._parameters1[2]], [param_values[0], param_values[2]] + ) + ) + result = VarQTE._create_init_state_param_dict( + dict(zip(self._parameters1, param_values)), + [self._parameters1[0], self._parameters1[2]], + ) + np.testing.assert_equal(result, expected) + + @data([1.4, 2], np.asarray([1.4, 3]), {}, []) + def test_create_init_state_param_dict_errors_list(self, param_values): + """Tests if an error is raised.""" + with assert_raises(ValueError): + _ = VarQTE._create_init_state_param_dict(param_values, self._parameters1) + + @data([1.4, 2], np.asarray([1.4, 3])) + def test_create_init_state_param_dict_errors_subset(self, param_values): + """Tests if an error is raised if subset of parameters provided.""" + param_values_dict = dict(zip([self._parameters1[0], self._parameters1[2]], param_values)) + with assert_raises(ValueError): + _ = VarQTE._create_init_state_param_dict(param_values_dict, self._parameters1) + + @data(5, "s", Parameter("x")) + def test_create_init_state_param_dict_errors_type(self, param_values): + """Tests if an error is raised if wrong input type.""" + with assert_raises(TypeError): + _ = VarQTE._create_init_state_param_dict(param_values, self._parameters1) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/python/algorithms/evolvers/variational/variational_principles/__init__.py b/test/python/algorithms/evolvers/variational/variational_principles/__init__.py new file mode 100644 index 000000000000..b3ac36d2a6d9 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/variational_principles/__init__.py @@ -0,0 +1,11 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. diff --git a/test/python/algorithms/evolvers/variational/variational_principles/expected_results/__init__.py b/test/python/algorithms/evolvers/variational/variational_principles/expected_results/__init__.py new file mode 100644 index 000000000000..9c3165f57a2a --- /dev/null +++ b/test/python/algorithms/evolvers/variational/variational_principles/expected_results/__init__.py @@ -0,0 +1,12 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Stores expected results that are lengthy.""" diff --git a/test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected1.py b/test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected1.py new file mode 100644 index 000000000000..231cbac4dba4 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected1.py @@ -0,0 +1,182 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Stores expected results that are lengthy.""" +expected_bound_metric_tensor_1 = [ + [ + 2.50000000e-01 + 0.0j, + 1.59600000e-33 + 0.0j, + 5.90075760e-18 + 0.0j, + -8.49242405e-19 + 0.0j, + 8.83883476e-02 + 0.0j, + 1.33253788e-17 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.40000000e-17 + 0.0j, + -1.41735435e-01 + 0.0j, + 3.12500000e-02 + 0.0j, + 1.00222087e-01 + 0.0j, + -3.12500000e-02 + 0.0j, + ], + [ + 1.59600000e-33 + 0.0j, + 2.50000000e-01 + 0.0j, + 1.34350288e-17 + 0.0j, + 6.43502884e-18 + 0.0j, + -8.83883476e-02 + 0.0j, + 1.25000000e-01 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.25000000e-01 + 0.0j, + -8.45970869e-02 + 0.0j, + 7.54441738e-02 + 0.0j, + 1.48207521e-01 + 0.0j, + 2.00444174e-01 + 0.0j, + ], + [ + 5.90075760e-18 + 0.0j, + 1.34350288e-17 + 0.0j, + 1.25000000e-01 + 0.0j, + -1.38777878e-17 + 0.0j, + -4.41941738e-02 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.19638348e-01 + 0.0j, + 6.25000000e-02 + 0.0j, + -5.14514565e-02 + 0.0j, + 6.89720869e-02 + 0.0j, + 1.04933262e-02 + 0.0j, + -6.89720869e-02 + 0.0j, + ], + [ + -8.49242405e-19 + 0.0j, + 6.43502884e-18 + 0.0j, + -1.38777878e-17 + 0.0j, + 1.25000000e-01 + 0.0j, + -4.41941738e-02 + 0.0j, + -6.25000000e-02 + 0.0j, + 3.12500000e-02 + 0.0j, + 1.25000000e-01 + 0.0j, + 5.14514565e-02 + 0.0j, + -6.89720869e-02 + 0.0j, + 7.81250000e-03 + 0.0j, + 1.94162607e-02 + 0.0j, + ], + [ + 8.83883476e-02 + 0.0j, + -8.83883476e-02 + 0.0j, + -4.41941738e-02 + 0.0j, + -4.41941738e-02 + 0.0j, + 2.34375000e-01 + 0.0j, + -1.10485435e-01 + 0.0j, + -2.02014565e-02 + 0.0j, + -4.41941738e-02 + 0.0j, + 1.49547935e-02 + 0.0j, + -2.24896848e-02 + 0.0j, + -1.42172278e-03 + 0.0j, + -1.23822206e-01 + 0.0j, + ], + [ + 1.33253788e-17 + 0.0j, + 1.25000000e-01 + 0.0j, + 6.25000000e-02 + 0.0j, + -6.25000000e-02 + 0.0j, + -1.10485435e-01 + 0.0j, + 2.18750000e-01 + 0.0j, + -2.68082618e-03 + 0.0j, + -1.59099026e-17 + 0.0j, + -1.57197815e-01 + 0.0j, + 2.53331304e-02 + 0.0j, + 9.82311963e-03 + 0.0j, + 1.06138957e-01 + 0.0j, + ], + [ + 6.25000000e-02 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.19638348e-01 + 0.0j, + 3.12500000e-02 + 0.0j, + -2.02014565e-02 + 0.0j, + -2.68082618e-03 + 0.0j, + 2.23881674e-01 + 0.0j, + 1.37944174e-01 + 0.0j, + -3.78033966e-02 + 0.0j, + 1.58423239e-01 + 0.0j, + 1.34535646e-01 + 0.0j, + -5.49651086e-02 + 0.0j, + ], + [ + 1.40000000e-17 + 0.0j, + 1.25000000e-01 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.25000000e-01 + 0.0j, + -4.41941738e-02 + 0.0j, + -1.59099026e-17 + 0.0j, + 1.37944174e-01 + 0.0j, + 2.50000000e-01 + 0.0j, + -2.10523539e-17 + 0.0j, + 1.15574269e-17 + 0.0j, + 9.75412607e-02 + 0.0j, + 5.71383476e-02 + 0.0j, + ], + [ + -1.41735435e-01 + 0.0j, + -8.45970869e-02 + 0.0j, + -5.14514565e-02 + 0.0j, + 5.14514565e-02 + 0.0j, + 1.49547935e-02 + 0.0j, + -1.57197815e-01 + 0.0j, + -3.78033966e-02 + 0.0j, + -2.10523539e-17 + 0.0j, + 1.95283753e-01 + 0.0j, + -3.82941440e-02 + 0.0j, + -6.11392595e-02 + 0.0j, + -4.51588288e-02 + 0.0j, + ], + [ + 3.12500000e-02 + 0.0j, + 7.54441738e-02 + 0.0j, + 6.89720869e-02 + 0.0j, + -6.89720869e-02 + 0.0j, + -2.24896848e-02 + 0.0j, + 2.53331304e-02 + 0.0j, + 1.58423239e-01 + 0.0j, + 1.15574269e-17 + 0.0j, + -3.82941440e-02 + 0.0j, + 2.17629701e-01 + 0.0j, + 1.32431810e-01 + 0.0j, + -1.91961467e-02 + 0.0j, + ], + [ + 1.00222087e-01 + 0.0j, + 1.48207521e-01 + 0.0j, + 1.04933262e-02 + 0.0j, + 7.81250000e-03 + 0.0j, + -1.42172278e-03 + 0.0j, + 9.82311963e-03 + 0.0j, + 1.34535646e-01 + 0.0j, + 9.75412607e-02 + 0.0j, + -6.11392595e-02 + 0.0j, + 1.32431810e-01 + 0.0j, + 1.81683746e-01 + 0.0j, + 7.28902444e-02 + 0.0j, + ], + [ + -3.12500000e-02 + 0.0j, + 2.00444174e-01 + 0.0j, + -6.89720869e-02 + 0.0j, + 1.94162607e-02 + 0.0j, + -1.23822206e-01 + 0.0j, + 1.06138957e-01 + 0.0j, + -5.49651086e-02 + 0.0j, + 5.71383476e-02 + 0.0j, + -4.51588288e-02 + 0.0j, + -1.91961467e-02 + 0.0j, + 7.28902444e-02 + 0.0j, + 2.38616353e-01 + 0.0j, + ], +] diff --git a/test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected2.py b/test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected2.py new file mode 100644 index 000000000000..386e3196ea4e --- /dev/null +++ b/test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected2.py @@ -0,0 +1,182 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Stores expected results that are lengthy.""" +expected_bound_metric_tensor_2 = [ + [ + 2.50000000e-01 + 0.0j, + 1.59600000e-33 + 0.0j, + 5.90075760e-18 + 0.0j, + -8.49242405e-19 + 0.0j, + 8.83883476e-02 + 0.0j, + 1.33253788e-17 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.40000000e-17 + 0.0j, + -1.41735435e-01 + 0.0j, + 3.12500000e-02 + 0.0j, + 1.00222087e-01 + 0.0j, + -3.12500000e-02 + 0.0j, + ], + [ + 1.59600000e-33 + 0.0j, + 2.50000000e-01 + 0.0j, + 1.34350288e-17 + 0.0j, + 6.43502884e-18 + 0.0j, + -8.83883476e-02 + 0.0j, + 1.25000000e-01 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.25000000e-01 + 0.0j, + -8.45970869e-02 + 0.0j, + 7.54441738e-02 + 0.0j, + 1.48207521e-01 + 0.0j, + 2.00444174e-01 + 0.0j, + ], + [ + 5.90075760e-18 + 0.0j, + 1.34350288e-17 + 0.0j, + 1.25000000e-01 + 0.0j, + -1.38777878e-17 + 0.0j, + -4.41941738e-02 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.19638348e-01 + 0.0j, + 6.25000000e-02 + 0.0j, + -5.14514565e-02 + 0.0j, + 6.89720869e-02 + 0.0j, + 1.04933262e-02 + 0.0j, + -6.89720869e-02 + 0.0j, + ], + [ + -8.49242405e-19 + 0.0j, + 6.43502884e-18 + 0.0j, + -1.38777878e-17 + 0.0j, + 1.25000000e-01 + 0.0j, + -4.41941738e-02 + 0.0j, + -6.25000000e-02 + 0.0j, + 3.12500000e-02 + 0.0j, + 1.25000000e-01 + 0.0j, + 5.14514565e-02 + 0.0j, + -6.89720869e-02 + 0.0j, + 7.81250000e-03 + 0.0j, + 1.94162607e-02 + 0.0j, + ], + [ + 8.83883476e-02 + 0.0j, + -8.83883476e-02 + 0.0j, + -4.41941738e-02 + 0.0j, + -4.41941738e-02 + 0.0j, + 2.34375000e-01 + 0.0j, + -1.10485435e-01 + 0.0j, + -2.02014565e-02 + 0.0j, + -4.41941738e-02 + 0.0j, + 1.49547935e-02 + 0.0j, + -2.24896848e-02 + 0.0j, + -1.42172278e-03 + 0.0j, + -1.23822206e-01 + 0.0j, + ], + [ + 1.33253788e-17 + 0.0j, + 1.25000000e-01 + 0.0j, + 6.25000000e-02 + 0.0j, + -6.25000000e-02 + 0.0j, + -1.10485435e-01 + 0.0j, + 2.18750000e-01 + 0.0j, + -2.68082618e-03 + 0.0j, + -1.59099026e-17 + 0.0j, + -1.57197815e-01 + 0.0j, + 2.53331304e-02 + 0.0j, + 9.82311963e-03 + 0.0j, + 1.06138957e-01 + 0.0j, + ], + [ + 6.25000000e-02 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.19638348e-01 + 0.0j, + 3.12500000e-02 + 0.0j, + -2.02014565e-02 + 0.0j, + -2.68082618e-03 + 0.0j, + 2.23881674e-01 + 0.0j, + 1.37944174e-01 + 0.0j, + -3.78033966e-02 + 0.0j, + 1.58423239e-01 + 0.0j, + 1.34535646e-01 + 0.0j, + -5.49651086e-02 + 0.0j, + ], + [ + 1.40000000e-17 + 0.0j, + 1.25000000e-01 + 0.0j, + 6.25000000e-02 + 0.0j, + 1.25000000e-01 + 0.0j, + -4.41941738e-02 + 0.0j, + -1.59099026e-17 + 0.0j, + 1.37944174e-01 + 0.0j, + 2.50000000e-01 + 0.0j, + -2.10523539e-17 + 0.0j, + 1.15574269e-17 + 0.0j, + 9.75412607e-02 + 0.0j, + 5.71383476e-02 + 0.0j, + ], + [ + -1.41735435e-01 + 0.0j, + -8.45970869e-02 + 0.0j, + -5.14514565e-02 + 0.0j, + 5.14514565e-02 + 0.0j, + 1.49547935e-02 + 0.0j, + -1.57197815e-01 + 0.0j, + -3.78033966e-02 + 0.0j, + -2.10523539e-17 + 0.0j, + 1.95283753e-01 + 0.0j, + -3.82941440e-02 + 0.0j, + -6.11392595e-02 + 0.0j, + -4.51588288e-02 + 0.0j, + ], + [ + 3.12500000e-02 + 0.0j, + 7.54441738e-02 + 0.0j, + 6.89720869e-02 + 0.0j, + -6.89720869e-02 + 0.0j, + -2.24896848e-02 + 0.0j, + 2.53331304e-02 + 0.0j, + 1.58423239e-01 + 0.0j, + 1.15574269e-17 + 0.0j, + -3.82941440e-02 + 0.0j, + 2.17629701e-01 + 0.0j, + 1.32431810e-01 + 0.0j, + -1.91961467e-02 + 0.0j, + ], + [ + 1.00222087e-01 + 0.0j, + 1.48207521e-01 + 0.0j, + 1.04933262e-02 + 0.0j, + 7.81250000e-03 + 0.0j, + -1.42172278e-03 + 0.0j, + 9.82311963e-03 + 0.0j, + 1.34535646e-01 + 0.0j, + 9.75412607e-02 + 0.0j, + -6.11392595e-02 + 0.0j, + 1.32431810e-01 + 0.0j, + 1.81683746e-01 + 0.0j, + 7.28902444e-02 + 0.0j, + ], + [ + -3.12500000e-02 + 0.0j, + 2.00444174e-01 + 0.0j, + -6.89720869e-02 + 0.0j, + 1.94162607e-02 + 0.0j, + -1.23822206e-01 + 0.0j, + 1.06138957e-01 + 0.0j, + -5.49651086e-02 + 0.0j, + 5.71383476e-02 + 0.0j, + -4.51588288e-02 + 0.0j, + -1.91961467e-02 + 0.0j, + 7.28902444e-02 + 0.0j, + 2.38616353e-01 + 0.0j, + ], +] diff --git a/test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected3.py b/test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected3.py new file mode 100644 index 000000000000..5c295c0c6f2a --- /dev/null +++ b/test/python/algorithms/evolvers/variational/variational_principles/expected_results/test_imaginary_mc_lachlan_variational_principle_expected3.py @@ -0,0 +1,182 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Stores expected results that are lengthy.""" +expected_bound_metric_tensor_3 = [ + [ + -1.21000000e-34 + 0.00e00j, + 1.21000000e-34 + 2.50e-19j, + 1.76776695e-01 - 1.00e-18j, + -1.40000000e-17 + 0.00e00j, + -6.25000000e-02 + 0.00e00j, + 8.83883476e-02 - 1.25e-18j, + 1.69194174e-01 + 2.25e-18j, + 8.83883476e-02 - 2.50e-19j, + -7.27633476e-02 + 0.00e00j, + 9.75412607e-02 + 7.50e-19j, + 1.48398042e-02 - 1.75e-18j, + -9.75412607e-02 + 3.75e-18j, + ], + [ + 1.21000000e-34 + 2.50e-19j, + -1.21000000e-34 + 0.00e00j, + 1.10000000e-34 + 2.75e-18j, + 1.76776695e-01 - 2.25e-18j, + -6.25000000e-02 + 0.00e00j, + -8.83883476e-02 + 4.00e-18j, + 4.41941738e-02 - 1.25e-18j, + 1.76776695e-01 - 2.50e-19j, + 7.27633476e-02 - 7.50e-19j, + -9.75412607e-02 - 7.50e-19j, + 1.10485435e-02 - 7.50e-19j, + 2.74587393e-02 + 2.50e-19j, + ], + [ + 1.76776695e-01 - 1.00e-18j, + 1.10000000e-34 + 2.75e-18j, + -1.25000000e-01 + 0.00e00j, + -1.25000000e-01 + 0.00e00j, + -1.06694174e-01 + 1.25e-18j, + -6.25000000e-02 + 1.75e-18j, + -1.01332521e-01 + 7.50e-19j, + 4.67500000e-17 - 7.50e-19j, + 1.75206304e-02 + 5.00e-19j, + -8.57075215e-02 - 1.00e-18j, + -1.63277304e-01 + 1.00e-18j, + -1.56250000e-02 + 0.00e00j, + ], + [ + -1.40000000e-17 + 0.00e00j, + 1.76776695e-01 - 2.25e-18j, + -1.25000000e-01 + 0.00e00j, + -1.25000000e-01 + 0.00e00j, + 1.83058262e-02 - 1.50e-18j, + -1.50888348e-01 - 1.50e-18j, + -1.01332521e-01 + 2.50e-19j, + -8.83883476e-02 - 1.00e-18j, + -2.28822827e-02 - 1.00e-18j, + -1.16957521e-01 + 1.00e-18j, + -1.97208130e-01 + 0.00e00j, + -1.79457521e-01 + 1.25e-18j, + ], + [ + -6.25000000e-02 + 0.00e00j, + -6.25000000e-02 + 0.00e00j, + -1.06694174e-01 + 1.25e-18j, + 1.83058262e-02 - 1.50e-18j, + -1.56250000e-02 + 0.00e00j, + -2.20970869e-02 - 2.00e-18j, + 1.48992717e-01 - 1.00e-18j, + 2.60000000e-17 - 1.50e-18j, + -6.69614673e-02 - 5.00e-19j, + 2.00051576e-01 + 5.00e-19j, + 1.13640168e-01 + 1.25e-18j, + -4.83780325e-02 - 1.00e-18j, + ], + [ + 8.83883476e-02 - 1.25e-18j, + -8.83883476e-02 + 4.00e-18j, + -6.25000000e-02 + 1.75e-18j, + -1.50888348e-01 - 1.50e-18j, + -2.20970869e-02 - 2.00e-18j, + -3.12500000e-02 + 0.00e00j, + -2.85691738e-02 + 4.25e-18j, + 1.76776695e-01 + 0.00e00j, + 5.52427173e-03 + 1.00e-18j, + -1.29346478e-01 + 5.00e-19j, + -4.81004238e-02 + 4.25e-18j, + 5.27918696e-02 + 2.50e-19j, + ], + [ + 1.69194174e-01 + 2.25e-18j, + 4.41941738e-02 - 1.25e-18j, + -1.01332521e-01 + 7.50e-19j, + -1.01332521e-01 + 2.50e-19j, + 1.48992717e-01 - 1.00e-18j, + -2.85691738e-02 + 4.25e-18j, + -2.61183262e-02 + 0.00e00j, + -6.88900000e-33 + 0.00e00j, + 6.62099510e-02 - 1.00e-18j, + -2.90767610e-02 + 1.75e-18j, + -1.24942505e-01 + 0.00e00j, + -1.72430217e-02 + 2.50e-19j, + ], + [ + 8.83883476e-02 - 2.50e-19j, + 1.76776695e-01 - 2.50e-19j, + 4.67500000e-17 - 7.50e-19j, + -8.83883476e-02 - 1.00e-18j, + 2.60000000e-17 - 1.50e-18j, + 1.76776695e-01 + 0.00e00j, + -6.88900000e-33 + 0.00e00j, + -6.88900000e-33 + 0.00e00j, + 1.79457521e-01 - 1.75e-18j, + -5.33470869e-02 + 2.00e-18j, + -9.56456304e-02 + 3.00e-18j, + -1.32582521e-01 + 2.50e-19j, + ], + [ + -7.27633476e-02 + 0.00e00j, + 7.27633476e-02 - 7.50e-19j, + 1.75206304e-02 + 5.00e-19j, + -2.28822827e-02 - 1.00e-18j, + -6.69614673e-02 - 5.00e-19j, + 5.52427173e-03 + 1.00e-18j, + 6.62099510e-02 - 1.00e-18j, + 1.79457521e-01 - 1.75e-18j, + -5.47162473e-02 + 0.00e00j, + -4.20854047e-02 + 4.00e-18j, + -7.75494553e-02 - 2.50e-18j, + -2.49573723e-02 + 7.50e-19j, + ], + [ + 9.75412607e-02 + 7.50e-19j, + -9.75412607e-02 - 7.50e-19j, + -8.57075215e-02 - 1.00e-18j, + -1.16957521e-01 + 1.00e-18j, + 2.00051576e-01 + 5.00e-19j, + -1.29346478e-01 + 5.00e-19j, + -2.90767610e-02 + 1.75e-18j, + -5.33470869e-02 + 2.00e-18j, + -4.20854047e-02 + 4.00e-18j, + -3.23702991e-02 + 0.00e00j, + -4.70257118e-02 + 0.00e00j, + 1.22539288e-01 - 2.25e-18j, + ], + [ + 1.48398042e-02 - 1.75e-18j, + 1.10485435e-02 - 7.50e-19j, + -1.63277304e-01 + 1.00e-18j, + -1.97208130e-01 + 0.00e00j, + 1.13640168e-01 + 1.25e-18j, + -4.81004238e-02 + 4.25e-18j, + -1.24942505e-01 + 0.00e00j, + -9.56456304e-02 + 3.00e-18j, + -7.75494553e-02 - 2.50e-18j, + -4.70257118e-02 + 0.00e00j, + -6.83162540e-02 + 0.00e00j, + -2.78870598e-02 + 0.00e00j, + ], + [ + -9.75412607e-02 + 3.75e-18j, + 2.74587393e-02 + 2.50e-19j, + -1.56250000e-02 + 0.00e00j, + -1.79457521e-01 + 1.25e-18j, + -4.83780325e-02 - 1.00e-18j, + 5.27918696e-02 + 2.50e-19j, + -1.72430217e-02 + 2.50e-19j, + -1.32582521e-01 + 2.50e-19j, + -2.49573723e-02 + 7.50e-19j, + 1.22539288e-01 - 2.25e-18j, + -2.78870598e-02 + 0.00e00j, + -1.13836467e-02 + 0.00e00j, + ], +] diff --git a/test/python/algorithms/evolvers/variational/variational_principles/imaginary/__init__.py b/test/python/algorithms/evolvers/variational/variational_principles/imaginary/__init__.py new file mode 100644 index 000000000000..b3ac36d2a6d9 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/variational_principles/imaginary/__init__.py @@ -0,0 +1,11 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. diff --git a/test/python/algorithms/evolvers/variational/variational_principles/imaginary/test_imaginary_mc_lachlan_principle.py b/test/python/algorithms/evolvers/variational/variational_principles/imaginary/test_imaginary_mc_lachlan_principle.py new file mode 100644 index 000000000000..5118a9a699a4 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/variational_principles/imaginary/test_imaginary_mc_lachlan_principle.py @@ -0,0 +1,111 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test imaginary McLachlan's variational principle.""" + +import unittest +from test.python.algorithms import QiskitAlgorithmsTestCase +import numpy as np + +from qiskit.algorithms.evolvers.variational import ( + ImaginaryMcLachlanPrinciple, +) +from qiskit.circuit.library import EfficientSU2 +from qiskit.opflow import SummedOp, X, Y, I, Z +from ..expected_results.test_imaginary_mc_lachlan_variational_principle_expected1 import ( + expected_bound_metric_tensor_1, +) + + +class TestImaginaryMcLachlanPrinciple(QiskitAlgorithmsTestCase): + """Test imaginary McLachlan's variational principle.""" + + def test_calc_metric_tensor(self): + """Test calculating a metric tensor.""" + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + + d = 2 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + # Define a set of initial parameters + parameters = list(ansatz.parameters) + param_dict = {param: np.pi / 4 for param in parameters} + var_principle = ImaginaryMcLachlanPrinciple() + + bound_metric_tensor = var_principle.metric_tensor( + ansatz, parameters, parameters, param_dict.values(), None, None + ) + + np.testing.assert_almost_equal(bound_metric_tensor, expected_bound_metric_tensor_1) + + def test_calc_calc_evolution_grad(self): + """Test calculating evolution gradient.""" + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + + d = 2 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + # Define a set of initial parameters + parameters = list(ansatz.parameters) + param_dict = {param: np.pi / 4 for param in parameters} + var_principle = ImaginaryMcLachlanPrinciple() + + bound_evolution_grad = var_principle.evolution_grad( + observable, + ansatz, + None, + param_dict, + parameters, + parameters, + param_dict.values(), + None, + None, + ) + + expected_bound_evolution_grad = [ + (0.19308934095957098 - 1.4e-17j), + (0.007027674650099142 - 0j), + (0.03192524520091862 - 0j), + (-0.06810314606309673 - 1e-18j), + (0.07590371669521798 - 7e-18j), + (0.11891968269385343 + 1.5e-18j), + (-0.0012030273438232639 + 0j), + (-0.049885258804562266 + 1.8500000000000002e-17j), + (-0.20178860797540302 - 5e-19j), + (-0.0052269232310933195 + 1e-18j), + (0.022892905637005266 - 3e-18j), + (-0.022892905637005294 + 3.5e-18j), + ] + + np.testing.assert_almost_equal(bound_evolution_grad, expected_bound_evolution_grad) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/python/algorithms/evolvers/variational/variational_principles/real/__init__.py b/test/python/algorithms/evolvers/variational/variational_principles/real/__init__.py new file mode 100644 index 000000000000..b3ac36d2a6d9 --- /dev/null +++ b/test/python/algorithms/evolvers/variational/variational_principles/real/__init__.py @@ -0,0 +1,11 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. diff --git a/test/python/algorithms/evolvers/variational/variational_principles/real/test_real_mc_lachlan_principle.py b/test/python/algorithms/evolvers/variational/variational_principles/real/test_real_mc_lachlan_principle.py new file mode 100644 index 000000000000..13c126928bdb --- /dev/null +++ b/test/python/algorithms/evolvers/variational/variational_principles/real/test_real_mc_lachlan_principle.py @@ -0,0 +1,114 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test real McLachlan's variational principle.""" + +import unittest +from test.python.algorithms import QiskitAlgorithmsTestCase +import numpy as np +from qiskit.algorithms.evolvers.variational import ( + RealMcLachlanPrinciple, +) +from qiskit.circuit.library import EfficientSU2 +from qiskit.opflow import SummedOp, X, Y, I, Z +from ..expected_results.test_imaginary_mc_lachlan_variational_principle_expected2 import ( + expected_bound_metric_tensor_2, +) + + +class TestRealMcLachlanPrinciple(QiskitAlgorithmsTestCase): + """Test real McLachlan's variational principle.""" + + def test_calc_calc_metric_tensor(self): + """Test calculating a metric tensor.""" + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + + d = 2 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + # Define a set of initial parameters + parameters = list(ansatz.parameters) + param_dict = {param: np.pi / 4 for param in parameters} + var_principle = RealMcLachlanPrinciple() + + bound_metric_tensor = var_principle.metric_tensor( + ansatz, parameters, parameters, list(param_dict.values()), None, None + ) + + np.testing.assert_almost_equal( + bound_metric_tensor, expected_bound_metric_tensor_2, decimal=5 + ) + + def test_calc_evolution_grad(self): + """Test calculating evolution gradient.""" + observable = SummedOp( + [ + 0.2252 * (I ^ I), + 0.5716 * (Z ^ Z), + 0.3435 * (I ^ Z), + -0.4347 * (Z ^ I), + 0.091 * (Y ^ Y), + 0.091 * (X ^ X), + ] + ) + + d = 2 + ansatz = EfficientSU2(observable.num_qubits, reps=d) + + # Define a set of initial parameters + parameters = list(ansatz.parameters) + param_dict = {param: np.pi / 4 for param in parameters} + var_principle = RealMcLachlanPrinciple() + + bound_evolution_grad = var_principle.evolution_grad( + observable, + ansatz, + None, + param_dict, + parameters, + parameters, + list(param_dict.values()), + None, + None, + ) + + expected_bound_evolution_grad = [ + (-0.04514911474522546 + 4e-18j), + (0.0963123928027075 - 1.5e-18j), + (0.1365347823673539 - 7e-18j), + (0.004969316401057883 - 4.9999999999999996e-18j), + (-0.003843833929692342 - 4.999999999999998e-19j), + (0.07036988622493834 - 7e-18j), + (0.16560609099860682 - 3.5e-18j), + (0.16674183768051887 + 1e-18j), + (-0.03843296670360974 - 6e-18j), + (0.08891074158680243 - 6e-18j), + (0.06425681697616654 + 7e-18j), + (-0.03172376682078948 - 7e-18j), + ] + + np.testing.assert_almost_equal( + bound_evolution_grad, expected_bound_evolution_grad, decimal=5 + ) + + +if __name__ == "__main__": + unittest.main() From 09429389e91e1325640eddd95cdb5d62aecc825c Mon Sep 17 00:00:00 2001 From: Guillermo-Mijares-Vilarino <106545082+Guillermo-Mijares-Vilarino@users.noreply.github.com> Date: Tue, 23 Aug 2022 19:25:50 +0200 Subject: [PATCH 21/54] Extended explanation from plot_bloch_multivector API reference (#8415) * Added multivector explanation * Remove unnecessary paragraph * remove matplotlib inline and use Statevector(qc) * changed bloch vector explanation * Use better-spaced LaTeX commands Co-authored-by: Junye Huang Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: Jake Lishman --- qiskit/visualization/state_visualization.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/qiskit/visualization/state_visualization.py b/qiskit/visualization/state_visualization.py index 215397633e86..40b38df245d2 100644 --- a/qiskit/visualization/state_visualization.py +++ b/qiskit/visualization/state_visualization.py @@ -186,7 +186,8 @@ def plot_state_hinton( def plot_bloch_vector(bloch, title="", ax=None, figsize=None, coord_type="cartesian"): """Plot the Bloch sphere. - Plot a sphere, axes, the Bloch vector, and its projections onto each axis. + Plot a Bloch sphere with the specified coordinates, that can be given in both + cartesian and spherical systems. Args: bloch (list[double]): array of three elements where [, , ] (Cartesian) @@ -247,9 +248,13 @@ def plot_bloch_vector(bloch, title="", ax=None, figsize=None, coord_type="cartes def plot_bloch_multivector( state, title="", figsize=None, *, rho=None, reverse_bits=False, filename=None ): - """Plot the Bloch sphere. + r"""Plot a Bloch sphere for each qubit. - Plot a sphere, axes, the Bloch vector, and its projections onto each axis. + Each component :math:`(x,y,z)` of the Bloch sphere labeled as 'qubit i' represents the expected + value of the corresponding Pauli operator acting only on that qubit, that is, the expected value + of :math:`I_{N-1} \otimes\dotsb\otimes I_{i+1}\otimes P_i \otimes I_{i-1}\otimes\dotsb\otimes + I_0`, where :math:`N` is the number of qubits, :math:`P\in \{X,Y,Z\}` and :math:`I` is the + identity operator. Args: state (Statevector or DensityMatrix or ndarray): an N-qubit quantum state. From 7c4bde5e8bf20b7eab6612d0393aa8c102f9fd6a Mon Sep 17 00:00:00 2001 From: Julien Gacon Date: Tue, 23 Aug 2022 20:49:38 +0200 Subject: [PATCH 22/54] Add equivalences between 2q Pauli rotations (#8376) * Add equivalences between 2q Pauli rotations * attempt fixing QPY tests * try fix QPY attempt 2 Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .../standard_gates/equivalence_library.py | 57 +++++++++++++++++++ test/qpy_compat/test_qpy.py | 10 ++-- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/qiskit/circuit/library/standard_gates/equivalence_library.py b/qiskit/circuit/library/standard_gates/equivalence_library.py index 65184b6dfbd2..5ded739eb51f 100644 --- a/qiskit/circuit/library/standard_gates/equivalence_library.py +++ b/qiskit/circuit/library/standard_gates/equivalence_library.py @@ -252,6 +252,20 @@ def_rxx.append(inst, qargs, cargs) _sel.add_equivalence(RXXGate(theta), def_rxx) +# RXX to RZZ +q = QuantumRegister(2, "q") +theta = Parameter("theta") +rxx_to_rzz = QuantumCircuit(q) +for inst, qargs, cargs in [ + (HGate(), [q[0]], []), + (HGate(), [q[1]], []), + (RZZGate(theta), [q[0], q[1]], []), + (HGate(), [q[0]], []), + (HGate(), [q[1]], []), +]: + rxx_to_rzz.append(inst, qargs, cargs) +_sel.add_equivalence(RXXGate(theta), rxx_to_rzz) + # RZXGate # # ┌─────────┐ @@ -324,6 +338,20 @@ def_ryy.append(inst, qargs, cargs) _sel.add_equivalence(RYYGate(theta), def_ryy) +# RYY to RZZ +q = QuantumRegister(2, "q") +theta = Parameter("theta") +ryy_to_rzz = QuantumCircuit(q) +for inst, qargs, cargs in [ + (RXGate(pi / 2), [q[0]], []), + (RXGate(pi / 2), [q[1]], []), + (RZZGate(theta), [q[0], q[1]], []), + (RXGate(-pi / 2), [q[0]], []), + (RXGate(-pi / 2), [q[1]], []), +]: + ryy_to_rzz.append(inst, qargs, cargs) +_sel.add_equivalence(RYYGate(theta), ryy_to_rzz) + # RZGate # global phase: -ϴ/2 # ┌───────┐ ┌───────┐ @@ -382,6 +410,35 @@ def_rzz.append(inst, qargs, cargs) _sel.add_equivalence(RZZGate(theta), def_rzz) +# RZZ to RXX +q = QuantumRegister(2, "q") +theta = Parameter("theta") +rzz_to_rxx = QuantumCircuit(q) +for inst, qargs, cargs in [ + (HGate(), [q[0]], []), + (HGate(), [q[1]], []), + (RXXGate(theta), [q[0], q[1]], []), + (HGate(), [q[0]], []), + (HGate(), [q[1]], []), +]: + rzz_to_rxx.append(inst, qargs, cargs) +_sel.add_equivalence(RZZGate(theta), rzz_to_rxx) + +# RZZ to RYY +q = QuantumRegister(2, "q") +theta = Parameter("theta") +rzz_to_ryy = QuantumCircuit(q) +for inst, qargs, cargs in [ + (RXGate(-pi / 2), [q[0]], []), + (RXGate(-pi / 2), [q[1]], []), + (RYYGate(theta), [q[0], q[1]], []), + (RXGate(pi / 2), [q[0]], []), + (RXGate(pi / 2), [q[1]], []), +]: + rzz_to_ryy.append(inst, qargs, cargs) +_sel.add_equivalence(RZZGate(theta), rzz_to_ryy) + + # RZXGate # # ┌─────────┐ diff --git a/test/qpy_compat/test_qpy.py b/test/qpy_compat/test_qpy.py index 418202f59d49..801052269ed5 100755 --- a/test/qpy_compat/test_qpy.py +++ b/test/qpy_compat/test_qpy.py @@ -446,14 +446,14 @@ def generate_calibrated_circuits(): # custom gate mygate = Gate("mygate", 1, []) - qc = QuantumCircuit(1) + qc = QuantumCircuit(1, name="calibrated_circuit_1") qc.append(mygate, [0]) with builder.build() as caldef: builder.play(Constant(100, 0.1), DriveChannel(0)) qc.add_calibration(mygate, (0,), caldef) circuits.append(qc) # override instruction - qc = QuantumCircuit(1) + qc = QuantumCircuit(1, name="calibrated_circuit_2") qc.x(0) with builder.build() as caldef: builder.play(Constant(100, 0.1), DriveChannel(0)) @@ -466,7 +466,7 @@ def generate_calibrated_circuits(): def generate_controlled_gates(): """Test QPY serialization with custom ControlledGates.""" circuits = [] - qc = QuantumCircuit(3) + qc = QuantumCircuit(3, name="custom_controlled_gates") controlled_gate = DCXGate().control(1) qc.append(controlled_gate, [0, 1, 2]) circuits.append(qc) @@ -476,13 +476,13 @@ def generate_controlled_gates(): custom_definition.rz(1.5, 0) custom_definition.sdg(0) custom_gate.definition = custom_definition - nested_qc = QuantumCircuit(3) + nested_qc = QuantumCircuit(3, name="nested_qc") qc.append(custom_gate, [0]) controlled_gate = custom_gate.control(2) nested_qc.append(controlled_gate, [0, 1, 2]) nested_qc.measure_all() circuits.append(nested_qc) - qc_open = QuantumCircuit(2) + qc_open = QuantumCircuit(2, name="open_cx") qc_open.cx(0, 1, ctrl_state=0) circuits.append(qc_open) return circuits From 94131ec8ba450ecec126a82d255cbfa607eba58a Mon Sep 17 00:00:00 2001 From: Jake Lishman Date: Wed, 24 Aug 2022 13:54:35 +0100 Subject: [PATCH 23/54] Ensure QPY test circuits have non-generated names (#8608) Circuits in QPY backwards compatibility should always have fixed names, to avoid changes in the number of circuits constructed during library set-up code affected the output names. --- test/qpy_compat/test_qpy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/qpy_compat/test_qpy.py b/test/qpy_compat/test_qpy.py index 801052269ed5..310ba871a771 100755 --- a/test/qpy_compat/test_qpy.py +++ b/test/qpy_compat/test_qpy.py @@ -491,7 +491,7 @@ def generate_controlled_gates(): def generate_open_controlled_gates(): """Test QPY serialization with custom ControlledGates with open controls.""" circuits = [] - qc = QuantumCircuit(3) + qc = QuantumCircuit(3, name="open_controls_simple") controlled_gate = DCXGate().control(1, ctrl_state=0) qc.append(controlled_gate, [0, 1, 2]) circuits.append(qc) @@ -502,7 +502,7 @@ def generate_open_controlled_gates(): custom_definition.rz(1.5, 0) custom_definition.sdg(0) custom_gate.definition = custom_definition - nested_qc = QuantumCircuit(3) + nested_qc = QuantumCircuit(3, name="open_controls_nested") nested_qc.append(custom_gate, [0]) controlled_gate = custom_gate.control(2, ctrl_state=1) nested_qc.append(controlled_gate, [0, 1, 2]) From 0e9aea69df8ba3b076a0966d2b21abb116a41b1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Aug 2022 14:54:22 +0000 Subject: [PATCH 24/54] Bump pyo3 from 0.16.5 to 0.16.6 (#8609) Bumps [pyo3](https://github.com/pyo3/pyo3) from 0.16.5 to 0.16.6. - [Release notes](https://github.com/pyo3/pyo3/releases) - [Changelog](https://github.com/PyO3/pyo3/blob/main/CHANGELOG.md) - [Commits](https://github.com/pyo3/pyo3/compare/v0.16.5...v0.16.6) --- updated-dependencies: - dependency-name: pyo3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 20 ++++++++++---------- Cargo.toml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f821d94ffdb..eb2736a8a7d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -330,9 +330,9 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.16.5" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6302e85060011447471887705bb7838f14aba43fcb06957d823739a496b3dc" +checksum = "0220c44442c9b239dd4357aa856ac468a4f5e1f0df19ddb89b2522952eb4c6ca" dependencies = [ "cfg-if", "hashbrown 0.12.3", @@ -349,9 +349,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.16.5" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b65b546c35d8a3b1b2f0ddbac7c6a569d759f357f2b9df884f5d6b719152c8" +checksum = "9c819d397859445928609d0ec5afc2da5204e0d0f73d6bf9e153b04e83c9cdc2" dependencies = [ "once_cell", "target-lexicon", @@ -359,9 +359,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.16.5" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c275a07127c1aca33031a563e384ffdd485aee34ef131116fcd58e3430d1742b" +checksum = "ca882703ab55f54702d7bfe1189b41b0af10272389f04cae38fe4cd56c65f75f" dependencies = [ "libc", "pyo3-build-config", @@ -369,9 +369,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.16.5" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284fc4485bfbcc9850a6d661d627783f18d19c2ab55880b021671c4ba83e90f7" +checksum = "568749402955ad7be7bad9a09b8593851cd36e549ac90bfd44079cea500f3f21" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -381,9 +381,9 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.16.5" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53bda0f58f73f5c5429693c96ed57f7abdb38fdfc28ae06da4101a257adb7faf" +checksum = "611f64e82d98f447787e82b8e7b0ebc681e1eb78fc1252668b2c605ffb4e1eb8" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index d0d3882db611..ab8cbb9fcc6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ num-bigint = "0.4" retworkx-core = "0.11" [dependencies.pyo3] -version = "0.16.5" +version = "0.16.6" features = ["extension-module", "hashbrown", "num-complex", "num-bigint"] [dependencies.ndarray] From 4693463d27ca5e03c0bf8d724b4d11c1be9a9054 Mon Sep 17 00:00:00 2001 From: Ikko Hamamura Date: Thu, 25 Aug 2022 02:34:36 +0900 Subject: [PATCH 25/54] Skip binding when parameter is None (#8605) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/primitives/estimator.py | 4 +++- qiskit/primitives/sampler.py | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/qiskit/primitives/estimator.py b/qiskit/primitives/estimator.py index e0ae5c9924e3..b2e1b5215ba1 100644 --- a/qiskit/primitives/estimator.py +++ b/qiskit/primitives/estimator.py @@ -102,7 +102,9 @@ def _call( f"the number of parameters ({len(self._parameters[i])})." ) bound_circuits.append( - self._circuits[i].bind_parameters(dict(zip(self._parameters[i], value))) + self._circuits[i] + if len(value) == 0 + else self._circuits[i].bind_parameters(dict(zip(self._parameters[i], value))) ) sorted_observables = [self._observables[i] for i in observables] expectation_values = [] diff --git a/qiskit/primitives/sampler.py b/qiskit/primitives/sampler.py index e5cee820ffce..5626ec5416ba 100644 --- a/qiskit/primitives/sampler.py +++ b/qiskit/primitives/sampler.py @@ -106,12 +106,11 @@ def _call( f"The number of values ({len(value)}) does not match " f"the number of parameters ({len(self._parameters[i])})." ) - bound_circuit = ( + bound_circuits.append( self._circuits[i] if len(value) == 0 else self._circuits[i].bind_parameters(dict(zip(self._parameters[i], value))) ) - bound_circuits.append(bound_circuit) qargs_list.append(self._qargs_list[i]) probabilities = [ Statevector(circ).probabilities(qargs=qargs) From 58f1162fbe11e94ed34f5370e1bbc89bee989d09 Mon Sep 17 00:00:00 2001 From: Ikko Hamamura Date: Thu, 25 Aug 2022 04:15:08 +0900 Subject: [PATCH 26/54] Add setuptools_rust to tox.ini (#8606) * Add setuptools_rust to tox.ini * add setuptools_rust to docs * add comment Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- tox.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index d2bf7ad9f7a5..ef11d313352e 100644 --- a/tox.ini +++ b/tox.ini @@ -15,7 +15,8 @@ setenv = QISKIT_TEST_CAPTURE_STREAMS=1 QISKIT_PARALLEL=FALSE passenv = RAYON_NUM_THREADS OMP_NUM_THREADS QISKIT_PARALLEL RUST_BACKTRACE SETUPTOOLS_ENABLE_FEATURES -deps = -r{toxinidir}/requirements.txt +deps = setuptools_rust # This is work around for the bug of tox 3 (see #8606 for more details.) + -r{toxinidir}/requirements.txt -r{toxinidir}/requirements-dev.txt commands = stestr run {posargs} @@ -73,6 +74,7 @@ setenv = {[testenv]setenv} QISKIT_SUPPRESS_PACKAGING_WARNINGS=Y deps = + setuptools_rust # This is work around for the bug of tox 3 (see #8606 for more details.) -r{toxinidir}/requirements-dev.txt qiskit-aer commands = From d970c46b42c0a6a7800ba2e9ae5abe701679b2ac Mon Sep 17 00:00:00 2001 From: Anthony-Gandon Date: Wed, 24 Aug 2022 22:29:33 +0200 Subject: [PATCH 27/54] Fix VQD callback not being used (#8576) * Added support for non-hermitian operators in AerPauliExpectation Fixes #415 QEOM creates a dictionary of operators to evaluate on the groundstate. When using the noisy simulators (qasm_simulator or aer_simulator), one could either use PauliExpectation (with noise) or AerPauliExpectation (without noise). PauliExpectation works with non-hermitian operators but internal methods of AerPauliExpectation raised an Error. This is a workaround to this limitation. Note that using include_custom=True on qasm allows the VQE to use a local AerPauliExpectation without using the "expectation" input. This does not apply to QEOM and one should explicitly define the "expectation" input of the VQE for it to apply globally. * Added support for non-hermitian operators in AerPauliExpectation Fixes #415 QEOM creates a dictionary of operators to evaluate on the groundstate. When using the noisy simulators (qasm_simulator or aer_simulator), one could either use PauliExpectation (with noise) or AerPauliExpectation (without noise). PauliExpectation works with non-hermitian operators but internal methods of AerPauliExpectation raised an Error. This is a workaround to this limitation. Note that using include_custom=True on qasm allows the VQE to use a local AerPauliExpectation without using the "expectation" input. This does not apply to QEOM and one should explicitly define the "expectation" input of the VQE for it to apply globally. * Add a test case for non-hermitian operators. * Add a test case for non-hermitian operators. * Add a test case for non-hermitian operators. * Update test/python/opflow/test_aer_pauli_expectation.py Co-authored-by: Julien Gacon * Update aer_pauli_expectation.py Use a generator instead of list * Update qiskit/opflow/expectations/aer_pauli_expectation.py Co-authored-by: Julien Gacon * Update releasenotes/notes/add-support-non-hermitian-op-aerpauliexpectation-653d8e16de4eca07.yaml Co-authored-by: Julien Gacon * Add a test case for PauliOp * Change the test cases from using ~StateFn() to using StateFn(, is_measurement=True) * Fix the formatting * Working point for QEOM * Small changes + Release note * Undesired change * Undesired change * Indentation error * Parenthesis * Minor changes in docstring * Minor changes in docstring Co-authored-by: Julien Gacon Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/algorithms/eigen_solvers/vqd.py | 49 ++++++++++++------- ...e-of-callback-in-vqd-99e3c85f03181298.yaml | 9 ++++ test/python/algorithms/test_vqd.py | 16 +++++- 3 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 releasenotes/notes/make-use-of-callback-in-vqd-99e3c85f03181298.yaml diff --git a/qiskit/algorithms/eigen_solvers/vqd.py b/qiskit/algorithms/eigen_solvers/vqd.py index d5070fad4367..29d237820273 100644 --- a/qiskit/algorithms/eigen_solvers/vqd.py +++ b/qiskit/algorithms/eigen_solvers/vqd.py @@ -108,10 +108,11 @@ def __init__( Args: ansatz: A parameterized circuit used as ansatz for the wave function. k: the number of eigenvalues to return. Returns the lowest k eigenvalues. - betas: beta parameter in the VQD paper. Should have size k -1, the number of excited states. - It is a hyperparameter that balances the contribution of the overlap - term to the cost function and has a default value computed as - mean square sum of coefficients of observable. + betas: beta parameters in the VQD paper. + Should have length k - 1, with k the number of excited states. + These hyperparameters balance the contribution of each overlap term to the cost + function and have a default value computed as the mean square sum of the + coefficients of the observable. optimizer: A classical optimizer. Can either be a Qiskit optimizer or a callable that takes an array as input and returns a Qiskit or SciPy optimization result. initial_point: An optional initial point (i.e. initial parameter values) @@ -141,8 +142,8 @@ def __init__( callback: a callback that can access the intermediate data during the optimization. Four parameter values are passed to the callback as follows during each evaluation by the optimizer for its current set of parameters as it works towards the minimum. - These are: the evaluation count, the optimizer parameters for the - ansatz, the evaluated mean and the evaluated standard deviation.` + These are: the evaluation count, the optimizer parameters for the ansatz, the + evaluated mean, the evaluated standard deviation, and the current step. quantum_instance: Quantum Instance or Backend """ @@ -264,12 +265,12 @@ def include_custom(self, include_custom: bool): self.expectation = None @property - def callback(self) -> Optional[Callable[[int, np.ndarray, float, float], None]]: + def callback(self) -> Optional[Callable[[int, np.ndarray, float, float, int], None]]: """Returns callback""" return self._callback @callback.setter - def callback(self, callback: Optional[Callable[[int, np.ndarray, float, float], None]]): + def callback(self, callback: Optional[Callable[[int, np.ndarray, float, float, int], None]]): """Sets callback""" self._callback = callback @@ -475,7 +476,8 @@ def _eval_aux_ops( aux_op_results = zip(aux_op_means, std_devs) # Return None eigenvalues for None operators if aux_operators is a list. - # None operators are already dropped in compute_minimum_eigenvalue if aux_operators is a dict. + # None operators are already dropped in compute_minimum_eigenvalue if aux_operators is a + # dict. if isinstance(aux_operators, list): aux_operator_eigenvalues = [None] * len(aux_operators) key_value_iterator = enumerate(aux_op_results) @@ -608,7 +610,8 @@ def compute_eigenvalues( if step == 1: logger.info( - "Ground state optimization complete in %s seconds.\nFound opt_params %s in %s evals", + "Ground state optimization complete in %s seconds.\n" + "Found opt_params %s in %s evals", eval_time, result.optimal_point, self._eval_count, @@ -616,7 +619,8 @@ def compute_eigenvalues( else: logger.info( ( - "%s excited state optimization complete in %s s.\nFound opt_parms %s in %s evals" + "%s excited state optimization complete in %s s.\n" + "Found opt_params %s in %s evals" ), str(step - 1), eval_time, @@ -624,7 +628,7 @@ def compute_eigenvalues( self._eval_count, ) - # To match the siignature of NumpyEigenSolver Result + # To match the signature of NumpyEigenSolver Result result.eigenstates = ListOp([StateFn(vec) for vec in result.eigenstates]) result.eigenvalues = np.array(result.eigenvalues) result.optimal_point = np.array(result.optimal_point) @@ -649,7 +653,7 @@ def get_energy_evaluation( This return value is the objective function to be passed to the optimizer for evaluation. Args: - step: level of enegy being calculated. 0 for ground, 1 for first excited state and so on. + step: level of energy being calculated. 0 for ground, 1 for first excited state... operator: The operator whose energy to evaluate. return_expectation: If True, return the ``ExpectationBase`` expectation converter used in the construction of the expectation value. Useful e.g. to evaluate other @@ -695,22 +699,29 @@ def get_energy_evaluation( def energy_evaluation(parameters): parameter_sets = np.reshape(parameters, (-1, num_parameters)) - # Create dict associating each parameter with the lists of parameterization values for it + # Dict associating each parameter with the lists of parameterization values for it param_bindings = dict(zip(ansatz_params, parameter_sets.transpose().tolist())) sampled_expect_op = self._circuit_sampler.convert(expect_op, params=param_bindings) - mean = np.real(sampled_expect_op.eval()) + means = np.real(sampled_expect_op.eval()) for state in range(step - 1): sampled_final_op = self._circuit_sampler.convert( overlap_op[state], params=param_bindings ) cost = sampled_final_op.eval() - mean += np.real(self.betas[state] * np.conj(cost) * cost) - - self._eval_count += len(mean) + means += np.real(self.betas[state] * np.conj(cost) * cost) + + if self._callback is not None: + variance = np.real(expectation.compute_variance(sampled_expect_op)) + estimator_error = np.sqrt(variance / self.quantum_instance.run_config.shots) + for i, param_set in enumerate(parameter_sets): + self._eval_count += 1 + self._callback(self._eval_count, param_set, means[i], estimator_error[i], step) + else: + self._eval_count += len(means) - return mean if len(mean) > 1 else mean[0] + return means if len(means) > 1 else means[0] if return_expectation: return energy_evaluation, expectation diff --git a/releasenotes/notes/make-use-of-callback-in-vqd-99e3c85f03181298.yaml b/releasenotes/notes/make-use-of-callback-in-vqd-99e3c85f03181298.yaml new file mode 100644 index 000000000000..7c39e26200f5 --- /dev/null +++ b/releasenotes/notes/make-use-of-callback-in-vqd-99e3c85f03181298.yaml @@ -0,0 +1,9 @@ +features: + - | + Add calls of the callback function during the :meth:`energy_evaluation` to track the progress of + the algorithm. Also adds a ``step`` argument to the callback to track which eigenstates of the + Hamiltonian is currently being optimized. +issues: + - | + The callback function in the :class:`VQD` was defined but never used. + diff --git a/test/python/algorithms/test_vqd.py b/test/python/algorithms/test_vqd.py index 665d73d687dd..286f9422daad 100644 --- a/test/python/algorithms/test_vqd.py +++ b/test/python/algorithms/test_vqd.py @@ -257,13 +257,14 @@ def test_with_aer_qasm_snapshot_mode(self): def test_callback(self): """Test the callback on VQD.""" - history = {"eval_count": [], "parameters": [], "mean": [], "std": []} + history = {"eval_count": [], "parameters": [], "mean": [], "std": [], "step": []} - def store_intermediate_result(eval_count, parameters, mean, std): + def store_intermediate_result(eval_count, parameters, mean, std, step): history["eval_count"].append(eval_count) history["parameters"].append(parameters) history["mean"].append(mean) history["std"].append(std) + history["step"].append(step) optimizer = COBYLA(maxiter=3) wavefunction = self.ry_wavefunction @@ -279,9 +280,20 @@ def store_intermediate_result(eval_count, parameters, mean, std): self.assertTrue(all(isinstance(count, int) for count in history["eval_count"])) self.assertTrue(all(isinstance(mean, float) for mean in history["mean"])) self.assertTrue(all(isinstance(std, float) for std in history["std"])) + self.assertTrue(all(isinstance(count, int) for count in history["step"])) for params in history["parameters"]: self.assertTrue(all(isinstance(param, float) for param in params)) + ref_eval_count = [1, 2, 3, 1, 2, 3] + ref_mean = [-1.063, -1.457, -1.360, 37.340, 48.543, 28.586] + ref_std = [0.011, 0.010, 0.014, 0.011, 0.010, 0.015] + ref_step = [1, 1, 1, 2, 2, 2] + + np.testing.assert_array_almost_equal(history["eval_count"], ref_eval_count, decimal=0) + np.testing.assert_array_almost_equal(history["mean"], ref_mean, decimal=2) + np.testing.assert_array_almost_equal(history["std"], ref_std, decimal=2) + np.testing.assert_array_almost_equal(history["step"], ref_step, decimal=0) + def test_reuse(self): """Test re-using a VQD algorithm instance.""" vqd = VQD(k=1) From c008008be283253ea9d0c8c7fb75bdab51e73c94 Mon Sep 17 00:00:00 2001 From: Julien Gacon Date: Thu, 25 Aug 2022 16:54:48 +0200 Subject: [PATCH 28/54] Fix decomposition for a single qubit and clbit (#8614) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/transpiler/passes/basis/decompose.py | 6 +++++- .../notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml | 13 +++++++++++++ test/python/transpiler/test_decompose.py | 15 +++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml diff --git a/qiskit/transpiler/passes/basis/decompose.py b/qiskit/transpiler/passes/basis/decompose.py index 408a95271917..062e97558cfb 100644 --- a/qiskit/transpiler/passes/basis/decompose.py +++ b/qiskit/transpiler/passes/basis/decompose.py @@ -91,7 +91,11 @@ def run(self, dag: DAGCircuit) -> DAGCircuit: continue # TODO: allow choosing among multiple decomposition rules rule = node.op.definition.data - if len(rule) == 1 and len(node.qargs) == len(rule[0].qubits) == 1: + if ( + len(rule) == 1 + and len(node.qargs) == len(rule[0].qubits) == 1 # to preserve gate order + and len(node.cargs) == len(rule[0].clbits) == 0 + ): if node.op.definition.global_phase: dag.global_phase += node.op.definition.global_phase dag.substitute_node(node, rule[0].operation, inplace=True) diff --git a/releasenotes/notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml b/releasenotes/notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml new file mode 100644 index 000000000000..74d8d1faa83b --- /dev/null +++ b/releasenotes/notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml @@ -0,0 +1,13 @@ +--- +fixes: + - | + Fixed a bug where decomposing an instruction with one qubit and one classical bit + containing a single quantum gate failed. Now the following decomposes as expected:: + + block = QuantumCircuit(1, 1) + block.h(0) + + circuit = QuantumCircuit(1, 1) + circuit.append(block, [0], [0]) + + decomposed = circuit.decompose() diff --git a/test/python/transpiler/test_decompose.py b/test/python/transpiler/test_decompose.py index 1a0aaf4a4b68..2664a00c7fbb 100644 --- a/test/python/transpiler/test_decompose.py +++ b/test/python/transpiler/test_decompose.py @@ -300,3 +300,18 @@ def test_decompose_reps(self): decom_circ = self.complex_circuit.decompose(reps=2) decomposed = self.complex_circuit.decompose().decompose() self.assertEqual(decom_circ, decomposed) + + def test_decompose_single_qubit_clbit(self): + """Test the decomposition of a block with a single qubit and clbit works. + + Regression test of Qiskit/qiskit-terra#8591. + """ + block = QuantumCircuit(1, 1) + block.h(0) + + circuit = QuantumCircuit(1, 1) + circuit.append(block, [0], [0]) + + decomposed = circuit.decompose() + + self.assertEqual(decomposed, block) From 9f5f8fba5145cdfb521a0ed650e2273b8830b158 Mon Sep 17 00:00:00 2001 From: Takashi Imamichi <31178928+t-imamichi@users.noreply.github.com> Date: Fri, 26 Aug 2022 12:11:26 +0900 Subject: [PATCH 29/54] Improve performance of `Estimator` and `Sampler` by avoiding deep copy at `circuit_to_instruction`. (#8403) * add simplified circuit_to_instruction * add a safe guard * optimize sampler as well as estimator Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/primitives/estimator.py | 4 ++-- qiskit/primitives/sampler.py | 4 ++-- qiskit/primitives/utils.py | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/qiskit/primitives/estimator.py b/qiskit/primitives/estimator.py index b2e1b5215ba1..0715abfcd859 100644 --- a/qiskit/primitives/estimator.py +++ b/qiskit/primitives/estimator.py @@ -30,7 +30,7 @@ from .base_estimator import BaseEstimator from .estimator_result import EstimatorResult from .primitive_job import PrimitiveJob -from .utils import init_circuit, init_observable +from .utils import bound_circuit_to_instruction, init_circuit, init_observable class Estimator(BaseEstimator): @@ -114,7 +114,7 @@ def _call( f"The number of qubits of a circuit ({circ.num_qubits}) does not match " f"the number of qubits of a observable ({obs.num_qubits})." ) - final_state = Statevector(circ) + final_state = Statevector(bound_circuit_to_instruction(circ)) expectation_value = final_state.expectation_value(obs) if shots is None: expectation_values.append(expectation_value) diff --git a/qiskit/primitives/sampler.py b/qiskit/primitives/sampler.py index 5626ec5416ba..f9c1c2910ecb 100644 --- a/qiskit/primitives/sampler.py +++ b/qiskit/primitives/sampler.py @@ -29,7 +29,7 @@ from .base_sampler import BaseSampler from .primitive_job import PrimitiveJob from .sampler_result import SamplerResult -from .utils import final_measurement_mapping, init_circuit +from .utils import bound_circuit_to_instruction, final_measurement_mapping, init_circuit class Sampler(BaseSampler): @@ -113,7 +113,7 @@ def _call( ) qargs_list.append(self._qargs_list[i]) probabilities = [ - Statevector(circ).probabilities(qargs=qargs) + Statevector(bound_circuit_to_instruction(circ)).probabilities(qargs=qargs) for circ, qargs in zip(bound_circuits, qargs_list) ] if shots is not None: diff --git a/qiskit/primitives/utils.py b/qiskit/primitives/utils.py index 1e2c16ccad3c..36fbae8f15f9 100644 --- a/qiskit/primitives/utils.py +++ b/qiskit/primitives/utils.py @@ -15,7 +15,7 @@ from __future__ import annotations -from qiskit.circuit import ParameterExpression, QuantumCircuit +from qiskit.circuit import ParameterExpression, QuantumCircuit, Instruction from qiskit.extensions.quantum_initializer.initializer import Initialize from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp, Statevector @@ -111,3 +111,35 @@ def final_measurement_mapping(circuit: QuantumCircuit) -> dict[int, int]: # Sort so that classical bits are in numeric order low->high. mapping = dict(sorted(mapping.items(), key=lambda item: item[1])) return mapping + + +def bound_circuit_to_instruction(circuit: QuantumCircuit) -> Instruction: + """Build an :class:`~qiskit.circuit.Instruction` object from + a :class:`~qiskit.circuit.QuantumCircuit` + + This is a specialized version of :func:`~qiskit.converters.circuit_to_instruction` + to avoid deep copy. This requires a quantum circuit whose parameters are all bound. + Because this does not take a copy of the input circuit, this assumes that the input + circuit won't be modified. + + If https://github.com/Qiskit/qiskit-terra/issues/7983 is resolved, + we can remove this function. + + Args: + circuit(QuantumCircuit): Input quantum circuit + + Returns: + An :class:`~qiskit.circuit.Instruction` object + """ + if len(circuit.qregs) > 1: + return circuit.to_instruction() + + # len(circuit.qregs) == 1 -> No need to flatten qregs + inst = Instruction( + name=circuit.name, + num_qubits=circuit.num_qubits, + num_clbits=circuit.num_clbits, + params=[], + ) + inst.definition = circuit + return inst From a511d99c1f55856d3ce7c84be7457db296af79f7 Mon Sep 17 00:00:00 2001 From: Emilio <63567458+epelaaez@users.noreply.github.com> Date: Mon, 29 Aug 2022 02:55:24 -0500 Subject: [PATCH 30/54] Add CS and CCZ gates (#8583) * add cs and ccz gates * add csdg gate * add gates to equivalence library * add release note * fix equivalences * commit review suggestions * simplify definitions and add ctrl_state to inverse * removed unused import --- .../library/standard_gates/__init__.py | 7 +- .../standard_gates/equivalence_library.py | 48 ++++++ qiskit/circuit/library/standard_gates/s.py | 157 +++++++++++++++++- qiskit/circuit/library/standard_gates/z.py | 79 ++++++++- qiskit/circuit/quantumcircuit.py | 95 +++++++++++ ...cz-cs-and-csdg-gates-4ad05e323f1dec4d.yaml | 5 + 6 files changed, 386 insertions(+), 5 deletions(-) create mode 100644 releasenotes/notes/add-ccz-cs-and-csdg-gates-4ad05e323f1dec4d.yaml diff --git a/qiskit/circuit/library/standard_gates/__init__.py b/qiskit/circuit/library/standard_gates/__init__.py index c3d464d66879..d1345e13d8f2 100644 --- a/qiskit/circuit/library/standard_gates/__init__.py +++ b/qiskit/circuit/library/standard_gates/__init__.py @@ -36,6 +36,7 @@ CXGate CYGate CZGate + CCZGate HGate IGate MCPhaseGate @@ -54,6 +55,8 @@ ECRGate SGate SdgGate + CSGate + CSdgGate SwapGate iSwapGate SXGate @@ -84,7 +87,7 @@ from .xx_minus_yy import XXMinusYYGate from .xx_plus_yy import XXPlusYYGate from .ecr import ECRGate -from .s import SGate, SdgGate +from .s import SGate, SdgGate, CSGate, CSdgGate from .swap import SwapGate, CSwapGate from .iswap import iSwapGate from .sx import SXGate, SXdgGate, CSXGate @@ -97,6 +100,6 @@ from .x import XGate, CXGate, CCXGate, C3XGate, C3SXGate, C4XGate, RCCXGate, RC3XGate from .x import MCXGate, MCXGrayCode, MCXRecursive, MCXVChain from .y import YGate, CYGate -from .z import ZGate, CZGate +from .z import ZGate, CZGate, CCZGate from .multi_control_rotation_gates import mcrx, mcry, mcrz diff --git a/qiskit/circuit/library/standard_gates/equivalence_library.py b/qiskit/circuit/library/standard_gates/equivalence_library.py index 5ded739eb51f..f847d9a62eed 100644 --- a/qiskit/circuit/library/standard_gates/equivalence_library.py +++ b/qiskit/circuit/library/standard_gates/equivalence_library.py @@ -36,6 +36,8 @@ RZXGate, SGate, SdgGate, + CSGate, + CSdgGate, SwapGate, CSwapGate, iSwapGate, @@ -61,6 +63,7 @@ ECRGate, ZGate, CZGate, + CCZGate, ) @@ -496,6 +499,33 @@ def_sdg.append(U1Gate(-pi / 2), [q[0]], []) _sel.add_equivalence(SdgGate(), def_sdg) +# CSGate +# +# q_0: ──■── q_0: ───────■──────── +# ┌─┴─┐ ┌───┐┌─┴──┐┌───┐ +# q_1: ┤ S ├ = q_1: ┤ H ├┤ Sx ├┤ H ├ +# └───┘ └───┘└────┘└───┘ +q = QuantumRegister(2, "q") +def_cs = QuantumCircuit(q) +def_cs.append(HGate(), [q[1]], []) +def_cs.append(CSXGate(), [q[0], q[1]], []) +def_cs.append(HGate(), [q[1]], []) +_sel.add_equivalence(CSGate(), def_cs) + +# CSdgGate +# +# q_0: ───■─── q_0: ───────■────■──────── +# ┌──┴──┐ ┌───┐┌─┴─┐┌─┴──┐┌───┐ +# q_1: ┤ Sdg ├ = q_1: ┤ H ├┤ X ├┤ Sx ├┤ H ├ +# └─────┘ └───┘└───┘└────┘└───┘ +q = QuantumRegister(2, "q") +def_csdg = QuantumCircuit(q) +def_csdg.append(HGate(), [q[1]], []) +def_csdg.append(CXGate(), [q[0], q[1]], []) +def_csdg.append(CSXGate(), [q[0], q[1]], []) +def_csdg.append(HGate(), [q[1]], []) +_sel.add_equivalence(CSdgGate(), def_csdg) + # SdgGate # # ┌─────┐ ┌───┐┌───┐ @@ -1222,6 +1252,24 @@ def_cz.append(inst, qargs, cargs) _sel.add_equivalence(CZGate(), def_cz) +# CCZGate +# +# q_0: ─■─ q_0: ───────■─────── +# │ │ +# q_1: ─■─ = q_1: ───────■─────── +# │ ┌───┐┌─┴─┐┌───┐ +# q_2: ─■─ q_2: ┤ H ├┤ X ├┤ H ├ +# └───┘└───┘└───┘ +q = QuantumRegister(3, "q") +def_ccz = QuantumCircuit(q) +for inst, qargs, cargs in [ + (HGate(), [q[2]], []), + (CCXGate(), [q[0], q[1], q[2]], []), + (HGate(), [q[2]], []), +]: + def_ccz.append(inst, qargs, cargs) +_sel.add_equivalence(CCZGate(), def_ccz) + # XGate # global phase: π/2 # ┌───┐ ┌───────┐ diff --git a/qiskit/circuit/library/standard_gates/s.py b/qiskit/circuit/library/standard_gates/s.py index a9c2d96555a4..5bda08fa2a69 100644 --- a/qiskit/circuit/library/standard_gates/s.py +++ b/qiskit/circuit/library/standard_gates/s.py @@ -10,11 +10,12 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. -"""The S and Sdg gate.""" +"""The S, Sdg, CS and CSdg gates.""" -from typing import Optional +from typing import Optional, Union import numpy from qiskit.qasm import pi +from qiskit.circuit.controlledgate import ControlledGate from qiskit.circuit.gate import Gate from qiskit.circuit.quantumregister import QuantumRegister @@ -135,3 +136,155 @@ def inverse(self): def __array__(self, dtype=None): """Return a numpy.array for the Sdg gate.""" return numpy.array([[1, 0], [0, -1j]], dtype=dtype) + + +class CSGate(ControlledGate): + r"""Controlled-S gate. + + Can be applied to a :class:`~qiskit.circuit.QuantumCircuit` + with the :meth:`~qiskit.circuit.QuantumCircuit.cs` method. + + **Circuit symbol:** + + .. parsed-literal:: + + q_0: ──■── + ┌─┴─┐ + q_1: ┤ S ├ + └───┘ + + **Matrix representation:** + + .. math:: + + CS \ q_0, q_1 = + I \otimes |0 \rangle\langle 0| + S \otimes |1 \rangle\langle 1| = + \begin{pmatrix} + 1 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & i + \end{pmatrix} + """ + # Define class constants. This saves future allocation time. + _matrix1 = numpy.array( + [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1j], + ] + ) + _matrix0 = numpy.array( + [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1j, 0], + [0, 0, 0, 1], + ] + ) + + def __init__(self, label: Optional[str] = None, ctrl_state: Optional[Union[str, int]] = None): + """Create new CS gate.""" + super().__init__( + "cs", 2, [], label=label, num_ctrl_qubits=1, ctrl_state=ctrl_state, base_gate=SGate() + ) + + def _define(self): + """ + gate cs a,b { h b; cp(pi/2) a,b; h b; } + """ + # pylint: disable=cyclic-import + from .p import CPhaseGate + + self.definition = CPhaseGate(theta=pi / 2).definition + + def inverse(self): + """Return inverse of CSGate (CSdgGate).""" + return CSdgGate(ctrl_state=self.ctrl_state) + + def __array__(self, dtype=None): + """Return a numpy.array for the CS gate.""" + mat = self._matrix1 if self.ctrl_state == 1 else self._matrix0 + if dtype is not None: + return numpy.asarray(mat, dtype=dtype) + return mat + + +class CSdgGate(ControlledGate): + r"""Controlled-S^\dagger gate. + + Can be applied to a :class:`~qiskit.circuit.QuantumCircuit` + with the :meth:`~qiskit.circuit.QuantumCircuit.csdg` method. + + **Circuit symbol:** + + .. parsed-literal:: + + q_0: ───■─── + ┌──┴──┐ + q_1: ┤ Sdg ├ + └─────┘ + + **Matrix representation:** + + .. math:: + + CS^\dagger \ q_0, q_1 = + I \otimes |0 \rangle\langle 0| + S^\dagger \otimes |1 \rangle\langle 1| = + \begin{pmatrix} + 1 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & -i + \end{pmatrix} + """ + # Define class constants. This saves future allocation time. + _matrix1 = numpy.array( + [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, -1j], + ] + ) + _matrix0 = numpy.array( + [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, -1j, 0], + [0, 0, 0, 1], + ] + ) + + def __init__(self, label: Optional[str] = None, ctrl_state: Optional[Union[str, int]] = None): + """Create new CSdg gate.""" + super().__init__( + "csdg", + 2, + [], + label=label, + num_ctrl_qubits=1, + ctrl_state=ctrl_state, + base_gate=SdgGate(), + ) + + def _define(self): + """ + gate csdg a,b { h b; cp(-pi/2) a,b; h b; } + """ + # pylint: disable=cyclic-import + from .p import CPhaseGate + + self.definition = CPhaseGate(theta=-pi / 2).definition + + def inverse(self): + """Return inverse of CSdgGate (CSGate).""" + return CSGate(ctrl_state=self.ctrl_state) + + def __array__(self, dtype=None): + """Return a numpy.array for the CSdg gate.""" + mat = self._matrix1 if self.ctrl_state == 1 else self._matrix0 + if dtype is not None: + return numpy.asarray(mat, dtype=dtype) + return mat diff --git a/qiskit/circuit/library/standard_gates/z.py b/qiskit/circuit/library/standard_gates/z.py index df57352e869a..9fad215878f9 100644 --- a/qiskit/circuit/library/standard_gates/z.py +++ b/qiskit/circuit/library/standard_gates/z.py @@ -10,7 +10,7 @@ # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. -"""Z and CZ gates.""" +"""Z, CZ and CCZ gates.""" from typing import Optional, Union import numpy @@ -18,6 +18,7 @@ from qiskit.circuit.controlledgate import ControlledGate from qiskit.circuit.gate import Gate from qiskit.circuit.quantumregister import QuantumRegister +from qiskit.circuit._utils import _compute_control_matrix class ZGate(Gate): @@ -187,3 +188,79 @@ def __array__(self, dtype=None): return numpy.array( [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]], dtype=dtype ) + + +class CCZGate(ControlledGate): + r"""CCZ gate. + + This is a symmetric gate. + + Can be applied to a :class:`~qiskit.circuit.QuantumCircuit` + with the :meth:`~qiskit.circuit.QuantumCircuit.ccz` method. + + **Circuit symbol:** + + .. parsed-literal:: + + q_0: ─■─ + │ + q_1: ─■─ + │ + q_2: ─■─ + + **Matrix representation:** + + .. math:: + + CCZ\ q_0, q_1, q_2 = + I \otimes I \otimes |0\rangle\langle 0| + CZ \otimes |1\rangle\langle 1| = + \begin{pmatrix} + 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ + 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 0 & 0 & 0 & 0 & -1 + \end{pmatrix} + + In the computational basis, this gate flips the phase of + the target qubit if the control qubits are in the :math:`|11\rangle` state. + """ + + def __init__(self, label: Optional[str] = None, ctrl_state: Optional[Union[str, int]] = None): + """Create new CCZ gate.""" + super().__init__( + "ccz", 3, [], label=label, num_ctrl_qubits=2, ctrl_state=ctrl_state, base_gate=ZGate() + ) + + def _define(self): + """ + gate ccz a,b,c { h c; ccx a,b,c; h c; } + """ + # pylint: disable=cyclic-import + from qiskit.circuit.quantumcircuit import QuantumCircuit + from .h import HGate + from .x import CCXGate + + q = QuantumRegister(3, "q") + qc = QuantumCircuit(q, name=self.name) + rules = [(HGate(), [q[2]], []), (CCXGate(), [q[0], q[1], q[2]], []), (HGate(), [q[2]], [])] + for instr, qargs, cargs in rules: + qc._append(instr, qargs, cargs) + + self.definition = qc + + def inverse(self): + """Return inverted CCZ gate (itself).""" + return CCZGate(ctrl_state=self.ctrl_state) # self-inverse + + def __array__(self, dtype=None): + """Return a numpy.array for the CCZ gate.""" + mat = _compute_control_matrix( + self.base_gate.to_matrix(), self.num_ctrl_qubits, ctrl_state=self.ctrl_state + ) + if dtype is not None: + return numpy.asarray(mat, dtype=dtype) + return mat diff --git a/qiskit/circuit/quantumcircuit.py b/qiskit/circuit/quantumcircuit.py index 60ba8b80c6f3..a337102ea644 100644 --- a/qiskit/circuit/quantumcircuit.py +++ b/qiskit/circuit/quantumcircuit.py @@ -1698,6 +1698,7 @@ def qasm( "sx", "sxdg", "cz", + "ccz", "cy", "swap", "ch", @@ -1710,6 +1711,8 @@ def qasm( "cp", "cu3", "csx", + "cs", + "csdg", "cu", "rxx", "rzz", @@ -3460,6 +3463,66 @@ def sdg(self, qubit: QubitSpecifier) -> InstructionSet: return self.append(SdgGate(), [qubit], []) + def cs( + self, + control_qubit: QubitSpecifier, + target_qubit: QubitSpecifier, + label: Optional[str] = None, + ctrl_state: Optional[Union[str, int]] = None, + ) -> InstructionSet: + """Apply :class:`~qiskit.circuit.library.CSGate`. + + For the full matrix form of this gate, see the underlying gate documentation. + + Args: + control_qubit: The qubit(s) used as the control. + target_qubit: The qubit(s) targeted by the gate. + label: The string label of the gate in the circuit. + ctrl_state: + The control state in decimal, or as a bitstring (e.g. '1'). Defaults to controlling + on the '1' state. + + Returns: + A handle to the instructions created. + """ + from .library.standard_gates.s import CSGate + + return self.append( + CSGate(label=label, ctrl_state=ctrl_state), + [control_qubit, target_qubit], + [], + ) + + def csdg( + self, + control_qubit: QubitSpecifier, + target_qubit: QubitSpecifier, + label: Optional[str] = None, + ctrl_state: Optional[Union[str, int]] = None, + ) -> InstructionSet: + """Apply :class:`~qiskit.circuit.library.CSdgGate`. + + For the full matrix form of this gate, see the underlying gate documentation. + + Args: + control_qubit: The qubit(s) used as the control. + target_qubit: The qubit(s) targeted by the gate. + label: The string label of the gate in the circuit. + ctrl_state: + The control state in decimal, or as a bitstring (e.g. '1'). Defaults to controlling + on the '1' state. + + Returns: + A handle to the instructions created. + """ + from .library.standard_gates.s import CSdgGate + + return self.append( + CSdgGate(label=label, ctrl_state=ctrl_state), + [control_qubit, target_qubit], + [], + ) + def swap(self, qubit1: QubitSpecifier, qubit2: QubitSpecifier) -> InstructionSet: """Apply :class:`~qiskit.circuit.library.SwapGate`. @@ -4230,6 +4293,38 @@ def cz( CZGate(label=label, ctrl_state=ctrl_state), [control_qubit, target_qubit], [] ) + def ccz( + self, + control_qubit1: QubitSpecifier, + control_qubit2: QubitSpecifier, + target_qubit: QubitSpecifier, + label: Optional[str] = None, + ctrl_state: Optional[Union[str, int]] = None, + ) -> InstructionSet: + r"""Apply :class:`~qiskit.circuit.library.CCZGate`. + + For the full matrix form of this gate, see the underlying gate documentation. + + Args: + control_qubit1: The qubit(s) used as the first control. + control_qubit2: The qubit(s) used as the second control. + target_qubit: The qubit(s) targeted by the gate. + label: The string label of the gate in the circuit. + ctrl_state: + The control state in decimal, or as a bitstring (e.g. '10'). Defaults to controlling + on the '11' state. + + Returns: + A handle to the instructions created. + """ + from .library.standard_gates.z import CCZGate + + return self.append( + CCZGate(label=label, ctrl_state=ctrl_state), + [control_qubit1, control_qubit2, target_qubit], + [], + ) + def pauli( self, pauli_string: str, diff --git a/releasenotes/notes/add-ccz-cs-and-csdg-gates-4ad05e323f1dec4d.yaml b/releasenotes/notes/add-ccz-cs-and-csdg-gates-4ad05e323f1dec4d.yaml new file mode 100644 index 000000000000..c15c8f52ed5d --- /dev/null +++ b/releasenotes/notes/add-ccz-cs-and-csdg-gates-4ad05e323f1dec4d.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Add new gates :class:`.CZZGate`, :class:`.CSGate`, and :class:`.CSdgGate`. + Added their equivalences into the standard :class:`EquivalenceLibrary`. From f2bf19173c65abe7e79f1d99a8735ea2af7bbe00 Mon Sep 17 00:00:00 2001 From: Ikko Hamamura Date: Mon, 29 Aug 2022 18:42:59 +0900 Subject: [PATCH 31/54] Support deprecate_arguments with new_arg None (#8613) * Support deprecate_arguments with None new_arg * Update qiskit/utils/deprecation.py Co-authored-by: Julien Gacon * fix lint * removed Co-authored-by: Julien Gacon Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/utils/deprecation.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/qiskit/utils/deprecation.py b/qiskit/utils/deprecation.py index 1a73803ab4f3..ccfa93615287 100644 --- a/qiskit/utils/deprecation.py +++ b/qiskit/utils/deprecation.py @@ -59,11 +59,19 @@ def _rename_kwargs(func_name, kwargs, kwarg_map): if new_arg in kwargs: raise TypeError(f"{func_name} received both {new_arg} and {old_arg} (deprecated).") - warnings.warn( - "{} keyword argument {} is deprecated and " - "replaced with {}.".format(func_name, old_arg, new_arg), - DeprecationWarning, - stacklevel=3, - ) - - kwargs[new_arg] = kwargs.pop(old_arg) + if new_arg is None: + warnings.warn( + f"{func_name} keyword argument {old_arg} is deprecated and " + "will in future be removed.", + DeprecationWarning, + stacklevel=3, + ) + else: + warnings.warn( + f"{func_name} keyword argument {old_arg} is deprecated and " + f"replaced with {new_arg}.", + DeprecationWarning, + stacklevel=3, + ) + + kwargs[new_arg] = kwargs.pop(old_arg) From 231961d6cfc3d944a8935c755f1d75ce68a311d1 Mon Sep 17 00:00:00 2001 From: Marc Sanz Drudis <93275620+MarcDrudis@users.noreply.github.com> Date: Mon, 29 Aug 2022 16:18:20 +0200 Subject: [PATCH 32/54] Steppable Optimizer (#8170) * All Changes so far * Revert "All Changes so far" This reverts commit 871f29ef540d3d5f93e3ffb5bee17295b3d4d65c. * All changes again * tests * Formated documentation Gradient Descent * Reviewed Documentation * Dealing with CALLBACK * Fixing documentation * Documentation * Apply suggestions from code review Co-authored-by: Daniel J. Egger <38065505+eggerdj@users.noreply.github.com> * GD docs * Fixed format of documentation * Typo * Imported files CMAES * Testing * Forgot to add nit to result * Started stopping conditions * Fixed comments * Changes * merge and black * Fixed documentation * IDK why docs is missing optimize * make black * Updated Documentation * Updated Documentation * Remove CMAES and merge * Removed CMAES * Learning Rate Class * Lint * RENO and unittests * Removed attribute documentation * Fixed variable name * Added Learning Rate * Fixed unittestt * Fixes * Apply suggestions from code review Co-authored-by: Julien Gacon * Fixing utils? * lint * Fixed Reno? * Update releasenotes/notes/steppable-optimizers-9d9b48ba78bd58bb.yaml Co-authored-by: Julien Gacon * Apply suggestions from code review Co-authored-by: Julien Gacon * Fixed documentation typo * Removed properties * Apply suggestions from code review Co-authored-by: Daniel J. Egger <38065505+eggerdj@users.noreply.github.com> * Fixed comments * Learning Rate init * LearningRate init * Update qiskit/algorithms/optimizers/utils/learning_rate.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * changes * changes * I can't fix the documentation * Accidentaly merged with an other branch * remains Co-authored-by: Daniel J. Egger <38065505+eggerdj@users.noreply.github.com> Co-authored-by: Julien Gacon Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/algorithms/__init__.py | 1 + qiskit/algorithms/optimizers/__init__.py | 30 +- .../algorithms/optimizers/gradient_descent.py | 346 +++++++++++++----- .../optimizers/optimizer_utils/__init__.py | 27 ++ .../optimizer_utils/learning_rate.py | 83 +++++ .../optimizers/steppable_optimizer.py | 302 +++++++++++++++ ...steppable-optimizers-9d9b48ba78bd58bb.yaml | 96 +++++ .../optimizers/test_gradient_descent.py | 125 +++++-- .../algorithms/optimizers/utils/__init__.py | 12 + .../optimizers/utils/test_learning_rate.py | 54 +++ 10 files changed, 967 insertions(+), 109 deletions(-) create mode 100644 qiskit/algorithms/optimizers/optimizer_utils/__init__.py create mode 100644 qiskit/algorithms/optimizers/optimizer_utils/learning_rate.py create mode 100644 qiskit/algorithms/optimizers/steppable_optimizer.py create mode 100644 releasenotes/notes/steppable-optimizers-9d9b48ba78bd58bb.yaml create mode 100644 test/python/algorithms/optimizers/utils/__init__.py create mode 100644 test/python/algorithms/optimizers/utils/test_learning_rate.py diff --git a/qiskit/algorithms/__init__.py b/qiskit/algorithms/__init__.py index 30d71a59e59c..f7929e337c4d 100644 --- a/qiskit/algorithms/__init__.py +++ b/qiskit/algorithms/__init__.py @@ -264,6 +264,7 @@ from .evolvers.trotterization import TrotterQRTE from .evolvers.variational.var_qite import VarQITE from .evolvers.variational.var_qrte import VarQRTE + from .evolvers.pvqd import PVQD, PVQDResult __all__ = [ diff --git a/qiskit/algorithms/optimizers/__init__.py b/qiskit/algorithms/optimizers/__init__.py index c0f30d86dd32..c1e6ef58bbd5 100644 --- a/qiskit/algorithms/optimizers/__init__.py +++ b/qiskit/algorithms/optimizers/__init__.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2018, 2020. +# (C) Copyright IBM 2018, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -39,6 +39,25 @@ Optimizer Minimizer +Steppable Optimizer Base Class +============================== + +.. autosummary:: + :toctree: ../stubs/ + + optimizer_utils + +.. autosummary:: + :toctree: ../stubs/ + :nosignatures: + + SteppableOptimizer + AskData + TellData + OptimizerState + + + Local Optimizers ================ @@ -53,6 +72,7 @@ L_BFGS_B GSLS GradientDescent + GradientDescentState NELDER_MEAD NFT P_BFGS @@ -110,7 +130,7 @@ from .cg import CG from .cobyla import COBYLA from .gsls import GSLS -from .gradient_descent import GradientDescent +from .gradient_descent import GradientDescent, GradientDescentState from .imfil import IMFIL from .l_bfgs_b import L_BFGS_B from .nelder_mead import NELDER_MEAD @@ -120,6 +140,7 @@ from .nlopts.direct_l_rand import DIRECT_L_RAND from .nlopts.esch import ESCH from .nlopts.isres import ISRES +from .steppable_optimizer import SteppableOptimizer, AskData, TellData, OptimizerState from .optimizer import Minimizer, Optimizer, OptimizerResult, OptimizerSupportLevel from .p_bfgs import P_BFGS from .powell import POWELL @@ -134,6 +155,10 @@ __all__ = [ "Optimizer", "OptimizerSupportLevel", + "SteppableOptimizer", + "AskData", + "TellData", + "OptimizerState", "OptimizerResult", "Minimizer", "ADAM", @@ -142,6 +167,7 @@ "COBYLA", "GSLS", "GradientDescent", + "GradientDescentState", "L_BFGS_B", "NELDER_MEAD", "NFT", diff --git a/qiskit/algorithms/optimizers/gradient_descent.py b/qiskit/algorithms/optimizers/gradient_descent.py index 38ed55048623..a354aa383a2b 100644 --- a/qiskit/algorithms/optimizers/gradient_descent.py +++ b/qiskit/algorithms/optimizers/gradient_descent.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2021. +# (C) Copyright IBM 2021, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -12,17 +12,36 @@ """A standard gradient descent optimizer.""" -from typing import Iterator, Optional, Union, Callable, Dict, Any, List, Tuple -from functools import partial - +from dataclasses import dataclass, field +from typing import Dict, Any, Union, Callable, Optional, Tuple, List, Iterator import numpy as np - from .optimizer import Optimizer, OptimizerSupportLevel, OptimizerResult, POINT +from .steppable_optimizer import AskData, TellData, OptimizerState, SteppableOptimizer +from .optimizer_utils import LearningRate CALLBACK = Callable[[int, np.ndarray, float, float], None] -class GradientDescent(Optimizer): +@dataclass +class GradientDescentState(OptimizerState): + """State of :class:`~.GradientDescent`. + + Dataclass with all the information of an optimizer plus the learning_rate and the stepsize. + """ + + stepsize: Optional[float] + """Norm of the gradient on the last step.""" + + learning_rate: LearningRate = field(compare=False) + """Learning rate at the current step of the optimization process. + + It behaves like a generator, (use ``next(learning_rate)`` to get the learning rate for the + next step) but it can also return the current learning rate with ``learning_rate.current``. + + """ + + +class GradientDescent(SteppableOptimizer): r"""The gradient descent minimization routine. For a function :math:`f` and an initial point :math:`\vec\theta_0`, the standard (or "vanilla") @@ -31,14 +50,14 @@ class GradientDescent(Optimizer): .. math:: - \vec\theta_{n+1} = \vec\theta_{n} - \vec\eta\nabla f(\vec\theta_{n}), + \vec\theta_{n+1} = \vec\theta_{n} - \eta_n \vec\nabla f(\vec\theta_{n}), - for a small learning rate :math:`\eta > 0`. + for a small learning rate :math:`\eta_n > 0`. - You can either provide the analytic gradient :math:`\vec\nabla f` as ``gradient_function`` - in the ``optimize`` method, or, if you do not provide it, use a finite difference approximation - of the gradient. To adapt the size of the perturbation in the finite difference gradients, - set the ``perturbation`` property in the initializer. + You can either provide the analytic gradient :math:`\vec\nabla f` as ``jac`` + in the :meth:`~.minimize` method, or, if you do not provide it, use a finite difference + approximation of the gradient. To adapt the size of the perturbation in the finite difference + gradients, set the ``perturbation`` property in the initializer. This optimizer supports a callback function. If provided in the initializer, the optimizer will call the callback in each iteration with the following information in this order: @@ -60,14 +79,14 @@ def f(x): initial_point = np.array([1, 0.5, -0.2]) optimizer = GradientDescent(maxiter=100) - x_opt, fx_opt, nfevs = optimizer.optimize(initial_point.size, - f, - initial_point=initial_point) - print(f"Found minimum {x_opt} at a value of {fx_opt} using {nfevs} evaluations.") + result = optimizer.minimize(fun=fun, x0=initial_point) + + print(f"Found minimum {result.x} at a value" + "of {result.fun} using {result.nfev} evaluations.") An example where the learning rate is an iterator and we supply the analytic gradient. - Note how much faster this convergences (i.e. less ``nfevs``) compared to the previous + Note how much faster this convergences (i.e. less ``nfev``) compared to the previous example. .. code-block:: python @@ -77,7 +96,6 @@ def f(x): def learning_rate(): power = 0.6 constant_coeff = 0.1 - def powerlaw(): n = 0 while True: @@ -95,42 +113,151 @@ def grad_f(x): initial_point = np.array([1, 0.5, -0.2]) optimizer = GradientDescent(maxiter=100, learning_rate=learning_rate) - x_opt, fx_opt, nfevs = optimizer.optimize(initial_point.size, - f, - gradient_function=grad_f, - initial_point=initial_point) + result = optimizer.minimize(fun=fun, jac=grad_f, x0=initial_point) + + print(f"Found minimum {result.x} at a value" + "of {result.fun} using {result.nfev} evaluations.") + + + An other example where the evaluation of the function has a chance of failing. The user, with + specific knowledge about his function can catch this errors and handle them before passing the + result to the optimizer. + + .. code-block:: python + + import random + import numpy as np + from qiskit.algorithms.optimizers import GradientDescent + + def objective(x): + if random.choice([True, False]): + return None + else: + return (np.linalg.norm(x) - 1) ** 2 + + def grad(x): + if random.choice([True, False]): + return None + else: + return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) + - print(f"Found minimum {x_opt} at a value of {fx_opt} using {nfevs} evaluations.") + initial_point = np.random.normal(0, 1, size=(100,)) + + optimizer = GradientDescent(maxiter=20) + optimizer.start(x0=initial_point, fun=objective, jac=grad) + + while optimizer.continue_condition(): + ask_data = optimizer.ask() + evaluated_gradient = None + + while evaluated_gradient is None: + evaluated_gradient = grad(ask_data.x_center) + optimizer.state.njev += 1 + + optmizer.state.nit += 1 + + tell_data = TellData(eval_jac=evaluated_gradient) + optimizer.tell(ask_data=ask_data, tell_data=tell_data) + + result = optimizer.create_result() + + Users that aren't dealing with complicated functions and who are more familiar with step by step + optimization algorithms can use the :meth:`~.step` method which wraps the :meth:`~.ask` + and :meth:`~.tell` methods. In the same spirit the method :meth:`~.minimize` will optimize the + function and return the result. + + To see other libraries that use this interface one can visit: + https://optuna.readthedocs.io/en/stable/tutorial/20_recipes/009_ask_and_tell.html """ def __init__( self, maxiter: int = 100, - learning_rate: Union[float, Callable[[], Iterator]] = 0.01, + learning_rate: Union[float, List[float], np.ndarray, Callable[[], Iterator]] = 0.01, tol: float = 1e-7, callback: Optional[CALLBACK] = None, perturbation: Optional[float] = None, ) -> None: - r""" + """ Args: maxiter: The maximum number of iterations. - learning_rate: A constant or generator yielding learning rates for the parameter - updates. See the docstring for an example. + learning_rate: A constant, list, array or factory of generators yielding learning rates + for the parameter updates. See the docstring for an example. tol: If the norm of the parameter update is smaller than this threshold, the - optimizer is converged. - perturbation: If no gradient is passed to ``GradientDescent.optimize`` the gradient is - approximated with a symmetric finite difference scheme with ``perturbation`` + optimizer has converged. + perturbation: If no gradient is passed to :meth:`~.minimize` the gradient is + approximated with a forward finite difference scheme with ``perturbation`` perturbation in both directions (defaults to 1e-2 if required). - Ignored if a gradient callable is passed to ``GradientDescent.optimize``. + Ignored when we have an explicit function for the gradient. + Raises: + ValueError: If ``learning_rate`` is an array and its lenght is less than ``maxiter``. """ - super().__init__() - - self.maxiter = maxiter - self.learning_rate = learning_rate - self.perturbation = perturbation - self.tol = tol + super().__init__(maxiter=maxiter) self.callback = callback + self._state: Optional[GradientDescentState] = None + self._perturbation = perturbation + self._tol = tol + # if learning rate is an array, check it is sufficiently long. + if isinstance(learning_rate, (list, np.ndarray)): + if len(learning_rate) < maxiter: + raise ValueError( + f"Length of learning_rate ({len(learning_rate)}) " + f"is smaller than maxiter ({maxiter})." + ) + self.learning_rate = learning_rate + + @property + def state(self) -> GradientDescentState: + """Return the current state of the optimizer.""" + return self._state + + @state.setter + def state(self, state: GradientDescentState) -> None: + """Set the current state of the optimizer.""" + self._state = state + + @property + def tol(self) -> float: + """Returns the tolerance of the optimizer. + + Any step with smaller stepsize than this value will stop the optimization.""" + return self._tol + + @tol.setter + def tol(self, tol: float) -> None: + """Set the tolerance.""" + self._tol = tol + + @property + def perturbation(self) -> Optional[float]: + """Returns the perturbation. + + This is the perturbation used in the finite difference gradient approximation. + """ + return self._perturbation + + @perturbation.setter + def perturbation(self, perturbation: Optional[float]) -> None: + """Set the perturbation.""" + self._perturbation = perturbation + + def _callback_wrapper(self) -> None: + """ + Wraps the callback function to accomodate GradientDescent. + + Will call :attr:`~.callback` and pass the following arguments: + current number of function values, current parameters, current function value, + norm of current gradient. + """ + if self.callback is not None: + self.callback( + self.state.nfev, + self.state.x, + self.state.fun(self.state.x), + self.state.stepsize, + ) @property def settings(self) -> Dict[str, Any]: @@ -149,60 +276,114 @@ def settings(self) -> Dict[str, Any]: "callback": self.callback, } - def minimize( - self, - fun: Callable[[POINT], float], - x0: POINT, - jac: Optional[Callable[[POINT], POINT]] = None, - bounds: Optional[List[Tuple[float, float]]] = None, - ) -> OptimizerResult: - # set learning rate - if isinstance(self.learning_rate, float): - eta = constant(self.learning_rate) - else: - eta = self.learning_rate() + def ask(self) -> AskData: + """Returns an object with the data needed to evaluate the gradient. + + If this object contains a gradient function the gradient can be evaluated directly. Otherwise + approximate it with a finite difference scheme. + """ + return AskData( + x_jac=self.state.x, + ) + + def tell(self, ask_data: AskData, tell_data: TellData) -> None: + """ + Updates :attr:`.~GradientDescentState.x` by an ammount proportional to the learning + rate and value of the gradient at that point. + + Args: + ask_data: The data used to evaluate the function. + tell_data: The data from the function evaluation. + + Raises: + ValueError: If the gradient passed doesn't have the right dimension. + """ + if np.shape(self.state.x) != np.shape(tell_data.eval_jac): + raise ValueError("The gradient does not have the correct dimension") + self.state.x = self.state.x - next(self.state.learning_rate) * tell_data.eval_jac + self.state.stepsize = np.linalg.norm(tell_data.eval_jac) + self.state.nit += 1 + + def evaluate(self, ask_data: AskData) -> TellData: + """Evaluates the gradient. - if jac is None: - eps = 0.01 if self.perturbation is None else self.perturbation - jac = partial( - Optimizer.gradient_num_diff, - f=fun, + It does so either by evaluating an analytic gradient or by approximating it with a + finite difference scheme. It will either add ``1`` to the number of gradient evaluations or add + ``N+1`` to the number of function evaluations (Where N is the dimension of the gradient). + + Args: + ask_data: It contains the point where the gradient is to be evaluated and the gradient + function or, in its absence, the objective function to perform a finite difference + approximation. + + Returns: + The data containing the gradient evaluation. + """ + if self.state.jac is None: + eps = 0.01 if (self.perturbation is None) else self.perturbation + grad = Optimizer.gradient_num_diff( + x_center=ask_data.x_jac, + f=self.state.fun, epsilon=eps, max_evals_grouped=self._max_evals_grouped, ) + self.state.nfev += 1 + len(ask_data.x_jac) + else: + grad = self.state.jac(ask_data.x_jac) + self.state.njev += 1 - # prepare some initials - x = np.asarray(x0) - nfevs = 0 + return TellData(eval_jac=grad) - for _ in range(1, self.maxiter + 1): - # compute update -- gradient evaluation counts as one function evaluation - update = jac(x) - nfevs += 1 + def create_result(self) -> OptimizerResult: + """Creates a result of the optimization process. - # compute next parameter value - x_next = x - next(eta) * update + This result contains the best point, the best function value, the number of function/gradient + evaluations and the number of iterations. - # send information to callback - stepsize = np.linalg.norm(update) - if self.callback is not None: - self.callback(nfevs, x_next, fun(x_next), stepsize) + Returns: + The result of the optimization process. + """ + result = OptimizerResult() + result.x = self.state.x + result.fun = self.state.fun(self.state.x) + result.nfev = self.state.nfev + result.njev = self.state.njev + result.nit = self.state.nit + return result - # update parameters - x = x_next + def start( + self, + fun: Callable[[POINT], float], + x0: POINT, + jac: Optional[Callable[[POINT], POINT]] = None, + bounds: Optional[List[Tuple[float, float]]] = None, + ) -> None: - # check termination - if stepsize < self.tol: - break + self.state = GradientDescentState( + fun=fun, + jac=jac, + x=np.asarray(x0), + nit=0, + nfev=0, + njev=0, + learning_rate=LearningRate(learning_rate=self.learning_rate), + stepsize=None, + ) + + def continue_condition(self) -> bool: + """ + Condition that indicates the optimization process should come to an end. - # TODO the optimizer result should contain the number of gradient evaluations, - # if the gradient is passed - result = OptimizerResult() - result.x = x - result.fun = fun(x) - result.nfev = nfevs + When the stepsize is smaller than the tolerance, the optimization process is considered + finished. - return result + Returns: + ``True`` if the optimization process should continue, ``False`` otherwise. + """ + if self.state.stepsize is None: + return True + else: + return (self.state.stepsize > self.tol) and super().continue_condition() def get_support_level(self): """Get the support level dictionary.""" @@ -211,10 +392,3 @@ def get_support_level(self): "bounds": OptimizerSupportLevel.ignored, "initial_point": OptimizerSupportLevel.required, } - - -def constant(eta=0.01): - """Yield a constant.""" - - while True: - yield eta diff --git a/qiskit/algorithms/optimizers/optimizer_utils/__init__.py b/qiskit/algorithms/optimizers/optimizer_utils/__init__.py new file mode 100644 index 000000000000..33c5bc90b087 --- /dev/null +++ b/qiskit/algorithms/optimizers/optimizer_utils/__init__.py @@ -0,0 +1,27 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Utils for optimizers + +Optimizer Utils (:mod:`qiskit.algorithms.optimizers.optimizer_utils`) +===================================================================== + +.. autosummary:: + :toctree: ../stubs/ + :nosignatures: + + LearningRate + +""" + +from .learning_rate import LearningRate + +__all__ = ["LearningRate"] diff --git a/qiskit/algorithms/optimizers/optimizer_utils/learning_rate.py b/qiskit/algorithms/optimizers/optimizer_utils/learning_rate.py new file mode 100644 index 000000000000..8ba8a0c69ca5 --- /dev/null +++ b/qiskit/algorithms/optimizers/optimizer_utils/learning_rate.py @@ -0,0 +1,83 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021, 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""A class to represent the Learning Rate.""" + +from typing import Union, Callable, Optional, List, Iterator, Generator +from itertools import tee +import numpy as np + + +class LearningRate(Generator): + """Represents a Learning Rate. + Will be an attribute of :class:`~.GradientDescentState`. Note that :class:`~.GradientDescent` also + has a learning rate. That learning rate can be a float, a list, an array, a function returning + a generator and will be used to create a generator to be used during the + optimization process. + This class wraps ``Generator`` so that we can also access the last yielded value. + """ + + def __init__( + self, learning_rate: Union[float, List[float], np.ndarray, Callable[[], Iterator]] + ): + """ + Args: + learning_rate: Used to create a generator to iterate on. + """ + if isinstance(learning_rate, (float, int)): + self._gen = constant(learning_rate) + elif isinstance(learning_rate, Generator): + learning_rate, self._gen = tee(learning_rate) + elif isinstance(learning_rate, (list, np.ndarray)): + self._gen = (eta for eta in learning_rate) + else: + self._gen = learning_rate() + + self._current: Optional[float] = None + + def send(self, value): + """Send a value into the generator. + Return next yielded value or raise StopIteration. + """ + self._current = next(self._gen) + return self.current + + def throw(self, typ, val=None, tb=None): + """Raise an exception in the generator. + Return next yielded value or raise StopIteration. + """ + if val is None: + if tb is None: + raise typ + val = typ() + if tb is not None: + val = val.with_traceback(tb) + raise val + + @property + def current(self): + """Returns the current value of the learning rate.""" + return self._current + + +def constant(learning_rate: float = 0.01) -> Generator[float, None, None]: + """Returns a python generator that always yields the same value. + + Args: + learning_rate: The value to yield. + + Yields: + The learning rate for the next iteration. + """ + + while True: + yield learning_rate diff --git a/qiskit/algorithms/optimizers/steppable_optimizer.py b/qiskit/algorithms/optimizers/steppable_optimizer.py new file mode 100644 index 000000000000..928777133026 --- /dev/null +++ b/qiskit/algorithms/optimizers/steppable_optimizer.py @@ -0,0 +1,302 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""SteppableOptimizer interface""" + +from abc import abstractmethod, ABC +from dataclasses import dataclass +from typing import Union, Callable, Optional, Tuple, List +from .optimizer import Optimizer, POINT, OptimizerResult + + +@dataclass +class AskData(ABC): + """Base class for return type of :meth:`~.SteppableOptimizer.ask`. + + Args: + x_fun: Point or list of points where the function needs to be evaluated to compute the next + state of the optimizer. + x_jac: Point or list of points where the gradient/jacobian needs to be evaluated to compute + the next state of the optimizer. + + """ + + x_fun: Optional[Union[POINT, List[POINT]]] = None + x_jac: Optional[Union[POINT, List[POINT]]] = None + + +@dataclass +class TellData(ABC): + """Base class for argument type of :meth:`~.SteppableOptimizer.tell`. + + Args: + eval_fun: Image of the function at :attr:`~.ask_data.x_fun`. + eval_jac: Image of the gradient-jacobian at :attr:`~.ask_data.x_jac`. + + """ + + eval_fun: Union[float, List[float], None] = None + eval_jac: Union[POINT, List[POINT], None] = None + + +@dataclass +class OptimizerState: + """Base class representing the state of the optimizer. + + This class stores the current state of the optimizer, given by the current point and + (optionally) information like the function value, the gradient or the number of + function evaluations. This dataclass can also store any other individual variables that + change during the optimization. + + """ + + x: POINT # pylint: disable=invalid-name + """Current optimization parameters.""" + fun: Optional[Callable[[POINT], float]] + """Function being optimized.""" + jac: Optional[Callable[[POINT], POINT]] + """Jacobian of the function being optimized.""" + nfev: Optional[int] + """Number of function evaluations so far in the optimization.""" + njev: Optional[int] + """Number of jacobian evaluations so far in the opimization.""" + nit: Optional[int] + """Number of optmization steps performed so far in the optimization.""" + + +class SteppableOptimizer(Optimizer): + """ + Base class for a steppable optimizer. + + This family of optimizers uses the `ask and tell interface + `_. + When using this interface the user has to call :meth:`~.ask` to get information about + how to evaluate the fucntion (we are asking the optimizer about how to do the evaluation). + This information is typically the next points at which the function is evaluated, but depending + on the optimizer it can also determine whether to evaluate the function or its gradient. + Once the function has been evaluated, the user calls the method :meth:`~..tell` + to tell the optimizer what the result of the function evaluation(s) is. The optimizer then + updates its state accordingly and the user can decide whether to stop the optimization process + or to repeat a step. + + This interface is more customizable, and allows the user to have full control over the evaluation + of the function. + + Examples: + + An example where the evaluation of the function has a chance of failing. The user, with + specific knowledge about his function can catch this errors and handle them before passing + the result to the optimizer. + + .. code-block:: python + + import random + import numpy as np + from qiskit.algorithms.optimizers import GradientDescent + + def objective(x): + if random.choice([True, False]): + return None + else: + return (np.linalg.norm(x) - 1) ** 2 + + def grad(x): + if random.choice([True, False]): + return None + else: + return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) + + + initial_point = np.random.normal(0, 1, size=(100,)) + + optimizer = GradientDescent(maxiter=20) + optimizer.start(x0=initial_point, fun=objective, jac=grad) + + while optimizer.continue_condition(): + ask_data = optimizer.ask() + evaluated_gradient = None + + while evaluated_gradient is None: + evaluated_gradient = grad(ask_data.x_center) + optimizer.state.njev += 1 + + optmizer.state.nit += 1 + + cf = TellData(eval_jac=evaluated_gradient) + optimizer.tell(ask_data=ask_data, tell_data=tell_data) + + result = optimizer.create_result() + + + Users that aren't dealing with complicated functions and who are more familiar with step by step + optimization algorithms can use the :meth:`~.step` method which wraps the :meth:`~.ask` + and :meth:`~.tell` methods. In the same spirit the method :meth:`~.minimize` will optimize the + function and return the result. + + To see other libraries that use this interface one can visit: + https://optuna.readthedocs.io/en/stable/tutorial/20_recipes/009_ask_and_tell.html + + + """ + + def __init__( + self, + maxiter: int = 100, + ): + """ + Args: + maxiter: Number of steps in the optimization process before ending the loop. + """ + super().__init__() + self._state: Optional[OptimizerState] = None + self.maxiter = maxiter + + @property + def state(self) -> OptimizerState: + """Return the current state of the optimizer.""" + return self._state + + @state.setter + def state(self, state: OptimizerState) -> None: + """Set the current state of the optimizer.""" + self._state = state + + def ask(self) -> AskData: + """Ask the optimizer for a set of points to evaluate. + + This method asks the optimizer which are the next points to evaluate. + These points can, e.g., correspond to function values and/or its derivative. + It may also correspond to variables that let the user infer which points to evaluate. + It is the first method inside of a :meth:`~.step` in the optimization process. + + Returns: + An object containing the data needed to make the funciton evaluation to advance the + optimization process. + + """ + raise NotImplementedError + + def tell(self, ask_data: AskData, tell_data: TellData) -> None: + """Updates the optimization state using the results of the function evaluation. + + A canonical optimization example using :meth:`~.ask` and :meth:`~.tell` can be seen + in :meth:`~.step`. + + Args: + ask_data: Contains the information on how the evaluation was done. + tell_data: Contains all relevant information about the evaluation of the objective + function. + """ + raise NotImplementedError + + @abstractmethod + def evaluate(self, ask_data: AskData) -> TellData: + """Evaluates the function according to the instructions contained in :attr:`~.ask_data`. + + If the user decides to use :meth:`~.step` instead of :meth:`~.ask` and :meth:`~.tell` + this function will contain the logic on how to evaluate the function. + + Args: + ask_data: Contains the information on how to do the evaluation. + + Returns: + Data of all relevant information about the function evaluation. + + """ + raise NotImplementedError + + def _callback_wrapper(self) -> None: + """ + Wraps the callback function to accomodate each optimizer. + """ + pass + + def step(self) -> None: + """Performs one step in the optimization process. + + This method composes :meth:`~.ask`, :meth:`~.evaluate`, and :meth:`~.tell` to make a "step" + in the optimization process. + """ + ask_data = self.ask() + tell_data = self.evaluate(ask_data=ask_data) + self.tell(ask_data=ask_data, tell_data=tell_data) + + # pylint: disable=invalid-name + @abstractmethod + def start( + self, + fun: Callable[[POINT], float], + x0: POINT, + jac: Optional[Callable[[POINT], POINT]] = None, + bounds: Optional[List[Tuple[float, float]]] = None, + ) -> None: + """Populates the state of the optimizer with the data provided and sets all the counters to 0. + + Args: + fun: Function to minimize. + x0: Initial point. + jac: Function to compute the gradient. + bounds: Bounds of the search space. + + """ + raise NotImplementedError + + def minimize( + self, + fun: Callable[[POINT], float], + x0: POINT, + jac: Optional[Callable[[POINT], POINT]] = None, + bounds: Optional[List[Tuple[float, float]]] = None, + ) -> OptimizerResult: + """Minimizes the function. + + For well behaved functions the user can call this method to minimize a function. + If the user wants more control on how to evaluate the function a custom loop can be + created using :meth:`~.ask` and :meth:`~.tell` and evaluating the function manually. + + Args: + fun: Function to minimize. + x0: Initial point. + jac: Function to compute the gradient. + bounds: Bounds of the search space. + + Returns: + Object containing the result of the optimization. + + """ + self.start(x0=x0, fun=fun, jac=jac, bounds=bounds) + while self.continue_condition(): + self.step() + self._callback_wrapper() + return self.create_result() + + @abstractmethod + def create_result(self) -> OptimizerResult: + """Returns the result of the optimization. + + All the information needed to create such a result should be stored in the optimizer state + and will typically contain the best point found, the function value and gradient at that point, + the number of function and gradient evaluation and the number of iterations in the optimization. + + Returns: + The result of the optimization process. + + """ + raise NotImplementedError + + def continue_condition(self) -> bool: + """Condition that indicates the optimization process should continue. + + Returns: + ``True`` if the optimization process should continue, ``False`` otherwise. + """ + return self.state.nit < self.maxiter diff --git a/releasenotes/notes/steppable-optimizers-9d9b48ba78bd58bb.yaml b/releasenotes/notes/steppable-optimizers-9d9b48ba78bd58bb.yaml new file mode 100644 index 000000000000..6bde2fc01a40 --- /dev/null +++ b/releasenotes/notes/steppable-optimizers-9d9b48ba78bd58bb.yaml @@ -0,0 +1,96 @@ +--- +features: + - | + The :class:`~.SteppableOptimizer` class is added. It allows one to perfore classical + optimizations step-by-step using the :meth:`~.SteppableOptimizer.step` method. These + optimizers implement the "ask and tell" interface which (optionally) allows to manually compute + the required function or gradient evaluations and plug them back into the optimizer. + For more information about this interface see: `ask and tell interface + `_. + A very simple use case when the user might want to do the optimization step by step is for + readout: + + .. code-block:: python + + import random + import numpy as np + from qiskit.algorithms.optimizers import GradientDescent + + def objective(x): + if random.choice([True, False]): + return None + else: + return (np.linalg.norm(x) - 1) ** 2 + + def grad(x): + if random.choice([True, False]): + return None + else: + return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) + + + initial_point = np.random.normal(0, 1, size=(100,)) + + optimizer = GradientDescent(maxiter=20) + optimizer.start(x0=initial_point, fun=objective, jac=grad) + + for _ in range(maxiter): + state = optimizer.state + # Here you can manually read out anything from the optimizer state. + optimizer.step() + + result = optimizer.create_result() + + A more complex case would be error handling. Imagine that the funciton you are evaluating has + a random chance of failing. In this case you can catch the error and run the function again + until it yields the desired result before continuing the optimization process. In this case + one would use the ask and tell interface. + + .. code-block:: python + + import random + import numpy as np + from qiskit.algorithms.optimizers import GradientDescent + + def objective(x): + if random.choice([True, False]): + return None + else: + return (np.linalg.norm(x) - 1) ** 2 + + def grad(x): + if random.choice([True, False]): + return None + else: + return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) + + + initial_point = np.random.normal(0, 1, size=(100,)) + + optimizer = GradientDescent(maxiter=20) + optimizer.start(x0=initial_point, fun=objective, jac=grad) + + while optimizer.continue_condition(): + ask_data = optimizer.ask() + evaluated_gradient = None + + while evaluated_gradient is None: + evaluated_gradient = grad(ask_data.x_center) + optimizer.state.njev += 1 + + optmizer.state.nit += 1 + + cf = TellData(eval_jac=evaluated_gradient) + optimizer.tell(ask_data=ask_data, tell_data=tell_data) + + result = optimizer.create_result() + + Transitioned GradientDescent to be a subclass of SteppableOptimizer. + +fixes: + - | + :class:`.GradientDescent` will now correctly count the number of iterations, function evaluations and + gradient evaluations. Also the documentation now correctly states that the gradient is approximated + by a forward finite difference method. + + diff --git a/test/python/algorithms/optimizers/test_gradient_descent.py b/test/python/algorithms/optimizers/test_gradient_descent.py index 0391c3a714c6..abe15f4b5362 100644 --- a/test/python/algorithms/optimizers/test_gradient_descent.py +++ b/test/python/algorithms/optimizers/test_gradient_descent.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2021. +# (C) Copyright IBM 2021, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -13,10 +13,9 @@ """Tests for the Gradient Descent optimizer.""" from test.python.algorithms import QiskitAlgorithmsTestCase - import numpy as np - -from qiskit.algorithms.optimizers import GradientDescent +from qiskit.algorithms.optimizers import GradientDescent, GradientDescentState +from qiskit.algorithms.optimizers.steppable_optimizer import TellData, AskData from qiskit.circuit.library import PauliTwoDesign from qiskit.opflow import I, Z, StateFn from qiskit.test.decorators import slow_test @@ -28,6 +27,15 @@ class TestGradientDescent(QiskitAlgorithmsTestCase): def setUp(self): super().setUp() np.random.seed(12) + self.initial_point = np.array([1, 1, 1, 1, 0]) + + def objective(self, x): + """Objective Function for the tests""" + return (np.linalg.norm(x) - 1) ** 2 + + def grad(self, x): + """Gradient of the objective function""" + return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) @slow_test def test_pauli_two_design(self): @@ -54,15 +62,15 @@ def test_pauli_two_design(self): ] ) - def objective(x): + def objective_pauli(x): return expr.bind_parameters(dict(zip(parameters, x))).eval().real optimizer = GradientDescent(maxiter=100, learning_rate=0.1, perturbation=0.1) - result = optimizer.minimize(objective, x0=initial_point) + result = optimizer.minimize(objective_pauli, x0=initial_point) self.assertLess(result.fun, -0.95) # final loss - self.assertEqual(result.nfev, 100) # function evaluations + self.assertEqual(result.nfev, 1300) # function evaluations def test_callback(self): """Test the callback.""" @@ -74,10 +82,7 @@ def callback(*args): optimizer = GradientDescent(maxiter=1, callback=callback) - def objective(x): - return np.linalg.norm(x) - - _ = optimizer.minimize(objective, np.array([1, -1])) + _ = optimizer.minimize(self.objective, np.array([1, -1])) self.assertEqual(len(history), 1) self.assertIsInstance(history[0][0], int) # nfevs @@ -85,8 +90,8 @@ def objective(x): self.assertIsInstance(history[0][2], float) # function value self.assertIsInstance(history[0][3], float) # norm of the gradient - def test_iterator_learning_rate(self): - """Test setting the learning rate as iterator.""" + def test_minimize(self): + """Test setting the learning rate as iterator and minimizing the funciton.""" def learning_rate(): power = 0.6 @@ -100,15 +105,93 @@ def powerlaw(): return powerlaw() - def objective(x): - return (np.linalg.norm(x) - 1) ** 2 + optimizer = GradientDescent(maxiter=20, learning_rate=learning_rate) + result = optimizer.minimize(self.objective, self.initial_point, self.grad) - def grad(x): - return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) + self.assertLess(result.fun, 1e-5) - initial_point = np.array([1, 0.5, -2]) + def test_no_start(self): + """Tests that making a step without having started the optimizer raises an error.""" + optimizer = GradientDescent() + with self.assertRaises(AttributeError): + optimizer.step() + + def test_start(self): + """Tests if the start method initializes the state properly.""" + optimizer = GradientDescent() + self.assertIsNone(optimizer.state) + self.assertIsNone(optimizer.perturbation) + optimizer.start(x0=self.initial_point, fun=self.objective) + + test_state = GradientDescentState( + x=self.initial_point, + fun=self.objective, + jac=None, + nfev=0, + njev=0, + nit=0, + learning_rate=1, + stepsize=None, + ) - optimizer = GradientDescent(maxiter=20, learning_rate=learning_rate) - result = optimizer.minimize(objective, initial_point, grad) + self.assertEqual(test_state, optimizer.state) + + def test_ask(self): + """Test the ask method.""" + optimizer = GradientDescent() + optimizer.start(fun=self.objective, x0=self.initial_point) + + ask_data = optimizer.ask() + np.testing.assert_equal(ask_data.x_jac, self.initial_point) + self.assertIsNone(ask_data.x_fun) + + def test_evaluate(self): + """Test the evaluate method.""" + optimizer = GradientDescent(perturbation=1e-10) + optimizer.start(fun=self.objective, x0=self.initial_point) + ask_data = AskData(x_jac=self.initial_point) + tell_data = optimizer.evaluate(ask_data=ask_data) + np.testing.assert_almost_equal(tell_data.eval_jac, self.grad(self.initial_point), decimal=2) + + def test_tell(self): + """Test the tell method.""" + optimizer = GradientDescent(learning_rate=1.0) + optimizer.start(fun=self.objective, x0=self.initial_point) + ask_data = AskData(x_jac=self.initial_point) + tell_data = TellData(eval_jac=self.initial_point) + optimizer.tell(ask_data=ask_data, tell_data=tell_data) + np.testing.assert_equal(optimizer.state.x, np.zeros(optimizer.state.x.shape)) + + def test_continue_condition(self): + """Test if the continue condition is working properly.""" + optimizer = GradientDescent(tol=1) + optimizer.start(fun=self.objective, x0=self.initial_point) + self.assertTrue(optimizer.continue_condition()) + optimizer.state.stepsize = 0.1 + self.assertFalse(optimizer.continue_condition()) + optimizer.state.stepsize = 10 + optimizer.state.nit = 1000 + self.assertFalse(optimizer.continue_condition()) + + def test_step(self): + """Tests if performing one step yields the desired result.""" + optimizer = GradientDescent(learning_rate=1.0) + optimizer.start(fun=self.objective, jac=self.grad, x0=self.initial_point) + optimizer.step() + np.testing.assert_almost_equal( + optimizer.state.x, self.initial_point - self.grad(self.initial_point), 6 + ) - self.assertLess(result.fun, 1e-5) + def test_wrong_dimension_gradient(self): + """Tests if an error is raised when a gradient of the wrong dimension is passed.""" + + optimizer = GradientDescent(learning_rate=1.0) + optimizer.start(fun=self.objective, x0=self.initial_point) + ask_data = AskData(x_jac=self.initial_point) + tell_data = TellData(eval_jac=np.array([1.0, 5])) + with self.assertRaises(ValueError): + optimizer.tell(ask_data=ask_data, tell_data=tell_data) + + tell_data = TellData(eval_jac=np.array(1)) + with self.assertRaises(ValueError): + optimizer.tell(ask_data=ask_data, tell_data=tell_data) diff --git a/test/python/algorithms/optimizers/utils/__init__.py b/test/python/algorithms/optimizers/utils/__init__.py new file mode 100644 index 000000000000..f3adc3e3b4da --- /dev/null +++ b/test/python/algorithms/optimizers/utils/__init__.py @@ -0,0 +1,12 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +"""Tests for Optimizer Utils.""" diff --git a/test/python/algorithms/optimizers/utils/test_learning_rate.py b/test/python/algorithms/optimizers/utils/test_learning_rate.py new file mode 100644 index 000000000000..52acdbf98aaa --- /dev/null +++ b/test/python/algorithms/optimizers/utils/test_learning_rate.py @@ -0,0 +1,54 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Tests for LearningRate.""" + +from test.python.algorithms import QiskitAlgorithmsTestCase +import numpy as np +from qiskit.algorithms.optimizers.optimizer_utils import LearningRate + + +class TestLearningRate(QiskitAlgorithmsTestCase): + """Tests for the LearningRate class.""" + + def setUp(self): + super().setUp() + np.random.seed(12) + self.initial_point = np.array([1, 1, 1, 1, 0]) + + def objective(self, x): + """Objective Function for the tests""" + return (np.linalg.norm(x) - 1) ** 2 + + def test_learning_rate(self): + """ + Tests if the learning rate is initialized properly for each kind of input: + float, list and iterator. + """ + constant_learning_rate_input = 0.01 + list_learning_rate_input = [0.01 * n for n in range(10)] + generator_learning_rate_input = lambda: (el for el in list_learning_rate_input) + + with self.subTest("Check constant learning rate."): + constant_learning_rate = LearningRate(learning_rate=constant_learning_rate_input) + for _ in range(5): + self.assertEqual(constant_learning_rate_input, next(constant_learning_rate)) + + with self.subTest("Check learning rate list."): + list_learning_rate = LearningRate(learning_rate=list_learning_rate_input) + for i in range(5): + self.assertEqual(list_learning_rate_input[i], next(list_learning_rate)) + + with self.subTest("Check learning rate generator."): + generator_learning_rate = LearningRate(generator_learning_rate_input) + for i in range(5): + self.assertEqual(list_learning_rate_input[i], next(generator_learning_rate)) From d163e89cd080fbfe4f21d964eaf58b0a0fb65ac7 Mon Sep 17 00:00:00 2001 From: Joseph McElroy <59029169+jmcelroy01@users.noreply.github.com> Date: Mon, 29 Aug 2022 12:54:15 -0400 Subject: [PATCH 33/54] Fix LaTeX drawer on split-filesystem systems (#8629) * Update circuit_visualization.py Corrects issue #8542 * Update circuit_visualization.py * Add release note Co-authored-by: Jake Lishman --- qiskit/visualization/circuit_visualization.py | 3 ++- .../notes/fix-latex-split-filesystem-0c38a1ade2f36e85.yaml | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/fix-latex-split-filesystem-0c38a1ade2f36e85.yaml diff --git a/qiskit/visualization/circuit_visualization.py b/qiskit/visualization/circuit_visualization.py index c25d94797417..65d9c5ffeb0b 100644 --- a/qiskit/visualization/circuit_visualization.py +++ b/qiskit/visualization/circuit_visualization.py @@ -27,6 +27,7 @@ import logging import os +import shutil import subprocess import tempfile from warnings import warn @@ -488,7 +489,7 @@ def _latex_circuit_drawer( image = utils._trim(image) if filename: if filename.endswith(".pdf"): - os.rename(base + ".pdf", filename) + shutil.move(base + ".pdf", filename) else: try: image.save(filename) diff --git a/releasenotes/notes/fix-latex-split-filesystem-0c38a1ade2f36e85.yaml b/releasenotes/notes/fix-latex-split-filesystem-0c38a1ade2f36e85.yaml new file mode 100644 index 000000000000..91fd099d3451 --- /dev/null +++ b/releasenotes/notes/fix-latex-split-filesystem-0c38a1ade2f36e85.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed an ``OSError`` in the LaTeX circuit drawer on systems whose temporary + directories (*e.g* ``/tmp``) are on a different filesystem to the working + directory. See `#8542 `__ + for more detail. From bab9d4568334d572dd14ffef3b35567bb81fbc2c Mon Sep 17 00:00:00 2001 From: Ikko Hamamura Date: Tue, 30 Aug 2022 03:16:10 +0900 Subject: [PATCH 34/54] Fix deprecation messages in BaseSampler/BaseEstimator (#8631) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/primitives/base_estimator.py | 6 +++--- qiskit/primitives/base_sampler.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/qiskit/primitives/base_estimator.py b/qiskit/primitives/base_estimator.py index 830cb54c12fc..998e162e9497 100644 --- a/qiskit/primitives/base_estimator.py +++ b/qiskit/primitives/base_estimator.py @@ -212,7 +212,7 @@ def __new__( return self @deprecate_function( - "The BaseEstimator.__enter__ method is deprecated as of Qiskit Terra 0.21.0 " + "The BaseEstimator.__enter__ method is deprecated as of Qiskit Terra 0.22.0 " "and will be removed no sooner than 3 months after the releasedate. " "BaseEstimator should be initialized directly.", ) @@ -220,7 +220,7 @@ def __enter__(self): return self @deprecate_function( - "The BaseEstimator.__exit__ method is deprecated as of Qiskit Terra 0.21.0 " + "The BaseEstimator.__exit__ method is deprecated as of Qiskit Terra 0.22.0 " "and will be removed no sooner than 3 months after the releasedate. " "BaseEstimator should be initialized directly.", ) @@ -259,7 +259,7 @@ def parameters(self) -> tuple[ParameterView, ...]: return tuple(self._parameters) @deprecate_function( - "The BaseSampler.__call__ method is deprecated as of Qiskit Terra 0.21.0 " + "The BaseSampler.__call__ method is deprecated as of Qiskit Terra 0.22.0 " "and will be removed no sooner than 3 months after the releasedate. " "Use run method instead.", ) diff --git a/qiskit/primitives/base_sampler.py b/qiskit/primitives/base_sampler.py index 42591e582045..2b2f14b0d32f 100644 --- a/qiskit/primitives/base_sampler.py +++ b/qiskit/primitives/base_sampler.py @@ -172,7 +172,7 @@ def __new__( return self @deprecate_function( - "The BaseSampler.__enter__ method is deprecated as of Qiskit Terra 0.21.0 " + "The BaseSampler.__enter__ method is deprecated as of Qiskit Terra 0.22.0 " "and will be removed no sooner than 3 months after the releasedate. " "BaseSampler should be initialized directly.", ) @@ -180,7 +180,7 @@ def __enter__(self): return self @deprecate_function( - "The BaseSampler.__exit__ method is deprecated as of Qiskit Terra 0.21.0 " + "The BaseSampler.__exit__ method is deprecated as of Qiskit Terra 0.22.0 " "and will be removed no sooner than 3 months after the releasedate. " "BaseSampler should be initialized directly.", ) @@ -210,7 +210,7 @@ def parameters(self) -> tuple[ParameterView, ...]: return tuple(self._parameters) @deprecate_function( - "The BaseSampler.__call__ method is deprecated as of Qiskit Terra 0.21.0 " + "The BaseSampler.__call__ method is deprecated as of Qiskit Terra 0.22.0 " "and will be removed no sooner than 3 months after the releasedate. " "Use run method instead.", ) From 367ed4e34a3d662ef8ed8f2b91e8823bba1b8ca8 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Tue, 30 Aug 2022 10:09:13 -0400 Subject: [PATCH 35/54] Fix panic in SabreSwap with classical bits (#8636) * Fix panic in SabreSwap with classical bits This commit fixes a bug introduced in SabreSwap that was caught by the randomized testing in #8635. A copy paste error was causing the rusty sabre code to panic in cases where there were classical bits of a particular index assigned prior to the qubit with the same index. This commit fixes the typo so the behavior is corrected in general and the panic is also fixed. Fixes #8635 * Run black and fix formatting --- src/sabre_swap/sabre_dag.rs | 2 +- test/python/transpiler/test_sabre_layout.py | 41 +++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/sabre_swap/sabre_dag.rs b/src/sabre_swap/sabre_dag.rs index bb60b990b2f9..ae349d30020a 100644 --- a/src/sabre_swap/sabre_dag.rs +++ b/src/sabre_swap/sabre_dag.rs @@ -54,7 +54,7 @@ impl SabreDAG { } for x in cargs { if clbit_pos[*x] != usize::MAX { - dag.add_edge(NodeIndex::new(qubit_pos[*x]), gate_index, ()); + dag.add_edge(NodeIndex::new(clbit_pos[*x]), gate_index, ()); } clbit_pos[*x] = gate_index.index(); } diff --git a/test/python/transpiler/test_sabre_layout.py b/test/python/transpiler/test_sabre_layout.py index 85a975dd6a48..142a66f2f4d9 100644 --- a/test/python/transpiler/test_sabre_layout.py +++ b/test/python/transpiler/test_sabre_layout.py @@ -19,7 +19,9 @@ from qiskit.transpiler.passes import SabreLayout from qiskit.converters import circuit_to_dag from qiskit.test import QiskitTestCase +from qiskit.compiler.transpiler import transpile from qiskit.providers.fake_provider import FakeAlmaden +from qiskit.providers.fake_provider import FakeKolkata class TestSabreLayout(QiskitTestCase): @@ -99,6 +101,45 @@ def test_6q_circuit_20q_coupling(self): self.assertEqual(layout[qr1[1]], 12) self.assertEqual(layout[qr1[2]], 11) + def test_layout_with_classical_bits(self): + """Test sabre layout with classical bits recreate from issue #8635.""" + qc = QuantumCircuit.from_qasm_str( + """ +OPENQASM 2.0; +include "qelib1.inc"; +qreg q4833[1]; +qreg q4834[6]; +qreg q4835[7]; +creg c982[2]; +creg c983[2]; +creg c984[2]; +rzz(0) q4833[0],q4834[4]; +cu(0,-6.1035156e-05,0,1e-05) q4834[1],q4835[2]; +swap q4834[0],q4834[2]; +cu(-1.1920929e-07,0,-0.33333333,0) q4833[0],q4834[2]; +ccx q4835[2],q4834[5],q4835[4]; +measure q4835[4] -> c984[0]; +ccx q4835[2],q4835[5],q4833[0]; +measure q4835[5] -> c984[1]; +measure q4834[0] -> c982[1]; +u(10*pi,0,1.9) q4834[5]; +measure q4834[3] -> c984[1]; +measure q4835[0] -> c982[0]; +rz(0) q4835[1]; +""" + ) + res = transpile(qc, FakeKolkata(), layout_method="sabre", seed_transpiler=1234) + self.assertIsInstance(res, QuantumCircuit) + layout = res._layout + self.assertEqual(layout[qc.qubits[0]], 14) + self.assertEqual(layout[qc.qubits[1]], 19) + self.assertEqual(layout[qc.qubits[2]], 7) + self.assertEqual(layout[qc.qubits[3]], 13) + self.assertEqual(layout[qc.qubits[4]], 6) + self.assertEqual(layout[qc.qubits[5]], 16) + self.assertEqual(layout[qc.qubits[6]], 18) + self.assertEqual(layout[qc.qubits[7]], 26) + if __name__ == "__main__": unittest.main() From d85aec58a56aa4c6e8b9c481da9e255d6d1db904 Mon Sep 17 00:00:00 2001 From: Jake Lishman Date: Tue, 30 Aug 2022 18:05:03 +0100 Subject: [PATCH 36/54] Enable Rust backtraces in CI (#8639) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .azure/test-linux.yml | 1 + .azure/test-macos.yml | 1 + .azure/test-windows.yml | 1 + .github/workflows/randomized_tests.yml | 2 ++ 4 files changed, 5 insertions(+) diff --git a/.azure/test-linux.yml b/.azure/test-linux.yml index 4ea728d46032..51a9afc90880 100644 --- a/.azure/test-linux.yml +++ b/.azure/test-linux.yml @@ -112,6 +112,7 @@ jobs: popd env: QISKIT_PARALLEL: FALSE + RUST_BACKTRACE: 1 displayName: 'Run tests' - bash: | diff --git a/.azure/test-macos.yml b/.azure/test-macos.yml index 69aca4e0c1e0..2219d853702a 100644 --- a/.azure/test-macos.yml +++ b/.azure/test-macos.yml @@ -60,6 +60,7 @@ jobs: python ./tools/verify_parallel_map.py env: QISKIT_PARALLEL: FALSE + RUST_BACKTRACE: 1 displayName: "Run tests" - bash: | diff --git a/.azure/test-windows.yml b/.azure/test-windows.yml index a1e4e85a1f9b..14753a78ed5d 100644 --- a/.azure/test-windows.yml +++ b/.azure/test-windows.yml @@ -53,6 +53,7 @@ jobs: LANG: 'C.UTF-8' PYTHONIOENCODING: 'utf-8:backslashreplace' QISKIT_PARALLEL: FALSE + RUST_BACKTRACE: 1 displayName: 'Run tests' - bash: | diff --git a/.github/workflows/randomized_tests.yml b/.github/workflows/randomized_tests.yml index f96f84e0ed78..7f526c1692b4 100644 --- a/.github/workflows/randomized_tests.yml +++ b/.github/workflows/randomized_tests.yml @@ -24,6 +24,8 @@ jobs: SETUPTOOLS_ENABLE_FEATURES: "legacy-editable" - name: Run randomized tests run: make test_randomized + env: + RUST_BACKTRACE=1 - name: Create comment on failed test run if: ${{ failure() }} uses: peter-evans/create-or-update-comment@v1 From cef0a8cc43e19c70091c057f7ca2366802e2dfdc Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Tue, 30 Aug 2022 14:16:51 -0400 Subject: [PATCH 37/54] Add stage plugin interface for transpile (#8305) * Add stage plugin interface for transpile This commit adds a new plugin interface to qiskit for enabling external packages to write plugins that will replace a stage in the transpilation pipeline. For example, if an external package had a custom layout pass that they wanted to integrate into transpile() they could export a plugin using this new interface and then users would just need to run transpile(.., layout_method=foo) This adds long asked for extensibility to the transpiler so that to cleanly integrate new transpiler passes we're no longer required to merge the features into terra. This should hopefully make it easier for downstream pass authors to integrate their passes into terra and make it easier for the terra maintainers to evaluate new transpiler passes. * Fix docs builds * Fix doc warning * Make routing methods all plugins This commit converts all the built-in routing method options into separate plugins and also adds a default plugin for the default behavior at each optimization level. To support using plugins for routing method adding the optimization_level to the passmanager config was necessary so that the plugin has sufficient context on how to construct the routing pass used for the routing stage. As depending on the optimization level the settings for each pass differs. For example on stochastic swap the number of stochastic trials increases for level 3 to try and find a better solution at the cost of more runtime. * Add plugin usage to level 3 * Add plugin support to level 0 preset pass manager * Add default plugin to reserved routing methods list * Add release notes * Add tests * Apply suggestions from code review Co-authored-by: Alexander Ivrii * Apply suggestions from code review Co-authored-by: Alexander Ivrii * Remove raise on non-builtin layout method argument * Fix typo * Deduplicate code in built-in routing plugins This commit deduplicates the code in the built-in routing stage plugins. First it removes the default plugin which was duplicated with the stochastic and sabre plugins. There was no functional difference between just setting the implicit default method name and using a per method plugin and having a standalone default plugin. Secondly all the vf2 call limit code is abstracted into a helper function which reduces code duplication. * Make vf2 call limit function private * Deduplicate code in stochastic swap plugin * Expand example plugin documentation to show more complete use case * Update qiskit/transpiler/preset_passmanagers/level1.py Co-authored-by: Luciano Bello * Add missing TODO comment * Unify vf2 call limit handling * Remove default plugin from entry points * Simplify level 3 optimization stage logic * Update qiskit/transpiler/preset_passmanagers/plugin.py Co-authored-by: Luciano Bello * Prefer toqm plugin if one is available The qiskit-toqm project will be one of the first users of this plugin interface. Once this is released in qiskit, qiskit-toqm will likely publish their own plugin soon after and if they do we want that plugin to be used instead of the hardcoded stage in terra. This commit updates the logic for toqm handling to only use the built-in toqm if a version of qiskit-toqm is installed without a plugin present. * Apply suggestions from code review Co-authored-by: Kevin Hartman Co-authored-by: Toshinari Itoko <15028342+itoko@users.noreply.github.com> * Fix lint * Remove unnecessary elses in builtin plugins * Apply suggestions from code review Co-authored-by: Luciano Bello * Make optimization level a plugin argument * Add test coverage for all built-in routing plugins * Reorder stage variables to execution order Co-authored-by: Alexander Ivrii Co-authored-by: Luciano Bello Co-authored-by: Kevin Hartman Co-authored-by: Toshinari Itoko <15028342+itoko@users.noreply.github.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- docs/apidocs/terra.rst | 1 + docs/apidocs/transpiler_plugins.rst | 2 +- docs/apidocs/transpiler_synthesis_plugins.rst | 6 + qiskit/compiler/transpiler.py | 36 ++- qiskit/transpiler/passes/synthesis/plugin.py | 4 + qiskit/transpiler/passmanager_config.py | 22 +- .../preset_passmanagers/__init__.py | 36 ++- .../preset_passmanagers/builtin_plugins.py | 273 ++++++++++++++++ .../transpiler/preset_passmanagers/common.py | 20 ++ .../transpiler/preset_passmanagers/level0.py | 111 ++++--- .../transpiler/preset_passmanagers/level1.py | 146 +++++---- .../transpiler/preset_passmanagers/level2.py | 134 ++++---- .../transpiler/preset_passmanagers/level3.py | 200 +++++++----- .../transpiler/preset_passmanagers/plugin.py | 299 ++++++++++++++++++ ...age-plugin-interface-47daae40f7d0ad3c.yaml | 32 ++ setup.py | 9 +- test/python/transpiler/test_stage_plugin.py | 103 ++++++ 17 files changed, 1171 insertions(+), 263 deletions(-) create mode 100644 docs/apidocs/transpiler_synthesis_plugins.rst create mode 100644 qiskit/transpiler/preset_passmanagers/builtin_plugins.py create mode 100644 qiskit/transpiler/preset_passmanagers/plugin.py create mode 100644 releasenotes/notes/stage-plugin-interface-47daae40f7d0ad3c.yaml create mode 100644 test/python/transpiler/test_stage_plugin.py diff --git a/docs/apidocs/terra.rst b/docs/apidocs/terra.rst index 5b765c7c95e7..9154a9420fc6 100644 --- a/docs/apidocs/terra.rst +++ b/docs/apidocs/terra.rst @@ -36,6 +36,7 @@ Qiskit Terra API Reference transpiler_passes transpiler_preset transpiler_plugins + transpiler_synthesis_plugins transpiler_builtin_plugins utils utils_mitigation diff --git a/docs/apidocs/transpiler_plugins.rst b/docs/apidocs/transpiler_plugins.rst index 33646fe2d58f..b5de3efc8ff6 100644 --- a/docs/apidocs/transpiler_plugins.rst +++ b/docs/apidocs/transpiler_plugins.rst @@ -1,6 +1,6 @@ .. _qiskit-transpiler-plugins: -.. automodule:: qiskit.transpiler.passes.synthesis.plugin +.. automodule:: qiskit.transpiler.preset_passmanagers.plugin :no-members: :no-inherited-members: :no-special-members: diff --git a/docs/apidocs/transpiler_synthesis_plugins.rst b/docs/apidocs/transpiler_synthesis_plugins.rst new file mode 100644 index 000000000000..70bef1190f40 --- /dev/null +++ b/docs/apidocs/transpiler_synthesis_plugins.rst @@ -0,0 +1,6 @@ +.. _qiskit-transpiler-synthesis-plugins: + +.. automodule:: qiskit.transpiler.passes.synthesis.plugin + :no-members: + :no-inherited-members: + :no-special-members: diff --git a/qiskit/compiler/transpiler.py b/qiskit/compiler/transpiler.py index ac9ccc7c0db4..d5545e9fdda6 100644 --- a/qiskit/compiler/transpiler.py +++ b/qiskit/compiler/transpiler.py @@ -80,6 +80,8 @@ def transpile( unitary_synthesis_method: str = "default", unitary_synthesis_plugin_config: dict = None, target: Target = None, + init_method: str = None, + optimization_method: str = None, ) -> Union[QuantumCircuit, List[QuantumCircuit]]: """Transpile one or more circuits, according to some desired transpilation targets. @@ -150,17 +152,29 @@ def transpile( [qr[0], None, None, qr[1], None, qr[2]] - layout_method: Name of layout selection pass ('trivial', 'dense', 'noise_adaptive', 'sabre') + layout_method: Name of layout selection pass ('trivial', 'dense', 'noise_adaptive', 'sabre'). + This can also be the external plugin name to use for the ``layout`` stage. + You can see a list of installed plugins by using :func:`~.list_stage_plugins` with + ``"layout"`` for the ``stage_name`` argument. routing_method: Name of routing pass ('basic', 'lookahead', 'stochastic', 'sabre', 'toqm', 'none'). Note that to use method 'toqm', package 'qiskit-toqm' must be installed. + This can also be the external plugin name to use for the ``routing`` stage. + You can see a list of installed plugins by using :func:`~.list_stage_plugins` with + ``"routing"`` for the ``stage_name`` argument. translation_method: Name of translation pass ('unroller', 'translator', 'synthesis') + This can also be the external plugin name to use for the ``translation`` stage. + You can see a list of installed plugins by using :func:`~.list_stage_plugins` with + ``"translation"`` for the ``stage_name`` argument. scheduling_method: Name of scheduling pass. * ``'as_soon_as_possible'``: Schedule instructions greedily, as early as possible on a qubit resource. (alias: ``'asap'``) * ``'as_late_as_possible'``: Schedule instructions late, i.e. keeping qubits in the ground state when possible. (alias: ``'alap'``) - If ``None``, no scheduling will be done. + If ``None``, no scheduling will be done. This can also be the external plugin name + to use for the ``scheduling`` stage. You can see a list of installed plugins by + using :func:`~.list_stage_plugins` with ``"scheduling"`` for the ``stage_name`` + argument. instruction_durations: Durations of instructions. Applicable only if scheduling_method is specified. The gate lengths defined in ``backend.properties`` are used as default. @@ -246,6 +260,16 @@ def callback_func(**kwargs): the ``backend`` argument, but if you have manually constructed a :class:`~qiskit.transpiler.Target` object you can specify it manually here. This will override the target from ``backend``. + init_method: The plugin name to use for the ``init`` stage. By default an external + plugin is not used. You can see a list of installed plugins by + using :func:`~.list_stage_plugins` with ``"init"`` for the stage + name argument. + optimization_method: The plugin name to use for the + ``optimization`` stage. By default an external + plugin is not used. You can see a list of installed plugins by + using :func:`~.list_stage_plugins` with ``"optimization"`` for the + ``stage_name`` argument. + Returns: The transpiled circuit(s). @@ -310,6 +334,8 @@ def callback_func(**kwargs): unitary_synthesis_method, unitary_synthesis_plugin_config, target, + init_method, + optimization_method, ) # Get transpile_args to configure the circuit transpilation job(s) if coupling_map in unique_transpile_args: @@ -392,7 +418,7 @@ def _log_transpile_time(start_time, end_time): def _combine_args(shared_transpiler_args, unique_config): # Pop optimization_level to exclude it from the kwargs when building a # PassManagerConfig - level = shared_transpiler_args.pop("optimization_level") + level = shared_transpiler_args.get("optimization_level") pass_manager_config = shared_transpiler_args pass_manager_config.update(unique_config.pop("pass_manager_config")) pass_manager_config = PassManagerConfig(**pass_manager_config) @@ -560,6 +586,8 @@ def _parse_transpile_args( unitary_synthesis_method, unitary_synthesis_plugin_config, target, + init_method, + optimization_method, ) -> Tuple[List[Dict], Dict]: """Resolve the various types of args allowed to the transpile() function through duck typing, overriding args, etc. Refer to the transpile() docstring for details on @@ -627,6 +655,8 @@ def _parse_transpile_args( shared_dict = { "optimization_level": optimization_level, "basis_gates": basis_gates, + "init_method": init_method, + "optimization_method": optimization_method, } list_transpile_args = [] diff --git a/qiskit/transpiler/passes/synthesis/plugin.py b/qiskit/transpiler/passes/synthesis/plugin.py index 33f168319ced..b199e0ffdbe8 100644 --- a/qiskit/transpiler/passes/synthesis/plugin.py +++ b/qiskit/transpiler/passes/synthesis/plugin.py @@ -27,6 +27,10 @@ which enable packages external to qiskit to advertise they include a synthesis plugin. +See :mod:`qiskit.transpiler.preset_passmanagers.plugin` for details on how +to write plugins for transpiler stages. + + Writing Plugins =============== diff --git a/qiskit/transpiler/passmanager_config.py b/qiskit/transpiler/passmanager_config.py index 929d1aa13366..fc412dc4f286 100644 --- a/qiskit/transpiler/passmanager_config.py +++ b/qiskit/transpiler/passmanager_config.py @@ -39,6 +39,9 @@ def __init__( unitary_synthesis_method="default", unitary_synthesis_plugin_config=None, target=None, + init_method=None, + optimization_method=None, + optimization_level=None, ): """Initialize a PassManagerConfig object @@ -50,12 +53,16 @@ def __init__( coupling_map (CouplingMap): Directed graph represented a coupling map. layout_method (str): the pass to use for choosing initial qubit - placement. + placement. This will be the plugin name if an external layout stage + plugin is being used. routing_method (str): the pass to use for routing qubits on the - architecture. + architecture. This will be a plugin name if an external routing stage + plugin is being used. translation_method (str): the pass to use for translating gates to - basis_gates. - scheduling_method (str): the pass to use for scheduling instructions. + basis_gates. This will be a plugin name if an external translation stage + plugin is being used. + scheduling_method (str): the pass to use for scheduling instructions. This will + be a plugin name if an external scheduling stage plugin is being used. instruction_durations (InstructionDurations): Dictionary of duration (in dt) for each instruction. backend_properties (BackendProperties): Properties returned by a @@ -70,14 +77,20 @@ def __init__( :class:`~qiskit.transpiler.passes.UnitarySynthesis` pass. Will search installed plugins for a valid method. target (Target): The backend target + init_method (str): The plugin name for the init stage plugin to use + optimization_method (str): The plugin name for the optimization stage plugin + to use. + optimization_level (int): The optimization level being used for compilation. """ self.initial_layout = initial_layout self.basis_gates = basis_gates self.inst_map = inst_map self.coupling_map = coupling_map + self.init_method = init_method self.layout_method = layout_method self.routing_method = routing_method self.translation_method = translation_method + self.optimization_method = optimization_method self.scheduling_method = scheduling_method self.instruction_durations = instruction_durations self.backend_properties = backend_properties @@ -87,6 +100,7 @@ def __init__( self.unitary_synthesis_method = unitary_synthesis_method self.unitary_synthesis_plugin_config = unitary_synthesis_plugin_config self.target = target + self.optimization_level = optimization_level @classmethod def from_backend(cls, backend, **pass_manager_options): diff --git a/qiskit/transpiler/preset_passmanagers/__init__.py b/qiskit/transpiler/preset_passmanagers/__init__.py index eb2f0d2aed39..0af4e40dd031 100644 --- a/qiskit/transpiler/preset_passmanagers/__init__.py +++ b/qiskit/transpiler/preset_passmanagers/__init__.py @@ -55,6 +55,8 @@ def generate_preset_pass_manager( seed_transpiler=None, unitary_synthesis_method="default", unitary_synthesis_plugin_config=None, + init_method=None, + optimization_method=None, ): """Generate a preset :class:`~.PassManager` @@ -103,18 +105,30 @@ def generate_preset_pass_manager( layout_method (str): The :class:`~.Pass` to use for choosing initial qubit placement. Valid choices are ``'trivial'``, ``'dense'``, ``'noise_adaptive'``, and, ``'sabre'`` repsenting :class:`~.TrivialLayout`, :class:`~DenseLayout`, - :class:`~.NoiseAdaptiveLayout`, :class:`~.SabreLayout` respectively. + :class:`~.NoiseAdaptiveLayout`, :class:`~.SabreLayout` respectively. This can also + be the external plugin name to use for the ``layout`` stage of the output + :class:`~.StagedPassManager`. You can see a list of installed plugins by using + :func:`~.list_stage_plugins` with ``"layout"`` for the ``stage_name`` argument. routing_method (str): The pass to use for routing qubits on the architecture. Valid choices are ``'basic'``, ``'lookahead'``, ``'stochastic'``, ``'sabre'``, and ``'none'`` representing :class:`~.BasicSwap`, :class:`~.LookaheadSwap`, :class:`~.StochasticSwap`, :class:`~.SabreSwap`, and - erroring if routing is required respectively. + erroring if routing is required respectively. This can also be the external plugin + name to use for the ``routing`` stage of the output :class:`~.StagedPassManager`. + You can see a list of installed plugins by using :func:`~.list_stage_plugins` with + ``"routing"`` for the ``stage_name`` argument. translation_method (str): The method to use for translating gates to basis gates. Valid choices ``'unroller'``, ``'translator'``, ``'synthesis'`` representing :class:`~.Unroller`, :class:`~.BasisTranslator`, and - :class:`~.UnitarySynthesis` respectively. + :class:`~.UnitarySynthesis` respectively. This can also be the external plugin + name to use for the ``translation`` stage of the output :class:`~.StagedPassManager`. + You can see a list of installed plugins by using :func:`~.list_stage_plugins` with + ``"translation"`` for the ``stage_name`` argument. scheduling_method (str): The pass to use for scheduling instructions. Valid choices - are ``'alap'`` and ``'asap'``. + are ``'alap'`` and ``'asap'``. This can also be the external plugin name to use + for the ``scheduling`` stage of the output :class:`~.StagedPassManager`. You can + see a list of installed plugins by using :func:`~.list_stage_plugins` with + ``"scheduling"`` for the ``stage_name`` argument. backend_properties (BackendProperties): Properties returned by a backend, including information on gate errors, readout errors, qubit coherence times, etc. @@ -134,6 +148,17 @@ def generate_preset_pass_manager( the ``unitary_synthesis`` argument. As this is custom for each unitary synthesis plugin refer to the plugin documentation for how to use this option. + init_method (str): The plugin name to use for the ``init`` stage of + the output :class:`~.StagedPassManager`. By default an external + plugin is not used. You can see a list of installed plugins by + using :func:`~.list_stage_plugins` with ``"init"`` for the stage + name argument. + optimization_method (str): The plugin name to use for the + ``optimization`` stage of the output + :class:`~.StagedPassManager`. By default an external + plugin is not used. You can see a list of installed plugins by + using :func:`~.list_stage_plugins` with ``"optimization"`` for the + ``stage_name`` argument. Returns: StagedPassManager: The preset pass manager for the given options @@ -172,6 +197,9 @@ def generate_preset_pass_manager( unitary_synthesis_method=unitary_synthesis_method, unitary_synthesis_plugin_config=unitary_synthesis_plugin_config, initial_layout=initial_layout, + init_method=init_method, + optimization_method=optimization_method, + optimization_level=optimization_level, ) if backend is not None: diff --git a/qiskit/transpiler/preset_passmanagers/builtin_plugins.py b/qiskit/transpiler/preset_passmanagers/builtin_plugins.py new file mode 100644 index 000000000000..d1fc2b5e67c7 --- /dev/null +++ b/qiskit/transpiler/preset_passmanagers/builtin_plugins.py @@ -0,0 +1,273 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Built-in transpiler stage plugins for preset pass managers.""" + +from qiskit.transpiler.passmanager import PassManager +from qiskit.transpiler.exceptions import TranspilerError +from qiskit.transpiler.passes import BasicSwap +from qiskit.transpiler.passes import LookaheadSwap +from qiskit.transpiler.passes import StochasticSwap +from qiskit.transpiler.passes import SabreSwap +from qiskit.transpiler.passes import Error +from qiskit.transpiler.preset_passmanagers import common +from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin + + +class BasicSwapPassManager(PassManagerStagePlugin): + """Plugin class for routing stage with :class:`~.BasicSwap`""" + + def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager: + """Build routing stage PassManager.""" + seed_transpiler = pass_manager_config.seed_transpiler + target = pass_manager_config.target + coupling_map = pass_manager_config.coupling_map + backend_properties = pass_manager_config.backend_properties + routing_pass = BasicSwap(coupling_map) + vf2_call_limit = common.get_vf2_call_limit( + optimization_level, + pass_manager_config.layout_method, + pass_manager_config.initial_layout, + ) + if optimization_level == 0: + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + if optimization_level == 1: + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + check_trivial=True, + use_barrier_before_measurement=True, + ) + if optimization_level == 2: + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + if optimization_level == 3: + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + raise TranspilerError(f"Invalid optimization level specified: {optimization_level}") + + +class StochasticSwapPassManager(PassManagerStagePlugin): + """Plugin class for routing stage with :class:`~.StochasticSwap`""" + + def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager: + """Build routing stage PassManager.""" + seed_transpiler = pass_manager_config.seed_transpiler + target = pass_manager_config.target + coupling_map = pass_manager_config.coupling_map + backend_properties = pass_manager_config.backend_properties + vf2_call_limit = common.get_vf2_call_limit( + optimization_level, + pass_manager_config.layout_method, + pass_manager_config.initial_layout, + ) + if optimization_level == 3: + routing_pass = StochasticSwap(coupling_map, trials=200, seed=seed_transpiler) + else: + routing_pass = StochasticSwap(coupling_map, trials=20, seed=seed_transpiler) + + if optimization_level == 0: + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + if optimization_level == 1: + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + check_trivial=True, + use_barrier_before_measurement=True, + ) + if optimization_level in {2, 3}: + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + raise TranspilerError(f"Invalid optimization level specified: {optimization_level}") + + +class LookaheadSwapPassManager(PassManagerStagePlugin): + """Plugin class for routing stage with :class:`~.LookaheadSwap`""" + + def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager: + """Build routing stage PassManager.""" + seed_transpiler = pass_manager_config.seed_transpiler + target = pass_manager_config.target + coupling_map = pass_manager_config.coupling_map + backend_properties = pass_manager_config.backend_properties + vf2_call_limit = common.get_vf2_call_limit( + optimization_level, + pass_manager_config.layout_method, + pass_manager_config.initial_layout, + ) + if optimization_level == 0: + routing_pass = LookaheadSwap(coupling_map, search_depth=2, search_width=2) + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + if optimization_level == 1: + routing_pass = LookaheadSwap(coupling_map, search_depth=4, search_width=4) + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + check_trivial=True, + use_barrier_before_measurement=True, + ) + if optimization_level == 2: + routing_pass = LookaheadSwap(coupling_map, search_depth=5, search_width=6) + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + if optimization_level == 3: + routing_pass = LookaheadSwap(coupling_map, search_depth=5, search_width=6) + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + raise TranspilerError(f"Invalid optimization level specified: {optimization_level}") + + +class SabreSwapPassManager(PassManagerStagePlugin): + """Plugin class for routing stage with :class:`~.SabreSwap`""" + + def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager: + """Build routing stage PassManager.""" + seed_transpiler = pass_manager_config.seed_transpiler + target = pass_manager_config.target + coupling_map = pass_manager_config.coupling_map + backend_properties = pass_manager_config.backend_properties + vf2_call_limit = common.get_vf2_call_limit( + optimization_level, + pass_manager_config.layout_method, + pass_manager_config.initial_layout, + ) + if optimization_level == 0: + routing_pass = SabreSwap(coupling_map, heuristic="basic", seed=seed_transpiler) + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + if optimization_level == 1: + routing_pass = SabreSwap(coupling_map, heuristic="lookahead", seed=seed_transpiler) + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + check_trivial=True, + use_barrier_before_measurement=True, + ) + if optimization_level == 2: + routing_pass = SabreSwap(coupling_map, heuristic="decay", seed=seed_transpiler) + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + if optimization_level == 3: + routing_pass = SabreSwap(coupling_map, heuristic="decay", seed=seed_transpiler) + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) + raise TranspilerError(f"Invalid optimization level specified: {optimization_level}") + + +class NoneRoutingPassManager(PassManagerStagePlugin): + """Plugin class for routing stage with error on routing.""" + + def pass_manager(self, pass_manager_config, optimization_level=None) -> PassManager: + """Build routing stage PassManager.""" + seed_transpiler = pass_manager_config.seed_transpiler + target = pass_manager_config.target + coupling_map = pass_manager_config.coupling_map + routing_pass = Error( + msg="No routing method selected, but circuit is not routed to device. " + "CheckMap Error: {check_map_msg}", + action="raise", + ) + return common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=True, + ) diff --git a/qiskit/transpiler/preset_passmanagers/common.py b/qiskit/transpiler/preset_passmanagers/common.py index d66037e616b9..7e5513316042 100644 --- a/qiskit/transpiler/preset_passmanagers/common.py +++ b/qiskit/transpiler/preset_passmanagers/common.py @@ -14,6 +14,8 @@ """Common preset passmanager generators.""" +from typing import Optional + from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel from qiskit.transpiler.passmanager import PassManager @@ -47,6 +49,7 @@ from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason from qiskit.transpiler.passes.layout.vf2_post_layout import VF2PostLayoutStopReason from qiskit.transpiler.exceptions import TranspilerError +from qiskit.transpiler.layout import Layout def generate_unroll_3q( @@ -391,3 +394,20 @@ def _require_alignment(property_set): scheduling.append(PadDelay()) return scheduling + + +def get_vf2_call_limit( + optimization_level: int, + layout_method: Optional[str] = None, + initial_layout: Optional[Layout] = None, +) -> Optional[int]: + """Get the vf2 call limit for vf2 based layout passes.""" + vf2_call_limit = None + if layout_method is None and initial_layout is None: + if optimization_level == 1: + vf2_call_limit = int(5e4) # Set call limit to ~100ms with retworkx 0.10.2 + elif optimization_level == 2: + vf2_call_limit = int(5e6) # Set call limit to ~10 sec with retworkx 0.10.2 + elif optimization_level == 3: + vf2_call_limit = int(3e7) # Set call limit to ~60 sec with retworkx 0.10.2 + return vf2_call_limit diff --git a/qiskit/transpiler/preset_passmanagers/level0.py b/qiskit/transpiler/preset_passmanagers/level0.py index 37aadc1c4452..c02c517a23e1 100644 --- a/qiskit/transpiler/preset_passmanagers/level0.py +++ b/qiskit/transpiler/preset_passmanagers/level0.py @@ -25,12 +25,11 @@ from qiskit.transpiler.passes import DenseLayout from qiskit.transpiler.passes import NoiseAdaptiveLayout from qiskit.transpiler.passes import SabreLayout -from qiskit.transpiler.passes import BasicSwap -from qiskit.transpiler.passes import LookaheadSwap -from qiskit.transpiler.passes import StochasticSwap -from qiskit.transpiler.passes import SabreSwap -from qiskit.transpiler.passes import Error from qiskit.transpiler.preset_passmanagers import common +from qiskit.transpiler.preset_passmanagers.plugin import ( + PassManagerStagePluginManager, + list_stage_plugins, +) from qiskit.transpiler import TranspilerError from qiskit.utils.optionals import HAS_TOQM @@ -54,13 +53,16 @@ def level_0_pass_manager(pass_manager_config: PassManagerConfig) -> StagedPassMa Raises: TranspilerError: if the passmanager config is invalid. """ + plugin_manager = PassManagerStagePluginManager() basis_gates = pass_manager_config.basis_gates inst_map = pass_manager_config.inst_map coupling_map = pass_manager_config.coupling_map initial_layout = pass_manager_config.initial_layout + init_method = pass_manager_config.init_method layout_method = pass_manager_config.layout_method or "trivial" routing_method = pass_manager_config.routing_method or "stochastic" translation_method = pass_manager_config.translation_method or "translator" + optimization_method = pass_manager_config.optimization_method scheduling_method = pass_manager_config.scheduling_method instruction_durations = pass_manager_config.instruction_durations seed_transpiler = pass_manager_config.seed_transpiler @@ -85,20 +87,11 @@ def _choose_layout_condition(property_set): _choose_layout = NoiseAdaptiveLayout(backend_properties) elif layout_method == "sabre": _choose_layout = SabreLayout(coupling_map, max_iterations=1, seed=seed_transpiler) - else: - raise TranspilerError("Invalid layout method %s." % layout_method) toqm_pass = False # Choose routing pass - if routing_method == "basic": - routing_pass = BasicSwap(coupling_map) - elif routing_method == "stochastic": - routing_pass = StochasticSwap(coupling_map, trials=20, seed=seed_transpiler) - elif routing_method == "lookahead": - routing_pass = LookaheadSwap(coupling_map, search_depth=2, search_width=2) - elif routing_method == "sabre": - routing_pass = SabreSwap(coupling_map, heuristic="basic", seed=seed_transpiler) - elif routing_method == "toqm": + # TODO: Remove when qiskit-toqm has it's own plugin and we can rely on just the plugin interface + if routing_method == "toqm" and "toqm" not in list_stage_plugins("routing"): HAS_TOQM.require_now("TOQM-based routing") from qiskit_toqm import ToqmSwap, ToqmStrategyO0, latencies_from_target @@ -116,14 +109,17 @@ def _choose_layout_condition(property_set): ) ), ) - elif routing_method == "none": - routing_pass = Error( - msg="No routing method selected, but circuit is not routed to device. " - "CheckMap Error: {check_map_msg}", - action="raise", + routing_pm = common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=not toqm_pass, ) else: - raise TranspilerError("Invalid routing method %s." % routing_method) + routing_pm = plugin_manager.get_passmanager_stage( + "routing", routing_method, pass_manager_config, optimization_level=0 + ) unroll_3q = None # Build pass manager @@ -135,30 +131,34 @@ def _choose_layout_condition(property_set): unitary_synthesis_method, unitary_synthesis_plugin_config, ) - layout = PassManager() - layout.append(_given_layout) - layout.append(_choose_layout, condition=_choose_layout_condition) - layout += common.generate_embed_passmanager(coupling_map) - routing = common.generate_routing_passmanager( - routing_pass, - target, - coupling_map=coupling_map, - seed_transpiler=seed_transpiler, - use_barrier_before_measurement=not toqm_pass, - ) + if layout_method not in {"trivial", "dense", "noise_adaptive", "sabre"}: + layout = plugin_manager.get_passmanager_stage( + "layout", layout_method, pass_manager_config, optimization_level=0 + ) + else: + layout = PassManager() + layout.append(_given_layout) + layout.append(_choose_layout, condition=_choose_layout_condition) + layout += common.generate_embed_passmanager(coupling_map) + routing = routing_pm else: layout = None routing = None - translation = common.generate_translation_passmanager( - target, - basis_gates, - translation_method, - approximation_degree, - coupling_map, - backend_properties, - unitary_synthesis_method, - unitary_synthesis_plugin_config, - ) + if translation_method not in {"translator", "synthesis", "unroller"}: + translation = plugin_manager.get_passmanager_stage( + "translation", translation_method, pass_manager_config, optimization_level=0 + ) + else: + translation = common.generate_translation_passmanager( + target, + basis_gates, + translation_method, + approximation_degree, + coupling_map, + backend_properties, + unitary_synthesis_method, + unitary_synthesis_plugin_config, + ) pre_routing = None if toqm_pass: pre_routing = translation @@ -170,16 +170,33 @@ def _choose_layout_condition(property_set): pre_opt += translation else: pre_opt = None - sched = common.generate_scheduling( - instruction_durations, scheduling_method, timing_constraints, inst_map - ) + if scheduling_method is None or scheduling_method in {"alap", "asap"}: + sched = common.generate_scheduling( + instruction_durations, scheduling_method, timing_constraints, inst_map + ) + else: + sched = plugin_manager.get_passmanager_stage( + "scheduling", scheduling_method, pass_manager_config, optimization_level=0 + ) + if init_method is not None: + init = plugin_manager.get_passmanager_stage( + "init", init_method, pass_manager_config, optimization_level=0 + ) + else: + init = unroll_3q + optimization = None + if optimization_method is not None: + optimization = plugin_manager.get_passmanager_stage( + "optimization", optimization_method, pass_manager_config, optimization_level=0 + ) return StagedPassManager( - init=unroll_3q, + init=init, layout=layout, pre_routing=pre_routing, routing=routing, translation=translation, pre_optimization=pre_opt, + optimization=optimization, scheduling=sched, ) diff --git a/qiskit/transpiler/preset_passmanagers/level1.py b/qiskit/transpiler/preset_passmanagers/level1.py index 5da52fb23052..05e7d56a736e 100644 --- a/qiskit/transpiler/preset_passmanagers/level1.py +++ b/qiskit/transpiler/preset_passmanagers/level1.py @@ -27,21 +27,20 @@ from qiskit.transpiler.passes import DenseLayout from qiskit.transpiler.passes import NoiseAdaptiveLayout from qiskit.transpiler.passes import SabreLayout -from qiskit.transpiler.passes import BasicSwap -from qiskit.transpiler.passes import LookaheadSwap -from qiskit.transpiler.passes import StochasticSwap -from qiskit.transpiler.passes import SabreSwap from qiskit.transpiler.passes import FixedPoint from qiskit.transpiler.passes import Depth from qiskit.transpiler.passes import Size from qiskit.transpiler.passes import Optimize1qGatesDecomposition from qiskit.transpiler.passes import Layout2qDistance -from qiskit.transpiler.passes import Error from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason from qiskit.transpiler import TranspilerError from qiskit.utils.optionals import HAS_TOQM +from qiskit.transpiler.preset_passmanagers.plugin import ( + PassManagerStagePluginManager, + list_stage_plugins, +) def level_1_pass_manager(pass_manager_config: PassManagerConfig) -> StagedPassManager: @@ -65,13 +64,16 @@ def level_1_pass_manager(pass_manager_config: PassManagerConfig) -> StagedPassMa Raises: TranspilerError: if the passmanager config is invalid. """ + plugin_manager = PassManagerStagePluginManager() basis_gates = pass_manager_config.basis_gates inst_map = pass_manager_config.inst_map coupling_map = pass_manager_config.coupling_map initial_layout = pass_manager_config.initial_layout layout_method = pass_manager_config.layout_method or "dense" + init_method = pass_manager_config.init_method routing_method = pass_manager_config.routing_method or "stochastic" translation_method = pass_manager_config.translation_method or "translator" + optimization_method = pass_manager_config.optimization_method scheduling_method = pass_manager_config.scheduling_method instruction_durations = pass_manager_config.instruction_durations seed_transpiler = pass_manager_config.seed_transpiler @@ -143,19 +145,11 @@ def _vf2_match_not_found(property_set): _improve_layout = NoiseAdaptiveLayout(backend_properties) elif layout_method == "sabre": _improve_layout = SabreLayout(coupling_map, max_iterations=2, seed=seed_transpiler) - else: - raise TranspilerError("Invalid layout method %s." % layout_method) toqm_pass = False - if routing_method == "basic": - routing_pass = BasicSwap(coupling_map) - elif routing_method == "stochastic": - routing_pass = StochasticSwap(coupling_map, trials=20, seed=seed_transpiler) - elif routing_method == "lookahead": - routing_pass = LookaheadSwap(coupling_map, search_depth=4, search_width=4) - elif routing_method == "sabre": - routing_pass = SabreSwap(coupling_map, heuristic="lookahead", seed=seed_transpiler) - elif routing_method == "toqm": + routing_pm = None + # TODO: Remove when qiskit-toqm has it's own plugin and we can rely on just the plugin interface + if routing_method == "toqm" and "toqm" not in list_stage_plugins("routing"): HAS_TOQM.require_now("TOQM-based routing") from qiskit_toqm import ToqmSwap, ToqmStrategyO1, latencies_from_target @@ -173,14 +167,26 @@ def _vf2_match_not_found(property_set): ) ), ) - elif routing_method == "none": - routing_pass = Error( - msg="No routing method selected, but circuit is not routed to device. " - "CheckMap Error: {check_map_msg}", - action="raise", + vf2_call_limit = common.get_vf2_call_limit( + 1, pass_manager_config.layout_method, pass_manager_config.initial_layout + ) + routing_pm = common.generate_routing_passmanager( + routing_pass, + target, + coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + check_trivial=True, + use_barrier_before_measurement=not toqm_pass, ) else: - raise TranspilerError("Invalid routing method %s." % routing_method) + routing_pm = plugin_manager.get_passmanager_stage( + "routing", + routing_method, + pass_manager_config, + optimization_level=1, + ) # Build optimization loop: merge 1q rotations and cancel CNOT gates iteratively # until no more change in depth @@ -202,38 +208,38 @@ def _opt_control(property_set): unitary_synthesis_method, unitary_synthesis_plugin_config, ) - layout = PassManager() - layout.append(_given_layout) - layout.append(_choose_layout_0, condition=_choose_layout_condition) - layout.append(_choose_layout_1, condition=_trivial_not_perfect) - layout.append(_improve_layout, condition=_vf2_match_not_found) - layout += common.generate_embed_passmanager(coupling_map) - vf2_call_limit = None - if pass_manager_config.layout_method is None and pass_manager_config.initial_layout is None: - vf2_call_limit = int(5e4) # Set call limit to ~100ms with retworkx 0.10.2 - routing = common.generate_routing_passmanager( - routing_pass, - target, - coupling_map, - vf2_call_limit=vf2_call_limit, - backend_properties=backend_properties, - seed_transpiler=seed_transpiler, - check_trivial=True, - use_barrier_before_measurement=not toqm_pass, - ) + if layout_method not in {"trivial", "dense", "noise_adaptive", "sabre"}: + layout = plugin_manager.get_passmanager_stage( + "layout", layout_method, pass_manager_config, optimization_level=1 + ) + else: + layout = PassManager() + layout.append(_given_layout) + layout.append(_choose_layout_0, condition=_choose_layout_condition) + layout.append(_choose_layout_1, condition=_trivial_not_perfect) + layout.append(_improve_layout, condition=_vf2_match_not_found) + layout += common.generate_embed_passmanager(coupling_map) + + routing = routing_pm + else: layout = None routing = None - translation = common.generate_translation_passmanager( - target, - basis_gates, - translation_method, - approximation_degree, - coupling_map, - backend_properties, - unitary_synthesis_method, - unitary_synthesis_plugin_config, - ) + if translation_method not in {"translator", "synthesis", "unroller"}: + translation = plugin_manager.get_passmanager_stage( + "translation", translation_method, pass_manager_config, optimization_level=1 + ) + else: + translation = common.generate_translation_passmanager( + target, + basis_gates, + translation_method, + approximation_degree, + coupling_map, + backend_properties, + unitary_synthesis_method, + unitary_synthesis_plugin_config, + ) pre_routing = None if toqm_pass: pre_routing = translation @@ -241,20 +247,38 @@ def _opt_control(property_set): if (coupling_map and not coupling_map.is_symmetric) or ( target is not None and target.get_non_global_operation_names(strict_direction=True) ): - pre_optimization = common.generate_pre_op_passmanager(target, coupling_map, True) + pre_optimization = common.generate_pre_op_passmanager( + target, coupling_map, remove_reset_in_zero=True + ) else: pre_optimization = common.generate_pre_op_passmanager(remove_reset_in_zero=True) - optimization = PassManager() - unroll = [pass_ for x in translation.passes() for pass_ in x["passes"]] - optimization.append(_depth_check + _size_check) - opt_loop = _opt + unroll + _depth_check + _size_check - optimization.append(opt_loop, do_while=_opt_control) - sched = common.generate_scheduling( - instruction_durations, scheduling_method, timing_constraints, inst_map - ) + if optimization_method is None: + optimization = PassManager() + unroll = [pass_ for x in translation.passes() for pass_ in x["passes"]] + optimization.append(_depth_check + _size_check) + opt_loop = _opt + unroll + _depth_check + _size_check + optimization.append(opt_loop, do_while=_opt_control) + else: + optimization = plugin_manager.get_passmanager_stage( + "optimization", optimization_method, pass_manager_config, optimization_level=1 + ) + if scheduling_method is None or scheduling_method in {"alap", "asap"}: + sched = common.generate_scheduling( + instruction_durations, scheduling_method, timing_constraints, inst_map + ) + else: + sched = plugin_manager.get_passmanager_stage( + "scheduling", scheduling_method, pass_manager_config, optimization_level=1 + ) + if init_method is not None: + init = plugin_manager.get_passmanager_stage( + "init", init_method, pass_manager_config, optimization_level=1 + ) + else: + init = unroll_3q return StagedPassManager( - init=unroll_3q, + init=init, layout=layout, pre_routing=pre_routing, routing=routing, diff --git a/qiskit/transpiler/preset_passmanagers/level2.py b/qiskit/transpiler/preset_passmanagers/level2.py index c2ee13ad8500..5a8dcde691e8 100644 --- a/qiskit/transpiler/preset_passmanagers/level2.py +++ b/qiskit/transpiler/preset_passmanagers/level2.py @@ -27,21 +27,20 @@ from qiskit.transpiler.passes import DenseLayout from qiskit.transpiler.passes import NoiseAdaptiveLayout from qiskit.transpiler.passes import SabreLayout -from qiskit.transpiler.passes import BasicSwap -from qiskit.transpiler.passes import LookaheadSwap -from qiskit.transpiler.passes import StochasticSwap -from qiskit.transpiler.passes import SabreSwap from qiskit.transpiler.passes import FixedPoint from qiskit.transpiler.passes import Depth from qiskit.transpiler.passes import Size from qiskit.transpiler.passes import Optimize1qGatesDecomposition from qiskit.transpiler.passes import CommutativeCancellation -from qiskit.transpiler.passes import Error from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason from qiskit.transpiler import TranspilerError from qiskit.utils.optionals import HAS_TOQM +from qiskit.transpiler.preset_passmanagers.plugin import ( + PassManagerStagePluginManager, + list_stage_plugins, +) def level_2_pass_manager(pass_manager_config: PassManagerConfig) -> StagedPassManager: @@ -67,13 +66,16 @@ def level_2_pass_manager(pass_manager_config: PassManagerConfig) -> StagedPassMa Raises: TranspilerError: if the passmanager config is invalid. """ + plugin_manager = PassManagerStagePluginManager() basis_gates = pass_manager_config.basis_gates inst_map = pass_manager_config.inst_map coupling_map = pass_manager_config.coupling_map initial_layout = pass_manager_config.initial_layout + init_method = pass_manager_config.init_method layout_method = pass_manager_config.layout_method or "dense" routing_method = pass_manager_config.routing_method or "stochastic" translation_method = pass_manager_config.translation_method or "translator" + optimization_method = pass_manager_config.optimization_method scheduling_method = pass_manager_config.scheduling_method instruction_durations = pass_manager_config.instruction_durations seed_transpiler = pass_manager_config.seed_transpiler @@ -126,19 +128,11 @@ def _vf2_match_not_found(property_set): _choose_layout_1 = NoiseAdaptiveLayout(backend_properties) elif layout_method == "sabre": _choose_layout_1 = SabreLayout(coupling_map, max_iterations=2, seed=seed_transpiler) - else: - raise TranspilerError("Invalid layout method %s." % layout_method) toqm_pass = False - if routing_method == "basic": - routing_pass = BasicSwap(coupling_map) - elif routing_method == "stochastic": - routing_pass = StochasticSwap(coupling_map, trials=20, seed=seed_transpiler) - elif routing_method == "lookahead": - routing_pass = LookaheadSwap(coupling_map, search_depth=5, search_width=5) - elif routing_method == "sabre": - routing_pass = SabreSwap(coupling_map, heuristic="decay", seed=seed_transpiler) - elif routing_method == "toqm": + routing_pm = None + # TODO: Remove when qiskit-toqm has it's own plugin and we can rely on just the plugin interface + if routing_method == "toqm" and "toqm" not in list_stage_plugins("routing"): HAS_TOQM.require_now("TOQM-based routing") from qiskit_toqm import ToqmSwap, ToqmStrategyO2, latencies_from_target @@ -156,14 +150,22 @@ def _vf2_match_not_found(property_set): ) ), ) - elif routing_method == "none": - routing_pass = Error( - msg="No routing method selected, but circuit is not routed to device. " - "CheckMap Error: {check_map_msg}", - action="raise", + vf2_call_limit = common.get_vf2_call_limit( + 2, pass_manager_config.layout_method, pass_manager_config.initial_layout + ) + routing_pm = common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=not toqm_pass, ) else: - raise TranspilerError("Invalid routing method %s." % routing_method) + routing_pm = plugin_manager.get_passmanager_stage( + "routing", routing_method, pass_manager_config, optimization_level=2 + ) # Build optimization loop: 1q rotation merge and commutative cancellation iteratively until # no more change in depth @@ -188,36 +190,35 @@ def _opt_control(property_set): unitary_synthesis_method, unitary_synthesis_plugin_config, ) - layout = PassManager() - layout.append(_given_layout) - layout.append(_choose_layout_0, condition=_choose_layout_condition) - layout.append(_choose_layout_1, condition=_vf2_match_not_found) - layout += common.generate_embed_passmanager(coupling_map) - vf2_call_limit = None - if pass_manager_config.layout_method is None and pass_manager_config.initial_layout is None: - vf2_call_limit = int(5e6) # Set call limit to ~10 sec with retworkx 0.10.2 - routing = common.generate_routing_passmanager( - routing_pass, - target, - coupling_map=coupling_map, - vf2_call_limit=vf2_call_limit, - backend_properties=backend_properties, - seed_transpiler=seed_transpiler, - use_barrier_before_measurement=not toqm_pass, - ) + if layout_method not in {"trivial", "dense", "noise_adaptive", "sabre"}: + layout = plugin_manager.get_passmanager_stage( + "layout", layout_method, pass_manager_config, optimization_level=2 + ) + else: + layout = PassManager() + layout.append(_given_layout) + layout.append(_choose_layout_0, condition=_choose_layout_condition) + layout.append(_choose_layout_1, condition=_vf2_match_not_found) + layout += common.generate_embed_passmanager(coupling_map) + routing = routing_pm else: layout = None routing = None - translation = common.generate_translation_passmanager( - target, - basis_gates, - translation_method, - approximation_degree, - coupling_map, - backend_properties, - unitary_synthesis_method, - unitary_synthesis_plugin_config, - ) + if translation_method not in {"translator", "synthesis", "unroller"}: + translation = plugin_manager.get_passmanager_stage( + "translation", translation_method, pass_manager_config, optimization_level=2 + ) + else: + translation = common.generate_translation_passmanager( + target, + basis_gates, + translation_method, + approximation_degree, + coupling_map, + backend_properties, + unitary_synthesis_method, + unitary_synthesis_plugin_config, + ) pre_routing = None if toqm_pass: pre_routing = translation @@ -227,16 +228,33 @@ def _opt_control(property_set): pre_optimization = common.generate_pre_op_passmanager(target, coupling_map, True) else: pre_optimization = common.generate_pre_op_passmanager(remove_reset_in_zero=True) - optimization = PassManager() - unroll = [pass_ for x in translation.passes() for pass_ in x["passes"]] - optimization.append(_depth_check + _size_check) - opt_loop = _opt + unroll + _depth_check + _size_check - optimization.append(opt_loop, do_while=_opt_control) - sched = common.generate_scheduling( - instruction_durations, scheduling_method, timing_constraints, inst_map - ) + if optimization_method is None: + optimization = PassManager() + unroll = [pass_ for x in translation.passes() for pass_ in x["passes"]] + optimization.append(_depth_check + _size_check) + opt_loop = _opt + unroll + _depth_check + _size_check + optimization.append(opt_loop, do_while=_opt_control) + else: + optimization = plugin_manager.get_passmanager_stage( + "optimization", optimization_method, pass_manager_config, optimization_level=2 + ) + if scheduling_method is None or scheduling_method in {"alap", "asap"}: + sched = common.generate_scheduling( + instruction_durations, scheduling_method, timing_constraints, inst_map + ) + else: + sched = plugin_manager.get_passmanager_stage( + "scheduling", scheduling_method, pass_manager_config, optimization_level=2 + ) + if init_method is not None: + init = plugin_manager.get_passmanager_stage( + "init", init_method, pass_manager_config, optimization_level=2 + ) + else: + init = unroll_3q + return StagedPassManager( - init=unroll_3q, + init=init, layout=layout, pre_routing=pre_routing, routing=routing, diff --git a/qiskit/transpiler/preset_passmanagers/level3.py b/qiskit/transpiler/preset_passmanagers/level3.py index 7a0f22319ecb..0d664f2172a0 100644 --- a/qiskit/transpiler/preset_passmanagers/level3.py +++ b/qiskit/transpiler/preset_passmanagers/level3.py @@ -28,10 +28,6 @@ from qiskit.transpiler.passes import DenseLayout from qiskit.transpiler.passes import NoiseAdaptiveLayout from qiskit.transpiler.passes import SabreLayout -from qiskit.transpiler.passes import BasicSwap -from qiskit.transpiler.passes import LookaheadSwap -from qiskit.transpiler.passes import StochasticSwap -from qiskit.transpiler.passes import SabreSwap from qiskit.transpiler.passes import FixedPoint from qiskit.transpiler.passes import Depth from qiskit.transpiler.passes import Size @@ -43,10 +39,12 @@ from qiskit.transpiler.passes import Collect2qBlocks from qiskit.transpiler.passes import ConsolidateBlocks from qiskit.transpiler.passes import UnitarySynthesis -from qiskit.transpiler.passes import Error from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason - +from qiskit.transpiler.preset_passmanagers.plugin import ( + PassManagerStagePluginManager, + list_stage_plugins, +) from qiskit.transpiler import TranspilerError from qiskit.utils.optionals import HAS_TOQM @@ -74,13 +72,16 @@ def level_3_pass_manager(pass_manager_config: PassManagerConfig) -> StagedPassMa Raises: TranspilerError: if the passmanager config is invalid. """ + plugin_manager = PassManagerStagePluginManager() basis_gates = pass_manager_config.basis_gates inst_map = pass_manager_config.inst_map coupling_map = pass_manager_config.coupling_map initial_layout = pass_manager_config.initial_layout + init_method = pass_manager_config.init_method layout_method = pass_manager_config.layout_method or "sabre" routing_method = pass_manager_config.routing_method or "sabre" translation_method = pass_manager_config.translation_method or "translator" + optimization_method = pass_manager_config.optimization_method scheduling_method = pass_manager_config.scheduling_method instruction_durations = pass_manager_config.instruction_durations seed_transpiler = pass_manager_config.seed_transpiler @@ -90,6 +91,11 @@ def level_3_pass_manager(pass_manager_config: PassManagerConfig) -> StagedPassMa timing_constraints = pass_manager_config.timing_constraints or TimingConstraints() unitary_synthesis_plugin_config = pass_manager_config.unitary_synthesis_plugin_config target = pass_manager_config.target + # Override an unset optimization_level for stage plugin use. + # it will be restored to None before this is returned + optimization_level = pass_manager_config.optimization_level + if optimization_level is None: + pass_manager_config.optimization_level = 3 # Layout on good qubits if calibration info available, otherwise on dense links _given_layout = SetLayout(initial_layout) @@ -133,19 +139,10 @@ def _vf2_match_not_found(property_set): _choose_layout_1 = NoiseAdaptiveLayout(backend_properties) elif layout_method == "sabre": _choose_layout_1 = SabreLayout(coupling_map, max_iterations=4, seed=seed_transpiler) - else: - raise TranspilerError("Invalid layout method %s." % layout_method) toqm_pass = False - if routing_method == "basic": - routing_pass = BasicSwap(coupling_map) - elif routing_method == "stochastic": - routing_pass = StochasticSwap(coupling_map, trials=200, seed=seed_transpiler) - elif routing_method == "lookahead": - routing_pass = LookaheadSwap(coupling_map, search_depth=5, search_width=6) - elif routing_method == "sabre": - routing_pass = SabreSwap(coupling_map, heuristic="decay", seed=seed_transpiler) - elif routing_method == "toqm": + # TODO: Remove when qiskit-toqm has it's own plugin and we can rely on just the plugin interface + if routing_method == "toqm" and "toqm" not in list_stage_plugins("routing"): HAS_TOQM.require_now("TOQM-based routing") from qiskit_toqm import ToqmSwap, ToqmStrategyO3, latencies_from_target @@ -163,14 +160,22 @@ def _vf2_match_not_found(property_set): ) ), ) - elif routing_method == "none": - routing_pass = Error( - msg="No routing method selected, but circuit is not routed to device. " - "CheckMap Error: {check_map_msg}", - action="raise", + vf2_call_limit = common.get_vf2_call_limit( + 3, pass_manager_config.layout_method, pass_manager_config.initial_layout + ) + routing_pm = common.generate_routing_passmanager( + routing_pass, + target, + coupling_map=coupling_map, + vf2_call_limit=vf2_call_limit, + backend_properties=backend_properties, + seed_transpiler=seed_transpiler, + use_barrier_before_measurement=not toqm_pass, ) else: - raise TranspilerError("Invalid routing method %s." % routing_method) + routing_pm = plugin_manager.get_passmanager_stage( + "routing", routing_method, pass_manager_config, optimization_level=3 + ) # 8. Optimize iteratively until no more change in depth. Removes useless gates # after reset and before measure, commutes gates and optimizes contiguous blocks. @@ -197,80 +202,107 @@ def _opt_control(property_set): ] # Build pass manager - init = common.generate_unroll_3q( - target, - basis_gates, - approximation_degree, - unitary_synthesis_method, - unitary_synthesis_plugin_config, - ) + if init_method is not None: + init = plugin_manager.get_passmanager_stage( + "init", init_method, pass_manager_config, optimization_level=3 + ) + else: + init = common.generate_unroll_3q( + target, + basis_gates, + approximation_degree, + unitary_synthesis_method, + unitary_synthesis_plugin_config, + ) init.append(RemoveResetInZeroState()) init.append(OptimizeSwapBeforeMeasure()) init.append(RemoveDiagonalGatesBeforeMeasure()) if coupling_map or initial_layout: - layout = PassManager() - layout.append(_given_layout) - layout.append(_choose_layout_0, condition=_choose_layout_condition) - layout.append(_choose_layout_1, condition=_vf2_match_not_found) - layout += common.generate_embed_passmanager(coupling_map) - vf2_call_limit = None - if pass_manager_config.layout_method is None and pass_manager_config.initial_layout is None: - vf2_call_limit = int(3e7) # Set call limit to ~60 sec with retworkx 0.10.2 - routing = common.generate_routing_passmanager( - routing_pass, - target, - coupling_map=coupling_map, - vf2_call_limit=vf2_call_limit, - backend_properties=backend_properties, - seed_transpiler=seed_transpiler, - use_barrier_before_measurement=not toqm_pass, - ) + if layout_method not in {"trivial", "dense", "noise_adaptive", "sabre"}: + layout = plugin_manager.get_passmanager_stage( + "layout", layout_method, pass_manager_config, optimization_level=3 + ) + else: + layout = PassManager() + layout.append(_given_layout) + layout.append(_choose_layout_0, condition=_choose_layout_condition) + layout.append(_choose_layout_1, condition=_vf2_match_not_found) + layout += common.generate_embed_passmanager(coupling_map) + routing = routing_pm else: layout = None routing = None - translation = common.generate_translation_passmanager( - target, - basis_gates, - translation_method, - approximation_degree, - coupling_map, - backend_properties, - unitary_synthesis_method, - unitary_synthesis_plugin_config, - ) + if translation_method not in {"translator", "synthesis", "unroller"}: + translation = plugin_manager.get_passmanager_stage( + "translation", translation_method, pass_manager_config, optimization_level=3 + ) + else: + translation = common.generate_translation_passmanager( + target, + basis_gates, + translation_method, + approximation_degree, + coupling_map, + backend_properties, + unitary_synthesis_method, + unitary_synthesis_plugin_config, + ) pre_routing = None if toqm_pass: pre_routing = translation - optimization = PassManager() - unroll = [pass_ for x in translation.passes() for pass_ in x["passes"]] - optimization.append(_depth_check + _size_check) - if (coupling_map and not coupling_map.is_symmetric) or ( - target is not None and target.get_non_global_operation_names(strict_direction=True) - ): - pre_optimization = common.generate_pre_op_passmanager(target, coupling_map, True) - _direction = [ - pass_ - for x in common.generate_pre_op_passmanager(target, coupling_map).passes() - for pass_ in x["passes"] - ] - # For transpiling to a target we need to run GateDirection in the - # optimization loop to correct for incorrect directions that might be - # inserted by UnitarySynthesis which is direction aware but only via - # the coupling map which with a target doesn't give a full picture - if target is not None: - optimization.append( - _opt + unroll + _depth_check + _size_check + _direction, do_while=_opt_control - ) + if optimization_method is None: + optimization = PassManager() + unroll = [pass_ for x in translation.passes() for pass_ in x["passes"]] + optimization.append(_depth_check + _size_check) + if (coupling_map and not coupling_map.is_symmetric) or ( + target is not None and target.get_non_global_operation_names(strict_direction=True) + ): + pre_optimization = common.generate_pre_op_passmanager(target, coupling_map, True) + _direction = [ + pass_ + for x in common.generate_pre_op_passmanager(target, coupling_map).passes() + for pass_ in x["passes"] + ] + # For transpiling to a target we need to run GateDirection in the + # optimization loop to correct for incorrect directions that might be + # inserted by UnitarySynthesis which is direction aware but only via + # the coupling map which with a target doesn't give a full picture + if target is not None and optimization is not None: + optimization.append( + _opt + unroll + _depth_check + _size_check + _direction, do_while=_opt_control + ) + elif optimization is not None: + optimization.append( + _opt + unroll + _depth_check + _size_check, do_while=_opt_control + ) else: + pre_optimization = common.generate_pre_op_passmanager(remove_reset_in_zero=True) optimization.append(_opt + unroll + _depth_check + _size_check, do_while=_opt_control) + opt_loop = _depth_check + _opt + unroll + optimization.append(opt_loop, do_while=_opt_control) else: - pre_optimization = common.generate_pre_op_passmanager(remove_reset_in_zero=True) - optimization.append(_opt + unroll + _depth_check + _size_check, do_while=_opt_control) - opt_loop = _depth_check + _opt + unroll - optimization.append(opt_loop, do_while=_opt_control) - sched = common.generate_scheduling( - instruction_durations, scheduling_method, timing_constraints, inst_map - ) + optimization = plugin_manager.get_passmanager_stage( + "optimization", optimization_method, pass_manager_config, optimization_level=3 + ) + if (coupling_map and not coupling_map.is_symmetric) or ( + target is not None and target.get_non_global_operation_names(strict_direction=True) + ): + pre_optimization = common.generate_pre_op_passmanager(target, coupling_map, True) + else: + pre_optimization = common.generate_pre_op_passmanager(remove_reset_in_zero=True) + + if scheduling_method is None or scheduling_method in {"alap", "asap"}: + sched = common.generate_scheduling( + instruction_durations, scheduling_method, timing_constraints, inst_map + ) + else: + sched = plugin_manager.get_passmanager_stage( + "scheduling", scheduling_method, pass_manager_config, optimization_level=3 + ) + + # Restore PassManagerConfig optimization_level override + pass_manager_config.optimization_level = optimization_level + return StagedPassManager( init=init, layout=layout, diff --git a/qiskit/transpiler/preset_passmanagers/plugin.py b/qiskit/transpiler/preset_passmanagers/plugin.py new file mode 100644 index 000000000000..a442bbb49383 --- /dev/null +++ b/qiskit/transpiler/preset_passmanagers/plugin.py @@ -0,0 +1,299 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +""" +======================================================================================= +Transpiler Stage Plugin Interface (:mod:`qiskit.transpiler.preset_passmanagers.plugin`) +======================================================================================= + +.. currentmodule:: qiskit.transpiler.preset_passmanagers.plugin + +This module defines the plugin interface for providing custom stage +implementations for the preset pass managers and the :func:`~.transpile` +function. This enables external Python packages to provide +:class:`~.PassManager` objects that can be used for each stage. + +The plugin interfaces are built using setuptools +`entry points `__ +which enable packages external to Qiskit to advertise they include a transpiler stage. + +See :mod:`qiskit.transpiler.passes.synthesis.plugin` for details on how to +write plugins for synthesis methods which are used by the transpiler. + +.. _stage_table: + +Plugin Stages +============= + +Currently there are 6 stages in the preset pass managers used by and corresponding entrypoints. + +.. list-table:: Stages + :header-rows: 1 + + * - Stage Name + - Entry Point + - Reserved Names + - Description and expectations + * - ``init`` + - ``qiskit.transpiler.init`` + - No reserved names + - This stage runs first and is typically used for any initial logical optimization. Because most + layout and routing algorithms are only designed to work with 1 and 2 qubit gates, this stage + is also used to translate any gates that operate on more than 2 qubits into gates that only + operate on 1 or 2 qubits. + * - ``layout`` + - ``qiskit.transpiler.layout`` + - ``trivial``, ``dense``, ``noise_adaptive``, ``sabre`` + - The output from this stage is expected to have the ``layout`` property + set field set with a :class:`~.Layout` object. Additionally, the circuit is + typically expected to be embedded so that it is expanded to include all + qubits and the :class:`~.ApplyLayout` pass is expected to be run to apply the + layout. The embedding of the :class:`~.Layout` can be generated with + :func:`~.generate_embed_passmanager`. + * - ``routing`` + - ``qiskit.transpiler.routing`` + - ``basic``, ``stochastic``, ``lookahead``, ``sabre``, ``toqm`` + - The output from this stage is expected to have the circuit match the + connectivity constraints of the target backend. This does not necessarily + need to match the directionality of the edges in the target as a later + stage typically will adjust directional gates to match that constraint + (but there is no penalty for doing that in the ``routing`` stage). + * - ``translation`` + - ``qiskit.transpiler.translation`` + - ``translator``, ``synthesis``, ``unroller`` + - The output of this stage is expected to have every operation be a native + instruction on the target backend. + * - ``optimization`` + - ``qiskit.transpiler.optimization`` + - There are no reserved plugin names + - This stage is expected to perform optimization and simplification. + The constraints from earlier stages still apply to the output of this + stage. After the ``optimization`` stage is run we expect the circuit + to still be executable on the target. + * - ``scheduling`` + - ``qiskit.transpiler.scheduling`` + - ``alap``, ``asap`` + - This is the last stage run and it is expected to output a scheduled + circuit such that all idle periods in the circuit are marked by explicit + :class:`~qiskit.circuit.Delay` instructions. + +Writing Plugins +=============== + +To write a pass manager stage plugin there are 2 main steps. The first step is +to create a subclass of the abstract plugin class +:class:`~.PassManagerStagePluginManager` which is used to define how the :class:`~.PassManager` +for the stage will be constructed. For example, to create a ``layout`` stage plugin that just +runs :class:`~.VF2Layout` and will fallback to use :class:`~.TrivialLayout` if +:class:`~VF2Layout` is unable to find a perfect layout:: + + from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin + from qiskit.transpiler.preset_passmanagers import common + from qiskit.transpiler import PassManager + from qiskit.transpiler.passes import VF2Layout, TrivialLayout + from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason + + + def _vf2_match_not_found(property_set): + return property_set["layout"] is None or ( + property_set["VF2Layout_stop_reason"] is not None + and property_set["VF2Layout_stop_reason"] is not VF2LayoutStopReason.SOLUTION_FOUND + + + class VF2LayoutPlugin(PassManagerStagePlugin): + + def pass_manager(self, pass_manager_config): + layout_pm = PassManager( + [ + VF2Layout( + coupling_map=pass_manager_config.coupling_map, + properties=pass_manager_config.backend_properties, + target=pass_manager_config.target + ) + ] + ) + layout_pm.append( + TrivialLayout(pass_manager_config.coupling_map), + condition=_vf2_match_not_found, + ) + layout_pm += common.generate_embed_passmanager(pass_manager_config.coupling_map) + return layout_pm + +The second step is to expose the :class:`~.PassManagerStagePluginManager` +subclass as a setuptools entry point in the package metadata. This can be done +by simply adding an ``entry_points`` entry to the ``setuptools.setup`` call in +the ``setup.py`` or the plugin package with the necessary entry points under the +appropriate namespace for the stage your plugin is for. You can see the list +of stages, entrypoints, and expectations from the stage in :ref:`stage_table`. +For example, continuing from the example plugin above:: + + entry_points = { + 'qiskit.transpiler.layout': [ + 'vf2 = qiskit_plugin_pkg.module.plugin:VF2LayoutPlugin', + ] + }, + +(note that the entry point ``name = path`` is a single string not a Python +expression). There isn't a limit to the number of plugins a single package can +include as long as each plugin has a unique name. So a single package can +expose multiple plugins if necessary. Refer to :ref:`stage_table` for a list +of reserved names for each stage. + +Plugin API +========== + +.. autosummary:: + :toctree: ../stubs/ + + PassManagerStagePlugin + PassManagerStagePluginManager + list_stage_plugins +""" + +import abc +from typing import List, Optional + +import stevedore + +from qiskit.transpiler.passmanager import PassManager +from qiskit.transpiler.exceptions import TranspilerError +from qiskit.transpiler.passmanager_config import PassManagerConfig + + +class PassManagerStagePlugin(abc.ABC): + """A ``PassManagerStagePlugin`` is a plugin interface object for using custom + stages in :func:`~.transpile`. + + A ``PassManagerStagePlugin`` object can be added to an external package and + integrated into the :func:`~.transpile` function with an entrypoint. This + will enable users to use the output of :meth:`.pass_manager` to implement + a stage in the compilation process. + """ + + @abc.abstractmethod + def pass_manager( + self, pass_manager_config: PassManagerConfig, optimization_level: Optional[int] = None + ) -> PassManager: + """This method is designed to return a :class:`~.PassManager` for the stage this implements + + Args: + pass_manager_config: A configuration object that defines all the target device + specifications and any user specified options to :func:`~.transpile` or + :func:`~.generate_preset_pass_manager` + optimization_level: The optimization level of the transpilation, if set this + should be used to set values for any tunable parameters to trade off runtime + for potential optimization. Valid values should be ``0``, ``1``, ``2``, or ``3`` + and the higher the number the more optimization is expected. + """ + pass + + +class PassManagerStagePluginManager: + """Manager class for preset pass manager stage plugins.""" + + def __init__(self): + super().__init__() + self.init_plugins = stevedore.ExtensionManager( + "qiskit.transpiler.init", invoke_on_load=True, propagate_map_exceptions=True + ) + self.layout_plugins = stevedore.ExtensionManager( + "qiskit.transpiler.layout", invoke_on_load=True, propagate_map_exceptions=True + ) + self.routing_plugins = stevedore.ExtensionManager( + "qiskit.transpiler.routing", invoke_on_load=True, propagate_map_exceptions=True + ) + self.translation_plugins = stevedore.ExtensionManager( + "qiskit.transpiler.translation", invoke_on_load=True, propagate_map_exceptions=True + ) + self.optimization_plugins = stevedore.ExtensionManager( + "qiskit.transpiler.optimization", invoke_on_load=True, propagate_map_exceptions=True + ) + self.scheduling_plugins = stevedore.ExtensionManager( + "qiskit.transpiler.scheduling", invoke_on_load=True, propagate_map_exceptions=True + ) + + def get_passmanager_stage( + self, + stage_name: str, + plugin_name: str, + pm_config: PassManagerConfig, + optimization_level=None, + ) -> PassManager: + """Get a stage""" + if stage_name == "init": + return self._build_pm( + self.init_plugins, stage_name, plugin_name, pm_config, optimization_level + ) + elif stage_name == "layout": + return self._build_pm( + self.layout_plugins, stage_name, plugin_name, pm_config, optimization_level + ) + elif stage_name == "routing": + return self._build_pm( + self.routing_plugins, stage_name, plugin_name, pm_config, optimization_level + ) + elif stage_name == "translation": + return self._build_pm( + self.translation_plugins, stage_name, plugin_name, pm_config, optimization_level + ) + elif stage_name == "optimization": + return self._build_pm( + self.optimization_plugins, stage_name, plugin_name, pm_config, optimization_level + ) + elif stage_name == "scheduling": + return self._build_pm( + self.scheduling_plugins, stage_name, plugin_name, pm_config, optimization_level + ) + else: + raise TranspilerError(f"Invalid stage name: {stage_name}") + + def _build_pm( + self, + stage_obj: stevedore.ExtensionManager, + stage_name: str, + plugin_name: str, + pm_config: PassManagerConfig, + optimization_level: Optional[int] = None, + ): + if plugin_name not in stage_obj: + raise TranspilerError(f"Invalid plugin name {plugin_name} for stage {stage_name}") + plugin_obj = stage_obj[plugin_name] + return plugin_obj.obj.pass_manager(pm_config, optimization_level) + + +def list_stage_plugins(stage_name: str) -> List[str]: + """Get a list of installed plugins for a stage. + + Args: + stage_name: The stage name to get the plugin names for + + Returns: + plugins: The list of installed plugin names for the specified stages + + Raises: + TranspilerError: If an invalid stage name is specified. + """ + plugin_mgr = PassManagerStagePluginManager() + if stage_name == "init": + return plugin_mgr.init_plugins.names() + elif stage_name == "layout": + return plugin_mgr.layout_plugins.names() + elif stage_name == "routing": + return plugin_mgr.routing_plugins.names() + elif stage_name == "translation": + return plugin_mgr.translation_plugins.names() + elif stage_name == "optimization": + return plugin_mgr.optimization_plugins.names() + elif stage_name == "scheduling": + return plugin_mgr.scheduling_plugins.names() + else: + raise TranspilerError(f"Invalid stage name: {stage_name}") diff --git a/releasenotes/notes/stage-plugin-interface-47daae40f7d0ad3c.yaml b/releasenotes/notes/stage-plugin-interface-47daae40f7d0ad3c.yaml new file mode 100644 index 000000000000..ea4c88c097df --- /dev/null +++ b/releasenotes/notes/stage-plugin-interface-47daae40f7d0ad3c.yaml @@ -0,0 +1,32 @@ +--- +features: + - | + Introduced a new plugin interface for transpiler stages which is used to + enable alternative :class:`~.PassManager` objects from an external package + in a particular stage as part of :func:`~.transpile` or the + :class:`~.StagedPassManager` output from + :func:`~.generate_preset_pass_manager`, :func:`~.level_0_pass_manager`, + :func:`~.level_1_pass_manager`, :func:`~.level_2_pass_manager`, and + :func:`~.level_3_pass_manager`. Users can select a plugin to use for a + transpiler stage with the ``init_method``, ``layout_method``, + ``routing_method``, ``translation_method``, ``optimization_method``, and + ``scheduling_method`` keyword arguments on :func:`~.transpile` and + :func:`~.generate_preset_pass_manager`. A full list of plugin names + currently installed can be found with the :func:`.list_stage_plugins` + function. For creating plugins refer to the + :mod:`qiskit.transpiler.preset_passmanagers.plugin` module documentation + which includes a guide for writing stage plugins. + - | + The :func:`~.transpile` has two new keyword arguments, ``init_method`` and + ``optimization_method`` which are used to specify alternative plugins to + use for the ``init`` stage and ``optimization`` stages respectively. + - | + The :class:`~.PassManagerConfig` class has 3 new attributes, + :attr:`~.PassManagerConfig.init_method`, + :attr:`~.PassManagerConfig.optimization_method`, and + :attr:`~.PassManagerConfig.optimization_level` along with matching keyword + arguments on the constructor methods. The first two attributes represent + the user specified ``init`` and ``optimization`` plugins to use for + compilation. The :attr:`~.PassManagerConfig.optimization_level` attribute + represents the compilations optimization level if specified which can + be used to inform stage plugin behavior. diff --git a/setup.py b/setup.py index 5cdccc12ceea..ed7d0489f8d3 100755 --- a/setup.py +++ b/setup.py @@ -100,6 +100,13 @@ "qiskit.unitary_synthesis": [ "default = qiskit.transpiler.passes.synthesis.unitary_synthesis:DefaultUnitarySynthesis", "aqc = qiskit.transpiler.synthesis.aqc.aqc_plugin:AQCSynthesisPlugin", - ] + ], + "qiskit.transpiler.routing": [ + "basic = qiskit.transpiler.preset_passmanagers.builtin_plugins:BasicSwapPassManager", + "stochastic = qiskit.transpiler.preset_passmanagers.builtin_plugins:StochasticSwapPassManager", + "lookahead = qiskit.transpiler.preset_passmanagers.builtin_plugins:LookaheadSwapPassManager", + "sabre = qiskit.transpiler.preset_passmanagers.builtin_plugins:SabreSwapPassManager", + "none = qiskit.transpiler.preset_passmanagers.builtin_plugins:NoneRoutingPassManager", + ], }, ) diff --git a/test/python/transpiler/test_stage_plugin.py b/test/python/transpiler/test_stage_plugin.py new file mode 100644 index 000000000000..1242905e9f4e --- /dev/null +++ b/test/python/transpiler/test_stage_plugin.py @@ -0,0 +1,103 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +""" +Tests for the staged transpiler plugins. +""" + +from test import combine + +import ddt + +from qiskit.circuit.quantumcircuit import QuantumCircuit +from qiskit.compiler.transpiler import transpile +from qiskit.test import QiskitTestCase +from qiskit.transpiler import PassManager, PassManagerConfig, CouplingMap +from qiskit.transpiler.preset_passmanagers.plugin import ( + PassManagerStagePluginManager, + list_stage_plugins, +) +from qiskit.transpiler.exceptions import TranspilerError +from qiskit.providers.basicaer import QasmSimulatorPy + + +class TestStagePassManagerPlugin(QiskitTestCase): + """Tests for the transpiler stage plugin interface.""" + + def test_list_stage_plugins(self): + """Test list stage plugin function.""" + routing_passes = list_stage_plugins("routing") + self.assertIn("basic", routing_passes) + self.assertIn("sabre", routing_passes) + self.assertIn("lookahead", routing_passes) + self.assertIn("stochastic", routing_passes) + self.assertIsInstance(list_stage_plugins("init"), list) + self.assertIsInstance(list_stage_plugins("layout"), list) + self.assertIsInstance(list_stage_plugins("translation"), list) + self.assertIsInstance(list_stage_plugins("optimization"), list) + self.assertIsInstance(list_stage_plugins("scheduling"), list) + + def test_list_stage_plugins_invalid_stage_name(self): + """Test list stage plugin function with invalid stage name.""" + with self.assertRaises(TranspilerError): + list_stage_plugins("not_a_stage") + + def test_build_pm_invalid_plugin_name_valid_stage(self): + """Test get pm from plugin with invalid plugin name and valid stage.""" + plugin_manager = PassManagerStagePluginManager() + with self.assertRaises(TranspilerError): + plugin_manager.get_passmanager_stage("init", "empty_plugin", PassManagerConfig()) + + def test_build_pm_invalid_stage(self): + """Test get pm from plugin with invalid stage.""" + plugin_manager = PassManagerStagePluginManager() + with self.assertRaises(TranspilerError): + plugin_manager.get_passmanager_stage( + "not_a_sage", "fake_plugin_not_real", PassManagerConfig() + ) + + def test_build_pm(self): + """Test get pm from plugin.""" + plugin_manager = PassManagerStagePluginManager() + pm_config = PassManagerConfig() + pm = plugin_manager.get_passmanager_stage( + "routing", "sabre", pm_config, optimization_level=3 + ) + self.assertIsInstance(pm, PassManager) + + +@ddt.ddt +class TestBuiltinPlugins(QiskitTestCase): + """Test that all built-in plugins work in transpile().""" + + @combine( + optimization_level=list(range(4)), + routing_method=["basic", "lookahead", "sabre", "stochastic"], + ) + def test_routing_plugins(self, optimization_level, routing_method): + """Test all routing plugins (excluding error).""" + qc = QuantumCircuit(4) + qc.h(0) + qc.cx(0, 1) + qc.cx(0, 2) + qc.cx(0, 3) + qc.measure_all() + tqc = transpile( + qc, + basis_gates=["cx", "sx", "x", "rz"], + coupling_map=CouplingMap.from_line(4), + optimization_level=optimization_level, + routing_method=routing_method, + ) + backend = QasmSimulatorPy() + counts = backend.run(tqc, shots=1000).result().get_counts() + self.assertDictAlmostEqual(counts, {"0000": 500, "1111": 500}, delta=100) From d2b7cc878a8ea8ad685c382c08a9e8c250079f45 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Tue, 30 Aug 2022 15:57:32 -0400 Subject: [PATCH 38/54] Fix potential overflow in sabre swap (#8644) * Fix potential overflow in sabre swap This commit fixes a potential overflow which was caught by the randomized testing around tracking the number of search steps for the purposes of reseting the decay rates used by the heuristic scoring. The number of search steps was using an unsigned 8bit integer because it's typically not a large number and it's used to track if we've performed 5 steps or more before resetting the decay rate for each qubit. However in some cases if there were more than 255 steps in a layer this value would overflow the way this detection was being done. While this actually wouldn't be fatal because the value would reset back to 0 and we'd still track the decay rate correctly this was a potential error in debug mode. This commit fixes this by detecting when we've reached DECAY_RESET_INTERVAL steps and resetting the counter to 0. This way the value of the overflowing variable can never exceed DECAY_RESET_INTERVAL. * Update src/sabre_swap/mod.rs --- src/sabre_swap/mod.rs | 3 +- test/python/transpiler/test_sabre_layout.py | 68 +++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/src/sabre_swap/mod.rs b/src/sabre_swap/mod.rs index a2301c56e31f..c038e13b673a 100644 --- a/src/sabre_swap/mod.rs +++ b/src/sabre_swap/mod.rs @@ -318,8 +318,9 @@ pub fn build_swap_map( run_in_parallel, ); num_search_steps += 1; - if num_search_steps % DECAY_RESET_INTERVAL == 0 { + if num_search_steps >= DECAY_RESET_INTERVAL { qubits_decay.fill_with(|| 1.); + num_search_steps = 0; } else { qubits_decay[best_swap[0]] += DECAY_RATE; qubits_decay[best_swap[1]] += DECAY_RATE; diff --git a/test/python/transpiler/test_sabre_layout.py b/test/python/transpiler/test_sabre_layout.py index 142a66f2f4d9..27205afe8a26 100644 --- a/test/python/transpiler/test_sabre_layout.py +++ b/test/python/transpiler/test_sabre_layout.py @@ -22,6 +22,7 @@ from qiskit.compiler.transpiler import transpile from qiskit.providers.fake_provider import FakeAlmaden from qiskit.providers.fake_provider import FakeKolkata +from qiskit.providers.fake_provider import FakeMontreal class TestSabreLayout(QiskitTestCase): @@ -140,6 +141,73 @@ def test_layout_with_classical_bits(self): self.assertEqual(layout[qc.qubits[6]], 18) self.assertEqual(layout[qc.qubits[7]], 26) + # pylint: disable=line-too-long + def test_layout_many_search_trials(self): + """Test recreate failure from randomized testing that overflowed.""" + qc = QuantumCircuit.from_qasm_str( + """ + OPENQASM 2.0; +include "qelib1.inc"; +qreg q18585[14]; +creg c1423[5]; +creg c1424[4]; +creg c1425[3]; +barrier q18585[4],q18585[5],q18585[12],q18585[1]; +cz q18585[11],q18585[3]; +cswap q18585[8],q18585[10],q18585[6]; +u(-2.00001,6.1035156e-05,-1.9) q18585[2]; +barrier q18585[3],q18585[6],q18585[5],q18585[8],q18585[10],q18585[9],q18585[11],q18585[2],q18585[12],q18585[7],q18585[13],q18585[4],q18585[0],q18585[1]; +cp(0) q18585[2],q18585[4]; +cu(-0.99999,0,0,0) q18585[7],q18585[1]; +cu(0,0,0,2.1507119) q18585[6],q18585[3]; +barrier q18585[13],q18585[0],q18585[12],q18585[3],q18585[2],q18585[10]; +ry(-1.1044662) q18585[13]; +barrier q18585[13]; +id q18585[12]; +barrier q18585[12],q18585[6]; +cu(-1.9,1.9,-1.5,0) q18585[10],q18585[0]; +barrier q18585[13]; +id q18585[8]; +barrier q18585[12]; +barrier q18585[12],q18585[1],q18585[9]; +sdg q18585[2]; +rz(-10*pi) q18585[6]; +u(0,27.566433,1.9) q18585[1]; +barrier q18585[12],q18585[11],q18585[9],q18585[4],q18585[7],q18585[0],q18585[13],q18585[3]; +cu(-0.99999,-5.9604645e-08,-0.5,2.00001) q18585[3],q18585[13]; +rx(-5.9604645e-08) q18585[7]; +p(1.1) q18585[13]; +barrier q18585[12],q18585[13],q18585[10],q18585[9],q18585[7],q18585[4]; +z q18585[10]; +measure q18585[7] -> c1423[2]; +barrier q18585[0],q18585[3],q18585[7],q18585[4],q18585[1],q18585[8],q18585[6],q18585[11],q18585[5]; +barrier q18585[5],q18585[2],q18585[8],q18585[3],q18585[6]; +""" + ) + res = transpile( + qc, + FakeMontreal(), + layout_method="sabre", + routing_method="stochastic", + seed_transpiler=12345, + ) + self.assertIsInstance(res, QuantumCircuit) + layout = res._layout + self.assertEqual(layout[qc.qubits[0]], 11) + self.assertEqual(layout[qc.qubits[1]], 22) + self.assertEqual(layout[qc.qubits[2]], 17) + self.assertEqual(layout[qc.qubits[3]], 12) + self.assertEqual(layout[qc.qubits[4]], 18) + self.assertEqual(layout[qc.qubits[5]], 9) + self.assertEqual(layout[qc.qubits[6]], 16) + self.assertEqual(layout[qc.qubits[7]], 25) + self.assertEqual(layout[qc.qubits[8]], 19) + self.assertEqual(layout[qc.qubits[9]], 3) + self.assertEqual(layout[qc.qubits[10]], 14) + self.assertEqual(layout[qc.qubits[11]], 15) + self.assertEqual(layout[qc.qubits[12]], 20) + self.assertEqual(layout[qc.qubits[13]], 8) + if __name__ == "__main__": unittest.main() From 94814ec30804bbd01b8ad7572afaf1f0b24f9041 Mon Sep 17 00:00:00 2001 From: Jake Lishman Date: Wed, 31 Aug 2022 00:21:01 +0100 Subject: [PATCH 39/54] Generate transpiler seed in randomised testing (#8645) Hypothesis sometimes fails to shrink tests or provide a proper reproducer because there is also randomisation in the transpiler. This now outputs a `seed_transpiler` value as part of the draw, which should fix the output completely. The draw configuration is re-organised into a `kwargs` dictionary because the argument list was getting unwieldy. --- .../randomized/test_transpiler_equivalence.py | 59 +++++++++---------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/test/randomized/test_transpiler_equivalence.py b/test/randomized/test_transpiler_equivalence.py index bfb48d0068de..1c678ddda5fc 100644 --- a/test/randomized/test_transpiler_equivalence.py +++ b/test/randomized/test_transpiler_equivalence.py @@ -229,18 +229,22 @@ def _fully_supports_scheduling(backend): @st.composite def transpiler_conf(draw): """Composite search strategy to pick a valid transpiler config.""" - opt_level = draw(st.integers(min_value=0, max_value=3)) - layout_method = draw(st.sampled_from(layout_methods)) - routing_method = draw(st.sampled_from(routing_methods)) + all_backends = st.one_of(st.none(), st.sampled_from(mock_backends)) + scheduling_backends = st.sampled_from(mock_backends_with_scheduling) scheduling_method = draw(st.sampled_from(scheduling_methods)) - - compatible_backends = st.one_of(st.none(), st.sampled_from(mock_backends)) - if scheduling_method is not None or backend_needs_durations: - compatible_backends = st.sampled_from(mock_backends_with_scheduling) - - backend = draw(st.one_of(compatible_backends)) - - return (backend, opt_level, layout_method, routing_method, scheduling_method) + backend = ( + draw(scheduling_backends) + if scheduling_method or backend_needs_durations + else draw(all_backends) + ) + return { + "backend": backend, + "optimization_level": draw(st.integers(min_value=0, max_value=3)), + "layout_method": draw(st.sampled_from(layout_methods)), + "routing_method": draw(st.sampled_from(routing_methods)), + "scheduling_method": scheduling_method, + "seed_transpiler": draw(st.integers(min_value=0, max_value=1_000_000)), + } class QCircuitMachine(RuleBasedStateMachine): @@ -337,21 +341,23 @@ def qasm(self): self.qc.qasm() @precondition(lambda self: any(isinstance(d[0], Measure) for d in self.qc.data)) - @rule(conf=transpiler_conf()) - def equivalent_transpile(self, conf): + @rule(kwargs=transpiler_conf()) + def equivalent_transpile(self, kwargs): """Simulate, transpile and simulate the present circuit. Verify that the counts are not significantly different before and after transpilation. """ - backend, opt_level, layout_method, routing_method, scheduling_method = conf - - assume(backend is None or backend.configuration().n_qubits >= len(self.qc.qubits)) + assume( + kwargs["backend"] is None + or kwargs["backend"].configuration().n_qubits >= len(self.qc.qubits) + ) - print( - f"Evaluating circuit at level {opt_level} on {backend} " - f"using layout_method={layout_method} routing_method={routing_method} " - f"and scheduling_method={scheduling_method}:\n{self.qc.qasm()}" + call = ( + "transpile(qc, " + + ", ".join(f"{key:s}={value!r}" for key, value in kwargs.items() if value is not None) + + ")" ) + print(f"Evaluating {call} for:\n{self.qc.qasm()}") shots = 4096 @@ -360,18 +366,9 @@ def equivalent_transpile(self, conf): aer_counts = self.backend.run(self.qc, shots=shots).result().get_counts() try: - xpiled_qc = transpile( - self.qc, - backend=backend, - optimization_level=opt_level, - layout_method=layout_method, - routing_method=routing_method, - scheduling_method=scheduling_method, - ) + xpiled_qc = transpile(self.qc, **kwargs) except Exception as e: - failed_qasm = "Exception caught during transpilation of circuit: \n{}".format( - self.qc.qasm() - ) + failed_qasm = f"Exception caught during transpilation of circuit: \n{self.qc.qasm()}" raise RuntimeError(failed_qasm) from e xpiled_aer_counts = self.backend.run(xpiled_qc, shots=shots).result().get_counts() From ea1d2d3d6f221574bbb6e0d20ab00a2d000c58fe Mon Sep 17 00:00:00 2001 From: Manoel Marques Date: Tue, 30 Aug 2022 20:53:50 -0400 Subject: [PATCH 40/54] Add optional category parameter to deprecate decorators (#8646) --- qiskit/utils/deprecation.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/qiskit/utils/deprecation.py b/qiskit/utils/deprecation.py index ccfa93615287..633c2472288d 100644 --- a/qiskit/utils/deprecation.py +++ b/qiskit/utils/deprecation.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2017. +# (C) Copyright IBM 2017, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -14,16 +14,17 @@ import functools import warnings +from typing import Type -def deprecate_arguments(kwarg_map): +def deprecate_arguments(kwarg_map, category: Type[Warning] = DeprecationWarning): """Decorator to automatically alias deprecated argument names and warn upon use.""" def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): if kwargs: - _rename_kwargs(func.__name__, kwargs, kwarg_map) + _rename_kwargs(func.__name__, kwargs, kwarg_map, category) return func(*args, **kwargs) return wrapper @@ -31,12 +32,13 @@ def wrapper(*args, **kwargs): return decorator -def deprecate_function(msg, stacklevel=2): +def deprecate_function(msg: str, stacklevel: int = 2, category: Type[Warning] = DeprecationWarning): """Emit a warning prior to calling decorated function. Args: - msg (str): Warning message to emit. - stacklevel (int): The warning stackevel to use, defaults to 2. + msg: Warning message to emit. + stacklevel: The warning stackevel to use, defaults to 2. + category: warning category, defaults to DeprecationWarning Returns: Callable: The decorated, deprecated callable. @@ -45,7 +47,7 @@ def deprecate_function(msg, stacklevel=2): def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): - warnings.warn(msg, DeprecationWarning, stacklevel=stacklevel) + warnings.warn(msg, category=category, stacklevel=stacklevel) return func(*args, **kwargs) return wrapper @@ -53,7 +55,7 @@ def wrapper(*args, **kwargs): return decorator -def _rename_kwargs(func_name, kwargs, kwarg_map): +def _rename_kwargs(func_name, kwargs, kwarg_map, category: Type[Warning] = DeprecationWarning): for old_arg, new_arg in kwarg_map.items(): if old_arg in kwargs: if new_arg in kwargs: @@ -63,14 +65,14 @@ def _rename_kwargs(func_name, kwargs, kwarg_map): warnings.warn( f"{func_name} keyword argument {old_arg} is deprecated and " "will in future be removed.", - DeprecationWarning, + category=category, stacklevel=3, ) else: warnings.warn( f"{func_name} keyword argument {old_arg} is deprecated and " f"replaced with {new_arg}.", - DeprecationWarning, + category=category, stacklevel=3, ) From 548dae2cb82df3de0ea247fe9f82a04c12f019b0 Mon Sep 17 00:00:00 2001 From: Anthony-Gandon Date: Wed, 31 Aug 2022 05:38:33 +0200 Subject: [PATCH 41/54] Implements two-step tapering (#8590) * Adds two new methods for the tapering: `convert_clifford` and `taper_clifford` * Adds two new methods for the tapering: `convert_clifford` and `taper_clifford`. Adds a corresponding test. * Make black * Make lint * Resolving the duplication and documenting the tapering. * Add release note. * Small changes * Double the OpflowError + Update docstring indent * Apply suggestions from code review Co-authored-by: Ikko Hamamura Co-authored-by: Ikko Hamamura Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .../primitive_ops/tapered_pauli_sum_op.py | 81 ++++++++++++++++--- ...ts_two_step_tapering-f481a8cac3990cd5.yaml | 5 ++ test/python/opflow/test_z2_symmetries.py | 18 +++++ 3 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 releasenotes/notes/implements_two_step_tapering-f481a8cac3990cd5.yaml diff --git a/qiskit/opflow/primitive_ops/tapered_pauli_sum_op.py b/qiskit/opflow/primitive_ops/tapered_pauli_sum_op.py index 0b4abf1713f1..97cc441b5b49 100644 --- a/qiskit/opflow/primitive_ops/tapered_pauli_sum_op.py +++ b/qiskit/opflow/primitive_ops/tapered_pauli_sum_op.py @@ -356,32 +356,59 @@ def find_Z2_symmetries(cls, operator: PauliSumOp) -> "Z2Symmetries": return cls(pauli_symmetries, sq_paulis, sq_list, None) - def taper(self, operator: PauliSumOp) -> OperatorBase: - """ - Taper an operator based on the z2_symmetries info and sector defined by `tapering_values`. - The `tapering_values` will be stored into the resulted operator for a record. + def convert_clifford(self, operator: PauliSumOp) -> OperatorBase: + """This method operates the first part of the tapering. + It converts the operator by composing it with the clifford unitaries defined in the current + symmetry. Args: - operator: the to-be-tapered operator. + operator: to-be-tapered operator Returns: - If tapering_values is None: [:class`PauliSumOp`]; otherwise, :class:`PauliSumOp` + :class:`PauliSumOp` corresponding to the converted operator. + Raises: OpflowError: Z2 symmetries, single qubit pauli and single qubit list cannot be empty + """ + if not self._symmetries or not self._sq_paulis or not self._sq_list: raise OpflowError( "Z2 symmetries, single qubit pauli and single qubit list cannot be empty." ) - # If the operator is zero then we can skip the following. We still need to taper the - # operator to reduce its size i.e. the number of qubits so for example 0*"IIII" could - # taper to 0*"II" when symmetries remove two qubits. if not operator.is_zero(): for clifford in self.cliffords: operator = cast(PauliSumOp, clifford @ operator @ clifford) operator = operator.reduce(atol=0) + return operator + + def taper_clifford(self, operator: PauliSumOp) -> OperatorBase: + """This method operates the second part of the tapering. + This function assumes that the input operators have already been transformed using + :meth:`convert_clifford`. The redundant qubits due to the symmetries are dropped and + replaced by their two possible eigenvalues. + The `tapering_values` will be stored into the resulted operator for a record. + + Args: + operator: Partially tapered operator resulting from a call to :meth:`convert_clifford` + + Returns: + If tapering_values is None: [:class:`PauliSumOp`]; otherwise, :class:`PauliSumOp` + + Raises: + OpflowError: Z2 symmetries, single qubit pauli and single qubit list cannot be empty + + """ + + if not self._symmetries or not self._sq_paulis or not self._sq_list: + raise OpflowError( + "Z2 symmetries, single qubit pauli and single qubit list cannot be empty." + ) + # If the operator is zero then we can skip the following. We still need to taper the + # operator to reduce its size i.e. the number of qubits so for example 0*"IIII" could + # taper to 0*"II" when symmetries remove two qubits. if self._tapering_values is None: tapered_ops_list = [ self._taper(operator, list(coeff)) @@ -393,6 +420,42 @@ def taper(self, operator: PauliSumOp) -> OperatorBase: return tapered_ops + def taper(self, operator: PauliSumOp) -> OperatorBase: + """ + Taper an operator based on the z2_symmetries info and sector defined by `tapering_values`. + The `tapering_values` will be stored into the resulted operator for a record. + + The tapering is a two-step algorithm which first converts the operator into a + :class:`PauliSumOp` with same eigenvalues but where some qubits are only acted upon + with the Pauli operators I or X. + The number M of these redundant qubits is equal to the number M of identified symmetries. + + The second step of the reduction consists in replacing these qubits with the possible + eigenvalues of the corresponding Pauli X, giving 2^M new operators with M less qubits. + If an eigenvalue sector was previously identified for the solution, then this reduces to + 1 new operator with M less qubits. + + Args: + operator: the to-be-tapered operator + + Returns: + If tapering_values is None: [:class:`PauliSumOp`]; otherwise, :class:`PauliSumOp` + + Raises: + OpflowError: Z2 symmetries, single qubit pauli and single qubit list cannot be empty + + """ + + if not self._symmetries or not self._sq_paulis or not self._sq_list: + raise OpflowError( + "Z2 symmetries, single qubit pauli and single qubit list cannot be empty." + ) + + converted_ops = self.convert_clifford(operator) + tapered_ops = self.taper_clifford(converted_ops) + + return tapered_ops + def _taper(self, op: PauliSumOp, curr_tapering_values: List[int]) -> OperatorBase: pauli_list = [] for pauli_term in op: diff --git a/releasenotes/notes/implements_two_step_tapering-f481a8cac3990cd5.yaml b/releasenotes/notes/implements_two_step_tapering-f481a8cac3990cd5.yaml new file mode 100644 index 000000000000..ca23df6dffea --- /dev/null +++ b/releasenotes/notes/implements_two_step_tapering-f481a8cac3990cd5.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Splits the internal procedure in :meth:`taper()` into two methods :meth:`convert_clifford()` and :meth:`taper_clifford()`. The logic remains the same but the methods are now exposed in the public API. Also improves the documentation of the method `taper()`. + diff --git a/test/python/opflow/test_z2_symmetries.py b/test/python/opflow/test_z2_symmetries.py index c7335f6425bd..911cc71db080 100644 --- a/test/python/opflow/test_z2_symmetries.py +++ b/test/python/opflow/test_z2_symmetries.py @@ -92,3 +92,21 @@ def test_truncate_tapered_op(self): ) expected_op = TaperedPauliSumOp(primitive, z2_symmetries) self.assertEqual(tapered_op, expected_op) + + def test_twostep_tapering(self): + """Test the two-step tapering""" + qubit_op = PauliSumOp.from_list( + [ + ("II", -1.0537076071291125), + ("IZ", 0.393983679438514), + ("ZI", -0.39398367943851387), + ("ZZ", -0.01123658523318205), + ("XX", 0.1812888082114961), + ] + ) + z2_symmetries = Z2Symmetries.find_Z2_symmetries(qubit_op) + tapered_op = z2_symmetries.taper(qubit_op) + + tapered_op_firststep = z2_symmetries.convert_clifford(qubit_op) + tapered_op_secondstep = z2_symmetries.taper_clifford(tapered_op_firststep) + self.assertEqual(tapered_op, tapered_op_secondstep) From 9195ec183f723c027d876f10c1dc79509a4e4f40 Mon Sep 17 00:00:00 2001 From: Manoel Marques Date: Wed, 31 Aug 2022 09:42:09 -0400 Subject: [PATCH 42/54] Deprecate Algorithms Factorizers and Linear Solvers (#8617) * Deprecate HHL and Shor * Deprecate factorizers and linear solvers * Fix docstrings --- qiskit/algorithms/factorizers/shor.py | 16 +++- qiskit/algorithms/linear_solvers/__init__.py | 4 +- qiskit/algorithms/linear_solvers/hhl.py | 27 +++++-- .../linear_solvers/linear_solver.py | 18 ++++- .../matrices/linear_system_matrix.py | 9 ++- .../linear_solvers/matrices/numpy_matrix.py | 14 +++- .../matrices/tridiagonal_toeplitz.py | 14 +++- .../linear_solvers/numpy_linear_solver.py | 29 +++++-- .../observables/absolute_average.py | 17 ++++- .../observables/linear_system_observable.py | 12 ++- .../observables/matrix_functional.py | 18 ++++- ...-solvers-factorizers-bbf5302484cb6831.yaml | 9 +++ test/python/algorithms/test_backendv1.py | 12 ++- test/python/algorithms/test_backendv2.py | 12 ++- test/python/algorithms/test_linear_solvers.py | 75 ++++++++++++++----- test/python/algorithms/test_shor.py | 22 ++++-- 16 files changed, 238 insertions(+), 70 deletions(-) create mode 100644 releasenotes/notes/deprecate-linear-solvers-factorizers-bbf5302484cb6831.yaml diff --git a/qiskit/algorithms/factorizers/shor.py b/qiskit/algorithms/factorizers/shor.py index 1030747ae89f..06f9f1610e09 100644 --- a/qiskit/algorithms/factorizers/shor.py +++ b/qiskit/algorithms/factorizers/shor.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2019, 2020. +# (C) Copyright IBM 2019, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -30,6 +30,7 @@ from qiskit.utils.arithmetic import is_power from qiskit.utils.quantum_instance import QuantumInstance from qiskit.utils.validation import validate_min +from qiskit.utils.deprecation import deprecate_function from ..algorithm_result import AlgorithmResult from ..exceptions import AlgorithmError @@ -40,7 +41,12 @@ class Shor: - """Shor's factoring algorithm. + """The deprecated Shor's factoring algorithm. + + The Shor class is deprecated as of Qiskit Terra 0.22.0 + and will be removed no sooner than 3 months after the release date. + It is replaced by the tutorial at + `Shor `_ Shor's Factoring algorithm is one of the most well-known quantum algorithms and finds the prime factors for input integer :math:`N` in polynomial time. @@ -50,6 +56,10 @@ class Shor: See also https://arxiv.org/abs/quant-ph/0205095 """ + @deprecate_function( + "The Shor class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) def __init__(self, quantum_instance: Optional[Union[QuantumInstance, Backend]] = None) -> None: """ Args: @@ -480,7 +490,7 @@ def factor( class ShorResult(AlgorithmResult): - """Shor Result.""" + """The deprecated Shor Result.""" def __init__(self) -> None: super().__init__() diff --git a/qiskit/algorithms/linear_solvers/__init__.py b/qiskit/algorithms/linear_solvers/__init__.py index 2b8214fb7cf2..746fb8e40496 100644 --- a/qiskit/algorithms/linear_solvers/__init__.py +++ b/qiskit/algorithms/linear_solvers/__init__.py @@ -11,8 +11,8 @@ # that they have been altered from the originals. """ -Linear solvers (:mod:`qiskit.algorithms.linear_solvers`) -========================================================= +The deprecated Linear solvers (:mod:`qiskit.algorithms.linear_solvers`) +======================================================================= It contains classical and quantum algorithms to solve systems of linear equations such as :class:`~qiskit.algorithms.HHL`. Although the quantum algorithm accepts a general Hermitian matrix as input, Qiskit's default diff --git a/qiskit/algorithms/linear_solvers/hhl.py b/qiskit/algorithms/linear_solvers/hhl.py index 6e59de4babcb..c5bf52a0380d 100644 --- a/qiskit/algorithms/linear_solvers/hhl.py +++ b/qiskit/algorithms/linear_solvers/hhl.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -32,6 +32,7 @@ from qiskit.providers import Backend from qiskit.quantum_info.operators.base_operator import BaseOperator from qiskit.utils import QuantumInstance +from qiskit.utils.deprecation import deprecate_function from .linear_solver import LinearSolver, LinearSolverResult from .matrices.numpy_matrix import NumPyMatrix @@ -39,7 +40,8 @@ class HHL(LinearSolver): - r"""Systems of linear equations arise naturally in many real-life applications in a wide range + r"""The deprecated systems of linear equations arise naturally in many real-life applications + in a wide range of areas, such as in the solution of Partial Differential Equations, the calibration of financial models, fluid simulation or numerical field calculation. The problem can be defined as, given a matrix :math:`A\in\mathbb{C}^{N\times N}` and a vector @@ -64,24 +66,29 @@ class HHL(LinearSolver): .. jupyter-execute:: + import warnings import numpy as np from qiskit import QuantumCircuit from qiskit.algorithms.linear_solvers.hhl import HHL from qiskit.algorithms.linear_solvers.matrices import TridiagonalToeplitz from qiskit.algorithms.linear_solvers.observables import MatrixFunctional - matrix = TridiagonalToeplitz(2, 1, 1 / 3, trotter_steps=2) - right_hand_side = [1.0, -2.1, 3.2, -4.3] - observable = MatrixFunctional(1, 1 / 2) - rhs = right_hand_side / np.linalg.norm(right_hand_side) + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + matrix = TridiagonalToeplitz(2, 1, 1 / 3, trotter_steps=2) + right_hand_side = [1.0, -2.1, 3.2, -4.3] + observable = MatrixFunctional(1, 1 / 2) + rhs = right_hand_side / np.linalg.norm(right_hand_side) # Initial state circuit num_qubits = matrix.num_state_qubits qc = QuantumCircuit(num_qubits) qc.isometry(rhs, list(range(num_qubits)), None) - hhl = HHL() - solution = hhl.solve(matrix, qc, observable) + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + hhl = HHL() + solution = hhl.solve(matrix, qc, observable) approx_result = solution.observable References: @@ -96,6 +103,10 @@ class HHL(LinearSolver): """ + @deprecate_function( + "The HHL class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) def __init__( self, epsilon: float = 1e-2, diff --git a/qiskit/algorithms/linear_solvers/linear_solver.py b/qiskit/algorithms/linear_solvers/linear_solver.py index 093d8cd30e93..97a68226ebb9 100644 --- a/qiskit/algorithms/linear_solvers/linear_solver.py +++ b/qiskit/algorithms/linear_solvers/linear_solver.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -19,18 +19,23 @@ from qiskit import QuantumCircuit from qiskit.result import Result from qiskit.quantum_info.operators.base_operator import BaseOperator +from qiskit.utils.deprecation import deprecate_function from .observables.linear_system_observable import LinearSystemObservable from ..algorithm_result import AlgorithmResult class LinearSolverResult(AlgorithmResult): - """A base class for linear systems results. + """The deprecated base class for linear systems results. The linear systems algorithms return an object of the type ``LinearSystemsResult`` with the information about the solution obtained. """ + @deprecate_function( + "The LinearSolverResult class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) def __init__(self) -> None: super().__init__() @@ -93,7 +98,14 @@ def circuit_results(self, results: Union[List[float], List[Result]]): class LinearSolver(ABC): - """An abstract class for linear system solvers in Qiskit.""" + """The deprecated abstract class for linear system solvers in Qiskit.""" + + @deprecate_function( + "The LinearSolver class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) + def __init__(self) -> None: + pass @abstractmethod def solve( diff --git a/qiskit/algorithms/linear_solvers/matrices/linear_system_matrix.py b/qiskit/algorithms/linear_solvers/matrices/linear_system_matrix.py index 745fdca2b4f2..26e53860dc1f 100644 --- a/qiskit/algorithms/linear_solvers/matrices/linear_system_matrix.py +++ b/qiskit/algorithms/linear_solvers/matrices/linear_system_matrix.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -17,11 +17,16 @@ from qiskit import QuantumCircuit from qiskit.circuit.library import BlueprintCircuit +from qiskit.utils.deprecation import deprecate_function class LinearSystemMatrix(BlueprintCircuit, ABC): - """Base class for linear system matrices.""" + """The deprecated base class for linear system matrices.""" + @deprecate_function( + "The LinearSystemMatrix class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) def __init__( self, num_state_qubits: int, diff --git a/qiskit/algorithms/linear_solvers/matrices/numpy_matrix.py b/qiskit/algorithms/linear_solvers/matrices/numpy_matrix.py index 1fc94893c6ab..fdf30017c925 100644 --- a/qiskit/algorithms/linear_solvers/matrices/numpy_matrix.py +++ b/qiskit/algorithms/linear_solvers/matrices/numpy_matrix.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -17,22 +17,26 @@ import scipy as sp from qiskit import QuantumCircuit, QuantumRegister +from qiskit.utils.deprecation import deprecate_function from .linear_system_matrix import LinearSystemMatrix class NumPyMatrix(LinearSystemMatrix): - """Class of matrices given as a numpy array. + """The deprecated class of matrices given as a numpy array. Examples: .. jupyter-execute:: + import warnings import numpy as np from qiskit import QuantumCircuit from qiskit.algorithms.linear_solvers.matrices.numpy_matrix import NumPyMatrix - matrix = NumPyMatrix(np.array([[1 / 2, 1 / 6, 0, 0], [1 / 6, 1 / 2, 1 / 6, 0], + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + matrix = NumPyMatrix(np.array([[1 / 2, 1 / 6, 0, 0], [1 / 6, 1 / 2, 1 / 6, 0], [0, 1 / 6, 1 / 2, 1 / 6], [0, 0, 1 / 6, 1 / 2]])) power = 2 @@ -44,6 +48,10 @@ class NumPyMatrix(LinearSystemMatrix): qc.append(matrix.power(power).control(), list(range(circ_qubits))) """ + @deprecate_function( + "The NumPyMatrix class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) def __init__( self, matrix: np.ndarray, diff --git a/qiskit/algorithms/linear_solvers/matrices/tridiagonal_toeplitz.py b/qiskit/algorithms/linear_solvers/matrices/tridiagonal_toeplitz.py index 6dfbd0ad3c8a..6dda2716b680 100644 --- a/qiskit/algorithms/linear_solvers/matrices/tridiagonal_toeplitz.py +++ b/qiskit/algorithms/linear_solvers/matrices/tridiagonal_toeplitz.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -18,12 +18,13 @@ from qiskit.circuit import QuantumCircuit, QuantumRegister, AncillaRegister from qiskit.circuit.library import UGate, MCMTVChain +from qiskit.utils.deprecation import deprecate_function from .linear_system_matrix import LinearSystemMatrix class TridiagonalToeplitz(LinearSystemMatrix): - r"""Class of tridiagonal Toeplitz symmetric matrices. + r"""The deprecated class of tridiagonal Toeplitz symmetric matrices. Given the main entry, :math:`a`, and the off diagonal entry, :math:`b`, the :math:`4\times 4` dimensional tridiagonal Toeplitz symmetric matrix is @@ -41,11 +42,14 @@ class TridiagonalToeplitz(LinearSystemMatrix): .. jupyter-execute:: + import warnings import numpy as np from qiskit import QuantumCircuit from qiskit.algorithms.linear_solvers.matrices import TridiagonalToeplitz - matrix = TridiagonalToeplitz(2, 1, -1 / 3) + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + matrix = TridiagonalToeplitz(2, 1, -1 / 3) power = 3 # Controlled power (as within QPE) @@ -56,6 +60,10 @@ class TridiagonalToeplitz(LinearSystemMatrix): qc.append(matrix.power(power).control(), list(range(circ_qubits))) """ + @deprecate_function( + "The TridiagonalToeplitz class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) def __init__( self, num_state_qubits: int, diff --git a/qiskit/algorithms/linear_solvers/numpy_linear_solver.py b/qiskit/algorithms/linear_solvers/numpy_linear_solver.py index bbbb3a35f50f..0a3cbbd57191 100644 --- a/qiskit/algorithms/linear_solvers/numpy_linear_solver.py +++ b/qiskit/algorithms/linear_solvers/numpy_linear_solver.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -17,13 +17,14 @@ from qiskit import QuantumCircuit from qiskit.quantum_info import Operator, Statevector from qiskit.quantum_info.operators.base_operator import BaseOperator +from qiskit.utils.deprecation import deprecate_function from .linear_solver import LinearSolverResult, LinearSolver from .observables.linear_system_observable import LinearSystemObservable class NumPyLinearSolver(LinearSolver): - """The Numpy Linear Solver algorithm (classical). + """The deprecated Numpy Linear Solver algorithm (classical). This linear system solver computes the exact value of the given observable(s) or the full solution vector if no observable is specified. @@ -32,21 +33,33 @@ class NumPyLinearSolver(LinearSolver): .. jupyter-execute:: + import warnings import numpy as np from qiskit.algorithms import NumPyLinearSolver from qiskit.algorithms.linear_solvers.matrices import TridiagonalToeplitz from qiskit.algorithms.linear_solvers.observables import MatrixFunctional - matrix = TridiagonalToeplitz(2, 1, 1 / 3, trotter_steps=2) - right_hand_side = [1.0, -2.1, 3.2, -4.3] - observable = MatrixFunctional(1, 1 / 2) - rhs = right_hand_side / np.linalg.norm(right_hand_side) + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + matrix = TridiagonalToeplitz(2, 1, 1 / 3, trotter_steps=2) + right_hand_side = [1.0, -2.1, 3.2, -4.3] + observable = MatrixFunctional(1, 1 / 2) + rhs = right_hand_side / np.linalg.norm(right_hand_side) - np_solver = NumPyLinearSolver() - solution = np_solver.solve(matrix, rhs, observable) + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + np_solver = NumPyLinearSolver() + solution = np_solver.solve(matrix, rhs, observable) result = solution.observable """ + @deprecate_function( + "The NumPyLinearSolver class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) + def __init__(self) -> None: + super().__init__() + def solve( self, matrix: Union[np.ndarray, QuantumCircuit], diff --git a/qiskit/algorithms/linear_solvers/observables/absolute_average.py b/qiskit/algorithms/linear_solvers/observables/absolute_average.py index 9c9f644dd571..300c31edaed9 100644 --- a/qiskit/algorithms/linear_solvers/observables/absolute_average.py +++ b/qiskit/algorithms/linear_solvers/observables/absolute_average.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -18,12 +18,13 @@ from qiskit import QuantumCircuit from qiskit.opflow import I, Z, TensoredOp from qiskit.quantum_info import Statevector +from qiskit.utils.deprecation import deprecate_function from .linear_system_observable import LinearSystemObservable class AbsoluteAverage(LinearSystemObservable): - r"""An observable for the absolute average of a linear system of equations solution. + r"""The deprecated observable for the absolute average of a linear system of equations solution. For a vector :math:`x=(x_1,...,x_N)`, the absolute average is defined as :math:`\abs{\frac{1}{N}\sum_{i=1}^{N}x_i}`. @@ -32,13 +33,16 @@ class AbsoluteAverage(LinearSystemObservable): .. jupyter-execute:: + import warnings import numpy as np from qiskit import QuantumCircuit from qiskit.algorithms.linear_solvers.observables.absolute_average import \ AbsoluteAverage from qiskit.opflow import StateFn - observable = AbsoluteAverage() + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + observable = AbsoluteAverage() vector = [1.0, -2.1, 3.2, -4.3] init_state = vector / np.linalg.norm(vector) @@ -59,6 +63,13 @@ class AbsoluteAverage(LinearSystemObservable): exact = observable.evaluate_classically(init_state) """ + @deprecate_function( + "The AbsoluteAverage class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) + def __init__(self) -> None: + super().__init__() + def observable(self, num_qubits: int) -> Union[TensoredOp, List[TensoredOp]]: """The observable operator. diff --git a/qiskit/algorithms/linear_solvers/observables/linear_system_observable.py b/qiskit/algorithms/linear_solvers/observables/linear_system_observable.py index 048291d3d96d..fd6ea2339738 100644 --- a/qiskit/algorithms/linear_solvers/observables/linear_system_observable.py +++ b/qiskit/algorithms/linear_solvers/observables/linear_system_observable.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -18,10 +18,18 @@ from qiskit import QuantumCircuit from qiskit.opflow import TensoredOp +from qiskit.utils.deprecation import deprecate_function class LinearSystemObservable(ABC): - """An abstract class for linear system observables in Qiskit.""" + """The deprecated abstract class for linear system observables in Qiskit.""" + + @deprecate_function( + "The LinearSystemObservable class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) + def __init__(self) -> None: + pass @abstractmethod def observable(self, num_qubits: int) -> Union[TensoredOp, List[TensoredOp]]: diff --git a/qiskit/algorithms/linear_solvers/observables/matrix_functional.py b/qiskit/algorithms/linear_solvers/observables/matrix_functional.py index 8611620377e2..ca0cfecf16bc 100644 --- a/qiskit/algorithms/linear_solvers/observables/matrix_functional.py +++ b/qiskit/algorithms/linear_solvers/observables/matrix_functional.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -13,23 +13,26 @@ """The matrix functional of the vector solution to the linear systems.""" from typing import Union, List +import warnings import numpy as np from scipy.sparse import diags from qiskit import QuantumCircuit from qiskit.quantum_info import Statevector from qiskit.opflow import I, Z, TensoredOp +from qiskit.utils.deprecation import deprecate_function from .linear_system_observable import LinearSystemObservable class MatrixFunctional(LinearSystemObservable): - """A class for the matrix functional of the vector solution to the linear systems. + """The deprecated class for the matrix functional of the vector solution to the linear systems. Examples: .. jupyter-execute:: + import warnings import numpy as np from qiskit import QuantumCircuit from qiskit.algorithms.linear_solvers.observables.matrix_functional import \ @@ -40,7 +43,9 @@ class MatrixFunctional(LinearSystemObservable): tpass = RemoveResetInZeroState() vector = [1.0, -2.1, 3.2, -4.3] - observable = MatrixFunctional(1, -1 / 3) + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + observable = MatrixFunctional(1, -1 / 3) init_state = vector / np.linalg.norm(vector) num_qubits = int(np.log2(len(vector))) @@ -70,6 +75,10 @@ class MatrixFunctional(LinearSystemObservable): exact = observable.evaluate_classically(init_state) """ + @deprecate_function( + "The MatrixFunctional class is deprecated as of Qiskit Terra 0.22.0 " + "and will be removed no sooner than 3 months after the release date. " + ) def __init__(self, main_diag: float, off_diag: int) -> None: """ Args: @@ -78,6 +87,9 @@ def __init__(self, main_diag: float, off_diag: int) -> None: off_diag: The off diagonal of the tridiagonal Toeplitz symmetric matrix to compute the functional. """ + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__() self._main_diag = main_diag self._off_diag = off_diag diff --git a/releasenotes/notes/deprecate-linear-solvers-factorizers-bbf5302484cb6831.yaml b/releasenotes/notes/deprecate-linear-solvers-factorizers-bbf5302484cb6831.yaml new file mode 100644 index 000000000000..2d7034394f5d --- /dev/null +++ b/releasenotes/notes/deprecate-linear-solvers-factorizers-bbf5302484cb6831.yaml @@ -0,0 +1,9 @@ +--- +deprecations: + - | + Modules :mod:`qiskit.algorithms.factorizers` and + :mod:`qiskit.algorithms.linear_solvers` are deprecated and will + be removed in a future release. + They are replaced by tutorials in the Qiskit Textbook: + `Shor `__ + `HHL `__ diff --git a/test/python/algorithms/test_backendv1.py b/test/python/algorithms/test_backendv1.py index aa251841e744..21674d1c953e 100644 --- a/test/python/algorithms/test_backendv1.py +++ b/test/python/algorithms/test_backendv1.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2021. +# (C) Copyright IBM 2021, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -13,6 +13,7 @@ """ Test Providers that support BackendV1 interface """ import unittest +import warnings from test.python.algorithms import QiskitAlgorithmsTestCase from qiskit import QuantumCircuit from qiskit.providers.fake_provider import FakeProvider @@ -40,7 +41,14 @@ def test_shor_factoring(self): qasm_simulator = QuantumInstance( self._qasm, shots=1000, seed_simulator=self.seed, seed_transpiler=self.seed ) - shor = Shor(quantum_instance=qasm_simulator) + with warnings.catch_warnings(record=True) as caught_warnings: + warnings.filterwarnings( + "always", + category=DeprecationWarning, + ) + shor = Shor(quantum_instance=qasm_simulator) + self.assertTrue("Shor class is deprecated" in str(caught_warnings[0].message)) + result = shor.factor(N=n_v) self.assertListEqual(result.factors[0], factors) self.assertTrue(result.total_counts >= result.successful_counts) diff --git a/test/python/algorithms/test_backendv2.py b/test/python/algorithms/test_backendv2.py index 27cf0f7cfb86..4b86bfc35139 100644 --- a/test/python/algorithms/test_backendv2.py +++ b/test/python/algorithms/test_backendv2.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2021. +# (C) Copyright IBM 2021, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -13,6 +13,7 @@ """ Test Providers that support BackendV2 interface """ import unittest +import warnings from test.python.algorithms import QiskitAlgorithmsTestCase from qiskit import QuantumCircuit from qiskit.providers.fake_provider import FakeProvider @@ -40,7 +41,14 @@ def test_shor_factoring(self): qasm_simulator = QuantumInstance( self._qasm, shots=1000, seed_simulator=self.seed, seed_transpiler=self.seed ) - shor = Shor(quantum_instance=qasm_simulator) + with warnings.catch_warnings(record=True) as caught_warnings: + warnings.filterwarnings( + "always", + category=DeprecationWarning, + ) + shor = Shor(quantum_instance=qasm_simulator) + self.assertTrue("Shor class is deprecated" in str(caught_warnings[0].message)) + result = shor.factor(N=n_v) self.assertListEqual(result.factors[0], factors) self.assertTrue(result.total_counts >= result.successful_counts) diff --git a/test/python/algorithms/test_linear_solvers.py b/test/python/algorithms/test_linear_solvers.py index ea16bf5ee0e9..b013ed5c32e2 100644 --- a/test/python/algorithms/test_linear_solvers.py +++ b/test/python/algorithms/test_linear_solvers.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2020, 2021. +# (C) Copyright IBM 2020, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -13,6 +13,7 @@ """Test the quantum linear system solver algorithm.""" import unittest +import warnings from test.python.algorithms import QiskitAlgorithmsTestCase from scipy.linalg import expm import numpy as np @@ -30,6 +31,22 @@ from qiskit import quantum_info +def _factory_tridiagonal_toeplitz( + num_state_qubits: int, main_diag: float, off_diag: float, trotter_steps: int = 1 +): + with warnings.catch_warnings(record=True): + warnings.simplefilter("ignore") + return TridiagonalToeplitz( + num_state_qubits, main_diag, off_diag, trotter_steps=trotter_steps + ) + + +def _factory_numpy_matrix(matrix: np.ndarray): + with warnings.catch_warnings(record=True): + warnings.simplefilter("ignore") + return NumPyMatrix(matrix) + + @ddt class TestMatrices(QiskitAlgorithmsTestCase): """Tests based on the matrices classes. @@ -40,10 +57,10 @@ class TestMatrices(QiskitAlgorithmsTestCase): @idata( [ - [TridiagonalToeplitz(2, 1, -1 / 3)], - [TridiagonalToeplitz(3, 2, 1), 1.1, 3], + [_factory_tridiagonal_toeplitz(2, 1, -1 / 3)], + [_factory_tridiagonal_toeplitz(3, 2, 1), 1.1, 3], [ - NumPyMatrix( + _factory_numpy_matrix( np.array( [ [1 / 2, 1 / 6, 0, 0], @@ -80,8 +97,8 @@ def test_matrices(self, matrix, time=1.0, power=1): @idata( [ - [TridiagonalToeplitz(2, 1.5, 2.5)], - [TridiagonalToeplitz(4, -1, 1.6)], + [_factory_tridiagonal_toeplitz(2, 1.5, 2.5)], + [_factory_tridiagonal_toeplitz(4, -1, 1.6)], ] ) @unpack @@ -101,6 +118,18 @@ def test_eigs_bounds(self, matrix): np.testing.assert_almost_equal(matrix_lambda_max, exact_lambda_max, decimal=6) +def _factory_absolute_average(): + with warnings.catch_warnings(record=True): + warnings.simplefilter("ignore") + return AbsoluteAverage() + + +def _factory_matrix_functional(main_diag: float, off_diag: int): + with warnings.catch_warnings(record=True): + warnings.simplefilter("ignore") + return MatrixFunctional(main_diag, off_diag) + + @ddt class TestObservables(QiskitAlgorithmsTestCase): """Tests based on the observables classes. @@ -111,8 +140,8 @@ class TestObservables(QiskitAlgorithmsTestCase): @idata( [ - [AbsoluteAverage(), [1.0, -2.1, 3.2, -4.3]], - [AbsoluteAverage(), [-9 / 4, -0.3, 8 / 7, 10, -5, 11.1, 13 / 11, -27 / 12]], + [_factory_absolute_average(), [1.0, -2.1, 3.2, -4.3]], + [_factory_absolute_average(), [-9 / 4, -0.3, 8 / 7, 10, -5, 11.1, 13 / 11, -27 / 12]], ] ) @unpack @@ -139,9 +168,9 @@ def test_absolute_average(self, observable, vector): @idata( [ - [MatrixFunctional(1, -1 / 3), [1.0, -2.1, 3.2, -4.3]], + [_factory_matrix_functional(1, -1 / 3), [1.0, -2.1, 3.2, -4.3]], [ - MatrixFunctional(2 / 3, 11 / 7), + _factory_matrix_functional(2 / 3, 11 / 7), [-9 / 4, -0.3, 8 / 7, 10, -5, 11.1, 13 / 11, -27 / 12], ], ] @@ -237,16 +266,16 @@ class TestLinearSolver(QiskitAlgorithmsTestCase): @idata( [ [ - TridiagonalToeplitz(2, 1, 1 / 3, trotter_steps=2), + _factory_tridiagonal_toeplitz(2, 1, 1 / 3, trotter_steps=2), [1.0, -2.1, 3.2, -4.3], - MatrixFunctional(1, 1 / 2), + _factory_matrix_functional(1, 1 / 2), ], [ np.array( [[0, 0, 1.585, 0], [0, 0, -0.585, 1], [1.585, -0.585, 0, 0], [0, 1, 0, 0]] ), [1.0, 0, 0, 0], - MatrixFunctional(1, 1 / 2), + _factory_matrix_functional(1, 1 / 2), ], [ [ @@ -256,18 +285,18 @@ class TestLinearSolver(QiskitAlgorithmsTestCase): [0, 0, 1 / 6, 1 / 2], ], [1.0, -2.1, 3.2, -4.3], - MatrixFunctional(1, 1 / 2), + _factory_matrix_functional(1, 1 / 2), ], [ np.array([[82, 34], [34, 58]]), np.array([[1], [0]]), - AbsoluteAverage(), + _factory_absolute_average(), 3, ], [ - TridiagonalToeplitz(3, 1, -1 / 2, trotter_steps=2), + _factory_tridiagonal_toeplitz(3, 1, -1 / 2, trotter_steps=2), [-9 / 4, -0.3, 8 / 7, 10, -5, 11.1, 13 / 11, -27 / 12], - AbsoluteAverage(), + _factory_absolute_average(), ], ] ) @@ -287,8 +316,11 @@ def test_hhl(self, matrix, right_hand_side, observable, decimal=1): qc = QuantumCircuit(num_qubits) qc.isometry(rhs, list(range(num_qubits)), None) - hhl = HHL() - solution = hhl.solve(matrix, qc, observable) + with warnings.catch_warnings(record=True) as caught_warnings: + warnings.simplefilter("always") + hhl = HHL() + self.assertTrue("HHL class is deprecated" in str(caught_warnings[0].message)) + solution = hhl.solve(matrix, qc, observable) approx_result = solution.observable # Calculate analytical value @@ -304,7 +336,10 @@ def test_hhl(self, matrix, right_hand_side, observable, decimal=1): def test_hhl_qi(self): """Test the HHL quantum instance getter and setter.""" - hhl = HHL() + with warnings.catch_warnings(record=True) as caught_warnings: + warnings.simplefilter("always") + hhl = HHL() + self.assertTrue("HHL class is deprecated" in str(caught_warnings[0].message)) self.assertIsNone(hhl.quantum_instance) # Defaults to None # First set a valid quantum instance and check via getter diff --git a/test/python/algorithms/test_shor.py b/test/python/algorithms/test_shor.py index 0ecc5886fe54..811680b1799a 100644 --- a/test/python/algorithms/test_shor.py +++ b/test/python/algorithms/test_shor.py @@ -1,6 +1,6 @@ # This code is part of Qiskit. # -# (C) Copyright IBM 2018, 2020. +# (C) Copyright IBM 2018, 2022. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory @@ -13,6 +13,7 @@ """ Test Shor """ import unittest +import warnings import math from test.python.algorithms import QiskitAlgorithmsTestCase from ddt import ddt, data, idata, unpack @@ -30,12 +31,18 @@ class TestShor(QiskitAlgorithmsTestCase): def setUp(self): super().setUp() - backend = Aer.get_backend("qasm_simulator") - self.instance = Shor(quantum_instance=QuantumInstance(backend, shots=1000)) + backend = Aer.get_backend("aer_simulator") + with warnings.catch_warnings(record=True) as caught_warnings: + warnings.filterwarnings( + "always", + category=DeprecationWarning, + ) + self.instance = Shor(quantum_instance=QuantumInstance(backend, shots=1000)) + self.assertTrue("Shor class is deprecated" in str(caught_warnings[0].message)) @idata( [ - [15, "qasm_simulator", [3, 5]], + [15, "aer_simulator", [3, 5]], ] ) @unpack @@ -46,7 +53,7 @@ def test_shor_factoring(self, n_v, backend, factors): @slow_test @idata( [ - [21, "qasm_simulator", [3, 7]], + [21, "aer_simulator", [3, 7]], ] ) @unpack @@ -56,7 +63,10 @@ def test_shor_factoring_5_bit_number(self, n_v, backend, factors): def _test_shor_factoring(self, backend, factors, n_v): """shor factoring test""" - shor = Shor(quantum_instance=QuantumInstance(Aer.get_backend(backend), shots=1000)) + with warnings.catch_warnings(record=True) as caught_warnings: + warnings.simplefilter("always") + shor = Shor(quantum_instance=QuantumInstance(Aer.get_backend(backend), shots=1000)) + self.assertTrue("Shor class is deprecated" in str(caught_warnings[0].message)) result = shor.factor(N=n_v) self.assertListEqual(result.factors[0], factors) self.assertTrue(result.total_counts >= result.successful_counts) From 219032df87b4b0224e1b38a605e7a34b8609baed Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Wed, 31 Aug 2022 13:21:32 -0400 Subject: [PATCH 43/54] Fix github actions yaml syntax for randomized testing (#8649) In #8639 we added an environment variable to enable printing the rust back traces when the rust code under test panics. However, that PR had a small syntax error as it used the bash syntax for setting an env variable and not the correct yaml syntax for github actions. This commit corrects the oversight to fix the job configuration so that the jobs run again. --- .github/workflows/randomized_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/randomized_tests.yml b/.github/workflows/randomized_tests.yml index 7f526c1692b4..4c9f8e0f86e7 100644 --- a/.github/workflows/randomized_tests.yml +++ b/.github/workflows/randomized_tests.yml @@ -25,7 +25,7 @@ jobs: - name: Run randomized tests run: make test_randomized env: - RUST_BACKTRACE=1 + RUST_BACKTRACE: 1 - name: Create comment on failed test run if: ${{ failure() }} uses: peter-evans/create-or-update-comment@v1 From 69ad6c66d55882baecf5bd9f8aff1b4d80cf97f7 Mon Sep 17 00:00:00 2001 From: Luciano Bello Date: Thu, 1 Sep 2022 00:04:17 +0200 Subject: [PATCH 44/54] Use np.array_split instead of np.split to support uneven splits in spsa._batch_evaluate (#8634) * Use np.array_split instead of np.split to support uneven splits in spsa._batch_evaluate * better testing Co-authored-by: Julien Gacon * Update test/python/algorithms/optimizers/test_spsa.py Co-authored-by: Julien Gacon * len of a boolean * Apply suggestions from code review * Fix Sphinx ref Co-authored-by: Julien Gacon Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/algorithms/optimizers/spsa.py | 2 +- .../notes/qiskit-nature-797-8f1b0975309b8756.yaml | 6 ++++++ test/python/algorithms/optimizers/test_spsa.py | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/qiskit-nature-797-8f1b0975309b8756.yaml diff --git a/qiskit/algorithms/optimizers/spsa.py b/qiskit/algorithms/optimizers/spsa.py index 707409efe4cf..10d81dfdd41c 100644 --- a/qiskit/algorithms/optimizers/spsa.py +++ b/qiskit/algorithms/optimizers/spsa.py @@ -727,7 +727,7 @@ def _batch_evaluate(function, points, max_evals_grouped): num_batches += 1 # split the points - batched_points = np.split(np.asarray(points), num_batches) + batched_points = np.array_split(np.asarray(points), num_batches) results = [] for batch in batched_points: diff --git a/releasenotes/notes/qiskit-nature-797-8f1b0975309b8756.yaml b/releasenotes/notes/qiskit-nature-797-8f1b0975309b8756.yaml new file mode 100644 index 000000000000..08412ffcf95c --- /dev/null +++ b/releasenotes/notes/qiskit-nature-797-8f1b0975309b8756.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + When the class :class:`~.SPSA` was using `np.split` (from NumPy) for splitting the jobs in even batches, + resulting in an exception if a perfectly even split was not possible. Now, it uses `np.array_split`, which is safer + for these cases. diff --git a/test/python/algorithms/optimizers/test_spsa.py b/test/python/algorithms/optimizers/test_spsa.py index 55e4b7b3c068..5f31d69d463f 100644 --- a/test/python/algorithms/optimizers/test_spsa.py +++ b/test/python/algorithms/optimizers/test_spsa.py @@ -181,3 +181,17 @@ def callback(nfev, point, fval, update, accepted): for i, (key, values) in enumerate(history.items()): self.assertTrue(all(isinstance(value, expected_types[i]) for value in values)) self.assertEqual(len(history[key]), maxiter) + + @data(1, 2, 3, 4) + def test_estimate_stddev(self, max_evals_grouped): + """Test the estimate_stddev + See https://github.com/Qiskit/qiskit-nature/issues/797""" + + def objective(x): + if len(x.shape) == 2: + return np.array([sum(x_i) for x_i in x]) + return sum(x) + + point = np.ones(5) + result = SPSA.estimate_stddev(objective, point, avg=10, max_evals_grouped=max_evals_grouped) + self.assertAlmostEqual(result, 0) From f1c5f5e272ce42dda3ff2a548dcfda7f76890bf2 Mon Sep 17 00:00:00 2001 From: Ikko Hamamura Date: Thu, 1 Sep 2022 23:34:58 +0900 Subject: [PATCH 45/54] Remove deprecated methods and arguments in quantum_info (#8510) * Remove deprecated methods and arguments in quantum_info * revert pauli.py * add releasenote * rm pauli_list argument * update reno Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .../operators/symplectic/pauli_utils.py | 23 ++------------ .../operators/symplectic/sparse_pauli_op.py | 31 ++----------------- ...ted-methods-in-pauli-c874d463ba1f7a0e.yaml | 7 +++++ 3 files changed, 12 insertions(+), 49 deletions(-) create mode 100644 releasenotes/notes/remove-deprecated-methods-in-pauli-c874d463ba1f7a0e.yaml diff --git a/qiskit/quantum_info/operators/symplectic/pauli_utils.py b/qiskit/quantum_info/operators/symplectic/pauli_utils.py index b3578d2ec98f..e4a3552b5076 100644 --- a/qiskit/quantum_info/operators/symplectic/pauli_utils.py +++ b/qiskit/quantum_info/operators/symplectic/pauli_utils.py @@ -13,40 +13,21 @@ PauliList utility functions. """ -import warnings - -import numpy as np - from qiskit.quantum_info.operators.symplectic.pauli_list import PauliList -from qiskit.quantum_info.operators.symplectic.pauli_table import PauliTable -def pauli_basis(num_qubits, weight=False, pauli_list=False): +def pauli_basis(num_qubits, weight=False): """Return the ordered PauliTable or PauliList for the n-qubit Pauli basis. Args: num_qubits (int): number of qubits weight (bool): if True optionally return the basis sorted by Pauli weight rather than lexicographic order (Default: False) - pauli_list (bool): if True, the return type becomes PauliList, otherwise PauliTable. Returns: PauliTable, PauliList: the Paulis for the basis """ - if pauli_list: - pauli_1q = PauliList(["I", "X", "Y", "Z"]) - else: - warnings.warn( - "The return type of 'pauli_basis' will change from PauliTable to PauliList in a " - "future release of Qiskit Terra. Returning PauliTable is deprecated as of " - "Qiskit Terra 0.19, and will be removed in a future release. To immediately switch " - "to the new behaviour, pass the keyword argument 'pauli_list=True'.", - FutureWarning, - stacklevel=2, - ) - pauli_1q = PauliTable( - np.array([[False, False], [True, False], [True, True], [False, True]], dtype=bool) - ) + pauli_1q = PauliList(["I", "X", "Y", "Z"]) if num_qubits == 1: return pauli_1q pauli = pauli_1q diff --git a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py index 114895e1cb7f..b3f04b4b3e33 100644 --- a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +++ b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py @@ -28,9 +28,7 @@ from qiskit.quantum_info.operators.operator import Operator from qiskit.quantum_info.operators.symplectic.pauli import BasePauli from qiskit.quantum_info.operators.symplectic.pauli_list import PauliList -from qiskit.quantum_info.operators.symplectic.pauli_table import PauliTable from qiskit.quantum_info.operators.symplectic.pauli_utils import pauli_basis -from qiskit.utils.deprecation import deprecate_function class SparsePauliOp(LinearOp): @@ -54,7 +52,7 @@ def __init__(self, data, coeffs=None, *, ignore_pauli_phase=False, copy=True): """Initialize an operator object. Args: - data (PauliList or SparsePauliOp or PauliTable or Pauli or list or str): Pauli list of + data (PauliList or SparsePauliOp or Pauli or list or str): Pauli list of terms. A list of Pauli strings or a Pauli string is also allowed. coeffs (np.ndarray): complex coefficients for Pauli terms. @@ -173,29 +171,6 @@ def __len__(self): """Return the size.""" return self.size - # pylint: disable=bad-docstring-quotes - - @property - @deprecate_function( - "The SparsePauliOp.table method is deprecated as of Qiskit Terra 0.19.0 " - "and will be removed no sooner than 3 months after the releasedate. " - "Use SparsePauliOp.paulis method instead.", - ) - def table(self): - """DEPRECATED - Return the the PauliTable.""" - return PauliTable(np.column_stack((self.paulis.x, self.paulis.z))) - - @table.setter - @deprecate_function( - "The SparsePauliOp.table method is deprecated as of Qiskit Terra 0.19.0 " - "and will be removed no sooner than 3 months after the releasedate. " - "Use SparsePauliOp.paulis method instead.", - ) - def table(self, value): - if not isinstance(value, PauliTable): - value = PauliTable(value) - self._pauli_list = PauliList(value) - @property def paulis(self): """Return the the PauliList.""" @@ -673,7 +648,7 @@ def from_operator(obj, atol=None, rtol=None): # Non-normalized basis factor denom = 2**num_qubits # Compute coefficients from basis - basis = pauli_basis(num_qubits, pauli_list=True) + basis = pauli_basis(num_qubits) for i, mat in enumerate(basis.matrix_iter()): coeff = np.trace(mat.dot(data)) / denom if not np.isclose(coeff, 0, atol=atol, rtol=rtol): @@ -848,7 +823,7 @@ def label_iter(self): use the :meth:`to_labels` method. Returns: - LabelIterator: label iterator object for the PauliTable. + LabelIterator: label iterator object for the SparsePauliOp. """ class LabelIterator(CustomIterator): diff --git a/releasenotes/notes/remove-deprecated-methods-in-pauli-c874d463ba1f7a0e.yaml b/releasenotes/notes/remove-deprecated-methods-in-pauli-c874d463ba1f7a0e.yaml new file mode 100644 index 000000000000..48c7acc6a516 --- /dev/null +++ b/releasenotes/notes/remove-deprecated-methods-in-pauli-c874d463ba1f7a0e.yaml @@ -0,0 +1,7 @@ +--- +upgrade: + - | + The deprecated method ``SparsePauliOp.table`` has been removed. + It was originally deprecated in Qiskit Terra 0.19. + Returning PauliTable of :func:`~pauli_basis` has been removed. + The argument ``pauli_list`` in :func:`pauli_basis` has been removed. From a0db5817ac39222abeaef647a38df491d688d221 Mon Sep 17 00:00:00 2001 From: Prakhar Bhatnagar <42675093+prakharb10@users.noreply.github.com> Date: Thu, 1 Sep 2022 21:33:48 +0530 Subject: [PATCH 46/54] Switch draw functions from `pydot` to `retworkx` (#8198) * switched to `retworkx` in `CouplingMap.draw()` * lint fix * switched `EquivalenceLibrary` to `retworkx` * added test for `CouplingMap` * added test for `CouplingMap.draw` * updated threshold for test * code de-duplication * added test for EquivalenceLibrary Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/circuit/equivalence.py | 65 ++++-------------- qiskit/transpiler/coupling.py | 33 ++------- test/python/circuit/test_equivalence.py | 18 ++++- test/python/transpiler/test_coupling.py | 15 ++++ .../visualization/references/coupling_map.png | Bin 0 -> 21307 bytes .../session_equivalence_library.png | Bin 0 -> 668932 bytes 6 files changed, 50 insertions(+), 81 deletions(-) create mode 100644 test/python/visualization/references/coupling_map.png create mode 100644 test/python/visualization/references/session_equivalence_library.png diff --git a/qiskit/circuit/equivalence.py b/qiskit/circuit/equivalence.py index e80d009cb0ba..5440efdb4d1c 100644 --- a/qiskit/circuit/equivalence.py +++ b/qiskit/circuit/equivalence.py @@ -12,16 +12,15 @@ """Gate equivalence library.""" -import io from collections import namedtuple +from retworkx.visualization import graphviz_draw import retworkx as rx -from qiskit.exceptions import MissingOptionalLibraryError +from qiskit.exceptions import InvalidFileError from .exceptions import CircuitError from .parameterexpression import ParameterExpression - Key = namedtuple("Key", ["name", "num_qubits"]) Entry = namedtuple("Entry", ["search_base", "equivalences"]) @@ -148,56 +147,20 @@ def draw(self, filename=None): IPython SVG if in a jupyter notebook, or as a PIL.Image otherwise. Raises: - MissingOptionalLibraryError: when pydot or pillow are not installed. + InvalidFileError: if filename is not valid. """ - try: - import pydot - - has_pydot = True - except ImportError: - has_pydot = False - try: - from PIL import Image - - has_pil = True - except ImportError: - has_pil = False - - if not has_pydot: - raise MissingOptionalLibraryError( - libname="pydot", - name="EquivalenceLibrary.draw", - pip_install="pip install pydot", - ) - if not has_pil and not filename: - raise MissingOptionalLibraryError( - libname="pillow", - name="EquivalenceLibrary.draw", - pip_install="pip install pillow", - ) - - try: - from IPython.display import SVG - - has_ipython = True - except ImportError: - has_ipython = False - - dot_str = self._build_basis_graph().to_dot( - lambda node: {"label": node["label"]}, lambda edge: edge - ) - dot = pydot.graph_from_dot_data(dot_str)[0] + image_type = None if filename: - extension = filename.split(".")[-1] - dot.write(filename, format=extension) - return None - - if has_ipython: - svg = dot.create_svg(prog="dot") - return SVG(svg) - - png = dot.create_png(prog="dot") - return Image.open(io.BytesIO(png)) + if "." not in filename: + raise InvalidFileError("Parameter 'filename' must be in format 'name.extension'") + image_type = filename.split(".")[-1] + return graphviz_draw( + self._build_basis_graph(), + lambda node: {"label": node["label"]}, + lambda edge: edge, + filename=filename, + image_type=image_type, + ) def _build_basis_graph(self): graph = rx.PyDiGraph() diff --git a/qiskit/transpiler/coupling.py b/qiskit/transpiler/coupling.py index 356c29b4a480..0f4dc26d12bb 100644 --- a/qiskit/transpiler/coupling.py +++ b/qiskit/transpiler/coupling.py @@ -19,14 +19,13 @@ onto a device with this coupling. """ -import io import warnings import numpy as np import retworkx as rx +from retworkx.visualization import graphviz_draw from qiskit.transpiler.exceptions import CouplingError -from qiskit.exceptions import MissingOptionalLibraryError class CouplingMap: @@ -410,36 +409,12 @@ def __str__(self): def draw(self): """Draws the coupling map. - This function needs `pydot `_, - which in turn needs `Graphviz `_ to be - installed. Additionally, `pillow `_ will - need to be installed. + This function calls the :func:`~retworkx.visualization.graphviz_draw` function from the + ``retworkx`` package to draw the :class:`CouplingMap` object. Returns: PIL.Image: Drawn coupling map. - Raises: - MissingOptionalLibraryError: when pydot or pillow are not installed. """ - try: - import pydot - except ImportError as ex: - raise MissingOptionalLibraryError( - libname="pydot", - name="coupling map drawer", - pip_install="pip install pydot", - ) from ex - try: - from PIL import Image - except ImportError as ex: - raise MissingOptionalLibraryError( - libname="pillow", - name="coupling map drawer", - pip_install="pip install pillow", - ) from ex - dot_str = self.graph.to_dot() - dot = pydot.graph_from_dot_data(dot_str)[0] - png = dot.create_png(prog="neato") - - return Image.open(io.BytesIO(png)) + return graphviz_draw(self.graph, method="neato") diff --git a/test/python/circuit/test_equivalence.py b/test/python/circuit/test_equivalence.py index 69f23a585ecf..324f7aba5bb9 100644 --- a/test/python/circuit/test_equivalence.py +++ b/test/python/circuit/test_equivalence.py @@ -13,6 +13,7 @@ """Test Qiskit's EquivalenceLibrary class.""" +import unittest import numpy as np from qiskit.test import QiskitTestCase @@ -21,8 +22,10 @@ from qiskit.circuit.library import U2Gate from qiskit.circuit.exceptions import CircuitError from qiskit.converters import circuit_to_instruction, circuit_to_gate - from qiskit.circuit import EquivalenceLibrary +from qiskit.utils import optionals + +from ..visualization.visualization import QiskitVisualizationTestCase, path_to_diagram_reference class OneQubitZeroParamGate(Gate): @@ -461,3 +464,16 @@ def test_gate_decomposition_properties(self): self.assertEqual(len(decomps), 1) self.assertEqual(decomps[0], qc2) + + +class TestEquivalenceLibraryVisualization(QiskitVisualizationTestCase): + """Test cases for EquivalenceLibrary visualization.""" + + @unittest.skipUnless(optionals.HAS_GRAPHVIZ, "Graphviz not installed") + def test_session_equivalence_draw(self): + """Verify SessionEquivalenceLibrary drawing with reference image.""" + from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel + + image = sel.draw() + image_ref = path_to_diagram_reference("session_equivalence_library.png") + self.assertImagesAreEqual(image, image_ref, 0.04) diff --git a/test/python/transpiler/test_coupling.py b/test/python/transpiler/test_coupling.py index bf210178abae..c81916fa2618 100644 --- a/test/python/transpiler/test_coupling.py +++ b/test/python/transpiler/test_coupling.py @@ -12,10 +12,15 @@ # pylint: disable=missing-docstring +import unittest + from qiskit.transpiler import CouplingMap from qiskit.transpiler.exceptions import CouplingError from qiskit.providers.fake_provider import FakeRueschlikon from qiskit.test import QiskitTestCase +from qiskit.utils import optionals + +from ..visualization.visualization import QiskitVisualizationTestCase, path_to_diagram_reference class CouplingTest(QiskitTestCase): @@ -436,3 +441,13 @@ def test_subgraph(self): edge_list = subgraph.get_edges() expected = [(0, 1), (1, 2), (2, 3)] self.assertEqual(expected, edge_list, f"{edge_list} does not match {expected}") + + +class CouplingVisualizationTest(QiskitVisualizationTestCase): + @unittest.skipUnless(optionals.HAS_GRAPHVIZ, "Graphviz not installed") + def test_coupling_draw(self): + """Test that the coupling map drawing with respect to the reference file is correct.""" + cmap = CouplingMap([[0, 1], [1, 2], [2, 3], [2, 4], [2, 5], [2, 6]]) + image_ref = path_to_diagram_reference("coupling_map.png") + image = cmap.draw() + self.assertImagesAreEqual(image, image_ref, diff_tolerance=0.01) diff --git a/test/python/visualization/references/coupling_map.png b/test/python/visualization/references/coupling_map.png new file mode 100644 index 0000000000000000000000000000000000000000..57ab05e1baaada8405ce072f9826038bb9475fa1 GIT binary patch literal 21307 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 literal 0 HcmV?d00001 diff --git a/test/python/visualization/references/session_equivalence_library.png b/test/python/visualization/references/session_equivalence_library.png new file mode 100644 index 0000000000000000000000000000000000000000..791affdb6585f9737fdcbce2c5157e86caa5efdb GIT binary patch literal 668932 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

Q{x6u65ZOV(I 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 U1TbjUek%uo)4jclnsw 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 CNCB__ literal 0 HcmV?d00001 From 2ab0ae511202306f3be2fee75ac0679ea7932e07 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Thu, 1 Sep 2022 18:12:28 -0400 Subject: [PATCH 47/54] Enable multiple parallel seed trials for SabreSwap (#8572) * Enable multiple parallel seed trials for SabreSwap The SabreSwap algorithm's output is quite linked to the random seed used to run the algorithm. Typically to get the best result a user will run the pass (or the full transpilation) multiple times with different seeds and pick the best output to get a better result. Since #8388 the SabreSwap pass has moved mostly the domain of Rust. This enables us to leverage multithreading easily to run parallel sabre over multiple seeds and pick the best result. This commit adds a new argument trials to the SabreSwap pass which is used to specify the number of random seed trials to run sabre with. Each trial will perform a complete run of the sabre algorithm and compute the swaps necessary for the algorithm. Then the result with the least number of swaps will be selected and used as the swap mapping for the pass. * Make parallel case fully deterministic The parallel trial code was potentially non-deterministic in it's execution because the way the parallel trials were compared was dependent on execution speed of the pass. This could result in a different output if results with equal number of swaps finished executing in differing amounts of time between runs. This commit addresses this by first collecting the results into an ordered Vec first which is then iterated over serially to find the minimum swap count. This will make the output independent of execution speed of the individual trials. * Fix test failures This commit updates tests which started to fail because of the different RNG behavior used by the parallel SabreSwap seed trials. For the most part these are just mechanical changes that either changed the expected layout with a fixed seed or updating a fixed seed so the output matches the expected result. The one interesting case was the TestTranspileLevelsSwap change which was caused by different swaps being inserted that for optimization level enabled the 2q block optimization passes to synthesize away the swap as part of its optimization. This was fixed by changing the seed, but it was a different case than the other failures. * Add swap_trials argument to SabreLayout This commit adds a swap_trials argument to the SabreLayout pass so that users can control how many trials to run in SabreSwap internally. This is necessary for reproducibility between systems for the same reason it's required on SabreSwap. * Add comment explaining the intermediate Vec usage * Update layout in new test * Update releasenotes/notes/multiple-parallel-rusty-sabres-32bc93f79ae48a1f.yaml Co-authored-by: Kevin Hartman * Remove intermediate Vec for parallel trials In an earlier commit we switched the parallel iterator to collect into an intermediate `Vec` to ensure the output result was deterministic. The min_by_key() will have a degree of non-determinism for equal entries as the parallel iterator's threads finish. However, collecting to a Vec isn't necessary as we can use the index as an element in a 2 element array we can get the deterministic evaluation and avoid the overhead of collecting into a `Vec`. This commit makes this change to improve the performance of the parallel execution path. Co-authored-by: Kevin Hartman Co-authored-by: Kevin Hartman Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .../transpiler/passes/layout/sabre_layout.py | 28 ++++- .../transpiler/passes/routing/sabre_swap.py | 26 ++-- .../preset_passmanagers/builtin_plugins.py | 16 ++- .../transpiler/preset_passmanagers/level0.py | 4 +- .../transpiler/preset_passmanagers/level1.py | 4 +- .../transpiler/preset_passmanagers/level2.py | 4 +- .../transpiler/preset_passmanagers/level3.py | 4 +- ...arallel-rusty-sabres-32bc93f79ae48a1f.yaml | 20 ++++ src/sabre_swap/mod.rs | 111 +++++++++++++++--- test/python/transpiler/test_mappers.py | 2 +- .../transpiler/test_preset_passmanagers.py | 30 ++--- test/python/transpiler/test_sabre_layout.py | 32 ++--- 12 files changed, 214 insertions(+), 67 deletions(-) create mode 100644 releasenotes/notes/multiple-parallel-rusty-sabres-32bc93f79ae48a1f.yaml diff --git a/qiskit/transpiler/passes/layout/sabre_layout.py b/qiskit/transpiler/passes/layout/sabre_layout.py index 9ba3fd1265c3..3c3abdaf3dce 100644 --- a/qiskit/transpiler/passes/layout/sabre_layout.py +++ b/qiskit/transpiler/passes/layout/sabre_layout.py @@ -49,20 +49,42 @@ class SabreLayout(AnalysisPass): `arXiv:1809.02573 `_ """ - def __init__(self, coupling_map, routing_pass=None, seed=None, max_iterations=3): + def __init__( + self, coupling_map, routing_pass=None, seed=None, max_iterations=3, swap_trials=None + ): """SabreLayout initializer. Args: coupling_map (Coupling): directed graph representing a coupling map. routing_pass (BasePass): the routing pass to use while iterating. + This is mutually exclusive with the ``swap_trials`` argument and + if both are set an error will be raised. seed (int): seed for setting a random first trial layout. max_iterations (int): number of forward-backward iterations. + swap_trials (int): The number of trials to run of + :class:`~.SabreSwap` for each iteration. This is equivalent to + the ``trials`` argument on :class:`~.SabreSwap`. If this is not + specified (and ``routing_pass`` isn't set) by default the number + of physical CPUs on your local system will be used. For + reproducibility between environments it is best to set this + to an explicit number because the output will potentially depend + on the number of trials run. This option is mutually exclusive + with the ``routing_pass`` argument and an error will be raised + if both are used. + + Raises: + TranspilerError: If both ``routing_pass`` and ``swap_trials`` are + specified """ super().__init__() self.coupling_map = coupling_map + if routing_pass is not None and swap_trials is not None: + raise TranspilerError("Both routing_pass and swap_trials can't be set at the same time") self.routing_pass = routing_pass self.seed = seed self.max_iterations = max_iterations + self.trials = swap_trials + self.swap_trials = swap_trials def run(self, dag): """Run the SabreLayout pass on `dag`. @@ -86,7 +108,9 @@ def run(self, dag): initial_layout = Layout({q: dag.qubits[i] for i, q in enumerate(physical_qubits)}) if self.routing_pass is None: - self.routing_pass = SabreSwap(self.coupling_map, "decay", seed=self.seed, fake_run=True) + self.routing_pass = SabreSwap( + self.coupling_map, "decay", seed=self.seed, fake_run=True, trials=self.swap_trials + ) else: self.routing_pass.fake_run = True diff --git a/qiskit/transpiler/passes/routing/sabre_swap.py b/qiskit/transpiler/passes/routing/sabre_swap.py index 275864ba7fba..0e37bc8b4b7d 100644 --- a/qiskit/transpiler/passes/routing/sabre_swap.py +++ b/qiskit/transpiler/passes/routing/sabre_swap.py @@ -23,6 +23,7 @@ from qiskit.transpiler.exceptions import TranspilerError from qiskit.transpiler.layout import Layout from qiskit.dagcircuit import DAGOpNode +from qiskit.tools.parallel import CPU_COUNT # pylint: disable=import-error from qiskit._accelerate.sabre_swap import ( @@ -61,6 +62,11 @@ class SabreSwap(TransformationPass): scored according to some heuristic cost function. The best SWAP is implemented and ``current_layout`` updated. + This transpiler pass adds onto the SABRE algorithm in that it will run + multiple trials of the algorithm with different seeds. The best output, + deteremined by the trial with the least amount of SWAPed inserted, will + be selected from the random trials. + **References:** [1] Li, Gushu, Yufei Ding, and Yuan Xie. "Tackling the qubit mapping problem @@ -68,13 +74,7 @@ class SabreSwap(TransformationPass): `arXiv:1809.02573 `_ """ - def __init__( - self, - coupling_map, - heuristic="basic", - seed=None, - fake_run=False, - ): + def __init__(self, coupling_map, heuristic="basic", seed=None, fake_run=False, trials=None): r"""SabreSwap initializer. Args: @@ -84,6 +84,12 @@ def __init__( seed (int): random seed used to tie-break among candidate swaps. fake_run (bool): if true, it only pretend to do routing, i.e., no swap is effectively added. + trials (int): The number of seed trials to run sabre with. These will + be run in parallel (unless the PassManager is already running in + parallel). If not specified this defaults to the number of physical + CPUs on the local system. For reproducible results it is recommended + that you set this explicitly, as the output will be deterministic for + a fixed number of trials. Raises: TranspilerError: If the specified heuristic is not valid. @@ -158,6 +164,11 @@ def __init__( self.seed = np.random.default_rng(None).integers(0, ii32.max, dtype=int) else: self.seed = seed + if trials is None: + self.trials = CPU_COUNT + else: + self.trials = trials + self.fake_run = fake_run self._qubit_indices = None self._clbit_indices = None @@ -216,6 +227,7 @@ def run(self, dag): self.heuristic, self.seed, layout, + self.trials, ) layout_mapping = layout.layout_mapping() diff --git a/qiskit/transpiler/preset_passmanagers/builtin_plugins.py b/qiskit/transpiler/preset_passmanagers/builtin_plugins.py index d1fc2b5e67c7..d3bce75e11bb 100644 --- a/qiskit/transpiler/preset_passmanagers/builtin_plugins.py +++ b/qiskit/transpiler/preset_passmanagers/builtin_plugins.py @@ -206,7 +206,9 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana pass_manager_config.initial_layout, ) if optimization_level == 0: - routing_pass = SabreSwap(coupling_map, heuristic="basic", seed=seed_transpiler) + routing_pass = SabreSwap( + coupling_map, heuristic="basic", seed=seed_transpiler, trials=5 + ) return common.generate_routing_passmanager( routing_pass, target, @@ -215,7 +217,9 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana use_barrier_before_measurement=True, ) if optimization_level == 1: - routing_pass = SabreSwap(coupling_map, heuristic="lookahead", seed=seed_transpiler) + routing_pass = SabreSwap( + coupling_map, heuristic="lookahead", seed=seed_transpiler, trials=5 + ) return common.generate_routing_passmanager( routing_pass, target, @@ -227,7 +231,9 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana use_barrier_before_measurement=True, ) if optimization_level == 2: - routing_pass = SabreSwap(coupling_map, heuristic="decay", seed=seed_transpiler) + routing_pass = SabreSwap( + coupling_map, heuristic="decay", seed=seed_transpiler, trials=10 + ) return common.generate_routing_passmanager( routing_pass, target, @@ -238,7 +244,9 @@ def pass_manager(self, pass_manager_config, optimization_level=None) -> PassMana use_barrier_before_measurement=True, ) if optimization_level == 3: - routing_pass = SabreSwap(coupling_map, heuristic="decay", seed=seed_transpiler) + routing_pass = SabreSwap( + coupling_map, heuristic="decay", seed=seed_transpiler, trials=20 + ) return common.generate_routing_passmanager( routing_pass, target, diff --git a/qiskit/transpiler/preset_passmanagers/level0.py b/qiskit/transpiler/preset_passmanagers/level0.py index c02c517a23e1..9779ed5dd0d4 100644 --- a/qiskit/transpiler/preset_passmanagers/level0.py +++ b/qiskit/transpiler/preset_passmanagers/level0.py @@ -86,7 +86,9 @@ def _choose_layout_condition(property_set): elif layout_method == "noise_adaptive": _choose_layout = NoiseAdaptiveLayout(backend_properties) elif layout_method == "sabre": - _choose_layout = SabreLayout(coupling_map, max_iterations=1, seed=seed_transpiler) + _choose_layout = SabreLayout( + coupling_map, max_iterations=1, seed=seed_transpiler, swap_trials=5 + ) toqm_pass = False # Choose routing pass diff --git a/qiskit/transpiler/preset_passmanagers/level1.py b/qiskit/transpiler/preset_passmanagers/level1.py index 05e7d56a736e..f6a32087ac95 100644 --- a/qiskit/transpiler/preset_passmanagers/level1.py +++ b/qiskit/transpiler/preset_passmanagers/level1.py @@ -144,7 +144,9 @@ def _vf2_match_not_found(property_set): elif layout_method == "noise_adaptive": _improve_layout = NoiseAdaptiveLayout(backend_properties) elif layout_method == "sabre": - _improve_layout = SabreLayout(coupling_map, max_iterations=2, seed=seed_transpiler) + _improve_layout = SabreLayout( + coupling_map, max_iterations=2, seed=seed_transpiler, swap_trials=5 + ) toqm_pass = False routing_pm = None diff --git a/qiskit/transpiler/preset_passmanagers/level2.py b/qiskit/transpiler/preset_passmanagers/level2.py index 5a8dcde691e8..7c7beb59f3fd 100644 --- a/qiskit/transpiler/preset_passmanagers/level2.py +++ b/qiskit/transpiler/preset_passmanagers/level2.py @@ -127,7 +127,9 @@ def _vf2_match_not_found(property_set): elif layout_method == "noise_adaptive": _choose_layout_1 = NoiseAdaptiveLayout(backend_properties) elif layout_method == "sabre": - _choose_layout_1 = SabreLayout(coupling_map, max_iterations=2, seed=seed_transpiler) + _choose_layout_1 = SabreLayout( + coupling_map, max_iterations=2, seed=seed_transpiler, swap_trials=10 + ) toqm_pass = False routing_pm = None diff --git a/qiskit/transpiler/preset_passmanagers/level3.py b/qiskit/transpiler/preset_passmanagers/level3.py index 0d664f2172a0..7f64b7873e5a 100644 --- a/qiskit/transpiler/preset_passmanagers/level3.py +++ b/qiskit/transpiler/preset_passmanagers/level3.py @@ -138,7 +138,9 @@ def _vf2_match_not_found(property_set): elif layout_method == "noise_adaptive": _choose_layout_1 = NoiseAdaptiveLayout(backend_properties) elif layout_method == "sabre": - _choose_layout_1 = SabreLayout(coupling_map, max_iterations=4, seed=seed_transpiler) + _choose_layout_1 = SabreLayout( + coupling_map, max_iterations=4, seed=seed_transpiler, swap_trials=20 + ) toqm_pass = False # TODO: Remove when qiskit-toqm has it's own plugin and we can rely on just the plugin interface diff --git a/releasenotes/notes/multiple-parallel-rusty-sabres-32bc93f79ae48a1f.yaml b/releasenotes/notes/multiple-parallel-rusty-sabres-32bc93f79ae48a1f.yaml new file mode 100644 index 000000000000..388ecc954ff1 --- /dev/null +++ b/releasenotes/notes/multiple-parallel-rusty-sabres-32bc93f79ae48a1f.yaml @@ -0,0 +1,20 @@ +--- +features: + - | + The :class:`~.SabreSwap` transpiler pass has a new keyword argument on its + constructor, ``trials``. The ``trials`` argument is used to specify the + number of random seed trials to attempt. The output from the + `SABRE algorithm `__ can differ greatly + based on the seed used for the random number. :class:`~.SabreSwap` will + now run the algorithm with ``trials`` number of random seeds and pick the + best (with the fewest swaps inserted). If ``trials`` is not specified the + pass will default to use the number of physical CPUs on the local system. + - | + The :class:`~.SabreLayout` transpiler pass has a new keyword argument on + its constructor, ``swap_trials``. The ``swap_trials`` argument is used + to specify how many random seed trials to run on the :class:`~.SabreSwap` + pass internally. It corresponds to the ``trials`` arugment on the + :class:`~.SabreSwap` pass. When set, each iteration of + :class:`~.SabreSwap` will be run internally ``swap_trials`` times. + If ``swap_trials`` is not specified the will default to use + the number of physical CPUs on the local system. diff --git a/src/sabre_swap/mod.rs b/src/sabre_swap/mod.rs index c038e13b673a..1798a0dd0e39 100644 --- a/src/sabre_swap/mod.rs +++ b/src/sabre_swap/mod.rs @@ -53,6 +53,12 @@ pub enum Heuristic { Decay, } +struct TrialResult { + out_map: HashMap>, + gate_order: Vec, + layout: NLayout, +} + /// Return a set of candidate swaps that affect qubits in front_layer. /// /// For each virtual qubit in front_layer, find its current location @@ -154,18 +160,88 @@ pub fn build_swap_map( heuristic: &Heuristic, seed: u64, layout: &mut NLayout, -) -> PyResult<(SwapMap, PyObject)> { - let mut gate_order: Vec = Vec::with_capacity(dag.dag.node_count()); + num_trials: usize, +) -> (SwapMap, PyObject) { let run_in_parallel = getenv_use_multiple_threads(); - let mut out_map: HashMap> = HashMap::new(); - let mut front_layer: Vec = dag.first_layer.clone(); + let dist = distance_matrix.as_array(); + let coupling_graph: DiGraph<(), ()> = cmap_from_neighor_table(neighbor_table); + let outer_rng = Pcg64Mcg::seed_from_u64(seed); + let seed_vec: Vec = outer_rng + .sample_iter(&rand::distributions::Standard) + .take(num_trials) + .collect(); + let result = if run_in_parallel { + seed_vec + .into_par_iter() + .enumerate() + .map(|(index, seed_trial)| { + ( + index, + swap_map_trial( + num_qubits, + dag, + neighbor_table, + &dist, + &coupling_graph, + heuristic, + seed_trial, + layout.clone(), + ), + ) + }) + .min_by_key(|(index, result)| { + [ + result.out_map.values().map(|x| x.len()).sum::(), + *index, + ] + }) + .unwrap() + .1 + } else { + seed_vec + .into_iter() + .map(|seed_trial| { + swap_map_trial( + num_qubits, + dag, + neighbor_table, + &dist, + &coupling_graph, + heuristic, + seed_trial, + layout.clone(), + ) + }) + .min_by_key(|result| result.out_map.values().map(|x| x.len()).sum::()) + .unwrap() + }; + *layout = result.layout; + ( + SwapMap { + map: result.out_map, + }, + result.gate_order.into_pyarray(py).into(), + ) +} + +fn swap_map_trial( + num_qubits: usize, + dag: &SabreDAG, + neighbor_table: &NeighborTable, + dist: &ArrayView2, + coupling_graph: &DiGraph<(), ()>, + heuristic: &Heuristic, + seed: u64, + mut layout: NLayout, +) -> TrialResult { let max_iterations_without_progress = 10 * neighbor_table.neighbors.len(); + let mut gate_order: Vec = Vec::with_capacity(dag.dag.node_count()); let mut ops_since_progress: Vec<[usize; 2]> = Vec::new(); + let mut out_map: HashMap> = HashMap::new(); + let mut front_layer: Vec = dag.first_layer.clone(); let mut required_predecessors: Vec = vec![0; dag.dag.node_count()]; let mut extended_set: Option> = None; let mut num_search_steps: u8 = 0; - let dist = distance_matrix.as_array(); - let coupling_graph: DiGraph<(), ()> = cmap_from_neighor_table(neighbor_table); let mut qubits_decay: Vec = vec![1.; num_qubits]; let mut rng = Pcg64Mcg::seed_from_u64(seed); @@ -245,7 +321,8 @@ pub fn build_swap_map( Some(NodeIndex::::new(v)), |_| Ok(1.), Some(&mut shortest_paths), - ) as PyResult>>)?; + ) as PyResult>>) + .unwrap(); let shortest_path: Vec = shortest_paths .get(&NodeIndex::new(v)) .unwrap() @@ -308,14 +385,13 @@ pub fn build_swap_map( let best_swap = sabre_score_heuristic( &first_layer, - layout, + &mut layout, neighbor_table, extended_set.as_ref().unwrap(), - &dist, + dist, &qubits_decay, heuristic, &mut rng, - run_in_parallel, ); num_search_steps += 1; if num_search_steps >= DECAY_RESET_INTERVAL { @@ -327,10 +403,14 @@ pub fn build_swap_map( } ops_since_progress.push(best_swap); } - Ok((SwapMap { map: out_map }, gate_order.into_pyarray(py).into())) + TrialResult { + out_map, + gate_order, + layout, + } } -pub fn sabre_score_heuristic( +fn sabre_score_heuristic( layer: &[[usize; 2]], layout: &mut NLayout, neighbor_table: &NeighborTable, @@ -339,7 +419,6 @@ pub fn sabre_score_heuristic( qubits_decay: &[f64], heuristic: &Heuristic, rng: &mut Pcg64Mcg, - run_in_parallel: bool, ) -> [usize; 2] { // Run in parallel only if we're not already in a multiprocessing context // unless force threads is set. @@ -366,11 +445,7 @@ pub fn sabre_score_heuristic( } layout.swap_logical(swap_qubits[0], swap_qubits[1]); } - if run_in_parallel { - best_swaps.par_sort_unstable(); - } else { - best_swaps.sort_unstable(); - } + best_swaps.sort_unstable(); let best_swap = *best_swaps.choose(rng).unwrap(); layout.swap_logical(best_swap[0], best_swap[1]); best_swap diff --git a/test/python/transpiler/test_mappers.py b/test/python/transpiler/test_mappers.py index ef061f7c7d28..6a3d0d1748e3 100644 --- a/test/python/transpiler/test_mappers.py +++ b/test/python/transpiler/test_mappers.py @@ -294,7 +294,7 @@ class TestsSabreSwap(SwapperCommonTestCases, QiskitTestCase): """Test SwapperCommonTestCases using SabreSwap.""" pass_class = SabreSwap - additional_args = {"seed": 4242} + additional_args = {"seed": 1242} if __name__ == "__main__": diff --git a/test/python/transpiler/test_preset_passmanagers.py b/test/python/transpiler/test_preset_passmanagers.py index 2ce8ef1d0343..2186813bf6ef 100644 --- a/test/python/transpiler/test_preset_passmanagers.py +++ b/test/python/transpiler/test_preset_passmanagers.py @@ -698,25 +698,25 @@ def test_layout_tokyo_fully_connected_cx(self, level): } sabre_layout = { - 6: qr[0], - 11: qr[1], - 10: qr[2], - 5: qr[3], - 16: qr[4], + 11: qr[0], + 17: qr[1], + 16: qr[2], + 6: qr[3], + 18: qr[4], 0: ancilla[0], 1: ancilla[1], 2: ancilla[2], 3: ancilla[3], 4: ancilla[4], - 7: ancilla[5], - 8: ancilla[6], - 9: ancilla[7], - 12: ancilla[8], - 13: ancilla[9], - 14: ancilla[10], - 15: ancilla[11], - 17: ancilla[12], - 18: ancilla[13], + 5: ancilla[5], + 7: ancilla[6], + 8: ancilla[7], + 9: ancilla[8], + 10: ancilla[9], + 12: ancilla[10], + 13: ancilla[11], + 14: ancilla[12], + 15: ancilla[13], 19: ancilla[14], } @@ -913,7 +913,7 @@ def test_2(self, level): optimization_level=level, basis_gates=basis, coupling_map=coupling_map, - seed_transpiler=42, + seed_transpiler=42123, ) self.assertIsInstance(result, QuantumCircuit) resulting_basis = {node.name for node in circuit_to_dag(result).op_nodes()} diff --git a/test/python/transpiler/test_sabre_layout.py b/test/python/transpiler/test_sabre_layout.py index 27205afe8a26..77aa5af050b3 100644 --- a/test/python/transpiler/test_sabre_layout.py +++ b/test/python/transpiler/test_sabre_layout.py @@ -55,14 +55,14 @@ def test_5q_circuit_20q_coupling(self): circuit.cx(qr[1], qr[2]) dag = circuit_to_dag(circuit) - pass_ = SabreLayout(CouplingMap(self.cmap20), seed=0) + pass_ = SabreLayout(CouplingMap(self.cmap20), seed=0, swap_trials=32) pass_.run(dag) layout = pass_.property_set["layout"] - self.assertEqual(layout[qr[0]], 11) - self.assertEqual(layout[qr[1]], 6) - self.assertEqual(layout[qr[2]], 12) - self.assertEqual(layout[qr[3]], 5) + self.assertEqual(layout[qr[0]], 10) + self.assertEqual(layout[qr[1]], 12) + self.assertEqual(layout[qr[2]], 7) + self.assertEqual(layout[qr[3]], 11) self.assertEqual(layout[qr[4]], 13) def test_6q_circuit_20q_coupling(self): @@ -95,12 +95,12 @@ def test_6q_circuit_20q_coupling(self): pass_.run(dag) layout = pass_.property_set["layout"] - self.assertEqual(layout[qr0[0]], 8) - self.assertEqual(layout[qr0[1]], 2) + self.assertEqual(layout[qr0[0]], 2) + self.assertEqual(layout[qr0[1]], 3) self.assertEqual(layout[qr0[2]], 10) - self.assertEqual(layout[qr1[0]], 3) - self.assertEqual(layout[qr1[1]], 12) - self.assertEqual(layout[qr1[2]], 11) + self.assertEqual(layout[qr1[0]], 1) + self.assertEqual(layout[qr1[1]], 7) + self.assertEqual(layout[qr1[2]], 5) def test_layout_with_classical_bits(self): """Test sabre layout with classical bits recreate from issue #8635.""" @@ -193,18 +193,18 @@ def test_layout_many_search_trials(self): ) self.assertIsInstance(res, QuantumCircuit) layout = res._layout - self.assertEqual(layout[qc.qubits[0]], 11) + self.assertEqual(layout[qc.qubits[0]], 19) self.assertEqual(layout[qc.qubits[1]], 22) self.assertEqual(layout[qc.qubits[2]], 17) - self.assertEqual(layout[qc.qubits[3]], 12) + self.assertEqual(layout[qc.qubits[3]], 14) self.assertEqual(layout[qc.qubits[4]], 18) self.assertEqual(layout[qc.qubits[5]], 9) - self.assertEqual(layout[qc.qubits[6]], 16) + self.assertEqual(layout[qc.qubits[6]], 11) self.assertEqual(layout[qc.qubits[7]], 25) - self.assertEqual(layout[qc.qubits[8]], 19) + self.assertEqual(layout[qc.qubits[8]], 16) self.assertEqual(layout[qc.qubits[9]], 3) - self.assertEqual(layout[qc.qubits[10]], 14) - self.assertEqual(layout[qc.qubits[11]], 15) + self.assertEqual(layout[qc.qubits[10]], 12) + self.assertEqual(layout[qc.qubits[11]], 13) self.assertEqual(layout[qc.qubits[12]], 20) self.assertEqual(layout[qc.qubits[13]], 8) From 27a6280a2f09239c15e58c486ef20a90eb3d522c Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Thu, 1 Sep 2022 20:49:46 -0400 Subject: [PATCH 48/54] Fix flaky equivalence drawer test (#8659) * Bump tolerance in flaky equivalence drawer test In the recently merged #8198 a couple new tests were added for the drawers modified. The coverage for these methods were previously missing. However, since merging one of those tests has been failing at a fairly high rate. This is because the graph for the session equivalence library is fairly complex and the layout algorithm used by graphviz has a stochastic component. To address this failure rate this commit updates the test to use a simpler equivalence library that is far less likely to have this issue. * Correct test documentation Co-authored-by: Jake Lishman --- test/python/circuit/test_equivalence.py | 18 ++++++++++++++---- .../references/equivalence_library.png | Bin 0 -> 16967 bytes .../session_equivalence_library.png | Bin 668932 -> 0 bytes 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 test/python/visualization/references/equivalence_library.png delete mode 100644 test/python/visualization/references/session_equivalence_library.png diff --git a/test/python/circuit/test_equivalence.py b/test/python/circuit/test_equivalence.py index 324f7aba5bb9..f83a9f150866 100644 --- a/test/python/circuit/test_equivalence.py +++ b/test/python/circuit/test_equivalence.py @@ -470,10 +470,20 @@ class TestEquivalenceLibraryVisualization(QiskitVisualizationTestCase): """Test cases for EquivalenceLibrary visualization.""" @unittest.skipUnless(optionals.HAS_GRAPHVIZ, "Graphviz not installed") - def test_session_equivalence_draw(self): - """Verify SessionEquivalenceLibrary drawing with reference image.""" - from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel + def test_equivalence_draw(self): + """Verify EquivalenceLibrary drawing with reference image.""" + sel = EquivalenceLibrary() + gate = OneQubitZeroParamGate() + first_equiv = QuantumCircuit(1) + first_equiv.h(0) + + sel.add_equivalence(gate, first_equiv) + + second_equiv = QuantumCircuit(1) + second_equiv.append(U2Gate(0, np.pi), [0]) + + sel.add_equivalence(gate, second_equiv) image = sel.draw() - image_ref = path_to_diagram_reference("session_equivalence_library.png") + image_ref = path_to_diagram_reference("equivalence_library.png") self.assertImagesAreEqual(image, image_ref, 0.04) diff --git a/test/python/visualization/references/equivalence_library.png b/test/python/visualization/references/equivalence_library.png new file mode 100644 index 0000000000000000000000000000000000000000..081204bf40fcb328c8f9bfcce4625cf2f22dba8f GIT binary patch literal 16967 zcmZ8}cQ}`Q8~2Z-RJJ79GZopDtTM7QDkI7+gp$gR?3Gnk*{di~A|i=G$R1G{QHYEX zGTzViJkR_7@!rRCJjb2;=XYJ#_j`WN^Ruo(b#+cr?_k|QB9W-o)s*!~Br-<)d((DG z{J-{#TRJ4tNg8$K6KC8WPFLMBW$NA7-0U~=m@zveLw+ao4vQHRZ%={G(_SOz%nx-R zPccf_PswRSw6j!sRCx$<_n0#sidHN3)zDLPfL^l0Hve0Rw4)9lk{&+eum zCkqP?=ce1PYi1UipMT)YxpUG+&q_*|PG%IHNQ#eVc9TtAuDWxFTvAG^X83A)R@Rmq zH*P$7{P=`{fq}rlJD%zy+YUc2p3%`!E?(X(<>loKt*xg{oFJQ@pRe2O-4s52_>_vu zR^l23VmGz5wTWLig!6kN;+5M1=X}%iFJCzn=Kufs(PYu|U63Hf?ZK zGOt2cclU62fuY;n$ky1nxR}(`yS>jY^5Q~!_wH@@`0=Ep<5M?p+|Zn#{pHJjLqpwN zT>%vpG9@oxX5{8lo;`bZd~)(69`nF~10x(CUOy@*P*PV{UrP>@7UIjU+65=jUDO>g#z01SoM0H60yQ7Z>r4jt*S|gDoUHtm5C_ zUo9*w$TT%I@m1lQWkp54p`lb~&Ys=-Ew;zN&@i~NQr6nqnoB~$;L5$3jkK5;vKTcA z686pa>C>lurlw|Q?XPb+CnhF}R`MU3sZ9>O*Vx!tQyWZ6zi(f7Vj_#I`#gn^kPuy{ za$8SNP*qjcvbp=;oUE+c64wup3JX;=G{X9<h%uyA~!>@XV}+uPx*EawJqShOhL!Q$`<2=K_runrFoZ{N97>EucBknOp-xmR!9 z3XY3o^jMtSdh6D$qcSpgnrsd~dKnZO%TV|JJvV-#HC3**Gw<}=csno3>ZE}IBL@cu zi{xdxFJHgTH43IF8X6|pHJVZOX!SR~xYSC=#1t?zWF8P0n1QV@F)?8|dNqA{Y=SxC57S}*A{y( zZl|FkwoFn|a%g&*`r^fl5$wmAFb-NX0R8(QUu_Z^@B@f?{aoefXpN{5!aE z5H083;o4yT)}KmxdNFoMhd8-}g{hA?f2(_XzU=C+9$}{4yE6=*T}TwS*Nq9^9Sz{AgpMs0I1L!a`zvLx(CJ`r6M=?8HUq z$C~!<->+Ehvo31&VOMjKMDV)Pz;*|L8RA@6)!!W++}t?g;^HD|S+`y5fi(5^`lw6W z{>X6Sd{|noOqUI!68(h?a)+7@R|g~{?CG4BVXix=tW3)xn?Cowo-wMPmywatMA zoSYmn;c%58EMa>L@2N-5gKsE&O-)V57bZH-7#h}>l+c_=I1=~o?@VW+nALU?HH)aP z&%fy-`Hvr4m@x0G{Zf59&Gyqnby<$6sp;v7uEz#X9(x6dI0!s`{8-ZI%TaR0)YR04 zpJ}(ng+odpMMsB*`H&Hblan*_*MWlv zYg6SsMJ?V@MC?04bH2<;#lj*(*@{n4uy$Zz-`|-*XWehH)Amk-Q~fV@zIpQ|@rW~r zh*<@nUKOWRbD~&CR8&27lz4(CX0Ok!=~^ZP+Z~D9iX|50h&qMik&Et}^x=)qx(pey zTb((Y3Ht>Ea%<*CN3F@*#tjQ|bAx=AhqsA~iE-Q5*o@4%F?8QgNzpDXEgc;nSG)A- zVTP|SX%YuK>A?d7w1T>ksW0Vm*y6`eoOk*T{{P@w{#r^uW<|oE4 z8hU#Z^bHIezkD$ru@$#%X2Bn_(7MB$cI@2Q`1Y-@tehM_bA3}&xN0OTzt3PYu`*o- zXV0pj<4R%?Lnj=Cal)<5%@ui1-JP1xYf0(Xa{BV>gsDiv($weL#2~#aRr-V`{us5c z(fJ=ViLYKAo!g9+j$2-KBUeoGUNX+I(M%BGCoTLPyj^x&$H__LTDj@!Si;3Ro2Q=( zqmroTW6*q2xanU_29(a6VY0Kg@4&I%+g&4>asP)ew{r5SH zRpEA-^Wm>wAHU0fJjj0=Ezi-TiF(3X9d_5>{zfUF#Fr=X(h}q6Pc*l*&@(XHxlrZt zvLN;2M-8@PE)?9{+>f3<4SexJB3{HSZ2jL~UNqLX12wg03(j$ih|rMQP#UU>T?*>^ zI5}xaM{jS)(s0V}B8f^$*0pDyn(I8RFkIumjc!Na?Ck8@Sboi9uhg-R_YaQuKI3d| zZtgG9j_p74+-hc2)_E-`dVj{n>>od)?E3 z4v+KmJ8&EaD$RszIyz#}h5FA1XS>ahQjw(}zx7*GIFMc@Cka!7o}{6pV{5Wwak4uc zOF3}1zMiIH_rY^?q<&0I|M|W?qY;<#$mZtydK5R7a$ol%1|hkklamwmM>8`sDw5e7 zuksV_=H^^v={Sj!`>VZH#K|s;s&@2G+fxzGYi0HQW;eGw8j>AWQLD*3K`VtDoX^>;MN z|6JBiU~Ftm*U<3Np^Z-|#|d2E=ILp*GC#JAy~trM0Q~v<`Lpi1b3qvy7FlB$*pVM6 z>oqVQScMC!wJRUbF)1n43P>~<8yP9`F>uStv6HwMLg`poLT;~p=X^SlC|zXNDR8B) zh%8P(`wj~5&B~8`kL%ayl9QA7A3l8P%oYPz4GA$xN#zqKPWT_QwQdZcVl2Ax>zvoz z`#ne9X1R1yWrbcE;XLb}Iiswt9qE=Famy~>qW9;-BTj4Ygw^MMTeeA?oYT{5&klP2 zT%1I=&&}GJ54cg(XKk6;NoAn?>M%Jf!r!hl*J7a5G4a^-+%7AhkS9+LvFzO|mhUH) zDBl`O*_x&xNLuKZd{<9TY(@rm)?X9a4;cNs}CUdu&pW;jgAQV!={mlf~>w@ccEXy>X-Q+qYEIwz`s%|IMks_R$JJLTe`{ou8jlve4-b06o+I+RzJG zW%Hw>qZLW}xwsU01{TF|;Ktr*VG1^W_z<+Q(u&C*C??}bW5n|=FU=<`B4U@U*D@W> zcEmV~ls(fOe}8VK9p@LzG4tnIY-X&Sod-wX+B-T5k9_~GXK1($|6I1Ww_KhjFsH-( zN9x&|OO=;eQ%~?Q)U>x3e=hg_`sGV>T3Qr_N>)V$>*+Lk6*Dt--26T-TLA68B8x5a zfBs}(zhb6W>1=In$I(Qx@?vdT?rhyjM@Q$2cHsJ}CsI#1qNXTG{XVKnTuO@H+1dG8 zuW3(nvQ#)pS6!WocTS;8!j5`TE-q?r!{56@6@{!C#UcE{O}p6p-%TvM>qG~?>J3rt zyvk&QsK<|m?%cUUw{PE0)P(ADtL}@tiIHH<@qp^)?=PWgw>OLhicg+A2`D)pr25PO>Nr&7v*2r(-hm$q0g$|BP(?9U}s~Tpbf`Gj)@YS1p_0a5S%t{9v<=s(vI%{I5X0@UjJkR zHH(Rlr^Kv!_3D+H+_wiuoLRqyVq*4>vKMpmfRBN8P=BnrHS=v$+wnP%m>7LvVBq+- zs^h2&8;(u1_vQJf!+LspeoYC7t={^QiT83Ph)&x+&n_*Emv;W91%iey*E9M;=+L2- zxgRb2=2-gbLK%f5B;xGUT~zWoB-}YMY@S@K<|r;MZtLuKbOpHN>-P{6T41!2|X_>BT(4p%;vhnjvYIAGISeC zB$^76$L zF@58;myC?;)wS=GAQNI&`b4!-W%mL_-w6!d+R0#SqK+wxn!GwUqC$N3{rmSUqUNMr zt)x4sh2lZGI-X)6sc;8=o7aWnq#1O#Hy1F_pXaI9_bB~@p3BdOd6#4Ms!*1^G7DI3S zA_N&{!isEpwuEd48zOLwrIpqH2z+)<4jBnO8=&rV-{;RYpFYt@OG_8Me5vw3?O^xr z-9crFt03h#Ej*anhc8sV{qwUm=HbIbKKJ9}$w}aiLqC25fzoH;G+w=NBM>AV@O|$$ za^@Z_76R8oofz5jKXS%{7tFj<7`?7fs}_(9(J)xZYSh|+2Pt8j>G%+ zZwKE|1_TAP;9Yb(G{1%T92ADE{QMn|kHo`|-IzQh>o!Zm$g^>^Rbl?zku#sQ z>Q9M5j~?xJ^Y9p1p8K9C=P7L^V`NR-bo8&@XI2a2?XPalaG(>gbU#N!CLnQWXec(u z{LId9SLig1BRHv$^h~Qf?%N6N7Zwi8%HsWSmpvToASxWJ5>{k*U1l#7l=m23MLz2u zxj7^^&$t0p__e7%F=b`t|9(m?PKScNrnYv=*NPjpfjjpk#&`Mx#B<@0L~+R70l@2Y zG0G+lNK7c3R=84O77-YsQ=fHsW+rOS;R{3coVTq_c7)$E_Y_E>;5nHl?``hv9EFXO z5YAJVcKQ=fgo#qbtq%QJAyl2( z5;kV4+GKS>#r;h0-oM|9FL)1dmlXf!1UWf*9b<#1hle;G@ebM|)lu(N$seCm!t+k2 zy#oxhJH}~)8^n4L&;54ndF{=VtyuY^Co|}DbabGNabY~vlssgfTbM9-RbD;}2>ia% z{ZC?iEf2Sm#KaJIJNeE%BFa!fo;-Pi<*;Nvd?5lq;Sv%G)lTeEM_b=waQ^&Gj7;Fh zA^g6LiB7@(Lx%z&ZZeCQh5%$p;P%Li1fQ@cG79Pt3a>-Y6AKfKf_6;ciW|R*Zg2Wj zdMt+79XrI}iz3stx3?b}8uA4>ABMbRYohZ2f-im4-?hKhn>Hpin#V0X1=#Opor>Z) ze*Cr4lE$Q-zW%#X$AMW4XWI7mcC4(O;FZ?wE&6BAZashgyjHR#)yBq#R+HV4G_QFo zh-sk6?@E~BZ@x`d-&Qv`$cY=O3Ey+r+{x)%VFlO*9V6ow5;kBY;&Mz(3@9uigmyW5 zSECFoD=V)qPM(FXcP_tpbgO&c3`4My3=>)a`jRSG*F80FoJBs6L0~FCcR`UfS$FZI z#Kbm`X?}*ER=A%~P*An~Odt6;IvbjN68NSP)wg{gs`1}1Bvg}swt(;4PhYYvbgZoX z=FC-4T#`O{z5r6>b>d; z)^$Smr>JHp(}rWT7kh}m|0^34-!=~TT83p8&c#tp`V-65b)BW zHxsz9R<5$I8mS_cYnjPJ7m25zUO-dc5i(-Ncn`HL4h3^P`V$;p=OnJRsy zj{80~HSKNZ+Bxc2UACu3YxE(Mypw?4*wA>5^@@rLNS3t_ak&{n>&E^qO)CMaSlzNH zyimo8QNg~%{UM6`*}p2eqO#5=F$|`n=g;4P;T1u$$sKEW2rM_;mZ7Akt$p9*S%iv9 zksRYOTaX#>=6b`6-tWPn9v#uWS(tK{%t62f@&OIRlL#0NN`U!x$0A^N_(MT3-`rTo zvB2XuoicAx*7;m)wG9?SF~C-Cj_Aj*-3QYlq2bm+dd7G$+k>qyUHU%Wo@G?##14Hw zDZX|;27^(#3qK7SGb#)%YitYg!7HDiZv`n^Ui;IU6wkBAYkje|t*gu0Q_zLRQ|i$*4NkdOigzUIfnV?iYS%kJ!~2)^%P(H`udjDpC2u5EA#xj zcJ1mvYv>uXv=Li2AMbN}2dA08N-l970Re$TiA#5zEjJcAPZLGwTUPes$c??Fa$^H! z&dy~?#MKGCm4-t$1S)K4LE#e5^g6%unDE91i&k^pJcpf~U3PZ1vY^hxXggB}hhH>$ zo7f%o^XDJH;o;Z6c%HcI5tE9lsl-sWV(14(CMK3Ynv=9NV>IIrU!)-|LxD@&{jP)W zNm2t9+zX=Xz1iIG+`qr*Qkr(g)2ES#tJfH?)BcKF=2&k}ERx`r{t~Kl=guX{d&_j{ zkFo-C1C4$MyV26LaHmDt`2K87`wkS`2c?R)DmF7Slg6MrCWija^2pAq&o6?DuUzT) zc5z-+vn)Z1@tFDg>f+U_SKrFVZ& z_v5a8yLWHR(Cy1_EphcUmas^Kz__;YZw8lop~Y%vaM{7(wktc&$;+4b16{wj0qAnn zlP-zx8e|3F5WVz?jZj%*w3dXwroO&4lbN5dv9|Gb-4IM`e0*Hs&r6DJ+m5hWi$Fg{ z0fEsD(u}=D1)fh~c=3KP&GqnsVy}o$MnQ4;l{1)ky)3?v*H#)QWO1qLoI&y^>g zg+acu)6*3(IpW>Ea%SZWWPt->t497V{&W7-^OR6gLHU8y;LM$%mOtV)YwoeOT)gb9 zrL}7>3rjTA9eiBMq*}__#wOhv}2S@j0%wQJXA|NgB)QOHNlhk!Qkeemy}47D-yeK&HL#@ z5(rHaxXpe(z5sMvmS0J9^m3j{5wA=|%wAm`_WvbTTpf};lT@jxs7P}6^b8+NJ9a%t zK<8nfIXf^(SX7iCPbN4Dxgxn=dSfEKmLE>w^WtJ|=qu3lvY$OW4Q@4Z1EW<7LZ4l` zG~G)t&(HfoL?xlq#_5ZI3>=_Tc~7L=SS5+F2WKXKYHZb`t$aJ>|ZdJ z5jO6{)})dEoMl)^^du86DHT43P-nk{y6ZBFFxV{L1yJ=px7kVD-jt8E%Wdxv;7r0# zIA3~&K4ENhR5EdoI+v+b00Ag8sDZ~uT)qW5J|HB+EAi)WJ zR>t;#p&3`+jfv4Km~Sp!_-EA;!2Ram@8bYymt9TbTNQjEDv2}JXq)b>8CqpeL14ny=95Ym0x`9H?TLpIlEZc~2*dWw#Z4-h>B_eI}Gg0imHonAD5bl5v|M`#Da!l{w zw{I2E$sX4{fB2AX7rP7-sy;TlpWCR)g8=Wz>}Ra)Z%49-kvsGjs(=8*3!e|d%@ZR} z;?gH&8ykMW7vPGpq9W0`OSnl$GK6q??K3)Gv26>hX{8&zX8fTVbiDUf9Da(v8A`zf z;nlXs6jg$=$-uxss+3Ce{QKJi!WzTig&r+y7XmBNu**<@6FpS8&GB}? zJ!>mD83C6uK`b$AM_OU2TVVz)!-1@`f&NpUtsZxEw1FNiK+0$n(76btH0=YKFB%W1 zC>aU83hwMXoNh7_L5%>eEMUsbP1`*C(ZGU}CoeD0PykB(tfo7(v`tT+&MO2+i%>!F z?6ifw^h<^o7Tm%nC682orOJC()Z9;wDu({TZ06^g5bt!@K|p*I0x*T|#>PMA&~9T> zQ?1SAdIcB@&{+byL=6<^^&sDT?(1uN7r0a5)rC`i|D7J%1N*^z_L8Ggt|b^;fXku` zD>?XSb*fS@O-*Yn?cs}W0>E#&MjGrrM+0%G++-FiXI>f3I0xuy<%!Ulq(vKy?Z4l*_W zh3b;O36=NDhy$n`2A`Th69#!YfdvHzJ6)1(z_`FuwsNJo8}cohU(_rH3M0&bORXG_ z6GQ*s?;fVsjDe?Sfm#R&5BCQ?>~yJM!jseyfSG}T9O7&4m@5??fdMQB?G+h=`o{)& z;4b{be^%Ps+TH?dCdPO0n{PAEsY{Z$G`qHP{mJ>VyLLim@x%mgRoGO(Q6|V#JUilA()AZz5RiKgBC0_!CL?>9?E$# zA3JtTt7&2Z=)(eIy%@GebIS2O03rD4Jk;TxGBPq#YjxtjQjApBN9w4M+c0lQmI5HD z8Cc^2X{^WLW6f5wj**3$6rG&RI@MRa1wTIpzz;k)zxk)z@L~oO28h}=CK`D`_#zkV z1%fn1RSd^!ySkXL!tdXB|9gAEIhtdtn~h5E|D!|}?op?rIBLFrWiN9c`~dY2>m-B% zIl24~8ml$cXqpXh9^mQ8Rwob6c?-;3diK+$T>P}p z*Ced!*6iF|Y2yp$&xiN-n_#)wfNJVs71f0X8INw`h}w4P(j_8vv!BUlc7?6Wt80FVHpcMWvkTNXCs)h0kNkrOgm0%Iz8!ELUbUmk-h`(2Fj=lbIPX!DAz|FS zzm(?PGj;2JTH0YNm6UBgS|*CuX@j7AKQS$52&Uz9TI#*4@@DAj(PbRQNQ>GaDZBls zl3kA`*@{lRJ%uGg*vsDK^N~R>f3w#&8;$5SJ@v4d$UtD$bM8NIK-%cT-J}xs9xeHk zfIe}I=9}QCedX5$w}ct-`Qi9&to=C+G9oQ{4*@00vp237Nvv$2xybzE>d~WDhe)8j zEc$gkLSRoAu{#JPDMYx>5BiHEi)`oVkzc6!K1Zr#zar;8&li8l_+8NfW_9RsenUg% zL=>oY7%plCXrP@jd#sN8N(K~36bT_m{x@bv!he?<{{Xae65mToPfsTy4tM$TWyGNN zpqpT0PHJfE2sp{j#Kd%UY04O&EGfp(GKK?q3^9?WYLrHt7@8>O88Ym z?}h-3@fF+az} z_=cP$;<%u-5CS`bWwEjF(xVB2OmZ6t7nPO{!d(CoSU5S+AeuBjF%jyyduB-l4dVTc zUz3y4AqKZM)o$F7LX1&EQxnWM0;(rOA`7q{!oQT%U1?}( zQGwJzEPn1%p&#NnwK&9U=+1kHh#$27VoLX*YZBZ%vfisq*jcybS#FGKY#~L4?sjl0 zVyM;BoLGY|bqb1Y-FKD_0eN|jPoF+Te*E+2PYm`NR!Q+^egT27nRqD)2_-nUL%)CD zZ!G{!ab#)are@mJp>jT51ao+(2@DAn}K@uU#y3G!efg(~t-XRPVNT4k8 zUPr+U>%WcnkSp`hr^>qD0Ro2Z%OxwzhOY=hj|C8~dq%_&Ld7=6g@m-c2QG{xs0l5C5dlEo{Q5fx~L!q_5t`X@gYAyKlH3S zNYGO5V(~rUPZ{dz+27xi);`iGjD8VMQ3;NWdQe!+y!kMs9jK`Pev zM-J+;9~v1vE_xEo=^RKSv9OmPRaBTHXN)By@rl#`<02voBqGfwZ2Btt_h5BviR1?y z(kwK}7{rdyW%bXU6M!GxU*&n^eO+C&8lR;}=9k!{Bz5r7bO_RM*mE*25L=VdD|-Wj zgPX1ls(;Z!Co-#W4TTi1i5ws7AiK}cZJ6lkPhi@149m#Ey(+mia{-AG9@6O4loq0D zdGFqx%*|0x0m137zOCTy;lU7G%Z+B5tZ-X?D{Zp_6FY{eCvnPEFc?2h({(6F#fbpF`XR1Uk# zm)kmWG==2kQtXTw1P>etLn2QRJvRI4Q|%YFEt&ACZccp5FF`5f%~Wq*@Vbd(paXuB z0YfXa-o7jey{H|@y@tNNL?Yz|Sb@XNN9AZ1k3rE7H4K?QGy{h9Ul%tsAzb9zybQ-t zkZ~CeS?=wqt@S5l_>I1XXl#5k*dt~v@|YY?OynA;CLg~knZ05NE z=W0E;AZqIBq0GW2$^a*pCJar-5q_Tk`*+WSk5Fa?Zmf3NOB}m7#R6YH7Fn5uH>+X1M?PQ7pjo6JOI`=FDm5;9vlBiy&8#_F_pN z;pt!Q$W|vdusi=O*10>^_t5lDVlj{^gNTv=o({b_LX9sI)(DZ)Ja+teCuRhZ)7s(VCCFSlQkzbpXmJ32Y3fu?uw z!GnYJF`Oef%M0)KT#SD9?6CKrmLt^hRX*#<%U<$d-*`U=3Hkl4O4CdJ;+p-m+zukX z1V#&g*FiTGaZO^K2>|r(^WT?UFRuU8VHLBaXh}JqAabFy?|_`6%6_H}a8mWNXYZp= zSu^}GLx%1#kU0!tRdmC6_2!Qug^D@fSSmQ#520g{YFwhAT$*zl2aiS%b<*zNF6UID2Pmw=h7j1dNfu& zHMQ;3tdb!lT|$}}nf`B%^u2!~(BuNVfoMc4ku5=@*kS3#jKgC=Zf-x6qQ>Fsp@}Ro^48hth)H#P9-jF&R#r-YJ3s}3afweI1syHGV<>!~c&XtLbD)g0 zgSV?27{mda$RE||PU_#?K5(rFB4RR*?KtX~)3nT3;uzQq4r1d}sxK(vLlOqwxwxhW z1MP4-oa2%(S=t}zW!24GYDrc>^G2FVu@ zmz(%fQK$60s?iAJYk53fEP0tyBK_gDV^%6O4Mq~HtlQNWY13Dx!^Wp?$sw5nPO)x2 z^Fm#sv89C{juL{BPrE4IwBo`b6w?26WBFS6jvPsV7P*da%*gZqL|CWSJ3>RWw6re2 z^(7PT;iKY^byGy13`XPOMWb!B9DG~12C9B_x9jY=*}=-d$oOC?vKP5D^ou#SN`ddU zdTy#L-1Pd?*cggr`nRb!&f*y#3e8@pXJq(+J8P_RkJ+Me1E|C_T6NxDo7)z${riVV z#ssPRq{nizZnBVeHA_B4wO8N1O)y@p_pvYCOvxeXb4;llfDMF(F4=Gm?UuUhsUl{qOODC=X9x*G9gVA5D;LF z(XK55A?>KwvZ#PoqOW?KfCcDe%kKpkaU};|j?|ZkhNh))g1Lc7ald29s%|t z{F23SY<=bj#0kW)gUZTo`5SM=N^yyBD)@MXPts6P`RVSj%Tx(ZHvN`_``X1KN+Req zTI+)g!|R0~LG}<|)v+lo=!ujiNDFuKrio?#3-SItAd<0K>+&zP=HQcf|lXcF_m(!zg>X;Z9PNEe` z0!&opUi@> zv3l>1Z@fp2?4hKjblj)}dg*y$><@q29K?-C)B#`h?*G1w=h8Da{ycIqt27hmUdLD1 z0c{5flN|k9xHbxA_}8z4_g58E9R}3VbcUy=zwW=7kAa1Fz&^fx&P0&s@SA0FaEezR zi}rEGa}_6Fllz{QU!j2VNrdrAp2Q>pO*hE?wTGn#O;HrNE9qV_`>scnGt*O3q{@~f z|3nN6P5t1j*0tIUUV`>aU|w_c^fTWj19Nh0vZmviU^s9g3w=~AXM>hI^kxS$q=6_R zLd3^M0Sc#G*txrZ_w3E)4?R81ILeXnQpo`Yh_Km~OWi`04g(J-oQjYW5v=Yv?frMr zW&PQyb;)gS2QDUJ@4S{iUvj+LsW0u=Pr(rtjOwbvHvwTdZI~Lo1C;srIXWLoX?~XGzKEj6PTXP#U|@U z2Y_N!WbW5BqJpr{;lrmV&Gbkx7XDvu74vWW^NYMLtDZlriw#4&2#!%5z07@sg#To-cH&|K_O{;QCT@) zIpYN8IXRclV7#>$h5{yg|77dS1oS?Jgr@uUJd-d(7^3R4;5ljvt6ncDP3ekDOjJW9 zARezpL~EU$PXl3cxXfV?){FZKAtwd>dYQ3_7q zDup_esLl`Qd;_rH;pg89etOl_H309mWoBjRojXT4G<{YS*cI<|Aw4wYe`9faU=J96 zAMPd3*>I8V=v5N>HIb+T31fZMcCQv4pB3DDZpAApH89nC`?nCw|ZhoFXtR*pkfk9}#t1-$W^L(J9bR zg4h(Cdm8JZrT)UIo(8H1FVF#Iy(k)FBcGG4tpGv>k!YSaGBNi75Rg17-QOFSJ-%x? z`=w}iVaT`KD>p!q5O=Zdl<)e}UJ?n~EP!KI;W8FhN8u9!vV?r}m9xLq-SM`E9|*Zk z{I!UXaVQU61%`)RkokqEk@WuQDL_BCh{O=mNs-}y@ru1XrG#04KtSPaC_ig}Cy*6R zv&}49eZ z8yAcf=Dk#U2XiZkhz6Eq75F4a{IrnfFZknp1nEMk`@j+Z7WJDZPH z+R@*Q*n3j@mdbb>wC&5c`fFTyYEYBOrEe}%R zp=U<|9^zjEE`|8Ra{EsPqyA55X2i4cqrDJlc{ek&xbR~Y=yUMtIRT?$koR^t;PL@@ zxv{e|j?{*?;aFwsdzkyJ1s1_3+rf2CWA=AtouUQNx>Rq#*MQQsgBMUYe6^vzKCium zhCL8^R~xcHnh5J;XJsj2-_n70#e@qq^^r{`ng{Zx1?Qu`&?Mfv$?* zQNnAaAVk2f6nFu}Vr_X2+f500W#xWg)DN-0VQhCjYJr}aIS9ZGg84QK9c0nqm)}0AU(qdEO%|aQuEb2=y=y2b_2n&@r?PBx21G!NAX~V87u-TirM+j|v&o2%)^; z=JD3W91OFo<);62#dgB(CA>F?ya(g5mFE@F&CrJfkV+-wH3)LZ)OvV$%+AgE0Zgji zWfOXNFNISn7x#xbvHWkQns_%A_VYHRow<03*#ysD3GV&y@82|+F8#D+T=~dINQN33 z@6h&VXNQ&WS`0U|O6b?3P;uc}5y668`=ldcDpS}~kW~2J%e_Q~oQP@X=M#Pl_$Lv# zhPfXEr-TqFEiBqCJl&BmgQ#)B)Rc`#QA6d!_{912tsQ>b-cFC_V|tM9@9%GV<)D@A zygUIDmS;1T6(hpJPC~>cDV{pDZE0zVn0SzcJr>5va72(0e%svqq|sfAkD8tvm>W$M zf_WX0d4@FPg9bz*;Vt2|GUtl`E2po7A*8L}+uKdN+wSF6x$GMr8cMuH3LA-3seRba z#%3!fsL}cJ(0N&jgte4ZAQ&=Qnsu^8bt)_rsnVuydsacsL0(M7y$d|LX{CXJaO%s7zCU5&p=^;7)QWhsDJqNbag2M z^V9|XEnHcIsju{szg#-*2jK*PNkDytIs`21hk9XRW|kK9!<}yrd`Ee`q3Z!lnfve;KIU$9f2(dPZfPWeaJBnIrS6IxR76m$V%J{>?K3!HgL3w+bMfdPQSV)du_gdvEvOyYTp|-*9HD1WPjF zuLxLCx|!sQSLF|=^SqvafA0JH`rdcB&g(ospZ7T4$8mhlpuM{_7tG_E$6zoPY}ZoT$6%~c zXE0`}&Y6uriI8_bg@4Vq*rBP$n56&QD!6xwjoI=ejZ?KZWG zE$#t-#wVUS2>-3vdEt3{bG>2j^hi#-xdB<#E!A0%E*ucOdOq;~@~3IN0doci=l|hP zP0Xrw&J5xI%OAI_!xe1GYX6r%_K`OlrUeFi?KyNvVBWlWd-v`=8yr0Ez`=vl7}`5_ z2t{bUxxatS>2GgmF>WO!Oh0(=U{_a{vYsB#$&+L6HPX{^a=0rhD%OgKY_qbu)0f4< zxO(+!QgZSP#?$A|RSq3GH0=KU`}e&E4*1@^yLywfbbLaBu(sEKmc&MOaBy(#`t|DD zx6j3Q=^Q!~8Xe8YID0@8e-hN!`uxR%_4ESHpP#;I)23T#X)U&~=dkNqw#E`d zQ&&mIx%=?p0hh?s`}eo0tNZmG#od&S(u3&g&hG0zm71Bkfj)Zw{#fmyY2&xPL#_DmhNh0+U_G zt#uC71s|Ey`1V03i!o40Sz`}_N^Z43(RdUa82dZ#4{)=Lil`FS$b9t?-tX_T3 z`QF_f^U5a~pKxDK*TPcr@$r>5Z~0nE*^#6Wp?!z`+|f~rmRLvU+{lO<<5hiFOl)Jf+&#*EiKiw@?CPYo-(l3%g0LTD5Aen3x)__~5~Vy+%f?jI|OHnpnKE zrb8W(*RHWJC@i$Kwdt86Be`*3YA<&GVD0`IXmX*Rh12OUfBHh5;;A_UC21EQYh-UjaqHSq9n>gxP)iLFlGSL%BF+gRQE4<2YYyhwcf*sv=uJvCMR z;K9XbzZ@-;9<15&qqFAD4xXA!F3#+u2spYgS65luR0PZO=i2Sn-lNP57j|YjJ-Qnn zGqN?tZC3P#rO^*cMfE&y#%x*J>PNVwrKQb_w#B~JQWKav z8Wa@RB>1|CBf@&${{5T+0->Ki9bUO+P3N=AYqWOlQs2Fs4XZi%>+AcsZ&m8k4w)Z0 zGMkl^^>_X=C*aih7A|v z;=(&REX-?04nBMFLKTtI)YR0~QXn^f!2)wz+xe=hs=P~<#A}8xla!XWikJFVmvq)0 zFft0ky~ulxEV_REIwhHg#_W?PPhO0T4MT2W4>qlP;Bj!5dep8{#v>ymlAAX9#>WfI zpFiL1@Zp&|cIkV(UVb& zKeqpu-ksaGXD(Q<06|#x^y!@0vuD$dUbt|<%-Z_tQGcy;iE?r@zFbX?xZ^%N(*}MK(zM#`*_6aj2Sadch@bz{k^HL*L-C6@lApI z8GU{ITSkxU(#MbQe_>;7t*os*@6x49zIktc|2|FY*Vx!d@#yH-e?0Hn(`V1-o=Vu& zosX0$Ex3KOI#v=l5$zBZnDqJJfdk7G6_??To<4nAoOQI?*D0&H*?18TPf;W@;KGIZ zREQE2XLx#g@-AIk*3iJKp`jtUVZ-^WR~PrrRZ~mVGB8+TVQCq07cE+}Nltm_VA6vJDm!+tethi2^~G-2 z&YiTy8#iv$H!@P)zWrOa$9iN^Le7OjJvFuTv}3zQD0+A7;4(oZu3fuU+1$K+-Q==^ zbbF`pXbC1qQN^XD=iOa7ILGx49l9y`l`?2-%mcAR5$RHNY_b(ssL!eXV~-u) zwrke{`sR1@tddWFV!pjg1Pv5XHT#IWMd4PxNZHxJiR6=okN%H8>JE=$=MRUR;QaGV#p-T%PIb~&KlTuS>_3el^ zM4Z+nYO??CY2+Fj8ge*!@;tVsFPk!pk#_AL+SB=f67PdT+g{?s5*Qk)Zebz3kc%rK zHkPgJ+L6~-^aR>_Ny)QJrqpBSAM=p>?Xo%F40KWJ5PGFwf4;pF;=qfwyej$C#MCsL z@RP3Yyz0zd)mivHm!Y2Pl6r9{toRE?k^GAx+z!$_BQx`SV&V$pL)1R%N?WB9a^fF6 zm?tGAd%@zvCCy;4fK_|oAXX(Ezm+l#;2#V@7lGC0tjEHO-9t(pSJrZCiYK41nSXh{(MAPqm zz;-C?XHB;(vi>!;T7mFiTAGHAPK2bOp|SA=1oGj-hnJ%`A3Ju8s^PI?B4*(x6>6?B3K=AIH zTeq2-n&z%ScbwbF4rtUK3t;-T=ei0i0U9AATFJDwt}X#9Nx)Q8bm7khvu4dgr(C$X zKzq*~p1N){$v4S*5-5{puV1she*L z9{1wKv%n4JvC7-FO#@(5S)liBO#hw7nRm^P{QWhu9;ad@;?YA&>;L}nP)9+@;!C^x zx0kx^kt4!LgC$FrJbnGzZnOQ{17*O9t9o7)_lr=^FA%|c%vrEtv5k6k<;z``2N2Na zS>BeGmR;T5s+yXbQDuNNK&gZ@eY1`5+vcXsyN@~A>c0*FT$xYgd^@o}P8Gm|+8RPn zYvn?$Z|TdI^EYqaoWW$C!{d$o>8&2&Km)R=*Y{Re`~4kJ$H~us0d=apynOlU)wA#4 zzt8Zx?`pTT_BEFE?%lhkZl~Y1=L5dJvbhr5JK$ZY@%TOu0Y+>}=?5fudtckbhnvjp z?bOxP8yXslTUwT}v9V$I1d&AXw{E@p)whN-1OZA)ra3!1Q}JtVZZ@;Bs>ouY>JpgrKKa3e z((%zhj=e1fM@|*&8oak_Ab*zxIzs!B?!QM<@5bKxI_iT2_WgSI?w>gC*EUV>5|0Un z;{maO^W0sdu3s;~1Jc!z9JuS=A;9Q&CNcJR76u&1-zkprJ$hDzT`H-Rb@f*Kzi#>`^hmAQ{{msuC{u^ zyt|`DuC93*t)8gn^H^CUVq(^%uzvpfb<2kV6GT5jEc8JWtVBk3w)&r+AC0=?wABOz z2&H$qZrFGKfT;5vVH?4();BaXG^0N|B!rb;K)`R?=a>WN zl>zL62+Zlog*oi(npjETvYK>LrTGF|7g<(?`CY#JZfUiOy*~y~6d${m{Gf~s$@WR+ z0a3qm=cd^rT~3@>Z(D44;zX$3$Hzg@c@G~xY@EJFMP)irWB;dTTu2CBz&XGn&yn9H zx3>Ab!PVpAFHeO=VBkb_Wu=CihDHabOqag4Y0KnYDA_k{-i(o1fST$1WFEJno}gt4 zZnv38GY%-I{iRr|_$;l5PC@(KBX;yre`~KBcHoGvQBfu5f`_7?(3dzbYK>@U}v7y%H z=QoQWG0J^@YpT&B-R!yPYQoz9HgU&(-nH-RA?7vXhZR4i1voKR;}) zufKl+X6j$Rer053ac$m^g(8-kx*p5nR~Bk$Xkc(XV{_eUrNE$|63i3JaS!X(t^57s z1JBQ&Kl_G;{86FS%3@{=LAx_9a9e!t+&O9^*dH{%XoYu;A3l^JnGwqCx3bv-i~>Dl zbA7wItkpC%S*zdDBV}j%0o2W2z~}p@#VxsUwvt-y2)cS3`f#r2=;oiTMVJZZv=^Ik zadEXPzx)sO0+L9mci(YmAJu&+DV?YRyXYcxdS8?TF)=aUt-!kyhz%o|O;;%Xx~zcV zS1ezytiRvu*QdFRIWecVoM^GPwDiFRr9a5zuL8Xxv}%=lR9R?H&^8YbdDNLV2r&hP zf+O8-Sj@#I3a`_J4rWZC8VzC~u6UoU=lJL6p_wc!o!Ggq+WTB7si}V1)^c)k4ULT@ z<>fQ+fa{~v(JpCo!ooCcZBzDk-i(Q1MSIE3%`JZQYJsZ%{F1g3pBRB=^%E@r!y=rX zViC&zu?U-j)XrnOhDS$NppXj*34uQHd+@*}t1$EK(G~00r*c5z-|Zn^~3Ul z$=ar=$zo?`=WymsRbP8q`=?LkPJ59U!omv=fi;*ueY&rw{4zz4Ky*A{<<0JOHcdvl z+qT844@m#`%(-~+`yPXJ7+?_ESZjwfM~&#T7s?!@Q>;A_z-%{xwN#jhJI5(BsR?NEZ{I!)cb?*Ma!VPv0N_%LWMyP-nHG70sc7q+A?&uQXU%Hi zgh_P`(W}}OY}?d+Xd*Q{(5k+E4ZzSxwg1BhBWsT1ySUzC49|7!oK02n>{*6TdU!bd z>OHaZ*Q{B?T=91D;`Qr6$LrJDD?^vkZ=F1K3e!fA*Z4^Mo;bzQ%I_BTGbb}K<52kl z6lgB;7R0Tqf)v3$ zn0;tpv77|!v$8hcxN!rms^tieAW|E<=7$f=Nl!{zOY|R#Xy312rN!rFNZB?>p8nBv zuqPKY%5Of$0^jac|E84_+tEG&_x)qG*mvNYFsAqbO9NW8fB!y@hleNk@#E6BZ!=%L zYScS;P-w%3eJ-&J&_9sm7}eeY%gtZ1VJ3q39I`k@g(_0Gvi;iYq(qgDYm|$A+Rc3kd-AxO^b1QxE zf)zE`LeowU({EqggyGe>Rw)(W$=uvL*Lza2 zw6xR#l^WE6@}52HssU_%j~;E=vU7#7+c{L?w&z#Z_5JyyiQ5J8p_Y##Y;JkJrNI5s z@ZBiygLZb}=&dmY^ta~b=WvUx5NSr)BXtBvQMJFw`H zeX9mi6R6BrHu!Fyy?}rKGqLa?pr&s?0PCq%Jk!$`FMPl$qtj7cpD(D$kL0w_T!pkw z(0zc03FP5ZRHQUEK2D=1d+;Eo>Ks;9Rcq_D=Y4#TQq$-cJmgP) z(!yX7Bybf`*X8#QxbiJsN&#n_cXHM>2~!PYV}9@!ZSC#TutY%biO8e9m}KR?3uwMntSr|yr0c^K7brDva%%~KOS<)9*T_y_3i8HJEz(ZMHKWkL3WKW{ve%1 zjgnWdQV;c9-;OE(R^rXOh656D(b4lTPf#5|WdcAcH9CI$IJO`}U^Mh;b+sm{5xRu$ zBM{6)?V<}J9eoEi_w3mNiY-LodJD&p1Xs2aNET{k1k(_VfItbTXy982KohPydX$A) zMpIMH{gy{c$p~MJ!_>=9pWZ~+s;g$jmB>gH@HSvUx>}2rFlK~Ln=u=TgkH~6wc6** zxTwHD6Mxc&f(6b8HsxSZ$9})t(~y0f2NRtch#@J<%Hpajme|->i>lFgxN3WMcL*pp zVbpkBHEN6fvb(!)&I3!$?5y#|IMPh4(z(J zGUI1ULCDfAcFWhTV?_n#m2(#J@bJJdmsHqMuR&N&KEPm%_z*YApQEItgnq4pR769i zwx3^6fX*}%3xr75!4zFOd-t|&+j38RWwSYc+}zS~hM=I}g(Vwj1LED-4~EIcC)cEO zaN)m8=iL4#JM{L>4uHFv41k={4yHozpq_&=FFLG9Tg#S=FU9__>hv4()R7!Ts*CdtE%WX1Te!S!k~OF1d2yTnx!HD~t_yhJ!Ej4GUvKFiF%VKdQpX-DPU)8*6Vv$jI0xOQ$UzG_B2TG%Q?@-7SlX4GQ*!;u;q*UifFgxh={-t9*Kn8 zw|%?crgC(D#SAM^+3i!$qN7>WFIttXmb#$oD1RI#mh6X3O@_cfW%czuM_=C{{*!V5 zLH#hssRk?sJvUkd^~oAYcP{SkmX#Nl@G5zEJbCbH#Z(~H#e>cB^74{#`%UGKI&{2h zz`RohAmp+5t1vI-y8jUeGIE$0b6vS|(%d%z592_0b#l$QHms=jzBnlE~uKP62e}pJ5s`3Nnn+1_hjJNXvw^=== zMJ8m3m6dm2rT6APKu{g|lMCdBd4=_lEMg^p zeCR{UE+Jt?&zd9PVrxv-thlOu$0A^PLXL=nf`F;_xHQ```9QEF=FhK)L@9YIA_~gG zhMps8GS2jx43CVcpx+OCc~yqq*Z6exC8`vCW$ZF8eaJ51TX*jGF)gbsI?981H{0?q zTD-U-tRVqmL$&M6%Oy8tPt6AZ4B4Rc<@JqH?nAaw(b2&I5mSIAFsTCkW!v}n$ucKD z%@H>(ynsyue6V;KCB?h($b8JA6=7>1BPafoaJi?yEd*8q5$J#H-Cc8R7(y}gqHfw%RBY86ona#JW^EH ztrN_&!>>=P*EPl)!y0Zv(0C=QRqJ) zf?k2RjSzwGK&?$%>|4r*etdBJ{CqKbTnR4jJ^G;)HLX$nt1qb7+=g;fNh<}ujs-1#Q6s? z0dBv$&fVXC&*FRSeGJq08v0wJAYG$WbYj_LyeH(L6-zny=!==;^Uh#lTO?-^P&Sfh zn&B1Z#hxB++BdTNd#;ShXP2u<+3mwUJpZaq3dF{q<~%Np_v%1oG@Md^A}b)Z^2oI; zy$m69|GnMq_zvnCsG<~Rvsk%{pFY*XD$-A_KNwxy2)Gr2T<0Hr1oa&|)ON;fPW@Ot zr~$}Jcj)?SCHTbI7$n4ub2;AK-PP@Iw3I{V#RF)+Xd>8Z9}q~Ghu8rac;#Ir{n-S9 zg;f2Ekw!gHCp1tAQOsydsd9tlCWT;|V z>xojUJ>RfrY~2tS7w5Rs|FBU;&`6k$of`aGPtQSF)z3S*>h7MnFks|BfgjoH(EpH% zOs8($E7z`BPK^E4&$d|%2E071PN@0G8Fu%fo^xn%46|RKo|SfF15G{sW*CkoB``xp z1yn`bj~}7P84En&54VW8f0btr!@|PCp|5S*4H-wuHeMNr<#%_*5b7ay)uQTnHi{Uy z1a?3Ws&`;+&p&x0cjRRhMGsi?T__G1jZBRt{+`M;QTexnTZvKw{Za)@Q)tba01!!* zsH+}f;{r$x8TTQvuw@Ft7cX*vwrn5&(^`f4Xhv0DUby7Phe!Qo>`KMe)$Hh}7@&R7 z%r!#!{J?+&3Z%aZ0;_U$onBvOxRUUO4GX8_%(0Q7AM2d+bytXr&UMt%!nZ(c9p4ot#CU|r0vG4A;VUEJWLfSxJskYCb{ji>v*kb`3)lF0>!fvCKqOO-C6+rGX zFk`&DDaQjgE&!;qpjNzF=K(jqVwA^6ga^Ue=^t%h#QgPA2t(tLW0=bu9|GBSYz5nevyFC;1_tZa^> z@Akjjqtp%vGiTmB@&r+AqK=q%y@~H?%1& zufP8s3O!nN*8+2;enCqDBQGLgyV=K7<*&yrG6awL;lsYGc0`)B~t^nw1@8~%1I`DgT4i=$5~#781m%w!cs7bq~dz?m9Ru9xNn{U zmvuIuzkKPyHxDDb`Vnsz_+=M%*QNS^{AsAc2xx#geY1Vb1q^njpdU|teOwYW!9K!g&ww0 z&M^53*#8xpVQmBp|Fb?rE3?%mkjJ{e?tPIReC`>&x-Vk-Tew17UvkRWI5Hx7AKKILZd7#w%^JXtQm@ zS+GYT0>s~g!efFC<(GHiSi0F3#uFiGNfjYHAjM63tW#Amqz(Q27^2`lguS1Sy(nE1 z=TR!XRe0nDcm;>wT{`qxQm8?{MoC#p9(%howybgb|Bi9g?!pC?zBHPp&KbRC$~JoK zezu#}JpSR`aCi>paRLHx%>)ZDKhiJ`Sb?o}{MjrEW0E;4B@O?86-0Jm$f-GA z?A39t%F6y|Tqp7X0Vzx-xx5xuPn7xXYrtE=!R1x;R1AsN-*t^vpqdy*DTdOiMnMbB24LL+zMRon%y_10s}q@n(6-j`b-zn=k1S%J;SoK(6b@$)Ed+>0?1C? zb+Bb<_gJHO3(T(HVIuh7`Juo7m!iT8tV?bp^wka&KfjQWkcOJ36pSfUxLdtO*F&a} z0xM_RkTLB)8BMCPQI2g%#0pI+fFk?vwk3uub~t^UPTU9lC1vRFP=BH}9%a)_(XTOQ z^Mt-u_26K#13+1BUS2yOa21+%9^2SL>>Pyg3?L*>e~4f(Dcdxg|$S1Z8VMyr6d zht3u%eY}o9ki2itp68&`x3qfrfIwA&b1_*jy%Gdho`#0n4-GI66puhiXhI82z5cF( zc3B?w{ySh>Cw(uF5`cdYuwH3RjZTlg+6gjVQkeD@O)dkx*3Wei;$Cl9YyRa}i!aPt zl<1T}XhMB|iY5i(Jbuju^H(0GL6FFsChr`(kHIMJDxy~{`a3H0GY`*Y@Be!lIGbjD z+op$e;dvmsW3yfJ94Nn28>+LkawJ)=3ar3%uf{WO!2b<}o^ntSGmgCCqZ&tU9Mt(c zu%3DR{d`TvxrY~GN`JcdI4g*8E;-$ps*yZBX2jp$Vud?+W@+=^b~L( zmqs#FW?H>)`1{KW?2S3T2OJ`YoNn^x-rjI5>T(dUD2|nnTD?L50YU^q{w3-X;6jg) zZ};HltIBsB$Z#998OqC7#?w0YwuB<~6QNzu{sb>xmwQB0&08DEk3t%T06-a=uHg2& z7?t+yl8r}-i;IgHV;f87G-+BX52hlZD^J&fmPhehheip?WS)sykGt)+cOs9ll zlM4si)P4tGFZz*d<_#I<4yRA6VNB9ZHJn9LXkrk-dn!jDFG(&3S83al4+T@L$NGdJ zTtLK!BGyYGA+j%%FUA1e{`vDN=ZBkLynVZnA_D>=s<1+eao$3>VZfjB$npKl*c#K0 z-d=WS2Kkc{qr}Mr>dpjgqv_gM#xoQytp0EJ;yMuHG9JT{P;x+h281h)%t78ywF8^_ zT$5iTkSC^grR&vP)Lf{q7zf!gIf9dEtG&M;bPK1PVa#1Pu@K(EFg+qzRd8F-7BZ}B zgcosh2MdHZF+ma2)CZhGJUz4xazO%M#nn5p_G9Qk73k|}+$d(0Gat3VKQB*KH{Il8 zTKXi2+?O$1*g@y3A^_}~bI+j#T;P)q?k<+t4lP$vQ4toQ^1lOLi5q}-gjy;10(yjz z{iFnYjk|%)72dj)k8bV2fkm`p%L0Ed#FG0XcZ651nzixh>vAB0d4K?zqBW^(rQb#` z+z}~Oa(3DbBKdGz9jK{f@{+t+s{KEObKRY^A~$nYF>hR_rU+5r;?Z=Gp@B3#r7 z7#kZte6WPXrC;QwK&l{?Y9OOY$;`$k7$S@id@$G*UPTWXaBD$WZlIIxDRJ%!`bzbR z{Ua_4E}k6OC-~C~<-_!XTF{40*#Gt7-N5s}A5dIbKqPlGWgn-m91svd5D`FR#imV* zK(CO!0K|I#04(Oow;^E(CYB1(<1CToAZ@HJXAYm6fwetU1bA`j`&^okb&Q5+1lb!$5r}sm%BEAM9ux)Fh z01z~%+`eQmF*J1(j3Gr3BQGhU&MBK=kYO|R=$}P_0dtWV5*)+d#Rg{6ohw%sQCtJ{ zl@0fIGQl3g5en2dm70NF-frN12+k430T40#JvrSB21n-RkC(Jo%AD@v09f}yl-o9D z`VHp)HpDDwiPZdW|3IY%%wqvFV4>OFM_}Z5y*Pe%7WmoWo~-H&i;7@pr@gOG(=u!u zH^8N4iP{Nuo?X?dBLq9S-9zy^|#4hc|GbOm$Szu6@mYmt5kU9w4L))ZV^B8J8IyGeIJ~@cNMWS$cIuRlez}N(~&P18P zXYf-a2t#-|nv?@(aw5|vN9v1UN?+@o;v5fKNzCRGrN9g1)gYD+7EpQ|;e^d+2lec^ zyVC==hJlC_GkiFQP&bh}0&>oM4$q3Z#{Lcv9DqHGx)vf)qett+?C!5E{B_mYp81L` z{3e2GCuUS7r?Z2cPiLt*YR^`66tF-d5<}6MR!<&kzdWWM=RUu@uueCHJOCA88k0U~x9C+&*MTF=g`P{n$`8Y=P*ddXjoKoI zygP+c5bN*2??dZ@du4%_mL?JJ$D-j7j;5rAd;1wj^iUv#7@fZ zZIg!Mq!b&;$;CB;#G&qbA~ZRtqCMLprO0Lpn&Wp~{1&9bsa;3mlJOkb1jQei{YdE2 zEo`u{^D4M)B2FHRO9GP#%$~}J6qH8_9zqJrBL!0hk%Bywg8rRZTf#dxBD-79jQl=E z-Yf`#a2i!&lAKP{lx6mIFy_Q&l$Mq0;CL9|8RVD1{{mlq;8>#iu5UbQ0oX}FIGcT$ z7+S-N=4O6agsY${FppL*Ba6xuOoP*a)KXZ+%7A959}2BszX0`4^z@Wf2LprV#}kyf`>d+U*o*luz1YG8bQ)NXkdfF z1TGYN;HfK}NHw@p(-hHnj1C$PF!J8Vr|!28nv9AwM>X?XB-nZbfFRd8+I<(ddD`=1f?23ifV zjnE}ajO+{iK*P5Gc+|=*ryG!P_pZNv;osTt&%yeA9tGd7wQ#+&m`$SSx^+^gzU;if zD>WSocwk6K84BVp#HI755dri%YD@&9t*rxTZous&rKj`AHJL8t;b9?Q3CawsQBgE8 zC^5wVBp-VB_H8LCRwTH{yDlV~prK)O0~3b>7+{4c`UomxmaxGvjk%FR3uQV(CbE18)CX+DeZeY+Qu;PtlzRVVz!k}K+b|1G=+ueBN zr84N&DN(;x9Q|yfyGNF*ZkfWEAM(9)1EL~DgkT)rHEhz zq{KJe92Eevq;+?*5>>Hc{20z(5R(V;0j+`s6@|INNd}AtX~~F6!hIO+Xmht_;FJ(C zuu#Nl!bIs`gJ({JahOON0zJ@E%%5FaHI*+)pje5l0guxGz4mN)csM%LO|XAvK)=Hs zArcv2Uzwd8*|`AkbX@>3nKM86rlT;<;lqf)h&;FrljMO@32(qAhMuF?F{ z(+H3TB#sYzi~{)u1q_}_6-;OEhgNE%AY*c3Dj{U~tqzi@8bRjZ#-xh&8xidXu(PmQ(5PKydYBQdF(mChEdLmC$@HCWU)=;&Ou zm?oml*)TBCZvV$m>*!JEBY#Ho(v1B-HWsjNJ@w_v=nbI_XNWlg=fwophXS(XiOlNb zVE&`zT{n|-)R**M1aXU6PP@QC)m&pvdv(>oB zR^GU1r$1?p^Owon7mOn2Jslj+ zzTg9>%oBJt`>xhp5drGJQnntBKtzSgr2zI>xZsZd|2g`*HaU1WyFmLy;sD#b5tCtn_z8Hb@B12`QWUdcx+ z;ZSLdu`eXI9<+cy$kd4*e}7eqb8qhg1x6M>oM{5woePv?$+KNL*Q;?j*Xw$)Wz)lB zsL!*Z74*}G;L^nUEYXL=gb2?7+$P5YBp+$#h`^U@^<3*%>T!Zl_U#-YUnc7|wdax+ z<#R}f<&iM)y?psHGbGUvBb_g>Ai-MzPQE8H!Tp$*EKr1oF};wd)siP5lhTwl%hNxb zmta~uuaPK)ubBFII{y%2L%cgWC8e)o2SjPJu&wVq#*LA!@Re?9@rX%q751jMNfoAniTx)KS`c zY{pmP8*?$OsNqBfxx*kA9H@yoC1rrwRC=)C^&Lc1Kq=Fj!+1E zdI57F%;ZaHq{W5XFw6A_U(ZH_Sir>B@Yrb`l>g%hRnBP)qSw#OU?IGV&5?F?+}Q#k zMydqaULbyLbao6}$-~Dt@1I3+DxVB8Z{tBGe~tY;1)uj~$Wb&{K!i9l6|9`sZxY{+ zIMF~Yf_2Wmrz0vGH<(kG$7-$;8v0h-z1gY7@*%)-Cz669aLRW>~A{HJYmd zCI5R^10{3m6B&()F<-kHX*X0jc27%9w6IM0Y0TM((km8^S1)7$y zVJbJCqcU3hc!te;QSv_^ET4UXDokJ#n1_sRm;@0P!BvAVo|g>1IH0dG2d>X)1Xn@e z_kn~)iCrlqG?V%VxjJwter zUgE`&iBiO1)IK=K3V1;DSKFsgzOdEte1C!jA)CVntLI&&^hul>xc;LgW-^RC)s!|k z)^+K`*+Y3Jt#DGL9eVG1GNw1pcKGy^6DB>fGXa*S+-A;qja6{zW3Y0I6=#^2we|Lz z-u|`rukm~4qelTWRqeb!onieUC-rv!zXS=K!1?#-sMF%#>(j%b++GnqsQuQ(pI_`%fFP%OGzq>LN7RK90Y;H3EovV%{T~z5}kEiz_;m*($3N-PXh+A zjzD=+LNOR%49}P3SKqG&FI>a4)Xe|W;yw%wnNFA;lfM(XYjLDu+T^8GI}$K^lWhbF zl`p&@3CQ+KRqIm#T_4)F(lJPKIBQ3Wi5Q5jy6LX16b|$58>r@_-vMiqkA-IoSA^~A zol$487L-5;_^V=J`+l-&7p-|{T{E4?0u+!|)L4q#4UTv*27}1jpQz#R6y=XRlXZ&WhDjtSb^J*gc&AhUNG7 z_pD&!i($!=vVOB1^38U>sWWjCMPL}gMw`)QOWRyI>?q@JB#D}!0V!D0>iHtjpab!| zsP;z!|LQ%ry(cvptaTIEp6(6rs_2BuZ8xfH!Yr_jT7d*?sc;XxRI zd>J5(t?N>*A9if0f1aimv=HaDS&3H%pKV@zcG{&1Vc||r6*K5l`0os=cyQ<_N9Jl@ zx4az87wb5Sfr(!Obd6(s=`47k1iZ@EwPL z=Emw@cUnQctC3Uf@X$lURO{wkCNRvS!%_&k)zO=d34_l2oj#5>IQ=YO=gIiObvU1n z6ZZQjPdPYbbTu#&8Duz%{Lyg30?I@%nY`c>5uVum_nl340&XM$llG;Gy`Zg30>RdW zULinoYg0D8ZAU8R1n;h4~4_#WdY-)iyBX(nD z)eGDP)jT}%KQZSkcrCx0(m4;Mx)kBZ{uMcUNW#=TPY{^Um6!U|A<~|l#@ap4A^F;pG604<3*5R=-j5Ub=ZZd0GOeyelO+82N0A2RQk?)xw(;mZM$B>^5L znnD-iMGBb}>yzNZ2^Ky0AP^+R_Rh86n)knRJq>k)l1b`#o!B#Q+;fG>ArboF#*sG{ zH&L?MMUM`zF9y$sMdZ!=jxq~m@ zX#)x|VGqz+5ucc!9vuJmqUyQ!dZ$aTF@>r5&0Ac4d;8_XL8x?UYAO)M=0YkXK)StZ zo~*x-3-WLw$cYZ5?j_>Th0*J-W_~#KvPgK}HK@sR$QcKzd3)#6L-!usZviZLn6&Rs zFp$C(`N)OW_fOo2e!b&MwFuxIy5sHGq3?KnHEhRB22O+C=V22@>;__Oj|Xoh*rBU{%GP9OngJ{}B;So56FJ zw6+SuaHtl(OkriX-W4xf$5W%fE@w-OlE)6@HzI5%4x`}=F~d050VfrvzcR~L4w7e_o)Ih)>i>>qdyZM|_q&tREy%#S2f!e=7|pp9E=H>mBM#zc z$I)9#Z+ok+z4cG+>1BD3A9q045F}GFY?WHe!UJE%a7+h#poxv`Zx0aE=G!6i zXI6GIm-dyl=g8_!G9L=q%20K+E7zbho1v2tIWpB;`Tr%?6$#U2V7-b7JmAoe7GKCy z{oS$hLBK>7U^yuAKlT5=l5965PNFZxO!A|gh)Rvv2^GyBVP^rR@=}_68?Rk^sDK!atSQg>VPx$l?PieUUwFKO}DL|9v_Rfs-t4}at5GmifLEJuLbD zR1feh9;Kd^GcFvP`Y6QWp_IFwqh@3a|6w&|Qaj zqjCNH*SPXBB%P-PJ{>0T1!DCUh{a14cno2P?>Bx(g9)Z~7|JItT6+d&40~#B6JLR* zN@{APsw_{1&>1u1LXRbesX2R@tcmDV)-?&Ua5)i!`FEgVEFp~ml&4lp|Frq;vEP7V z7U#*^$m%(vuSSX)oCiGU0K~rp3&hmVbNG%>zVUW;w32k9B{Pga})9_Wz*IFLnqicrUJ;csG$S zWEpb#!!^M}rkg>LnwXeaH)gJ46xY;nV)XaXNGxgfp1gU~;PbLX%)?vhYvD@(*J2zQ zb=w0?wG=x}L;g3O@7s4xC0Qks40OvBEsLY#I;=uR;SYx|mOQZtw6}Tpat69!s|r9N z6KqgbyF}QYG61H&9m^=Aq(5>I?j}zQ1rCSGTYWXPJj}XmhL7w*0dx1fl{wk6ruMW1 z4c=&>R(X0{OUhtJB&wisv*eZJv}Y26>()uX-@bK)#sy_efl^N24;XY10JxrobIBxp zLRyivsZA0(CKlGt9g8AD+XKFbjy_(hqz(9NHgWaWhhvO^^uSsR$mKXrSOMR_Dp#?* z?gP^AV=#bF1QQ_%xpljxNNC>Y>igdaC?2()0*VnMP04-+t;u)Ys&9NqRx`M6G&+B; z-hVn&CL)X+hSv3IH*Y)2gvC8V>?Xh|i<)un6T}4kXc-aeW}vIbe%nF zAC7WY09jGK|9WGSjnfFKaIwi&ehO_^W4tFN>~TbQP|#C; zFfz!GT-f`_q?Tfst^HQ!;DZAtn2KY6NQY|pV75y{-vL*GynEH3h1UboK@>(Cww7Lg zcSrkbrhw(KW7j*6W>r2Fh0g>)9Suue$NSFoZ+ICCH9FuqSFu%1|C}O{ICE{#@%c>b zHWgf?m$EEU6V6! zE1r%8SmidXy=VY*8bw}S{tXa=ZO~|5fj1~$+sipnR;J##(404eL5S9izrD3{9^m{- z-4>j4Dn^ULDm-V7Z9N&j?!bcsb3rQ;Z9@Y6x2o;f@s~IEecjQJ_DtZvt?|YQ3}SRF zIx#U(tbblp_-g|Gi0A@P<$?F*15}-ce9*S{9Wf}tv5gqQu zAV;$*QHh`rUvIv9iahp>Su7J16C=5x^e`dr%{hMHRlQQ*12+A97b#-fFre?PYmnWp ztzC*J%{cvSpTUH9@K$zAJ(hSU-_FVFH-2)Wf^7IUs)fEshwDk%1GLu&T4-#eq4t(+ zorc*qe(0#$%aW7+%z_IJRM?8D-iH|(%AcQK-8B+R^cea2h~hVVXf5O_FPxA<0Xp1g z4%>n8Fa3&F$!ov6S!42~u)*v|4UcSqrw+01xUB(xb{NIT>f_4%T&Gv)the6Vm|I!- zArq&&Tn&iCySG3bks8YQRbBN~$LQv51aJ_s{t$fv!^6?nZi+dQO7*e^;D}ylgGo>A zm%hLLz~0(CCF$^X=dL%?uuOC2&sRfLU4>?+rdD|;ax587C#0Zo$a@SCHjM$zvkdvb zU_c5PaW=NA>T0sF`8Ti%pkMmqg(E~{U#b$dD>{Q;MzGg;zpnlMid;>gREb%I)Gy*H ze@D`9EDr!R=5V1e+rZZgn#bx{_6{?jjim_!L0=J+&eoe8&jb1}1C2}vFL7Q7L;vsI zWM<38`XNyr-MeoT*FDX>6FpitHN=Vpqw*orIe2;3qWIOhGrsrm9NWYPA%RXZAh$hF zc+Q&|ukKetF2oAniOY(-6kqAS%c)um*!7{^N4^h_?7dU-)o$-bFQjwobhxhZPpoup zei7f$EZr9y(@sZkJ`qfVGOA()c_}Z+pY_uazb}fBDoJVgfx&;Vhyz*>3N|F-&+4KWEo#hVqg9 zh$;c(SrlJ-0SoXA$+0+RM8u}|7@{6z_MiGf&BU6+qZ{w>8sKdm-AiNlea9RhtLPcb z$|J6|YzN+OF{lUra>WO;lq=~FhHNb z^5Y3zhpH}$8BuSJV5|?M=yN)KuiXZ;{=4e_593$Qp_f9ec-h~32~molrx(e)3=7~b zC<&PrFYU+7P+o{#g3FA2)if~>gnk{X5CZ6X3;Z-*X;B8rj|qzv_%0551J}i`qY${K z-uL0*K~y$|f>ONI3fkxT}1lare}a(%C^h-c%x#iGOp zgMW>b78ltMpC;K&U`>#zx^eLSqBYm*;cUU3`+?u!+iV-CeN{9b|G*z5i3S(nx(Kk1 zla8K(^wi0=Id}mW8n<3X$3RIl0^drWeuf!vq;=Cn5n?&Qtaru#OQQy z23}iKdQnJ~e0PnOUk}5FMepIjzpR4vYF*o4DEH{){Nf0*Nv3cdlvn8wcH0AhYy+iLs|vLpbjFcccTo{*YM3@Pp0y!5wJ??#n7>v4~}0lAmYK^dDr1pm+&%{fP6f4;kuC` z_pR4kw}UHI#4C}Cp=_-_ZcM1>R2Cem4{hFSM=nST`Cuacx;ZY)@WWI1bgD4JTZK%O zuSAqDWF^r+aPr~>IrZK+tM4`pR+s~}33m2ykMNr8_q9#CEhiR7WLDtCK`U3PNu-pJ-6UMq! zb?H<=0N)3`;$-O~Fb7~D4z#6F6zR~19q_|+9FH19)z$O`|ImdV$Zs@-11vULEQ~l! zDTBvPM6b=P+FXv3^=Fpu2ucf6KfZ%VXs`BzVu&vc#n2We{DZ#tIdvZcpT>NKt_3>=OY04l63zR?4oi}eG;EUhz zf?$p0_w&ft2AK5BQbY&6wgN!kD&$(L>(H;yJ9O^vTSdl^@#B*)dk#)2+0?GBfn0AJ z_pL592C`A@WKVCegzdjqr*f!Zk>^ZP9_#gkjJILI^56=;$3qljG?V1t}-_^uV|+1oN;6i^9$DEh;KP4!s!oBUzbyoLJf5TDwT_YRyEq?>HaKC?W@UnuqNHxIM%(J$#Str-piTA?T15MfwdcfPFI=tuy z0_lQ?>(}plry}o!!GA*NOHECUl0F_eQ2^C91Q6uA_cBSdvqVh6a+ZkY1I>r05@G~` z_5T*Wf0S53=%qXiHGTakosOf@uD=eG9{>Na^(JsV=iU4N2V)t_2xX56QL^tfh?JDA zLdjA{DBDzwNDE`h7Nta%XhD(`*(+O{BvN*wC?Qmm_W$$5-2dhGpT}dqkMDio)aUbl zzh38D=Q`K9&eI%~#a%A_S=Pkq(r#oa+h7e-pvmthQPnh5$gq-Sj!J19W0QejDuzvq z@5L38Qa8CRBk#Sa*2r*oT8Cd+tCBFcWkhhM3r=PcKg$Ng9*xOtGLV|u@u8CT9J)ts z$)rz5mrzwSb8)F$7OB#s>%@rFK3*qIEWY5NFOg)>NZO$T8Mv}s&><*x&Y{b?YMIZ+ zkN*3$hvH9K+qOH51PL8GUKI|v8@q3J8E5Ma4j@nho0NjaBsDqq>Yo55Aqof0{rB4S z|Lq8{ikVX$v*mqRz`9s%i>GdWT{>1@ zdzy{QP`;o-3H|8(uEKgUmFQFGk~!ICg(rS9NVtHFzT}DUn@W|}OR=XyjwvO+j z5D|g2>}rop0e=v^Zb`!ua)_>D0~rlLqf$~eYUjW+3I)IG1`o@27iTeKy78g@DUmO4 z{*$J4=+~M6C*>|({vdY3Bc`^F{ImMW#<$;%UixPlG33Og`dKJO*FWa3*g15(HCG!; zKD^{6Ke`k$5+UcmkeWGpImLJ0HS`eG2yV`R?#y`eV|ooo(vU>rtMC9|3GJwRg2{!^ zLQpA0lioya4}rRNJ@vad_%L;;@WA;i@9u#Hii$5oHp8-fcofl0L7jT$Q&cVeNVX1SHmv_G?V6)(_> zPoG?OACg~imm!W!i$`p+@853m=c#GS7ryL#dc}*wg#StY0mYGxnz#2rDEb<0Usl&n z7@LU?Ap=p0rmJ=aK(pjO-{#wgG5(Ib8qt;XNg6ag{&D8V$%yvPeRv*VTyrQaf1=`A zV5fgG&g>5In%uTWtuIdF@5b*coS_QNsjj6c>I7Z#p!Rg$y7U*%gl{pfJbg5GpZ%He zCv}LRO@|I)0Wr2?Zai{1c{!rqHTyP>yJX2gEAMr`t6|z3aVkddc--QU&)FMGO!Pmr zL(&XD3c`hsq_2NC{DSL-tm2*Fr#lW=;=$PtzHQ!3J;It1E|IGXi6wn-W)4M2gy@g{ z#GKRG_CqgDQ$V*IdU@HYG2(E_s2J!kdPm%eTz#p9$n8W#2l}7>I$;$c@g_4FUm?hCU6iu9 z9nyID*EgJYp%Bma0(Eyo*!{bH@rpbC{dc3aH?q+%Wt2^E{m~=y;+dPZ)1~!?9A3OD zD3xxaqgN=ztPEg^&+s|b+An`>r@a81F7^cqnTJ9seE-^7r|NvpZ5df4}Fi+VxvteOfR`!bP zqY!})(M!ZmPPGX&yQ31{)BhvEx=q@6*8))qJp6&&@mI_S==bX{(^aykW9G#bs*2at z^9m2BlzF@!g$Gpnjr8=XwH+AjLjW`nrz#WyQkU8>n& zQL;*b;dY;;FAgzWr(r)wIeBfDnZ4p&^v8OcR<6Zs0o6pWOuJ(-f*mWNFvYp3^ z#~14zcbzJ(w9uY>GdzVXV9KlU?PF<{F=ERn$*Oh)dh?Qu9)=IFttaYLUk*4JNX&ySsv)kw3+ z(2GMA7lsSa_RQ?ZG#omQQy-TeC_dtS<=VV^<64CUu86mISrh3vaN*DU^_Ba@sgfpd zauV;$)TFZ1G|J*I6M)1P$OKfHM4BLbY~4F}WH?V8;h$ph_mcay2`zw0rvPq#t3S9bkT zJp0_VIa{vue;X6mVnCsb436d}c_wQR%}NjcYm{KJRz=4Ec>B#|EPfDioo=)W+a=6u zuCm9Qj{!IDXm*{LMsFK?3hfnRxm`U5Hg4QF<$0Q8jQ?cU=IsJ*`+zj zNsPDv6wGp9J?eVQ%hc(w7V{{2eX#EBjvH?A)|8G{vX|Z|T|~RtGHv3)S!A-jiHf^{ zgByj;?V6x^@GS_{;Mk+@_HLPT{)3}S0}rgr4yaRqsWX1Y^YR|jsM26_8=U1y*D0-k z&JZ?_1R)VdX1H3X`hMS;xhodZp;M}Ve?#m7ryLrwfvIRIGm3xcFC3xLd%DN?U`_KQ zR;KNv@6C7~cU{NWEpdjqxF5WFZK**I8-bYOH4Tu+SQ_TjPZ!PqFL%v2J<~L*?COh? zgWtpE3@fvpY5^g;DB~8udRT%qbO;)YkY%Foep-^4cBrX>%JRQmdmUf$~xD2 z?mL1Q#p=Po}63U5(QCdWHv+<$TPLf^)RiR`3QkTb`O&(BFyR$W8HF_S~Aq$ zghpywNqd`}S|}LB+U=x8mwxaIpUFly5MLjO~!8~ZQ zipQIjFmGLS=H0OI)@_|j(c%7e>*mJP-|o(Z>h;$QrkW=J;Zy3u0%$B&6klcF)CQ58^}}(f!dh>J2|hSu~oGz zS^-43W4=GB&HMCeC%T2y*5M;cuIsFQ*}bXb&S&Y}Bg}Vz6-WH_S1PgU?(P-dah=Py zwr)_6UmHYF-g5uGmDx7yI{2nnHh7 zEKr~3bU1Z}5H%LZt_$hEt3|5@?mb-xJEO1AnvuTU(n(TdI^`l5^wsT301g)3BJ>fOavDUGg3w^19>uY_W&ke@s*E z`}dxF`;^?|m{;Qpm$y*+t+LMRLBA(b4Wk*ZeXpM{+nHHCThIiAk!ZU`NJZ<#x9@Bz zq?g=3S`T}}f%G$ABsz)K4Vi*C5%X}y?Q?8xT0^#J0FzG9G5-6LEhn9_F7*EzuUXo` zLg&DN1L9^S8Y`D&p=KEs@0got!*sZa@~q<4hq+gSOF5gyWRSMa;`yj4eMy(t*}WU(MTPml8+}tmoF9IiAKYzlJ`;DS2GRW*WQ>3TmLGWL z3k(us%WjOX$xsdw`ZTe|OU zl<)h)YhH;^-gbw@o|0w2w+eR`G`TPlIlG3x8bd`Y`c+V2JI-^%uOF_l*R1s>C6X39 z78(gDivW-?jh9*Eu=eeiEAy61pTWQ3|6^TQ;zyldi&p z{Hhp(rFcyY(Q5wJ*EhuV79wV=Zq1Jdz{l${TTV+OzjCw!8ITfZQiOP?%pg<>yQ+-WbOrI(9le_iEets^VrM0-+=Hh8KHz z-}Cm;_xm#cbi&DyJ}61Xqi~L5gxfN=Z7+X|Bp!`8mARF_YbR1)h1K$T@=)nhD5Hj` zuu0`)z0SHE=@I>F$w;?)BUi={pkt#nRA3jpi*hNnVDV^3k( zpFtMPp!BXhH+*&Ts5L&)xO)x@&O{JH6pbmvgKt|%O?<}WSbZ5_MZpow>5yhF{q$xK z8PbL}I1+5`@(Z=o*g6aK!3L1zE?585E=mv7ZLGNFTvT6C7U%yAP0Ziqb5Kr#M$xuO z2QnVDX?Jnz{126Jbx`9<>%@MFRvj#;gy*eXDVQOcc`cuW%hYSezR9t7EYB}#C3X^Y z$!xen3ab`(r3@EC6Tmp*l7YF4rykbXjQq8}0;#7w0$^=^hjeZYb8HDeb~Vl8@=Ab) z@aTs&p%@Jk;Z4>SWS*HjyV$w>@L~n{WjAzmC-M40=qiRmBpHQ5LvFk7vu45>(S1J(dhEb!wxcO5UO$#GT4fuj?eD_Ntdq9QIwd%_&RY`1U@E2~g+~c-v ztYc-!`&35r&Er#K=pZ^)-s8yOpNAy2ua*WeCd*7FO@~gKBP$*dvwszrH1JyV?LI4h z6&S?-^GhF3seOk0w>fBtkW^qzH=>JJj`CA%cvm8TLl{ywAxvQJ4(d@TG-jMqmM=)_ zM+^Zab;NlkYnE9of2^y(gI&7gAjPOpQBFC$PJo*@VaJaiV{CA^alhnILG*$|b8eJv z$moX<@Q6;PUf8d{(2Yry9ir%?KSlds&k%FdFU`s$Xzax$Km>ZT9f=z#MV&@CRF3Ga z=+Nq8$J=9<^!C8RZP$%DKkIWtNn*(7P0lTv446p?rDq}^TWr5TZIkxx-;(@>^LPW1 zf(!vvAGbm%Mz=v)xnH5?^AGN}ZE9o9V~0K*cVVk{-Eh{M7I?!8c|?qSQ&6C3cRJ^S z|Bk_BC-Mfqz&z>`B?Qe{-#W!~2me{ckxLe2WZm+2E@7oVx?^c{2E=coDoXP++yb+~iY zkAdjLH$jhdHaSFeHSKgPjWl6kU~w4FJ1GFIlZyR^-LaJtj&Wqt+*UR11>Hl2d*&A1hJ z-F_Wa7+p#OUiWK^MSOo4hnz1>B|^xKA(`nWjNZbPL3|3a5A+C1GYyYDe6uvwx04u~ zVoxrPyJDGCkB7>>^KqI8T8gQpu{jH6(HK;nM zLXT0?F(#H=nhuBe_Q#rE>8e-P;=P3| zyq;nJ`YC~@l*FP{gYGdUWK=Jn{HCI@2RemZlE3WyKmnmX`^B|MhjmmS36jYFCd^Nv z0$UIlo2dQGU^pqY6Rh1>&Im1|Z>0;R+YqsLm5^aXnjA#wxrt$t1`}wJY-G$E z8^CuJaE`x04Q-)g9RGcQ`MAATRvu|L^rCk=>RS=<0bowfia8Y`vdRe^GWWY@v7VDj zQ`5kBi~Ba2FY0s(IyfP8l~F!i>H3x5`qupAm!UE19wMNDj2v=xb<4axx+n5Ve9D~? zLo+|#+GDd9HdI5`enn)Sei{hwf*`nr?*}wXe?}&Ch>BaZN@a^BoLnxzLIM?xm1u?e z+~VSe++AQeaP{2naNT>A8A}FMtVdU%L1=T?^J)G zly|=~tRZWfieoieJa|0l-Kg#iA8+Fe=W=-(RjUF={$^xOBsiimlf(*6mjya{O{Dzf zeH)T`gwq!*9`Mulr{O*m3Yq&5ITfx2MvqF}5+axe_>IRyVZyNv26G$T1u zM5PeoW1v5kW8BJNP3h_xGGOEQ;>+m)PMP*A>I4sK58@XkWed!15c~s!EXGr=1$=fe zus!Yaf@?0PNu1oXv#l>&($CWmt7B}Fw*`D0e}*kXP9`^>G-QhKAXXY;XT{yNkvXW_ z5^4#^JF3=>8>UfDk|{%Td(Mx&%zWQc47Y+=mS{%0*dB65lI%Z>`mhh3Kj%6HPK%@nrFwEb(-Z)kPQ{%KTEigB?3n zWT{f?)(}W64M0Hi)G`Bb&%b2!YCnUh$RbX^F{a2 zP+oJWsYhJ=?94K!z0WT(vO5+beA8-IM=xQH=Akfk{t{az`+`zrSWMH1U0^h0WIIpw zlM24rH{ERBD)JVzhGN39YqYhG%JZR-57Ye74>$UMMyCJ~vw$YVr-2OF)oA$d4VymR zo!0kaf30z4wmXdP(NU3zLXNwQ!uMX|zI&_~{1n$}=Ivy!1IxPhz8%=YFSXh0m==Z% zL3n>GtxoK;a$%+RiN>d9&7K|1#fywR^POfT04WMt5#8c3rUxgv0u^SSTht=1ref)O zSOTBKLAOW#?QpVuWJiYN>9a^YWs1qWT=b*Vq`Slzn*nr&sI=p%TGqOC`_C7kcp^u? z6AX$^!q7a|u@PmPIL^7aaLE8d2#uBEK?o2;BPwRRQ0*F)oyX@v$9HK%1Z7enJqmWGMGMuz;_vHtOH1x zZH0uqFKf7+ji(qwiq9OiE0YDSh+MO_~P|&ieg>G`4I{8@)lHTt4LJ3Hc zM~&ghzSA$v%F;@L9t|s|a+6^$E?PiKWfn^e>TaJJuY=e9p~Hur?q;WcX&-app#l&V zCa^(dM54xGs?29d{;NIJR@1_V_h)~EOuK-s1`xd-?l+I7C zD@%R5#$2#)3V!sTP<>YA-OP%g>d%2BzV13YVo=Gs71PWAcL4jjXeaIaWm17Go}_t8 zG9E(!_?8~!gm)%^fwA5Y_YvzLzq5{ELnZdGZz(AZb zg}6Kydjy;<#wIBJZ-B7kCsL+VUzB$9Rh^PnY9J?lD4vJIn-%Z+!B zUsn0I^2K{I9s<#v6aDV-L%zai{;cutQ90V2^3*2WePv#CK{Eh$rhQFh& z^qSbT+vvG7ooy6Es9R*%Z@YBIt;26oydEG18^IwB{ZZD=T#U_;$ftDqOm5gpA;jLr zdbloa>oG7h1R_m_Qc(;Z&i`|{gOTeIRhS?sqg&LO_)br#9yenptOK3eKmYvm`s=;l z%mV95QCUeTml4fn-sMZ5fG8D{r>;I2^r2=a`ledC<&m{JDF`6Pn&LNu1nC%UG7%V~ z+84C|B~&nn#HR*}9{DF^4!BmZhEnIw&1tqWLb3div9aSWEyZ=hmrO3q!K#4WN_D8p zXNOXKcw%v;guqei(!~qTRfH5|4o)V8DLUmATn}*^=Xc$D`qZ+v1ZXemFDu=@{lAAw z)TzL4!Q6>{jY`p|de);pZqBR}a zC2T6Fr3f{NEJ(p}>Uc<$uk&PgSd9^w)m^w|u9>p7y1{jVi|AwI=W$f_sxO)^z82uY z1lUfTh5A}{RzKpBp!Rs}dAI6y;ta-k!=A!J>fIi;<(qN)bMa}Fg)I`EnTHLcXjzhV zN(Eb>oj~Cr^gc2<&_iph=F4_(FZGgyE@>Ehg&toTv~Kk-AIAzQ3>|QZ>$ZG?rIP*C zsmTugg(}8LMN9<5Em5%81-PR+CuL*{GJk52Y* zNg`Lkga)6WJ+igPx}&S9{wLFCNVy|kD#g>*)nrk!$%PZurNCMQnGEMX*XwGt1XWnj zA(=X?#V-$k%BDtLN1DBGiwt{okj4cVeIo%E7`I|yH9PWVVwyG3{fx)kD}jUEr*v?3 zRsI9>kcT1rzMmS1)j|*5n2YI?VpgWf4(%CbP3X=5NV8Qm_|^S2eVcSu@r!{V>`iVtV4eXmmJ-9T>y7eW~RO(DY`h>bQ- z5=rd?kgHCAan4_mzyz7mlcjRllyW%y3)A6UK`!+bB-MKK;xkWMw&6DF^OQ_t*R2-x z4wkry@Sl}>YDOId_GOLgE+c&e9LkBw(QzxrvNGchiLjzpgee#m_-dHepByk`EX9Z{ z=VA_+(&5HQTXnM?;F_cKx@4sZLQnPZ#pld&f9wl;RK#I>F_u=c+$dqh;mx9N&**f< zy59)xz=w~-)CwCA5$4mE#_r(5YP{+NMH0v{u8r+edT7>}#na-GLXRI0B7)cMj;-|C zp0li0wDF{RYy7(QF}2whJAPwf)X|=aUCtVOn)_RD zqg@M>lc9rWFELShtwpl4?Uct#M`!Sy%_gUF`7X~ZWug$XqJ1`Zf-6#0~aqscAJ2L=jZCu3%Eq?M=h@fL%rt;S`mQZ%* z)4OK9HSUd5@i;?-mdBrA1K`q*4ipFb5Nw&quN|`F=;eLYmF~5XTRN*3xEYz6=D4LW zA8UQb>qecvK7>_uii@wBkkRrgLM5} zYpS%t@FWWHp)@{cQsgh2Z_b^|zcj*J4Qr|%|M3E#*$n20nf>cWNNLR&w3mO-IF=^9b)PCfLVUBfhm=Ha2V zd0)h(+PNC1;(y2TA193?ta4==+stkOrcKngU&JksA{;0#)FSHbD3kBgI@e55&dT11 z-0ESFK{I+?w}@{cVaGKdWZDnqrRFmHDM%H?_<55ui_URNtt?EfE1NcN9>Q6aV9n17 zx?k2yUbtx{mi?FMh4RXJYHAkvxsB{!TV0v>m{@LLZ5>F`XEC{yVJGKa9maLY>eF*J zEKz;!6E4)CoJMvCiaKo7>ebm5Lu-v4y7q7PuKijbFu!G^kQd?M6XAfd(}ahyKeBky zqWWU}AduM7`TM(^b9C1vDQymzCa-$4;lYoQFzC|UBuvOO7v22f6$dtUE49$`bRXni zBi#b?{j9IWCXwk$eQ+f^` z-p+#)Cl3MkA`C*9a2?D|%8Z!p&-tV(1P#L-D|PBL5uF{n ze>7ntiG1qh62dQ!2RxnE{E=gdmKw_kqvQ>zxBPGYCwq0z1ZOcKUV_&&RHO4U1e^UT0E z{w4km>emWL@M=)`i)-eTv(1k|{K z5wpM(^_i?9=-eg|N`ueW>)Ru42M&qGNzO~jskW%EWV#v8xsVBEOy8x^PrgI(Yo%#5 z#mGpA9*%1r`YE8|d7>UfiMvp!ML6ZS_AKHDJ z`%&|7OPnx~eaqS%EJO7QCh%8oTeGe_SE4culwaR|{k*u3wAC7k^>grnOD7^Dr*g&~ zJbruveG@W~K)%7X(zo6|&ha53&THcra=T~Fn$@~P2P4>HcAdigc<@oF6C_R|O2*rE933KroFI=s1QGMD7`rUmy`woB z0Co~|a|;X87_Hl`5&I(;H8%$k7N$3+CzJ;xKd;H_i+O`6*WpdtFo&QwSL4L_)H`<= z9NPfsq1AkHM)HJ*3wGE`4`}=@6oA1Zt!z zyMg!ppOa9AHcP?uv6xYXrR(ymqWryZX&=gjO2#M31o_a^-w@+gJtn6lSkJ~>AE>>U z5)_D7{VpAZ!2BqeN*#UWx!9^T#0P~;IX`*Qo~613zfC;!MN{+%COe9k|4!h`vG%FZ zD(p^>Q?@QIFXx`LQdLcZ$r?brhzBd{Ianojo0iY}$B}^<4$8esot};Tkbiz}=dRDj zdbL#Z?VdZsHraWGXMC^R!G(Y34(6xUzJ<087=4v$6)5QA>#I+CCZFH{uZS;w!BFrU zt=ZJD_a8qtB;3P$E;Wdl$?GAwiuMP)^p6phiXHCzyuHU#4}vpa^M`7kyezS|CtL<} z6!S9sBfZqs?d-d=(QO=GPI^!{_Y9PSc<`VNvAU#T-80q?^9u|Vgg{fdhmKAF6bBXx z$h-1*9oJWuu)T2Skfq1lw{O4XNT-e+Va)u7KPv+%F}L2F0EDZr^4sUF-Mfz*c?gvJ z5Cb_lz|d8P9)Ev*qXB6{oEB&r64<=iS7aO-MC%226F+XXlY(}W4#|LpN_HJr4ztf}f?=iQ&T+pG-S%yApW}gZbFbXSDH2kJ zulu7Dc!RSlGuZ$o49u=_T>x5+To`a$?YoWh*%bs~sE8jrf8dZIw*e;S#ym-lpolWa zXg}_={}TVlvDQ9*exV2c?5Lt*fGjaDyMMdi>6so`WO~+LdV27TR;F?4oI?pg8YXy0 z;hEr%O{loNAe{8|>fu2d$iQ(5PgvU_=Qm0VQ{F}+Leouvj5Z_L5F=ua%DrDXCc^w2 z)FG{~&6J7KRH1V`L+6n$@VXTsrJI`C21q^{K*6g*%sw)O$yCG!=we4GXauIGSM^Za zv~MD2=U_D=c20i2A?Fw?i(n4B92D`3m^=5Sd-WCIpe^z9^z4gXEH6~nb1aHSBjU?J zMgO0|3&Q0hR32K63PuXT9|A(@$@Oe@Sa~DBO`;a3k#g!7ZVY_-pk!u!GvHl`Pfz0A zb*T{esy}oA?2A$Tt*323&-5Uw?B1$I^7e98qOCi`nb+;xlWk{X=s}Sy71UcBz-3F? zdJi2i;QmM&dtE6XB2FjBL^5BOmmH1pUWbF4;sGrCQ}~DV9_5LVC2v#OfJ4xp{>lFM z!H;|P?74-eghDJsaW2lw%L_>IcUms*>zHatjj_vwYColfY+_qEh;l77Bv>K=FjFu= z{TVgh0id&6?s01`ejmPLp%zY-ly$bz{Y^GiR0n3G1dU zTO3Iuz@YDmk$!vkjsqY4!j>0^CbT^~vh91P-Mu?t=+K0pRRlW_2M!x{TuRK+3qOyd z$#j;-@Ye#gJNM6bV%}!yy*H=;7q$b?be=G8-qA@* ze)wBiHHiSmBgyVDbf_QbLQHiL;$Q$X7m@3kjDaepG-$D4yak#HGYxJ;*(LnDaZ+!; zE>P066*cMfkDG_sfdf9aU}nx5=s6rI)EQ|&@B@cXcYBpW^_d>w zXSqN1RHxkazZh5g?b`rW4U${CcMrB0w)}F>&a_+@r5E!>q|5s%)thRbtW>9OjD=-f z^n{tt&Lb!T6*aZ>=Yt|--O7p;Q{dtk9@6@GK=IBIppv3 zd`_m`>u%|L)RO|@K5<_X2OkE4tL7Fd#&(Xzru#Y)l^{}N zn*;lCCU?|rdldA88|qyedqpKB!AyPDg)EjS4TJ;!{v~@iGBRRoh(Nle-Z8v3QAH8b z<*V_xrd?QO8EPX?M(-G_JPBg*8BaUekM%d4#h&$1FVeA{`g@rpv9}hqjab90BQNUE4ifSH5K4 zJP$9gDaYOc2tn6-E41Dj5wFyfpatK*iv5fCEv=%8mF+fOyEc-6?^LuuLa;&QU(WD8 z@0FRZnQL49g7C&y9v5n+scKZ!PWcV%E^f?k{z}zlZ>&ZaY;_P6xPvea!&L#gOa_Aj~C%iParW ze%)BS0=s@ZaD0y?}&tXU+RSjN&6Av}t?m#b^FZq_NPLktjRF1h^kP&!ZJPy*xZ z@4W#vNh4nL&TQ-TU}j?8vSmBL{(L+Tj66()Tc@9B--9}}WKja_v5b_de;8>t8;*aA z_}bdo+~N?QoF3+r;oWpP;6iLvw!6K|kKFCmR?pX5=Yzl2t!8SsYbl+N zy4Th~*m{Xw5J!qP_OXy{xa_ILOE;a1#v@TfIKTsjP-AOZkHLf6Fi%gEJN2}weXBp0 z`yM<Yom(OG!^}>^6I5 zf$hId`ATVzxD^YgyqYO5Deo25#vdWEja(P&20uU7oAUZhx*4vtcr8 z3~A63U_f#_cE4?(3f2_h*V~6#a9e^S(*{RPzIS)a&CR{V7zpnJMoE;34gf;7?a1zw ztSmp=Vm5JyG*o9aQB#Nw5E4*&pgPh|ovMB>AT zdohB)4{buC=r`F+MHa1!PaZAC8^Udp;e!Qt@-_$YXd?UcaN$p+Er{mT);o#}k*Nxk zbDpQAA{;zmfX0Je6KNDUI6CGa?3@q!MJ}hM8m7O)%WDx0I1b;r<+`k`uMi1wZ_EPRA`~_ z%|q`fyn<+Q3MR~&_#uD$qc0!xNj72D@o^N(wSOiVKJdvM*QBs}Zq`joOtn`#ccyRO zR~Hc9vWOxFMSeg)41%aMFnnNxy3Mc)7U)p}4jH<%|3&7m$Gll%a-Qmp;hhk@%}v?! z6-dhKtr~V4iNQj?)ATU2&5!}}sfi|dQSs9>L4HX7*DGlcrTmlNc$j&L83pkfRdz-c=BoSShQ>vn=#TXTVAPt5r7*{8UcVref7SHu zP6V5WXBp#ew3616^Zn)rX<;UIPZ~fwYwf zi7d;|a4TQ+A)F6?U}HqY@~9PmAMo+fqtDE|C+lRqVa!;tc*gRZ20T08eh|7t-e4jH zRx*)6h8HMsWuxr&EzO>Cti&HwQ1jEL2WW0?p--WuIqsJuxC19ULM>(vnkBwbI!v-FdRz~ZwF#}Z6F5=6?!7k>p#$^wj_vj3}&s7Jk~{pMQF4Ys=I! z9T3|tv+JR)><6MseEirS{cd8u`Ez|3<;mysDJu8uswWCSa3 z(y7Z?-E4!QhLj%#Gu2rhC|k!Cad7aKIE%-RG^bXb)|DccR46rJ+oQWUqj$HSoO5~5 z@#DuK#}P(ufY%_ogi_bkeNi>zE@AP#bP+k#oQ4)SW+^^GP1c>kXA;g+P({I zZRt~`;5lhPRV{mbM8lX7RYNA(iZBcJtYZb)mBrk@yFK`PQ(d9)#+$aUT zT}zt{i`#s%FH1ggkR3}21vD?^Pe%?! zp)EqkGg<8#fVO2QjDm@PbO0AlS`(otaEuMx=v8gF+pC`r3N>3MtT}8V123OTd9D7x z^7<+~V-%_Z*|ZIMlv)Q?5ks+qz*sHSsY}J~Fem3GjUXUy3lQ-7!rC$fT|z+9u4GB? zRDvwZrXcQ(6k`l8Eh#mKg=LX-c98QzAxXCw!M~_1IptIY$aPQu>8Dv zUr#)4`o|x6qHIN0vWPY&Zof18b!>MQ%)$UkDrmxpUnPVF57sy-V-}=*K;l6nSHQM< zWU06L`9R%?tQ_P$W)69UL*h|Dkg?&fF05y3BltH2cv4D%D1`lC-otyr)^4pkcDw`s zA(bPKpZBWQ_Fx;#)FV-JSA}hmUOLc6AwmtJX!8~=Kw<&;p<&*eUi8;o|I963ct$uQhr{2e-=d=i8OYov2xL=yrI6J z);bJFInep*JOm}By0zJ0xxs{6_={xL(A*#qhJiO)srR2NzX>ERyje=hHo~Oi>+ALK ztDA^ovi<1wBd~ovTGw$8wcqon znVB&aEvF5LLzN=mngU}Nv2D?_Q66qvs1@19la8lr2)b?G}wg~rA z@Q{>6SY-CNArn+`TB016u!h~53h!ny)k+;I4c9jd&!S1NgC4X`K)@ZSa8AXk_5Fnh z2pYqQ+Pi1ZQOgO#x^)v5Aj($fqMU{bh~Za(ZGDEq(P4m+*rWD3Pl@Wm2O}YLGJXEG z9>Z%$WfXxtvXHxrfkN;T*S4&wlViaT!wf9#g{OZr_kxcfm#!O187;Aydc4n~9vqBo z>ICIE5|j(zcm+4$qHTlnluZ)XGQVkSXow7e20Z2QR*p*)3%|-=RkaIoJM(wd^9t=_ zhu{9t=VQC3Yzkk#Jd7M%bxGr zEIKk7d51OKEP{EIJF@;eFV8rsP0)mwfMBr7IYJ_;hBP#_9kd-oP7e=x$GZ`UEUepc zIx~WM8TUjS;OAxDjn42*)7E+YcjT}g+Lxk9cC0XOEMrCjZSSf-)}#FZs5pxc9sfXz zEuwBzKT{T~q`r%AJSRSI>I;w&7k3IuNdSi}T1>ueX!oXS`rZ#r!?Wx|>3sP5lZj#G zC@K+xW8$nOtuuls?GqW#Wx8iSpFj8WXRA~F6;*D7JiWbTH^aJ*^%lZqQu^iaoeqt1 z*~g?P;YXIrGw{OO&@xv(0D%Aq`vr}!UmugU>pSsY5DjWEP`|8e6pjUwdJq#8fS=-7 z!<%N=52f6fT}~sJ=BGFoBXjJRX8-o(Y+W4%my(~_KmIMC68De|^g-o?h6bxlWH<&q z(ndukffqicVHyoQ1vsX}Z{s5L=$cE~)}07F&-%U$-{P|)a?%L%!8n`((#O*m@#X0^ zY}6>{-Ma*m#aWUdw(n?Ij0)JtqjvrUh!iL2cO*zOb4$7ej&f;Kb-~jcAr8(;9BI}8 zKr;emW9>oDes!E+ z6SW#_h0?|LfRdK0)0tsD5M~Dq4zXNVU-&rX-aXv8;$$7|`wt%mVLLLqw#o@w-qf>T z;%?#uI`-xazJgDu3hEeKDn^G6F2%Ov92m#w^laAhF(duxOSNCMDCk6 zH_$x{$!@`1QP`Y#ExrC$*JL>;HeW|j_DbO+#_23P%y`f=i{`|Bh6A`#%{!0SBS!RS zK~|k!pheU{eiY46r5Mcen9137XtWs=knGc;Z9N&Hi_2m2_GXEu(4q?STNm7%&wCpdT45H;|CAM=*8|-l`e-$#(ks$AO^_hN2nGH!1AoVu;jw9A-^Pf ziq|+&SjU$!iff-1M=g2KjYrC&r)DsO;{g2yOXM(V9GCvJr{{gh3jAUz3#b}ls~fXo z9p<8cJBi)z>RPAkq9BwKq0)-JeY*|e4{%G}U*012nxQ*=RKD|O9u=4kOlCqi_8nC- zW`+#DC6Y)kLt--PcCF;zU!X`VX(9^dFG7vDW23~lm190cHrU`-VZ59o( zq(BX<4u!`a)lKeM2QQp2E-PD1WZ{<#z{Zi`?2|KGuboc;Cq89Z8}OY&pdn78o9{4e zS$lwmna&XX7h0Y7v}s-3kRH*pkOD=B#pAwh;VXl#mA zt$zbu-_UG9Z~XfeCZL5~26jlp14Ydy5U&4~l0M6o+qDB7{Uu%rTuvr`4-nKI!cB(; z|E^Zk@W9kLXKPlBE&@uHBeW2R%!8sEBWtMXaO#6H>Tup>g}fG~OedLDp0a!mw%9y9q^m|`<9DTZ8rp6>fG2x>NefC7>AHa@#a{pN{-XZX?6O|QJ~G-P zd~b2o6*>c6*g|L4wr>n8seT_ND$xe2`ui2hvAyayQ>K9qAN1y2$-0@>U5|KcwPhe8Fn5zp36@p5>HzII+W zcutJjO@ef@Ljxj05?X=SEi{!}8uv|G%pKt1w)$?!78{ouiTP&2>JIPX*S6p|8KIjYLyYeSLL z$l3}(8RzE2sv&B1Ujik+^cKOaP)3`-l`E#)?y0HQ#s8J?ze9j;=OpCmN>V| zL?@u`xQVz#YCpjx%~D=na`+e8OMxi$Um6X>&j3R|V|AO0da!V5eEJkbf>U{)IMudo z(5U&I&8k+nh@@Z190)QXX`)#J!>KsF>U1}lRF=^E2CS#&-H7sRX@G{_!a-`Nt%1k~Q9N z#~*+G;_{__z>%v0aN@4Am8uRGWrqGcD`F9aXrGy9JwWsW5R26zysU5@bA%I(agk1A z&m*^j;y)3;&Vrc+C`|o{WCZ;oqt>Hl5F2jL&BM+~{A6O`eTX@2uR1c+*n@{FJ8aSd zK1utE)>K_Z4UkHE#B>Q^DfI6Jg^adFh_bQIzVP`naI+wt1>J; zP=Giw8}-kpCpXBaLJ(qiB0G$WUxp|hh_A{suB@^>HW$iKRwO@VH3$5W%%31bn!k9l zA;p=WmxVo^9U>bR6LhJ>0aFf6PPZ_${pixVnOY4kK{uDkzXE@}s~9WWK+!2kTM1&4 zhEbKFz0YPP^?eLZnQN)SpM7(5bQF`YTetq@mB>w^ey??ix&m&c-10z}g?v$J3~3*E znrX?;lO;*AdJ0xnCM!2=80-CsUh+0LP)ByPvx``2SO`HhdVFwc0enkrH?7wBT(vY5 z3F<%7dmF+NTUk`u7futr#bC4rPxx8CoJaeLR?MDyjsUw>`VoHtWA5mVYE;a2SLo zrsu~u^7Rtocr)7G!U8T?a&l3#X3cWRbwW>30|7BvIM{)0bsQ08gh`<`{!JX?-)2{a zSE_?tWYvSZo0%Q9;>T0&&@B~dC+vLaf`skZ<38jZ!`m28BZL+luIue6h2DjY`1M#l zE6DB-n24MA@9#kz_Bt;wk(IY6R*g)MRw-mM0hRtn2(;Cut5*lZuiJI0YRBJ878d|u5-kkPa}(JFW%Bj#FB8?3obPqloU2F>%z{s_v=H_sMsDv z(rBkW+A2_z#+*S`)k{eldL0Ihc5xjv8n9F7>*G^woHmPZ3qo!n+cJpiOD>3}qT}DQ zpg6bkqlN$JGSXSb?xgr6WbpWXXGQeH(}xi&M$o44axHP=mD;VPZ?>B*^0mm!Q>=^K z8xUX&8A2~fJgv?l8Yz#hE4i0M(T{CI=ETL3p1_>gb$*~zY%0f*f>AH3Gw62|;t(#; zID7MBnE;2r6!$^&LWJDIl#FJKn1u#w_C~CPM+m1#Y+;~6U{5%M5v$HG&>A)BFtq(y zdeX9}00pn~-*LV?0Xi49C|Np)au^ULf^6(wUKvVrCYTa^kl{I{cX@e^c*YjId)vS5-&u9nu9l+4CXXm$3ZEvOhz%1~HFjIsk zBXkh$My!%4C~9&s7?o6jdQY0c;$<;xSdB%b6Q5S3FQ8!$TvQOlCp>r%r9XKU@YaS8 zv%b3Yv5>)_GkEfeKsx1AG$;Q*#Rl$ah*oyT##U#)a^`PyV&D4Z6p)*^>qM#J2&5o> zX-$kH_Sc?oVh0u#4vC8=1qOv_}aQ|2XbQ;jc6N{c& zCo|K;uVQS+mv*rudq>GF!slU=EZ$zmhRSGA_t41|rPbc=>;*9f0BUP%%d3}?+}73r zvI8;*@UFLAZ->W={^i*<43*hc@65~3U+R?)_ale|9mZH59Ahfnejo8`Te@^2AGl`K zN|T>ulW7&?STxc+iq-KeRC5OXrv=~_5Jr1abiRN8UipI?y$fw-Y3Xdg11L~f7(ASG zjNs{5Q{*m!a0&sbF2o#4Mk`U4aAYZXb1$wd1iNAHlS~0}*}Zl&KT@DJud1ENI@4zo zrJ2MLjEf7erU)Pv8;ok`>y%z%ljOC z`ox@1`9*w|u$fWaD2@U?25p`ZZ`B#$&fgW^?9lS1OT`kN)f@vSt_Z|I@T!q&n{HCJ z$=Xpg3K5Iu9}+`PTIHd^u`ztbsQI^K0X-v%_4$$fO%FL#&n~xs#)Re`#L_Q^K&{`(3IT)BVE?B(SqW3*j zdJVFMiZcI@&g$*-CI-1xIWz8B*S0L$q%lyo9pP}8LhXgRDe3Orojf!olVj?L^%E*w zAL5;ecaU#FquH@R5!(tDh)&46*oF@>^EVlk` zzYds4c7D`nP_-ite`hkh1;$4($mTxvLnOl)<^*QRugpk^M=>2u6dZ^R0Oa0A0BD|@ zBv_Q_rjb^oL`^_zMzh&PurKELaOG8iHRb4C44`vSPKAE|L-INHrcyx-+20rvbK__e;js$ zymV^1>zO*(d44jW;uoXBv0}(&GWb@ao&3Qi5A;ej@|{-Z^FjsI;q1E))boI2Ba$k# z4VLzg#&dKfr-*(OHWnEd?f~=oP$aV6s*(E4-SD&e3WlR3me~hN_TKS}O;2$HUgzhF zOZ*6U9~_I1L!zzv_-Ger83k9R+12l6V~r+Ez_GwX^f6UcL*jG!??vrXe(%A8LGI=0 z3u~e^&WP}XJM@%Ni5zQ4O)5WuaTM62?Z%;IIt!vg%)@_g*6dbxb|5fMwpS^TFz>{x z18^!Lgr|G-JoOkUuCG$j_Eq3S^xNo;+{&5Qkr@dM9YU+P?p9z*!i0qWCS*+Y|!k3r}5 z!JTFf^nHco<7hY$fD{bwd$Lorx8HW^{mHrMutk*0lOfY&q7hsoB`IBn+O=wGG%M*` zcHyJY9(vDEE0O*sxo^q$9+jNH&#L^cRwI-6mggbY( zgR15e)uH3iL~hA&_$40F3rD}~01YkT>D3>UX?UYAk|0Ew8&8cvC)fwoy94=0B&@U` zhr}P0?6PuYI=7m!91EQwE^R}&9|wG;Cg0l3YbrvFKpWl@Ci)kIBD^(6pn3Vs>4tCJ zQdYit>$dGj#D>MhzyEZm3=JdI-3?e?^117UrH{Qxw)>uK`!$^B`x_5Jm;+(8mM=em z(;x~*^B$@EUr`s4^}B0mc#=?UD3y7r@)$7!Fzw;r8u^m!kwnt{hL6kzoQ6G+jMO0H zK;NkKb^K@2rj(8ZBS)5G%NgCewJ{l{&;4r83^vLcmS~UW@kl3v+$#ffl<7Rs9q^JF z17kJ_6_4@%$=*hf*PlOq|C$c+4Q`NM|v9mCc(&iCx56Y2J1Qt)jdzYd3@}Y=l z>z^7Af>0bN_Y&TW6FULI#LsKyN#Pa%e^Rr`xG7whjO8#|A#WRNf$c-mA*!T52^+vf z(;>JgAf(hn-g&&`ABBgqXhajWim9ok%7zhlK(vT*rEUzxvtdtYSh^2Uz$fzPR8BCV zaWUgb;F{FS$CWmJ;;V}+3hgS0;9mxHx$lz2moA-s>O)qbuKPWBmJx7MxT)q5N7{Gj z@BrZec-Jl?WLrinIl9Nxr5G?V*>l{h9Ke9n+$M&QX++6Jw;=~PcT`13GQ1Ny-Jv5) zSuDSi(K7ndH1?X2pm~R?uCA`3-P@i5ct|rHbS(?KF-C=1+DGsjj6?$E)~Qvu7xYDH zNJkwjy_=koCQX~NP}v9UMSD^JtW0xq^|4*}t7Z6=yVx%Lw$Rjfvhr`OrZ1c^#=MoX zt@n_$7lWJ@oe5}r!tO!&6ob8fea&@T!ykk#I%OHqZ+VB*RWDRbloxs%JYASQ-1Ph8 z5!cJBAM8%QeKE|=bhO8pq}8rx{@r|}UDN#apDW$6zjU&;&Yqojw6CPmo7}9^YA$?E`L!_itI_ogAwEi3+7t(G6|um=EscQ-W8YM z%+T$%rCoXXp1_uBD^@$k_bv<9Yd+l3y=NJ6tATTrRa9i47PL#Fm_Uqa+g9dC(6zGI zO7XJ*3c0XY858Cl?1u#RoWFRn4OBKb#*%XdXJ?;u^-b^Iy#>LDk0CdLUcp%?`7Z0; zA2Zc%+u0aeg`cezW6ym9_&vzZrUn=#!VY2P8aGB_r2=ny4;(Rd;r#6FDlcIuxOrr}qw9^|AJ!Sfy_=WtwZa(I~b?Mri(V-}`bwB^H> zFTLnOaP7V_&uC(9p2*`YXE@{@-=}~6nimW4sgypBwB(ePm8CEpw(`|o)ip2Fs!!kU zYY_Z^)qF`DCKv#jj;A3Ah&2S8^OTZUcw+y$c1KW9H|ZZDksxgN__T)bOCo;D^e8)a zeQQ#>@BC!FuR3+XDq(*_YQU5u1J@ZZUhE_&pudyKi&%*H+1t@yb>Dyak`K2=5SH;O zhM!AIOT`h1rm*nue7FseRL@K|EA`$}eS6%+z)P{QhuQJGn^xT3En6CWW)Sg+%V%vu z>&oOn7N6NaV8_<17)XE>XCOygF~I2HFp$5|KYe6LbI|DUZ`$_u_CG#a*WR(Nt+0Su zAPy`%*&sRS7yRhQr_H*Y-l-3($ zM?^>aP_va_)Z@b(ptW^Z^d!F1!$j7aHN#;{Sg*XD z6#DwzyVBU2(}{`Wty~I+qDb9Ezn5IO05WNKSu-Wwnfyp9x}IukV=o&U8{dEU@D`LQ zjhxVo!s&)6WTFQ=Wk^%AS=&CWC3eretG0fwySpxm0il3smI{e$ zXQxR6n3L_4q`F3IcIb5+`)4{QeB4Rc2)mn(Ko1DblaY~zQ>V71`bXO9x0Gr~e5?wS zbK>`u`gFZ$)vb}1rl#qzl0=4I$zuv)Ci@0O_Dx95!Bb~N-K}95$X$#Jk2gDyt!r~sY~T)F?%D=Tp22!`I}nIYG1t+>Jl zCFXrhqb0hoMSB%P6@!cK@W`mO)yNVZr*=!n`lK>g$tZIa%2O!Alh-h6st#Xzm~Kd* z7P245g)9XRD1B>W^As!P?u*KmB*pPo+X*W5`F7PcUlZ)$Hbi5Be)|Y8;MuVIQ>V|E zA#qcH23!xJL#9Gdb{sfRWyOjQs#lAyTb7iTN5wQ^PA`Kjr+0pCr2?Z?P>({gA z!bu}`sQvLrA-WsEqY!{x6%=f?FcFdoK+r~ZGxD0dXLcl=bGx|?tI58C_x;J*@nK)z zy?Qk~qQ!gexAX+!{A6?n#3tW^V$Ui@K%AqX2)mWFM@`JxXFgg(sH*Xe#-m<u)WG^P>b%QeH+%~CRE|=2M@?A zk09pxGi~(OKc6nUbTT?Rdd)qf$lze^=OA%Q%vd2`3O##vpAc`%a-l2a;Q7JChtM_i zlo790C_j{O`*Jyv)e$1;6PLA3h3@JjM|Q;UdEV?j>t{rShreKDnM^k6OQygB$Q33W zAmym^dUw{s++3JIVZ!9hfMuxBcGK~H3=Ei>=hlv8pfG4D-D@kS$_R8cg77-FygAfI z5#45ashXqB;6_m)lldlPWvkG!p^l&ZpwnkYT;0FF%=F&|l|v&UA{ZY?Xqp_?xpQZ# z_XI&vD@p5>ips(7UPcqX48B`qJM;>zjY9GiejkmE;t!bog7nmI5Cku-A$!lL*ZeFd z7@Rt{cTAr?TX78%HyOSq_YlDpe=p9u{REYs-~ZmeWGpm`7L}(~(eY(XNfZmu-uk`Q zfB{Wmw~u`}KB4i-;l+Hx)43d~)>PV8X>saJu~ta?_=-n!N9yS0Wfd`{0CVfF6+%6m z#7Go2^4Lw9++gtk=+W1X`M$c!EH(InpRpW=&XtgKn@m-W$V^ur&B`lOYvWFodk4r z?9%1)?OuC7@_Pt~ShZ$)!U>L|FrR@RhmbN8M8UUQ)E5XlX(1rYCAqhb!)gGm@XOpX zVHQ!nr$2qVlN)=k60y;j1ATYy+_9tb{tEXbI5|<>QbL#JHm#59t+eK_42x(iV|Ki~ z6Ct;Y-@UVi7b9k!XT%+cvb@SE9>*azx@$4g0Ad2W3T{z;QtRJeVZ#rC>Qp~W6=cnt zHL!(Y$1A@Vmz10e2=KgjPhXykwwqqPHeb9r0>2|mp#f#m@ds(<@K?_*EiZX<+rfDU z<5Hs2)QOiOT%|xs`91Jdz}wmVO8dN=;^5@eOIzF0?Hy>a2+S!QB4L_XK)ETIp!F`S z?isym2lHW}{_A$oHSqrOs}}wqHEwiJWbLW&LvO(_>;fnpAlH7_8lpeNYzVEFrKLOZ zO&lp1OL#XL6yCq@OVb9KA8unh4i)AmC^C|gUo+vrsUOoolyd*RL3R{@XX*1RJ|u8F z%@cA~9z0@6>%ggN*Ivr#p#yXUAg(5dmRqEhPPM_HamiA1%**qqjuzJKd!y3g;*(4Z zmpNGTuS}v>9%kj#g$r$&`X>TC-DO~8PI~X{=+(XLmoDv%QSc2B7WW@8fLT<(!DmWa z6OwKQTz2Sic)_)qx#{V$CM@pH7k_1p>qn|nQ{yhsfkG(?UJ4)!Q260~l82-}dUTV8 zQYl?l#BW0HBv>$^Dm!|4@sznB&eR*@iG8O+LK@Pa2e%)oaTc3dKs_?zz0>zW0B6)A zGNwu6IFW2J4@1U44#FTpN$-=s82*JRSgkAWBNQxn*!9(JEkc~xs6#DZwl|+MCzYbF zgd0jbXyLn2fF_1FY0*M_GxTVS$jwWyT)m1;vM+eDveFf5Go0Im(?y0Xff(=Cx6zO$ zL+`PFi3k{ZZ{u(O)~;Q-(x~JT?_Lg?WbobPS~DnRR6T?xaY&H!*zmZ>Y$>Op)aPw4 z0U7H1>sr3MEaqfL!GB+dE-b=PauEjF5;HgZ>VIcdA{~2c=AGP6DV{+*(f3}^eAi0R zuV3i+{9X)-Oe=aj&cVPRf)2HO^20SUMhC;=bsXVeQ8B&=9;Au>F?(}mChqesuz ze%q%mBFb`+&6_t1o}bXzOnSN}R6EZ(eTWaoQ>UUz;F6zANazl|73}{Qg|D4m(E{^X zaK!hJXdb-s0aMG&$^s%cKnuHo3M!5NsX7lEt5&R@uwm4)n(eeG`6cxcxi)4kliaS&cs36|B0&J5tW=o*OVVkSle5;)+MBXyM7N4A z)Y7MM#i`v=F~SS7k&=AiJnR+o%2M%2D~f*43lcsa$MrPe-y3aoDKc509qeo@P`Y%hV6d$F_kGD)W&PG#SYH4ZUl`FpFe$WtN zr09d`I)+=XCsIiUa>sFLgi=bqlXAcB_rqH|Zlox~MwlLIY7U0;8zxfL`1J9k4Y)sb zeIBg@bnDF4u9#(RVloj;Cx0$8o9m@#D{nh|vg6&df;88e!JM3bnJ(>@126c@&jaAsG5PnJJk{q^ft6H7}b8n)t` z;hDYt{b!N^fTHYZGhk-8S6w?c0|2fpNZS}#{^iSlW+Ba)A4Fux|J|I83<&uC9m(;oF8+mxSE}D=C7g_i*g;>3FJ((L!{1dUxG*JQ z%orPmVD&H=nw0T~$D2e0*0=@Y^s3Rg>@wp^f)CfYgSWNU~pndJY^o zkTLBBC1?zU!`4~6yMd^TU0gK54%3&F#RggT;X+Q93^STax@@C`il z1|jfwGmhVqZBSZTydr6vM+6`WWcTXIWB#W>_(=V2XKDZz2;ET9VPRoJ6yow)HR!8luN`7qjzOsIx7vvh9|xwgHIT^huQgYH?$eJL#fW2g_aY;w_Ju(~wjIRB5 zqE?l73FC4|(t2JqT0d&T9yVGv@{uj6Nk<7{i|=&ly+ zXsaM+1GNjhp<_)3;v!_{F7Mf9g| z;)_>vpQg>4rQ2&Tqu(DMNo~<-vIn$Ee`c0>oj3z*raJo(`nMZihwVxiGI1S9YLQAn$2y1inEmewtDG16r9)mHVddGs^z-2%#vh~A8IlDZxA z04yfFTqs_i*9Y)X;~LbNuq%#-N8d?JQM;@cP7aTKB4~y7phAUg)1B#Pn|h4(=9sk^yy%}3%s#>9Gnn| zjsgkgP+sDaH2?d&oP&8@#s_+CsT|7vmA(OrnNs{peRk~Me%IY{pFWkTpRN_z=0{Oe zF-1!^p}KJJigot`0e=1eH}sRU+?X-=nv4l$WH4Atq>yvoS?s{jcxb_MPz$(tGGLz@ z*GUPa^`1F8sf)h^=^bE+`tf16yEDBCy`1yfwV6+zG#R&g^>DzV5V{;5lo`^jrrc-# zxW0{}qZHmqjL2XZNizK37QX+2nh3b`sly#1e^MoFgBySwgX1?@?uGqgJvByY#ABJq zDH}zAOg2z@2xlb-aO+&rH-CHn!Cfn2$L|bqrbYY}5s%t}TJtBU*?iKN^qhF}<~B&Q zMa!3;nJ0r8eSJ^inN_^G-+=?qN$)LCZhZH(&dv{?J<~TaX#>pC(9+6$_;B3h$y>`d zHnTQp3jaOhiN3fq6atWw6EB`T2g({-{o=Ry@{AeW_s>j@h1aQ8bz8pjmH1QU8wQUn zqR6nh^NMZTx37j4(qj+-*O~vR?trzWJ{u3Z!+dZ@hQ`LH?k%`s{@DU&NjZNZCwBDc zlYkkpY&3t`zIU*h+3fn9d0qRL|65XG{H6_;iw>ZZadDPM&1LB(AYp+`XKN@@zW2{L zfz-^5$E*Q&g{J@uRJWZ#Cq-a7sC|Rd0K&shG|zB5Q{Sj*Hd9Oa*i#bixBvdzo0JtC zB9a+cgdr%DuL3t2r?hyun1F9Qfw#P&t`$DNa$9ljh;Gwd_CE% zfO^#DTkn;bu@^2FT3Ad2I{-}S$WiZZO;0BVUbwm+5@^aTVhu-*h;bs?=PJrS*w`fU z{d|^8s$c3{pF{SEy|^hh4#Q-XuKluQW{-**y4OTTMi#$)Yv^7}7se6x@^D(xtP8g^ zpnDpoQZj6N+@`APP4^?}@8$hoh>cY{!2sx+f;?kl694&U;lpQPJPBv8d5k$2gT$Pl z?-^}1>)5el^huoz5C5C0g{_ry!N%9MWAc$tOA-qp;QN#9aTr}^fA6xTWl|bG%nf)C zE?i6{jmfxrpHFv}AP*cVRGi{}c?;oTVTO)w<>loEZ)(>6(4_u{-{=^zqrab5@QX^- zW#U2Hc86ule%xF?K~z`Go12=Mr9XQXwRjk<%6ING0saI(k?mSC(V^WU-P5!0l3qN3 zhcwu@arEHpl|9+cc3ERV%Lyv#;zF-)I116to@bvaHvxX-U%%G3&i2GVEpl+UL%QQL zm1))EKQ!XhiM0?`k-O?ObnNfz>q|-Bx6J=f$^ke*pE=D?Qj=l<*!HY)1DqfYfAy>C zlvbx_OLawt)$viFVcQn*_|T)bI-?Dz7>USO{qytspYu6l(uNj}hL!U_x8uoDH+)Te zwwCYc;^MOT%}Y2LQXNSS7-DH#^OT(zEq;?rx_l)L2wFoqxtA(3d{=mMwB0{jnm~=U zY2ErC5?k2g**B+7sP4#LrGl!q`Z9qO=VN4OIK+O1Na`7#WlI*6+Vy>6AV~Mzw(rZn zcWd})ccVvMjoz$e(rXwlU!J=S_(5h^@-Ylf_=~ZmW&QI%^qNa)7hSw$;Pgs>w?X_s zG?vSXC=hPB>;7%`c-rJY`_{n{Dph2)1RX>wGqhdl5zoN8rx5r_LEv5Kf;?4b&me8S zb(vdz&CEak_=A_D9(|I8E%fBc@sRMFYrg)^>D_3Z=-Fm+$XU2)+PS3P6Ldx~rk4eQ zf}*8Vg4f^0HXW8OH64RM+gSU6jm?I|3l`j9pjyL<;Z?J~-);CHmpVW&SsLn-^oI`v zqPC9E)Kp6w4naEp)u~NWisr8#26D)dpvML8-a|8(Fr)2zTsh+YE+?xL7lxPF?F zSGd3%EJ8gl;!Aq(R%2tVGz!~Q%mWI)Ju2jK6WEM{LmwqBTCm_`MvfU&mgF&{V)j4o z{PWK*G85~IsmR0j=Cb|-CiXmK7IOt(2cCE z$G-hhSo*=G{*U(wHSSsuGo5U%HELLUFDb$4mFM`<@%2BffCNnaJ`b{h$K@E*7qzW) zJWdjs0^52Nic{y^Zq?gB>8$doe${lkdtmimxuaD^dqY zzcM;IAw&Qclee4)M{;-+4?=r_dO!3VzzK5Qj(#*@lyQqbg#-+jKG?JG+?y(ave zRMpjB5jg;Wf7d}dPoDfeCGZBA@yY8Y%a=dE!!zk)F&!CjeMgxlqSh!)TSrGk{@K^x z)FP?gMyPDsv?)c2o}$?!^L+4NCSkpX7jrIIhD+Bn^|TO5Y)XQ(t0IYm){YQ)qM4+HQ#Y`YRsWS?Pabw$^al8 zu4lpG#ghyfQEbGqZMNF0iDAW@eL_7QAZYJW8;n6Qah+&mSAM z=}rz?c(19ZCdU5-?5hJz3t>CETG&Aev@O6zE?Bl~^uVHOuDr@_+ysz9G!ZBsNNq6B zag@c$Or+I{MLmsf@9eJsXh!lZ4D$iHBQFL=;~BaB!|8OV{fl`_uP;7bo<#f2yCZe* zXjf+xz=b&pHJV^|-HI#|As-mGIs2W(M8Mk2PIqUUni`s$hwidYunNr0%p7jN`R%w~ zzuFkq-?}NOeZvucL~ixH^x>si5DX5HuWu~cc6wh}LIN%RUp^+cne{L~KMl}uD{$|a z0S4=~3;@Uq+P`@5kgsp&I^sYR-#C4@n~BMRvQqM0f|t)`NZ|Vc+ge-aj~g>&yDj5o zHB38M1a_%>3}&$mJdY?FI-o`Gj=?-Yctpgh`1s=-N&Q$tlQ4=O~BZ zc&oD}d|5aFgb(3UVK;!>sal@Yj@>?G&s!SlbBOs2{*`q4+gbYB*W#rn+QB0YI2On=~*@@bgsi|rI?e|sY zaWtFrx-@j0oRF8eG+;^Ay?ZJInBXSo!GL7=_!n0FB!YK>$C!G}oyV>W<3KA*%kX=< zo8NN-3Y}u!4$c)%P2%~Bieq^L6~~54Kw|#>c>&rVHtofqG`hcjhTjzl#to_HiCTcD zB9s+WGvE^b!GgY!x@uBO$Vp3+_7jEBle2)(3kwSn8a2w^ro|=xtpLB8%2KCWGKFsA z{X~oB$;pc!c0EHDcW&=$oB5Qy=RDfEq7~mvN?goXqy$PpgF1f2xFW(W>YQI2HcTz` z=aD{X=9_s`RLl@L^UJZ+Zj7v^l7NsSc5xp0A@Nq{-BYx0+ZF`qj?=bSRiK##bhf19 zk4W+tS@0?YN(}c0TdJ7k&mOxLMF*}1`Lm$;lA`24^h#!IZFy-}oOQbiDpS#DQ6t-f z0pgRTNFw@z1`QhgOobUlD^n;)t&DSeEx!VpW2?`Q=PA_n=mqMcF~-r!DG)RWf>qcq zbGFg_wf4Q!V%RB41eCW;2eA=q{Q7%S=FaN%$pD`O`zZ4z8S#m`f&e{FV=6``+Ch}$ zBBmgeR;E*oWRUt#0WFO@AQNgR0Yej~XJuC>HhFF(vQ? z1?}m-6_8^Vy0`@_|5%!nXyqAw;#PRJVc%j4!gR3!M?VEy~L~yQXc9b}Yt4 z9<)X{ZB?9EQSoCX5s#mp8pym4YC=Tjp)k$TmaXeHOm-WtJlpbRNXff*g=8az5EG+k zjjm`LO(X2AbQ5bu2egi zdA5~I{x|~TPe?{0uRBBr1#JOc53;_lPj3W4I(2tp;*z~5QXfCA96O?*CZWrenh&?o zk6td`daPTwZbE1v7c_*v(Vs$tqA|c?{P<17)R++|E!Hxo6e3J`P?(0ofcwX!6Ayii zH$*HD(5*Q5Fog#j_+%0dza`j3eDY@ z++5;JU35A=a^+v3IH=xKo|#8XB76WlN!3Yoh`35qB@#>&)XLZ%{rW2!(`)H-QyqYzJlG#q^PL zORWAUs*J>`kRW|xIr3SWUSvWc+;R4vK2wf{g!C0TQ{Kj}^D*8hu}&S7s;Sm58-ciS z0iRK(tj?LgHoV)^U4|41ZqWcq)-&N<{|UG^xabw}pBhRUMEWi=gJZ-kax@tpcYw~7As88(^6^SS*e1|h1#U8ycqj{rNRW8L>6G|xkt)dk` zm^XNs+@TZ|y;|u#GQneo0?A}FUC#jnroZdI@ZkElC%4OZ6^L)gsjU`Hs=76{<_1z= zeLK6*Tq8G9y)B#4LY(+EmyU z#lU_XQX9cBQ^F|;`EMxGYtem-K2Fc0GO7EYYuB3N87_6T+}q}o)M7{jq~I-2J#pNZ zq$a9U_LE7Aun_-QDc_4mkE}htYZA~uenM>V5L^O)bN%=1Emmi!mF|Oly zDp?LGf;wRGNR&_nfr!O0eA0>}stLqr0BnWy@m#*lVz@grhfsuISC<;}E2PsNxDK30 z>ItTM2DMEiK?6u2kdT4i#J&vL!bpg?r5c)==~-EmRY_qk``o1iIAWr&rOIg>6f1oHK@}^_7%0`pBDG{Xy~R8Gm;H_~Gf!lu z@|$#7TCz}zD+h)C`&ed6QrWSk6`ldg`Zd>-W`UhH+OcYkdf*DA+WjVfta7u z0>B>IOIo9FHve{`BLnO$YKRlH)piJ%RbzYoZIp^)9#Pv$cJ0cPjrIdA5(m3~YUW=1 zJ%2cEKlW9VPuG4TJ8EIMM#+t{MHIif$n{-pPS&2DTP~+awB|`@~@KngCeJ*N?~_P z5y=b*ivTKs|K8DGIs*RD{*M2gS#;jLQgnS=HtnA^$-_(klw#bUO_Wiwx{##Lqhop@|@^tpnCG%0| zXI!QQ zYlIk(~PK;UBg+Nzuc7O*Pd zlmUH0R<9K8DEY*KPjd#1ihb>pDQd4^Hd4p`jnfpGi@|-&=n{D>DYL+2 zuLaRm$$_*h%ikJFe=Ud{a3JPPjfmEXzMr4--ILdPSMW0{9i+@l*@`xE<54?0rXYyJ zOZBBisiec!%6&Bmab+h2N=tDlEhkQYZ@#rEyMedGosQHF}1iy}F6<9UY2LRsuQeE4u~E4lwGcR~agQdFvD zvdC+23(${M?svf5qJjlR&mMIO-Bu2YPxLY!h@IPjZq$%;KPJ`}1zT6p%wuJ;(rAm@a_gTH;N?i|yU}qH#vpyN6yR>XD(s z{wQpA<<{HMGXDhNpH6@`u{l%;}oUqWF`Yds-M=y9o6JZ(v`{cnvB{em+BO*Lwnl4(mkxH33sL< z&RVxSNC39I{I+8#PMC`Hw7EHRU(*Sqkta>hz229_93DfL_&_Y>h>#6Fe41g z#CzDe&$3~Jfq4YCxewv0go2?f=JlDY?-!zPjmJ?_gNooiuE>7&OvMwrHdQZqTDxxD zc2hP{it}4dc=i`pUS@hQE=@ptby{up-mH&1jqbv@Fv;d4{EZLeC)%JEMJFR;ad_pgmii%3s9+oH8`IYJ(c%8-kXVeVCyG{0LH6t*6 z$dX-M>-GBYZzP(Jc2?dU?hh3Q7Uz4k|btu1{H(sxQdrNy1qEK@tr;6TcSDGZgU ze3Irq1wjchK)1H~GqTuIk?Mo{=|8Gn^Pd(VX*V~WSx-oIWC8=~UdavJ%N73s0GM|6 zDca-5PSSUOw>QdthrC95W0%l%kvjgbh2;z_c!^aj70;-inc7Es7`$fS$^)$L@sXws zQQR}SKvEz9Djb}GGj!igKh!LXr_!q3!(_IqItupWVZ%MD@g1GW*&+L z^X1Eh^vO;J=#bsZeegQQY=o6UL5uIt%FY%=Gr+y_^?_M3lZz1`NOVl*&5Qa^0=4ZK zDkc#xlRireHqAw0-SnRQ!^lY))FNSoP$ZMk=r9ZGHiL_kk?~6pgN)?8?V(d9P1=$> z6f_pVYyo|T5&q=W42k+1@lk5{mdoGXC)B!=4;H_FFG|OMpI(~vP8MfU-Xl{sm&6P; zr;&Wq#;Q|@5KSfKllw`HfgwN0(mF}r1gsEQ&yF4YlNN7n`Lf|ds{FTZZMQqI@et}{ z0>cxgg;I}Xirg=t3CW4ZRK4v*c9ON{=l&l^y z<_9#y@OrVYgrHuyrIc1Tf{l!v!G>jcJ|}+j>57E=giDdKo!tKWek%{+>fPkzE#m4B z8iB85KGN0>R+LVNJ9X$!b<5?GV=4>kgNjl{e|;vCC4OF)uV}dOvvbj(K#H{?PtEhF z-5AUEreEvsiWZE%?DlEZU^ZtJACxg1ZGEDB3#=-oWFIpI2)juGEpRDfT=@bSu`v`R%h+$^Q!_QmEL$vR+^5) zygGO30=<%~g`R@?@3^L)Cc4mwbNo0n?T$!>e#skNQrawOXTMK`<=ftpI)KFl6*Vf| zWbBU#Fo>-Cfh3?9a}Z&FxMXF z1+iat2_+IqgvUm2Csht=IN{xt8=-sY^IXg=vO`$_m18`2?p&V!nCS<}gCLX#5l}Z56OvVAxpN!;4sb@(##Px%+IK>|!k9bAP zKRdCc0*8vX2!DO@>eadb-MMFma9fN!`jdW3(dLuY@5G&xTXam$$~wsF*-Ipl@fTzs zqRN9;+RQarM4y4v+Lu#B0uNt9Ix57*%ANfO4Csl99ZuK_8u2gw``_p=#@yp4&l!z@E(xj3@_MpElN8=LC3M~@p7X;SN8P+`!R>M%CXb(G$rT9)C6fXGb_kp#V}*sUlja%p<;py+&YD!pFqmc>B`=RmB-tw@ z-Tw8!Msh2~+Ai%PItg9I2Mf?4|CSG=wj#ul^qI;{fc9IMRYnU5NrSYW`};pgbN@1Y zOiksYy4Kd00HA>2;GYG-jv_u(mch5F641zD*`@>1sNM3fqWuM0RhvrstA~^`?T^Rn+P1n^Bmt|60^TRA)T)pPq$IL?sU=Z6r z=(xF++hk@^_#y{kv`#oeZM89D@|@cn|DCdMALy2c)_R`?bYbk3#aenK3%6lYAPKQl)*OQFs<_TX1O$10Z{5@y#oxQ%wN zwg8xzA}%xNS8rA}iydI==JE9ous8t@EgT1!Y3bR!7!R0wba-g7ibXgq#5Ka$y3hBu z3_=yt8WH{inaGlwmuJNcT4O>WKg(ePm^ctraC%5IdrKOfP2^l?=^$3&cq^kOMzwiYW@?s+vByBr){?*&21-6VcpT;ceA$~l7LNRWK-t_4i zG{;9Wn&a{$-AB`DcIHuq_j{St0S%Uc|BJ=IdcbSQ^)u05D zlAIjInW&8!wEq^FjoHZw4d%zKnhdkqdFa9|_?F!joTd>CTaO4BS(jE=Z-fmPFy}%T z;+8;2mrkV<%3>@A;$w^`(&HaZnLNsmNWsJ{Ne8n}PHglJ`U@V!m^}d+46Q9pJ7EpW z^QM*qQYec5;n~XZx8bA?Atnk%LtWR8uTxn&2owdfWBsT@u@%H#K6+IQ$+$KO&YT$l61%s4Ad?hiTt_@iMT?j7@a-MKWU< zyFP@D$t-AEt4zIdzOv;_?tk>PFTN4x(PtpPGxhk`DfHx9(K0X_Nh^0kp-7V9g$()B z=kA#k-Wi}Wn$n*>OMQ02JDdTP$+DY};q?@01&|);@XZyJhQLG9wl-}iTa(IJUl0Lq z-SPL|L;V`_GZoW9sefs8V+kn}nuhrOVsVYxOltV%5OE&-`5NY;GkW&~`HhTARAXH{ z3uJvLX+}vS7~62MKgE8KyV=*)ul3`bGU@a*8D!FDJ;hRAC`Kk4hVhaIFz|s^?iw`z>Kr>U)-jv}#^QT(H0mpz>=H;D@x z#7$C1f3BwU2K=Cj9dk7%PTtWr9sO}d`qb`f+($K?LHnn24VcVi#&9#HuUvUAGM9)+%a7r?&9( zsI#}*2$z)`vtaX%_J2fR6~%zykk4}DJyKwqCsL-|HvP~*2b~5A?;R3DBq61Lz>G-j zqh`{Vd4MJSC*sO>v{hTE(@L>)4i2OcVgs7j0e3UNFu+qz@s|coZ{NB#m4KqDeCN7t zKy)tuJ~m>x4{EKjf}om#8{LQ7XHWZmUq(B=Q1cK{euN;H%~^*-sw2yGOMV;Lnh2@9NP?5p{%6#CHwC z{@Y^aQ3QeQaFt}bSeG0*ZIZZ{JiXcn*gAx2)#DBZivyeF$PxTs#b~%%G@81IvN!ztPsorNxaL=IkKUm+Leer?Wt5$s;{#;^7T1 zFjkH(jJvmP^-G}vzvx6ETkp`vIgo>(Q8C{1O9SH#^Lp>4gUo z+O=yI6P++hW5~Nlpe$1s?qr{yYYqYk`TVgp#C%(pt^ri;QfZ}}6>`AFkfJs_K8E}t zSD16fIh@jCInqCInO)a3lk@G%qFWQr{ZPunp?<$8rY%6`nR|WXRfgtAh!t{%R10#b z5tfri%HvkAS17{oq1fZNbKru27JZ0LlW=dwNC&v4gZ;*A%ysU`kN-Fcny-p*3Z*mf zTUAx+gFSto$5^4TqMc|qh{24hV(%WGO>%CXarS>*@K)L?ooj10#vzrRSwzn%!Zl`HadC=ez#n)k#D z@wk8*gA-%skFBjf&nV(37&So>oJa0C+nqQ``5@25?Ynjzh~U6&-MUoHnbM{o@9`9a z$kf1yc$~x|bPUL=p>=Z3#id8(`=VDq@<92N1>JXd96ABLdM2Nn&FJe)?P-1FWkJwo+X45IRWwMU}gc2%GgE?G?W$Q#WXtqw0kDJs%bi8OhRLz^x2+c(e^mp_Ez=P zUL7K_7{GCC<}dqGNU{anigP2rKBNOnzn`k#mDNQpw#U5KD*Pd(ACrAOCxgsm##1L} z%$yJItDM|1f-l3lM(!KBXo|#n))5%u{M)r`X;bG)r7B3xUn2Fm0dc7DLG!^h?K?8k zo~1%c_kq$+J`O`d zuyxCpu<@H40;rCC{P<#`?QQQH&JE=V6@&kMk+fYd0gtVLGSuZm-hAfC28PT!@nB56 z!lpiLu2G!fTPm;OiUeiJihxn0O5t4|5KZ5PWoCYecKR(?7_z3{__Xzs+Z2jd5@jm#Jl0Z=nps259DGXJSa%ENg+p zO2-KnbYGl$P;dSf=XC5dmU*|V9E<>!ty;S_hq{1%5k9Ji-wZMls)CyEzNgu9$X_4o z_iOJ+x#qOE%Ze#%K9soaJ9C1LGlL~*lumMP7)2A#5$tAxPJPeja`a4}l=K8kxGjQ} z);2B!+wY{k?KFTpf^=fewRN#13<}S-YiY2Ye|>``XRU$bR~SFWMHIe!Cz-Cibni=- zE(v0!BM{-z9p~Q_iQcXIOlJV=9Kwck&Y#7Ic z)W8_eO@b6j&Mq;$K-*7ywcIXK;`rjT78g8f-QnF=UTm+>o&0y}K4PPqEAr-n!80*C zl2G~R9(qJHU+EBpLB%H4gsislVrn@!LX8#zx$TrE#SDii&CsU~CZ#@oIv4tvMHqJv z!iu!*z80WY^6=zl0X&RZDg@6dE%EZoK&Fl`ytxl~X_zwIu$sdo#1i!1KKK#COXa57-Z;1h!q4}VugoPw4>Q8AkuVM=u(%m`OR-RH!5!xo-aRoL_B);?2XaC?D2X;9Z?R6Z z;@f!jgT1D<$m|p|47?yYnsjZoRgCCMt^t8P8?(IrJsH;=}KqJX7%jldWt`+M7YX(ya(!`JAh-Pz! zvvJRY!SO}DGwUlNy@BWA{)x$13^d4QYWx2p$R6E3fBl+6_Nlr0jXsz@-MNLzU0=;e z;rv))FRulBGQ{uK#3@gXwoqgQf`;Yl`Z8*iAj!u*Zrgo0>;ST4p_uU1r_kWv$;%s) za%*y#CDBl3Z{u4W$*tB=NHOTwCz8T0y6x#`{tQ_{js2VfC6lS$z!Ep7EKEnfCfq>t zjzh))Dnbr;Z)0(RCFo6O^_yLCSm3V+BI=b@g*%EhG;q=g9po&^d- z2dL-(c_AdDSUS+D_kk)!y&m29~$eBk#K-**ppD6SB$9i(S7@qKW6u)A&*)3Ug4vC1oIH6Wo{&Trq{h zVmEKn5u$E@_4RnpC>WlKtM2k|N;5^VDV^Z4$ie+aub&OEQ<5IIoiA_-Ac9RQ3YyS( zeF`WdXGE9aL%zBoUwBR%A7N!!5;lcOjya?GT^M<+WFxrM_QV6Zw;W3!YW)DgUhq2= zDIKiC*p$GQO+P9VPC89Io1YurO%bH^6U~tNMW8ry!I7uj+E872mW5uY@$`;3Gy=By zj=g`smakpG#$(~A7#O#hAFrb}*sjdcNc#2f5*i@zhWa&-^GX|tGeO=;q|}nsq@i3$R^Vl^ z9zakt1K0$el|P!hLTs#eFX%*JWgxDYf$mK{q``I>I_i(`rwY&Aa_z7UxpwdhkMMAg z>lR6(&-sBjKo_=?s+aUlElBu8}kvuXSW*y`@v; z%{xwTTB4(bfu0^NEOa+xg#fkwEc9|N1VhQ9$P9w&kql=+h08ZkXUsMDCj@@@w4g{i zq1sY7o|4?yNFwC`(htbz>6BS6Jo)^fUXNIf<%O0bzXGVLIWJv{C8aoLd7F$3X3qZ-Dkzf`k{(-%)Jl}77V4tNZ)Bt(^MBWUtd?#6Tb;!QKbtQQX$zD1suw-_hOGir&YlLl{De2*0E>xkfSC z2%p)(XfBy+m{Bj;><2)>*=7?SUFd-)lfwoSiaW2-02!lm5kiw6Xh}?ZBvfLmdbAk7 zML5kQ_Cy68x3VC7{~&Hk#oP3WxW!@ME`G%fV+M9Q7`c$@qfUdEPQ0X5h%f7y@@>4L6Sow zSQ+7;xNA$j{E8Jlu2I@HCsenCrvzOEr}oW4Fe3C8+RQLI6SHAX1g812nN12Ol?8_(LhX13NeTt{;;#N14$lz@Xu;=%-baD2*sqKk>%VXBY-gA$PT)ubjz^T6F$e8 zenA{Czdo8u(hF3pAX_=c8;K8)H%mSs2!Q{PMPM=-<)~c4{Xh-}3fwv?Uv6pIwto-o zMCcPXUT7)bMVD0&Dljs#uRfD*UHu}(P4+!G@ulUnSq1|(CAk_gV8n>o`{63=FaP=o zG2nE7?FhemiBpjKn87FdBqSuzZedWQ7$LlAQxz3c)??u|l5c(kB!!U7+=X3$?Gxfh zVa23~{emT=ScW1Zi@YZmp@_d8uJu^Y$vgTpghfIOIyv!Xj1rQs!!L_{T&f7(xvaYk_dXTN+ie7SXXW@9!tt}gbEGzd$oV37^h6xrj}2kU*bh&n~AcO)hF4zQcuvNO5`C?r@@16LRPb82Jm#BPA2hc5boMkT$2@cc60q zY!apC?0f-vl^K?ssiuf}#tCP$=K{?m(_rp`pq5Kr6q1y0u%8TJiPBgsF_sco(%}+4 ztR`UR15CpLz;|rBo*;{3$v_u!$8BD%dVO1!QS-b^p*aXJk{s~v_%*Kc8g@kcja)f_ zS0_lib%zf9{*SGsAnhq9Y%uFbA5ZN~_AQ0wC{y0LxLc`s<7!MGCkS=D#4sOU5Ne&+ zC4Q7Fh_tcq&J=l)jIB6jH5?o{{y~({h)$HX4?_DQnPMRDnqaY;lj1ARmYJyZ*A19= zIYz2S@bSJgf3Ye2SHF?s;u+Qs=3ZQOj3&!7;wMv&fJQQLFanryKqJgow~^|I z;Ct#*bv#F+^#&SguB`uhMqG7@Odys32yZ+|6L(k0Z9md-En2GjJeN5dFI#FJ*FCze^kBUif@9a6^cR&14vROkoUl z-h7gI^)Ez_Fz)|=`ByHGW^-uM)=CnA79yOhwKSeL9F+$RM9A(%tqto^6f_W&0l5}o zc=9ji&V=FlkIW=u4rd|Eb@>2q?;iYJCeHi^J&gz}`{`6z?@;fKWD78Qnm-}S32Gg$ z-@iWtXVqUr!<07|!sYk$xx2s5PL3;fU4`S%tDF846WSb*qzt}Z>UyHSzaaTSA zqa>4(F9QMyhy-gAA$y!^JX0bHTpS*RXCPsu#=9#*_tk@F)&|$&l3<0|9G%rGrt&3zX|P{O2?6oUzMOG36y+1 zw?(c^Mi}qX0R$suVBw@yCvNMnrgleJ^oqI-8y_S%{A0n52zE}1Np#k*_h!*tG^}xd z9i3bp$21&A*KXY;4uvM}K%X6nE62-Q#8G%C#i@xHg^eSNF^0p)(IPo!at|xvQWaJd z19t(!3(*r(KUL_4A~~TRJDtjd$U)FCM&($ozt02p@WY;u(1t2;Kne<&AZ)3;k7=6) zh!YIem1g<>JB?}kg;t}O3^_U7;zIND)c&Uy1ry3PC6^*g*ai7|Acs-gI5*LzJV4 zdFP^tkv>&p9#$%21j1Ee9Tf#f=~Z?Be1gCIW%Q*IZSvpFrnkh1q%cD&B)Hup59(!H zpm}B3F0 zmCFM9k#nWfRXnOqo0{_p#RPB3aA>UM-g`Qyv1D0luujp}LV!S@KP&501zSmZA^@|g zka^Irk0TooK8-(^6JxUpdhrZMfLo$a7j;7nipvEh&#zt*RbIurr&?w=ckSG1LX*EZ z(bJaar;z%E4;!?9FHwR!MFA;5rPHt@56(7i(6sGCxIIylNZk`pqv5y3?jgLgWOQ^d zqXqLw%z$12bv z3-U|@*R+w|Im(s(^8V?s%Y;vpq60)9<^-vzDuqXk;mHwRm-=w-5YEg26e+|+aaS1c zgQ^o7N{xp5UH63c7s-?#-v^%U zu!ViSNqzy43MT+dm~g_A{%&1G0|=H_X$@jCg8Ua^U3tY_RYfoe+BLA_1B*UlHjczA zp*{#|V!R)vts$0Xy6iLa=R%5Qq2G~r$FB@eMj%sbGs0+wQ*Js)U2`Hq)tFCEYOwe# zahvKlD#4+MU|^(f7lro#5^vE463tCYo}3R=R^GYovHVAYERnD$_gsaXT3-1v2u!u! zy(iHEDGT}P5SVe4*Nkjal zBZZ}0vhx$xS69B;MpH@%cC^{n178-n_?p$?#jj1GySHl>3?;Ao)#XI!X9!$0)9c?4 ztr;{rFFN7-rSBrf1tAv?wq8_o;(4uKttbYXOaS8PG@!W&a29%`Nj-=I$W=wWiVKn7ek=u@QHDa}35tmyf6oiGQo}Rd8sJ9^)h#pu%b* zy1HY|s4F1Z#|ts(S+BlWx_`4JjsZ)hdrcW2o+CFivPTDi-3w~i(t}C1XHJsj0E5KIa&|IS{ zsvyZEOYkqflJ@i{8d7|6Y23}qtL3fm8HxNS?&pcboAi8UloaOXb6?kq8$JA%9qU`R6RYYT{Zt>-ep62 zkq;pvm6(fHZYRU81U(Z1ka*{T_o0J=H5k!AxOh-$SE7iT(J-@~=V{redHvg)F6_u# zixz5H#4g%{BW2AkthE$iOl2CwWxHWLI<(M*?@sp7nvE>r4ep7%3$^qgH86eP2?j z<@wkDpeCx9K}kXA712vmN0BQ{S?)*C0tYHAW~gF?HQdPdZ%K-A;kBPCq=t*J!a{0` z1QyI;M!zx1NDwt}1DHD;qzQF0Q!)jq8HmP3bX-zeq@{KTdH5fCwUt$&71i5$!7#$T z^=4gjhyE33g4RS2hh|P;^2EsZnP)x+x!pZ6HbHy|<;wv$g=f)rm#z62c~-$JcZG_LG$91hu|=ENJf?*|su?5kpwT^7n=$Rh_DE5xt4E|KI&m=ZEY z;ebWy|C6GtM}m_rJSgh%Otqhu|9@TYUa9vIf$xy|5N$o))DF6Ky1wo63og$GKQcJK zT<2O^EeL^n!<*5;xT_ENgOJfR+Z-CA6%X#ELL?OL@`9X0A|hby?@ zAT6Fej+oJw=6t(73Y$Jx)_yoc=R_n=DWyNm!|p%WiJ;z|3I|T*5Jg8Q*PBxKlKc`9 z$C-kh?Stb_fQjmfB`tb%q6yOq@0Cqhu01zoAS$#z;efMqmoDX?S|fWlww>2I!P8R# zpqU}`VR73?3KRW2JUsM75U!F_kWa(4THn5J(i&B4^2o&Gk)fD?Cx;16l`^lC;)rFc2CAWu0gl zq|XHg?n`pcC~fUx5{#0km!gGpaq*N|r~tOl3vm zEoZI!k-4s>m#*$SMrrNojdzCvGXX6Lg^UwosMPzdIwv$%?3W9~)`ZGF?;lz}srn&B z%Q4?xw-J(_lv(t;(wU(*>$)|s>HvBvII0?_>qlyfj@5>`<+-bUE9$ORN|=+t2XC*z zv;nCP>uOO~1bxmVpF)%;D3f19Y`}2qD7N!AmD$VK^{1iAo`a(0rH+>74ELIEcId-i zrnwv+{LiDDP3M;9UU}c4G{jQthsMP*wX~o-0`6o>GWhPPIbTKqwExvw2ahuctK5Bl zsuDrl8Ptre-XgsS(&96+>7+dczW5wJRAF(H)c!Whmxw1hJY-$&sK^LFekGC&%Gv@F zAf4)qr`+&qD+utEvhG{Yrq4*X`mTC{=COQ{BmJ-)YB~KF7lW4>!gR>~G>nFi7_>hJ zkX9kDl~5F7vUCdmjLOY0Nz8eFW@MrI{a!TTBt*M}I-dewzH^JHaR`aT#S8nzx2sD} zd-%yrD&g+nTSfC*y;K!^}dNdubRt$2hfwsxF(Z3lmT|gTUvlJsT@la zLHM{$zhIq_IWY?+3NnLuIKWhsRd4RWvdm^Ll=%Er%v>YMmU*EFKMX0*Q$b7I@eD76 zU`EnMd@NuyF+sR_5?TYhg6`}f98Y|Z-Wp(8Z@t{BYokR1 zs`C1t#t&Y)QVY;&SanW4mQl<^3%9?w6bWdvq(J2}di@%r@%yxB=>?G{BM6G#KhjiZ zLw*?nG;7a($hWGUHM;gw)b?&V+S)(j#$0m!^zw?^=MZ-~dWuRms^vuZth=T!G96pzK7BFtpMWm=a! zv`{GYrBo-SRS_Bj(#k%5{Ev&7j20cL{G-RU4lN1_f1u3YA7pO5G5e=sUt{59CSyGy zcgi~CHQMeH5Ou6(?}ar97FvEIYOf!er{!n$W-QkgoH3jCe^A|g5X{HRwEXpX-#jvM zOv=9dAoOae(y<4dv4j)B#ks$5BAqLxc7aI^mQE|)jJTaNb_mVHRZ0T@;(0Ae?g`0C zI6(e$8+;-q645CxJbUE9cpW2}`y>Mb^Ef^^7Yy|X0Y9$u;Tz5hoBI+KLC$x$F1U1q z*pYC&>RaP1Jkg(gBEkJ(sdpXgZ+J=Hd4V^fn_##4`% zsEh7^YT62F45#1+=bT&o_aLkIFi}wnJEHL3!zdC%xS;`aFGf*^OU&osrjWwzyL9QR ziPo?66g{*}X?md|Q<9&MAd8rB@k+AVQx*6ufI|8KB%sQUFhOv{*ZU{N%I&(%mG7e` zV$6BJILTxk;+7?LMt>;@jTi!8!+|ow26MNtsGPge0~}xpk`) z8oKl7br=30U2g)G^V+rl-?Yt%2$4cE&vRv-i;N}8ylbP(3Kgln+sM?2L}VyLp^!0U zETmLagrcYvWhgZMKI_i&4*&o0cD%>&?q_fAzW4RLuC>l}u5+DNzD9+c;64P;E>&eh zBY>er`ZCFf_xRN>ZE5_0FMXn`uB25T<_$`Qg0ZPiE22haj}8A;P#uz6L~UO6s(n%5 zxxjgcs|PosUMY(mn<&*Y>4$^<+5dWSN~N3}0R$*!^XQ%RxqQCvx9Y^;@?CxG;y^N-a9YvxP9b^XM+=+cFo+Hb93 z$HM6qL~r@5Bo{}mll}@K%TN&z(pTxT`SABkYJ1nGq^@Vvt}HJ&>0cdPmRKY@eT%b$OfOCBUJ5Nnsgz4ck&3%2-Ybn^Ws6%s)~d zrNJl3e4UI9$R75Uhf~;aZ^~6^W6%VGa(IeB!CxdUoO;vq3!<3&y}#+H;z)Nl8V{Dd zlCx+oL<)F$)oa5S85yS@U3IDWvYixq3XENR``^ace97dUjIyS58@!ZfdKqrDT?l@T z-NA(0%>{CZ5~6OX5!KIo?!}cpF3Cfg%oRZ$=@?3bL@7q9qbPQfmL-^5M3^#_D7A(C zaa3ob_>k5s-3`B&8j{>nl`?(wuY4g1YAFV;PvU^gGI+|Hk_x45#MY&y+<9!&Y~+b- zf66rzg8j^Gs>96dWWA_hzyuF<59ui|$pPzCyqosdGep=NIwPq_e-r(RiWBIH;T9$e zoMwNvgRGMICHCDZK%{iD>Ei?L{Me1Zs?%>2{cKb8pgOy#a8AgBhC6g^Q_TlVxZKt0 z#H9(_Ggg|KO+UM##h~t`r^DPLCtSNcYm=Vs-qhWlTg+_mXNw)0t#g0G{#dnT{FpI5 zi3VNH=VrhClJ&?Su;9I+L7IWVuX$;~1SjMrW`JqS=q*tI$de5I*swbC5UhYSHs5{n z)E?TI-Z}wc3WC>wE4^yk z)k+Z8S*!|{q5PL(1(3qTY52gBiQ~pG_txdbrzQnrKqT!(813nNCn|hJ@iQ2uOYHbr zVV1KfH=d%-QPRya$)xbQP5me0?}Vh<)?V=Q>uz?Cf8Rc35BEK@J0aq4H-9~{M}o>< zZ!WDIz99ZkWRYXait4>rT-Y9F$Hz5bVW!CSW*k+$Zci$aZUN7nmpS4+d+^6>o09ke ziObS2EEXmOB`$dJn^`t##*l#V$$4wS^s1wk=cCUBj63bHZ)(G6spl!_#!xd@`(@ z7JCZPx)Z{SFx2TExxjii5{5HSElRHSRC+J~PE@;4Y!^A`blx8F{B8n;;HIZQW~0T{ zN&@V(=x%1DjQbELxp`b&9KdVJAOEY#~ z$5z$+-MBwR2FQl#3S}w-8Fq>rDSZCxn~tUk82qFW16$0OeMrY2>_hXoqjb1X2KAbM z{h5p?Qax;{gzA>Dpc-<=$PLT2v$SqtzYo!(5hTwVRc8T!0k*)8slpMGoeFD_5qeyPr!62<8{7*QHJo-x!(TejLWja0{AOW?;_ zdoNT5e*X3KQf0T5)##AsM>$D@ZzlBr%;)aAeWAfw7#WS_2gegQ1;wcA21rt5cuT$G z1ThGTwijRU-{9Uu(Du#tgtp?`Xd+kxgBkyG(EWa z*tLkxg`{98p_j;=3|!~STnRK>C{X<1RJxzLcbm~r zf+F9BU&=gXJV2Bubh*q+Bl+k`HP5FdcSZaxFiDz&oS(Z=9gK<)j!oJtWwj^9X;OMi zZNSF|oXNl#Dk%TX44bIR%pb;|%kM~_Y*Z9%U%uD+@%||kS0*LAWB*qh;z(cDH+(94 zT8UEO$eBhV!I4QvbR?16q5u*)DCOCKwvjF$gT8Mz4(W7Rwk$A4N@(HZ&uDqCm8}C3 zQI4O;W>sOcifmmFzKo^F$QG}kpVoz-73s1;A})t6m@JK^Bf}g;*Tzpo{ayEugLh9; zSD^5ne5NRtP3Re@b69raC(}E!C1a0#m~yeQ=tov*G_{FzLBK_Meax_Ki9}?22tAK;{x{NL-d#i;6y@AiS)Ww?>U(?0N`iefj8>;FguW)@G< zu<~zvHIQJ-rj~h5#)L$^7Y0kZ9KKUDP7DpeMm>^gKT+gEkfY3~i!wt5Mxu-+1tHCG zZM=;BkO=xn`oa1CW-CIuCHQAZt!N3~ z`5NgLD4p^_Y06ol+Udd4WFTouIZq&ov%k5p&Z4mNk+m)?W!ugYl1*q}5gMp@bvQ7j zu@R_FS)_k4W0wCcSv74H zOJio~$#WSbKl$5Y@)c4r{sHE3hX_!8lv1b-Pnhx$$pcG31>gcg=r1EUq-_5L*Tx}~ zjS))|&w;<0j^>PcjhA5N^ZibvKAOFuKUUI81={=3n|hR6s8F1cUEXTp<{A7Ab6%{H z(zm{VgIuqLx8}j4_<_-Bznqg82og*|ZmHZTps|b$Mr~HyqifgOxVuF}(A#E;$VEK4 z%qt_LxwqqMEv*mm-@@#n3z0D(`FPjuxKPeiG9$HOw(0BZ$0a3sC-!hP=}STrGY}m*Ir&%qslW5?jOoXe0)pO`A->WnWrr zewd=-bK=COh3j5YhLfmMQR=Q|Oh_X3oUOEFME@o8;ig2Zqm+3v_u^Dq7=ltk8Pyf8 zCXrlHFUX2Tu2uOlnjd(^9c1S;5wGqISvH_+?tu#nQ(YxBp^m_agO4)Jr-$L zFd_*VVUiXVxR28KkP;ME<)(oCf4SpF`SPGdGy z^9f?;oZ(L2r!#ORr9l5UQPng2MGKo&xU5?H<|1>Dg~lQ+ZSJ<`{v>9uI{y{b%hlT8 zATr+3oO{ki7Y>;-wJ-rQ;nMm{SUWb2Is7s#?pc$$efp;Yt4^ZS%VW-U@L``$4h{~d zQFV$71(4SyH>;L(viM6%tEp}mI)EdRVSQ>+UYxE>YEzOO0%=qvvbWcx*H%iucut=n z5}~rwO6I4=v{5#)T4SMZ$>ftanth>va}^eMXb9W?_&lFh+*5k}^N>Y}S1 z1M^F>Q+Sr(p(AQ<@rq#Yp~4kzkOrqh3n2OCvaZ!*uF4laUAPxy?h&ydb~&uaAnGBM}$KVTP4eN;iuM zU~c8giD0gw&U8|Ji#`juJM$C$5v`ddasjaT)=5B6D6DHSlxQkCNWzbv7^h%l67KXp zuLJo(cCcP+q>gfdg=lR=dM3}_KZejPgXeJK&+Qv}{pH}~BwSD#5+oLLIP#yFq%2_A zLEQX_rt;dj+`xxOmhQ^=maHVQ40&xq{Bs!>nS`OS>@j#SqiMVcy?i)nX;yRNHd=l5 z(p_HW_a{R#mobC9&OT@0N`-5vxK3W*Qfb&FT{*`yRPgywHgm8(Vb zz@Z<&M(oI#%B~Kp$z7+~`OTYagW6_Ejp1)T5~Dg{Z^9K;EDbWE7W4&G$&|lZuvYxZllftf60R z#iGjV_W8%z!KW#mUUC81`R%d}i@K2RgGibF35vp0=p?)ja`N-VT}u9IEadaarAHjM zWxxN_*6!PrgvCqCGZNP=*RQKPJXb$s7tE3kT#wYtN=mjKC`THiw0+Nz%$(5sD--Ds z*b@;~P}RvK(Yt`z%8x%KmRoEWksF>gb&ZvF!tcUNSQXh54VEJJxGZJ^BL3xZY!Qw5 z->L#(iC|MWr+~wbXI}b}lZ9aK6ZPFkb_FhCV)8&Wa`L}-MLuu5jE3NMJou3PG+tw8 zCz^HfXu{9}xrsa#0^jt0s0?2|+4=!N{mRT+^M#;ckIJF| z4b9-h4FqO49oD9F8?|55n0S~78#SBvBFG4@Z0UGHVWJ?^!jN91%x94-k|E}V6BGp} z)AE&B9fD%(MT}NSfhqGFTri}RSz5?&jB?;I!Kf9?p$x^!1+$o`BEU-`_( z0DGZR@&+pwHI@P8l`jXPtDKG~jotq1JHcpJ(!2!JZgCt77V?SfObV7j#zn=%0}4;{ zC}K^*Jguxq@m@6ZvPc|Z0>mO|LF*YaLiSsrc44;Qd2k^Bvnw#*iM?9?rvKS3vFnx_ z{N63JXJs-I8E%f{afNHorL4VJG;!i(Y5TvxKm0TYYaaCZGdlRPb@)lP0G5b~3AFf7 zu%%k@oZl7=gMb=xh|ma%mqA1QLu!gpWdn#yBjQq0Oko?nPMokhd2S?aB|tVieIH+N zZ%Dy}2aS;DLK30u=|)1I$srUU7{-VGX_pgfM5qw2GJ15KrhKTYbBc0UR6{i~-wmHh zn?jl}TO{x?;--iKI1R#x3BI2Bz3^h9H0b1fN*70oXhBCYrnDxWvX3ueek(hLneN6i z#3=*i|6`|M2_n;tri)aFA)SmlxC7_ajyWiMgak=W^5xgG))QDmIV)2=r1i&ANYNmR zI}U_IR1(4<#DS^CLr5Tlx7_Y(y_?YkTXrh&AWP|gLJtC`u!#heXQav_%fxwCz&&N| zwd89}6^e`*aIeylr`D9n?J!^2oziNBvKv5jmbffn8zERdJR4Dj$s#(Ev2KC?{ilG(g{OjC_%?LBBJLk4 zK!GFDn}MZhmG(w>W5v(`n59V(0D|Bs1zECxL433cM{0TL!g;al@_1b`OCTZRG4ah#8ZbQ;@HS%cY#dy5FhAOS_& z**AyWFq6M4Zg_lLvU|ZJereVWpxY@>$VYg!eF!Cx^*=|YCVxt*VQ4yK;jB;j75W5{ z>M~`ryhf+0U%3OED?!L*SkuW&;nW2yw^MA269lBz!Kn`;WVRn~Re;GOV0;!zXgJOT z5Fl{l&*9)hu3puz`DTUbfSO+cYJ(I13>S4jjrzZmBbZs1sY28!{pZvTdc&j!Ox?Q7 zAN^dPWnWgr&7+7GN~o$lv)Yyt0Dy2meWVKM7-%VdRhesGB=Mx3YtJyYxyT)OGPc|! z<{KaVuB2(hiX*duzCM%qi-J)dfl9lPgdT$=RB`G)DRWaCY)oiUMxfYZGK96axu$4^T=xhXK?-#e z!V!j`FqPmSty>Re@>W>8^GdoK8XnAESS#j1P+Hrio4!fZ{WE+SXFI~!(Lx?)A&x@HBi-fb z(MG#_b(=Enr~fUvSae+UpNLD-xK(35uQr9x7Ew7hfvVj=ZN;2jY_^Ybbg6!2AgyC# zT5eLKiW?iSK+9&-1DS;Z#a`9-SuEOXNaOEV9v+-}d!$H7X!P(0hyn6mdKk+)Qf88v z1sIu$rI2!#zqZ1{67|1GIpH3Jv}!*^v~uFdBL0PvcooBx-dkjA$kzb=jgR0)(VK#! zDb0H{Lx3qApw<`EsV;q$?*|bCA;$9Jl0A%XFEgw&sx#L@q|kB@j|qx3(M~HYo`P!W zAomlFBFm+!;@dQl2#7te{Nm7Us8obImlP__hju&+3oob{_nUBBr6-3ML9uM6^~l7`<47c_?ue zk<3Dal~6b=9BLaoHK}RX>oI+m*^q0SrJ@r7B9^i7b0*?>^zPj|d0|$KB~N4(qkutA5tSJAFVv}|pt()!=n zR-?=*-A8t%O`)6)leadB{Vg75)J+p5X7MvkMi3c$RhsW;#GFIStsF#Gavw2j=$ICQ zoy|}!K(qSx-B@0I;HBCMm-3kGWtB7syTJ-58GnvlYq8G|k*_d4B4mZ>=|MBtkxI*B z`2qQDu6qvAbdkOY#SyXQ$W8QyO>HeaG;aTBNswM9l&Qk^(Pmg+AV517L3wgha{Ss5W^ zv|L#+Cc0F~VOum_jP_+F1lsUFdnJnuB{mqWk%5O|!&^uS!8hMwbs>=!d7VHTbxHab z==D>0Z+njPbwV_{bI+bxfg_xE4{C39m<3};is|~4Q=?|`H8mJ{Av(*!V|GhSE~u~m zle8E_t074XpRq&4w*w~bHNnB!hU1C8Mhp>Rns=i!CXtWMm{MaXNwy7_T$xJ~pvG79 z=XTW6HUvRNA3AXZRUcz{Y4d8&6(??~BL#ghX8)b;kg{zH_saRIYhRE$MKT>FkOV2$ zo*$q#CM2%yU@ST(oM&BVlN1WY)s$G(99X)zfqo|tuZMsxC z(>rGgudaTPA~s#bBt7FHt6n|*?R^129Q-=RjO&yr`~+tKo7 zx8&~&=ni^Lfn;k}=4+9;Q4#7l=u3QT&?WyT_#rZzL(QE%v~U zcdJ*g9+T>@GKla3>EA2T{prngB@O{t1|9zMn@RlPL{+F`G3ZCY`CenS?~!kx z0{8APDD>|TmJw*xUgtr-rWSLN8eL+t3Q3%d9=5+L7v0hH-a+78s@zDTmV%2YAO(JC z(^;NmksIhsSNbXWDXh9z?}jaVo`$)Qi6LTc9pK`iEfo%Ei$~a4fCoj(psBg+f@5Q;2Ag~Ib7alUq&0x8RLGv|?q{&X@dJNosfD8;WdWbZX z;(?})5*hvPO;%FzEs;J$@_n!fJ+CK0F6@i~mb&gP*JsxlV<)levQtIy3Fz&M;(E428tT2B8pht-Z|+0ty*M zGM;fV!Qol7i;H;DA-tLNT$3%2Ud6SaLrsS&=CoV>V&pwS64KS#D8cA3P@**?ML7R_yB+`O;4Rga8zo(Ezy@-U zBx!J3a*>xJDEhbVN9Y%7CVnmqkPIV2FM!#>so{>DKO`)@MAtyb0$x`NI}Ja&`0eLn ze`K}YY-$p}IC0su2m;@`Ep1i)=CtMkx!*y_&@~h177WE?YJs!v+Cl~bc)iDIS0qtv zm}Om;c=|Jg?z(cWjwVUX3~SIKKu10*_v{~6yqFB7pN1{;zfz&`S|7;8Co>q=y2MpllnjEZd@_bmW$u^3G{07u1LjdqI8T%E{Mb zXazccu^6@l95xtO*RvH+)0hh^P&%`TnYZT`zWpa~R7;4~*;0$iJtB1ABz?K|%p!UD zNRuYG;HtzJF%`n#OSI;)pMO_FT{e}|QkOYjA2Y^gK{}m7@{vLcj(kRM#C~N@9-YNG z&KR$ekJu~NuRFnpMz7TSe)&0kf4OqXk zT|qsWT+c*HzdrMRCk&xGa7>MT04Z=xI-72}GqQo$q%3?7REHPUIUI=WBF>cwEzZcG z>Y?h-_}jrmq7alGQiSN)5c13Lyb|@Ab*#zCXh0qr=sdRr2c1`O4Qte>k+>;H@k!{- zmtpmkN}9v7(c7Jd!)t9;AMG@5Wnp4KA$A)*Q&5M%_XvhCKg}DL$TpDZ&VGuwS96{C`;eUyS*I)+lRfzw?dLydE}bBi$}#_Z zs9e#$AnVbzI3M!mGqjBKx<7J-)quk%go@-Cmz)#2_0 zZJky@mhc5~--OJqiH)RSaxxyFpHh$pzETJ)zL&4Bgkm+^q?byl_!+^YeSc+_2<%(Y z=6oGjM|gKJjB3F>#fhzr?o?466 zei{hSo}_VcmK8Pjm*cB^>_Ij`(dgOo;0}#jZGgoJ#9ruI?1FUpwLZw#_o-Fyn%IaS z!Xebzbb}KkHUd6DkRWErN@o1-4M}9CL{E>P#_Cq}mmrBDYo%<-`%`Bi>4oyd^X`Khm5? z1^38pP10axLzqDdOaD_G(Qkc8ez}kyk_=qh80Pc4Op>#maofkJJNsBh(4}D%-Y@!f z)YbKQVDd!2=Td{mT#W4WshwCgkPM~wBXt?N3z?hhG<3r{MBaN*NqI1ikfkoo0?I)k z$V8fjv)LfO{SRio{hg=a7dCL2gPqUbbISdK_yxcxdxCj>|Eb}ICvy`DSb= z=*n}e_D42&*qJ}YcLgQEj!(4}7bX)f#L{A~==Uj2dI$w5=k&kYEDEC$N`k0%%mv=iLSpQ5{{MLnkn(qL_ze9bhJ(e)A?qi+qu7^H z5=^mNKyLtNRcX#Pc`f%;N;^u&atk^+QCFd)amX>8KW|u#3$>47}DSy&%NyvXNM z*0+PunMLjYA74WDd(EJq!e}dW))~?cG|dfkxd!|w>;K>RBNQ~sn&+0yf7o~U#;Vcz z!_)eQ*?r?^g%JzSGW*74Xp!^6^4zu+n73CJEUfl{BF80Dq(4FDgV(EVne^DS&BR9) z28F4SmF>1tHe{|o8#`*)r?$DFNAWQzqj@ACMQL5O%mOP~l!|MbjbV7th)5xMYq+#I#~7&y;j274JoE~GX`5^zF|!fT!+)KG z-q47zN1i>+9VB9iPZQ9{NBq9nyu-ha0QStlcfGB)w)D=yE`5JSlSIshi@EZdz*2Zm~Mt6!h zks~n|w`V1;RyOh+{*|`~Exx&`f%OG}Xr%ge8$KlW5j5cXeJ#7NlGi_Po_-xd`_fC7 z;-B~h32sN7HtkD+OXBVGh(W~HK?p*hOU~sRqP{%Pnl`Ln^=MD6E*Enzj11ZRvZ~u# zP4{Od8DIM~oi-rWpa%mk$6y+zNRHxqKM8+EL!cb|xEeS2p^9RdT=xJB>4I^Qg_ME9 zxASLivkQS@y)iOKqex!N$ZUuhZ}Q;cM9b?VVa1IbmhBxJK=x(T(dk9wl(^h*BCj|} zX5ScA_)>dCF8M(^zcpThRdUg^-**?^xr>L(jhSMwQ$u#DP=|K~S-{f#<_w0~@tTdD z&ZyXOBUF(zOls>?duD>lG{7D9lD5A<4g=|qA^)*L?=1M{1g~<<{7cRJNZ!C98 z5gi-vf8B>5K0mgcFVW7R3eo2!5avM7L;Dlxq<0-Wxb)cj!d5fsTP-6S3K5a7ap{~G;teo z7^}8ynOu|T2y8SpGka!Ly_y-*kn0@3DDEv634jO%!B?jdJc}5S=43FF7~@4SE%%UL zDmqNhjT((F?x*%;yahk?qm^A}D{(Iin&QD9K!){jF*+t?vR) z#oXJu10Q-O<_;Y7pn%)xL?+JrI>Z3SyFoo!=Ef?E8kWD$iCr44I;Yi^g_SwrTD%!* zB(u}@q=n|h<_>yn7%+6>RN8g{`MZ1WsvP?@`=X1&>xDz6TGr~DBPVa!{3ftN80x1! zjEZpX)9rW8iU_{;t+ikSuu?MUcMvw|7CrZGU-d1~;3v`v*|DMu5vWWi@C_Q6czYq$ zWW-}`nD*7qU0phO`|z-gh3_=oLmgD_r6jCPX!zSjRZNgV9=vs4_BH#^=5`0oExvql zdYY{xH{TRMao$+nI%8x>)wRkWU|?5Q*VqxAJ@1xIi#qi>HNV3}msJaxKtwqc%8H#T zxEg2Z;Nn~Hb8|x7O>!%Rn0Bz^^ZV?tg0@*_m&{W(G5b32sU; z*x>2>uZ3u8xdjAa3A`|9j&78-+-Hr*%2K-Q=;8h}oapl%R#p<248-MYSYH5FDN)ye zVpn7)a+4WqFtA-co?@LC5w*7p41A`Fs zPGX%*c&YJ?>6VUqoy9+;Y@gn4F4LAID7i@LQYgwT5xG&|sqXI(CF%mXfQ9-U{~)bf zt5aA8J4q0@veS;~erxuTSHwM~GV5;d;Xj@IQ5~?AmZM*hf=MzRl$hp9RmR+rwWk4u`tx17LdVa~qlzH6kxg!#tH$4wBKHbc@ z#ecK_&0$6jUr%jnCJ|8R{9}3MtxD%ss~pj7 zh%>eDbZB%llN$(R zh(HD@=|vJsuy9%Xh~tOWl3_&Lf=YESH$Dj_m08^do4<_bP6IJ`5Tg%0 zaZiyq28A!5MAy}5=D~8jFwTix+L?Y)nEcTC9`^kd@YDZgt(dZ)w5nsMyV@|vsV6Q{ zPM@#kCfmyl6lk)?lpnQBvhCW8I91E!A*yA$4sgWe*yh=TcBl1Kq;9S3U;bB2%i{8n zU0Okm8cXk^1+KPl~Ds z{f7p6lNaSKODUr{F-QV&{&ifVR>iDyD7a93WyJPj`}TTqxOCd#XPc{+Zi}zD_6t6e+yBa)1N~~-+%MNE*yM6IcSRgLdvCds zM69v^B_m243P+}+imV#>;i4jSS8kUTPryd#CHm1{NwA-^KW4-okySlPOq@nqqd(#% zURq?_&Xq$^d%>agpYv~g)(S&KoGLCNl;g>qA;BEVEB}1-M4#`JAM7UEwp}$7A#*JW(Ei-N%yC%`-m7Ko(3?o7UoO< z$df49Sm^)P_GmmP4bp)BKeeGxU0V*&g;(9S}yOG8_j zK;QDWki<%z_`!gx|?sprRE8I-(o!Q-Ul zjimsLp2x4_(yimZp@z#eeCtp{&`brRDkm?`=G(CAaYM8a6{ zoi{DJ##^Ga8W7qqxMaj6WCbWM6U|m$=f`|lvi%ZgGtL> zMB%o%LvO`}jj;A!K<#|htdL@Z#(^mcf8|wKNH2xhWgW4>+w(sUrlRyc`HRgsdt23; zM2!U(9iBvV2EC+ko>myDRNt-oyAr&5q4&*^*_Ex6KT|i$+eX^9%J6>Y^gFK{eRTrd zT%Z+%p_kGFW~}JYQ2+e~KRtb3>07K<8yY)G&(o@X@lgV-T-#Shr>q3pE%@<)n@ui< z{Wxav>5E+AL0r_((K#oB%d~H0e7oH*2XPTbmU590xIQz|s{E95`N&C@mM(Vbj;{Ee)Ow-8sjv^ciKB;u=;`b6;;KLTKF$svS{0n`1l{+ zhK=yNY4>4xra|uTB7*_n5*$rU_uT4jaC3DPy!CWbQ#VN3L+7>!?7CRes&tFfY zUjG^T`RZ8vwzi8W1vdkG>aWYGPjjud0-b*h@1h@95rn^ui`3KYasg{4vGx)Z*>Mv? zOwG+ZL(EKi$wg~-rMo_kF%z&^xK0yL-S(8EdQM#VhV;*ihZu^mJI*KKP+IKZ>Yx zOR6F#{DQ$6A8lgc0F({}yvW~jcaL+WhBQ(HL89&O81v-lbK77USL>QqP$DX#I(oWu zjf{-EL>HFSFLc|d)OD~&A^{o~yKL=>9#f?GAO^eks@ttk&(}ezLhACZ^#*9A2Cnv{g%(LOR%|OW-VrKJe#!LoSEj7bvo|z8m12x+%NHw`HWget68W)= z8L7|H12bM8TyWmc-tcfxTEX~<{Tlt~qi$eGWsx6PU2!T;b6m@}xdST#wi#XG+aJoj zJj1uR?E^bagFZ`tj<~NAzHmvjNohxbzTBOcr#Xh4e6k!)r@OGi_Nr&I40h%AG>}%r zC5%s#`USKsuUFbcuSvq@s7XVLuOH6YS!wz>yQKB`#M8gTS*w97`pJ%lJ6|u$5C0aq zq#!)Q@NmMC^>cks_bY5WbhW07%IHY5S+hF95*X8TTkBhpwf^+5^J9CxT~RK+aLLMH zE1w`RtdV$P>lr`z;ivaHZ`bNoeskBBYbDyHe9BnpqxwT@{|7(4Rn@!=`-0Lm+sn!1 zqo9Ka+n{KiBcREiyM1$xu9p z<~J#CQrfQ9p3GS9i*%JeQ&Col^D65Ka+y*&^9gTg-yiY%nPY2o`QlV z_<4GGY_klTfE?uGqtc>G&*bEpaExk-qbd0p;5tkK^ph5iFnz4`$j%o@wM9mIUESJP zttwn;1k%LdZi~$00ee=~Q`B$RaLnSx$1EIAj|em0b?MT;o(x3UYiz$`6&QP~BR8bp zrcw9>qoM3+E@i%X`WxJ0M|!&G>PDE19$oA6)oisx=f;MZ)xO%#Jh&4F>SE%dKe}o( zjsAU`McF$1)Titc4?Cv~@u{_Pe_w8CHS{#4=?Ag%^7n*K-z1}ac ztG!lflfrhaywL&&=LZD?`e#zo{EGnW&9vLKdkx?4CUwQ|!POs1eTL46o{_b>qiXi* z_CK}i&n4frKm#DJYgk#{3G=W+X~#;}YkxE;mpcWxqIsyI{fH4d=p4e%W|vlSo$B@p zSG2A~mw2?A{5A95r`0b?iFvotIf>wnsX;6D|9Vf0>y>- zTkQ!yRiLFiSpp~5wvAh|WXXK3E1gT*6^@i$;~ux}^5x5OuCD1o-uGa#D`~B}p>2=@qIM<+${blPk-FAF=oeAn!ZQ|O^BiT?lyxON|ltSU$U8LalG9$VU>CrHhhte zzZ)0FEuZby@31ik1pmcxu}3pbn{`J=(7scrIv7Wi39ZjTT{pfJ(@B|&Y|m9xY<}gK zd-%9jQ+0#OXU=q2xYBIP(i=A}!3uf99Q1cnK2DuBEf#uksqghqXz**(YW4uh>C*7D zZz~^jef*?J4VmAmzi;Q*&>cDFh`UD9_+@T?V9D51ygd!;zGz_VGu_g%p^J-4(u{yd zOoO?DrPC@82L^gZMD&k8GF(e>0Xo&`@r~=(Q_C}+eZ5lf;$oNn{reZ+Yd&qDgUPY! zqkQx(`VHBeyTM2AdF9l5(<@US+1L(6^ws9(;_m(%$XjM+W{bGp?)V9P4W07ThYzh5 z-b9e~Ct?o$EfxCWIcn%JKkLit!vVvpcDM(OwXkS?=ImK@4GlfRowK;eY}Ba~()Zv$ z!z#}vEpu?Gr`zAix_S*!N-?B!O2>77R0KRQH27uE*xLpP&z;GAqW<+9QC44OifZ=o z#i>(|+;xw$Oz*?BZRLOIHtRKHNGq7GX4-d8IwVB!UoRf)-KS3zAH5F9KJ7KGH!iPN zkYimv3R*k$PQieJoSYJWyPtTH_k$Zt>Sxs6<4N@BXB)CgH>y@N{{&o+KM+fTVu3+fDDk=bzHB{-V=3h zGpDzPyDA~*-95%y?`MY*Fy2f%w?p5mok36H&~_cC`k?-wP}Ex5!=5G&Y}0s4S$>zE zf=x7RYuVV?9Dwc1)3oNUuzEOgbvCTqnptj7M5-qCsu3zodQuv;B&N$xTaztYMli~z zYgiX7m128Yq1d-`p-nS&?`(h2AH}0PyvSV&s+z4^cAi9;^{`8zB!&2X_@}m)(O0+9zTYjc#A!24+0&t+1j{bPVD8b!rW4rPwQk)y{rdVI z5f?9pZ!B7{nc9(4e-Bp4J0L*S*r#dJrmo=8S9xEfD@(P&<*4Y~_U_dXZb#p_Y#_&# zu^%mrS#_X%Y3Zq=+eM}2O8Ss>H9V}w(qim#kA&N}cRNmc-^4H!dRqzPs+xTj3e{AZ z^FlzR1?ic`JPbVQ-=x3z0E3j{0Ww2zRhy1jqpSydP97sHg2UvG!e+5*O||cLC{E7} zFIvVVmwL;V+puwS9nxm--@g;UE257=vGLW~?GhQr{hr2xf-4OY0!A&sSdU_ z3|~9s9ot?^w`UEEv86m{@(rE;On!=()IQ+C3&FW=UFX!SpX_$J*?v>r$SPc>yKL z=RPXs%fII(IWRD!uBlo7vgID;eX@{OO;D0DGpHfZ`SSL5vxiBKud1fJs=_69G^b^z zsp+w#WqrZ@%tu@96}NUIRUb;PtSR5*=-6S{u(otv$Fi|#PAg*GRd7C}3FY>c-Tb!b z5EWVj5&{fQy8ZB+%>iN2ikywqD9c$TLJxJf)&;B`5U|FjJ|o%Yke$TY=0 z>v(q4%U9pt-F}z7giy(Vj!s8IkFmy+C*K7IG}Y3Y`@?ZtKWgzoP>=o4@*R4%Ivy_H z%iH^JIPyXHzmBhXd8q-t>G6=DA0LVRHA3D$856AS`=Y^)xY1Fx2t=5(_sEgnhLcpp zUY8;zA%W^;MIkjqGX-VNmS);pcOO71Eo1uN7FWuX1-0AL>f7ZprvDGn!DLRWqzit$ z-STmR7n9wZQikfOlOmY|Hhy9U-E|FlhkjCk+z88jLzCB-LO&T`qkO08>Xm8eKlBvI zq)m|AAYb#d`$Xy;5*iwM&g4Xrk%+tLO!n^E+9Cy=dnW{TzbhGxYm&)FT?{AevYKmi zkZlC;2mU9`XzO!q!;1qDE|Wmbg=M|wSADSi?i6+V>&K6_Zj^!RhY=4q3xha;$0`=w>;(PZ6<)R)mKx{R~l9anXXUs$`nOtFng zo%YO({9#|28ut(s)aD9Ng2!fTGHFJfM{(OF*S9Rs$uZcS6W99IwD5_AepAv`?+GaM zd)Nl?M=(w49UdM2h(5on&7KJzNmWMGWogmlCWbdWa?wQo;IO3@P|NFmEW=uA-wg?O z={rAq(7Fhh_ND>9oc68CT0it*i}F+ZV+#f-zuWo5wrPm2I(5@%D0tsqqnW$axz$ZC zYhSI@R&h~T>_Rxw3!d4H>DDOY#N73#^UK1#Q+x`Z(hV{89A0|hg@MUm_LnNhmS*Aa98y9i`qJY)=lW+ z=t0m;qU}ze*Dh86`sJDFG-J#e)V1$+u(@n$L(5`GuZ+D#EqjGzYHk|(hI%xJt(MxO z9G*WII(ah3x%u8lx4Mqbai#8dqhHw^MWY(jb2r1ODx|>Sq>z6A@9g=(`wt#$7(8=_ zRNgb<>eEG8cG*%62Fxfo9@U{bX|BE1x_A5b3RDtf*RQ`!?vtOKQSjhT3CT5Q<4NMG zS>5+3<7X;=aOf*`@Xx#xp42ozsN>aQvJ_ixP@i7~8l*l5Iv0BMsDe}42wizMPJt=q z>x}vHKlROikiM#y9U{8D`}Pr?=GpIU85@~A5W7-^0(^DbxUH`o19Wa(_kE}idXoHp z^@xebrfc@Z?0v{4M=LZnTSr!X@mwMsXIrG3r)LuySxH&H3R}h7VP1Ie!GoP1i?28o z)@=8}U4tmTX-U_CcWwDU&w+2-FT=Zem&}WDY7w(1(SU)bI758p) zek^o~dh_v``-&ZbDatntewvYuDvb#8w_H?cuMyF4*mi&A$x`d6YZtz7uyXG%>};#E zW#Q|A%#l$3UHz6Ybo~F??w_T7y?RXF(k3Shu1uIp2C;50zO{a3#sBdwM6E^IU05|DgeL1dP0TBgnn)`HdkRD)UQ$iikv;u(qU?UPqe-hP*I#v%hw>k9zX3hvSYI5j@D-!cxx z)gNy*jgLLr@`6kC7RCq~6X=hh@KW!-uOU&-UbX+IFmrSkI!07s*b9!2?a;bW{rZYE zR(BrJo^3F7tn%D>9Eat4(`2E$`|0-~W!SEFgC zR?+YO-MaM{jX*{Y`t-#DIccr6TWqxcuqxw$x4LwSII?qRLo9AB?7vxWnqgtF1D>#! z0?1ppPoML3A76Mi;_-P{>8yT=r^^PG=nOceGdW|&l`9)x|EN7>exJt{3F|WU&&}3f zxvHA0*(VCHl%+lP-1ZB4Kr7x^<0GrxCk6jA=2%wc(zwsXc5T*z-ex#c!*qo}ccZen z@p;JKzvNT&RqdY>PAzuyM!N9B$K?d@C`2Wx|XetK7pC+B=KGB-!+ zFCf!wEGV6Q_PGPYyT{DB&mA~+^3B!MR1=ph>74k(y2Z^~>f1SS%Sck1Vi^N<(}vzj z%aMVV+x4aN&e@)A;hwWAw#&oUoW|XNhs_KwkxDv|O8U`fz)(p?3BZ`Gqg+hNx5vUl zMFu?0%+25ZT~8-QiR0}c68mDN|HmJHEJC=TIoxR=iTVo=>QB0jAgG30e!i`TOO6U( zAur=fADlw|P&nis-q^HtYn!zR)KKk^W2WD993TZXjkiDPIyyi#dmlc$2c^~`M2K^4 zI`jjQzr}LHJ_;l@V!@VQe^Js4(i=2r5DL8*x-EUll~-@vup;p}-5X+&+H!TPrT1^t^}hQn zyIpmC$}%c|nC@-^L&MITX^7(DZeZ2-E=e;^*9i&^?m#2RUe)$r^Rw@#e7Ej7V#KY7 zDkcvdSqO!KrgRd??Y51w8jDkZ25}P^*%JK;)EEo{0fjBSFuJ#X19fjZ;`*AkYr`|j zK8Y1i)`t({da$x$MNC6 zhNRmL)znfc$j#mU@}=b}mwH{>jo9qq7W>I&_r(EBNsQ#qad-X;(PRf@_kf05$LzOT z+5EC#I>Uda6lO-ZGd%3^?Lc$&85f740$^{n1OgA0f2I&oKA3^_;i=oeUpZ9dC5<1QR^$Hf9<}gx`_2^d;tmpjSXr1jo`Q5riwxHvD*F@&Gz>F`#0mo za)~lcm^l}hG)9lGBRxI+`dT$^0~$4RW-~-_CNhzka_6;kYT zI%+F`NgSO9iuz5OOk~aQ7+Yi?MXP`08|NSMVHF6jx6{&EA%vW0W7CZ;a=okx?QYai zr0R;k&Smx{fg_?GzF3VUq6a3T)6W-@Ph*AjguClFbf}hP*!~{}hWtHudt1ELmtTOV z73^BSe*LD}u}7)1pQWbi(mDpQ^y7%ov&{~V)dBsr0haAyYeODQz?f$-2l@1wGylM( z<>~904oUolU9~a=Q8JxiJcJ3EpFitQ9WyTH)v7HUHbF4mHl`Kiwrf`-`Vg;ES9`L* z`!Te;BJ-9u+K1h&JwH>6WYltqj-Ku>yY=hqtjRu^kh2-WA&G0D-=urTo6nuwD9gpU zo_Z40S`r;uF43epG_L;;n8S*a^DY8u`r7ABhil|Gj3%Dl!AQhj^^m6Qo(8w$`URaj zl`Xd>|2)v^$Bok^&Afl*JR4a-{&3&9bIh7GeaW+1>ojV4U_Qo!?H)aP6sqmZCv_8i z1CeqMfBhZUqp|0dsd!xVEHkq|f@d~RvVQJuU(%e#F&7F)xx>^AT)%&}r<s4$ zV*6)|w6a=+ftagk>__R^b}JqD;KhsY1!+xSOZC^j`vW`A9&&WN@2j=dcLgac*-K)J zxAyXslZ^?o|I**g#^C=qJ?|cuFNBRSDl*)jG{fC`F$S{^1bw+)fHv|D533>Y!e7|u z9SsfJD2jhmViWwDz?cI8US}dbT9$chxFUyZD)L;KJe`)UIWJnO~hk7Py#=(0QrI}9} z>2AvIS>B~Xhg#4n3{l2-br?G?)?0h2O}&$sR=sY+ccrk9=*^F}+kfxgb#DAN6q6pW zUd`LxZse^O3okUa5Iwz@UdU+2dGp$4bbP@*)?E}wDZuWhJ-Ow#>d$sYSDHQ7$w^gP zzI?gX=FXY8{=rd1IV`RXnS+bVmhtM9<-(vv>+ z3E-1-S^Uk;XpP)@^_NPsb-n4pepqj45k#WlX~|~t2TbrI-96-XXWfgSwT?s}oR529 zLfTy!cn#biJ(@(*W|zlkDz)hxBJU$dJm{bh;CR;U;248p2zdn<4}ZerxhAZ;cKg zpsQPcEUh3MR>|bZF#j~$an;YGU0ejY$hX9QXnSix?{r3t&j}qQy-v^*n>mL_m9sT;hQyT!2+ElTgq%s6wHsXZlL3k zRf|#@A#OuJ{WjQLCMDe{&pY<*+mr#I(JNN;MC7Va@YZ9|Ie7W`rR9|lqoaTYmN28R zO;(g1P;t%SHFp7zbdUh9C=Q?%v}|A-X_CEo@q+xhX5+@y?{wCybx*409(wHh^)?ui zPT+5TQMT(-PV?)JE2)M{^^JY-c-cHGB3668CYdIq?>y(+H2!)ei~^QZ^y7<2){2QZY5_-h$zb8S~~ra@FKj zLTN*VIKyS>4I$r(iRo>IdirksJntqW^T#`S`}&V?HvI17?DiGi%^I&dFZP~4-$zm3 zf6i{_KCkbM@LJXB%<#A{?UO;c{oQt>a?%#xbJcbu+Ty=+53T;(VU5~Hf3ga}Gho!Q z=~-aSSboEb2(=?=h0%xgwMwtRwvI73Z>c!S2okBu`x>lbErn&6`I=_UxPc7i?Z!Yz z_ldU4m%sh^@zIX79jB){IbFZq?sPNt*8SlIH&bB>nyuk4>a9f*^xx+Rq3RdE=!!ZD zK?%D8i&#_YM@s{)H}n3cIdaP|m^Dw@M9*)i_o+z*JCNa8`~7&`Iid??MI8mnya5SP z`QwpA-phM^W60h~!E&aoJ3Z0PE?lv9QYTtEdn65qoI27>AYkM@YmQJcI)kk0 zs-o&*#0P((1_ax@_;7!qdt{TEf{N^jr=g4#DSJT!J|FTSMTO!a{Iv^r@s)V#3D}pSoH=)$-|OWl;H4pGAc5p zPZ3nPLV-%{4$%1Hlhy;+9>bVV>pWoF)~#=1u&5Xfs@OmtPr`Rffn=X4)FT$>C{o5M1OPGJ(^LamwKwTOs_>%02;oMQfl zee3Qqx_>Jg70QmfED#`Jub-ca0yD}LGhJu{3u{3B&!YSmih)pVYyXP`0A*BLA#a1; z{qx})xRq*i@$Gtp9~zI-JBSr7hXD23q4}-K7wGC1%wUxV*=h*iiVwKt>JLwz9=e^F z*aW5JnIT4xG>)XnFAwe0qemm#%WY^tF;_9Vc!pFZ_cf{@p`UAxw25tVrR zMHqvsM**QND+m8058&>;;_TI{2Y%FQ9}!M0yz~0CHsFHaSo0s-#tgyyQDuINd_&nw;GuP zg~OpgG&D5e4Q4-j{5YH|hq+Pc4-g02uXErDv+lUyWE`D$Y`PdpH-5w9t{xiCZf#RG5?S z`Bq(f_FQ3aV4D5|r@i-uDi&LM%=mOHICT^At8N9?UZa3~`|e%s!&7I^9!$x8@yJ{Y z3kyGsRT;4XcD`Y|wT7s<{Cd1_`uzEgn>6v9;P>7!%;tSz;-|B(W|YtMu2fZ5_us#7 z-&SPH?jDN=wApj=&7kOB3AxY;dlvXb+UqRO@w1w`eBa!N=$uI>k`xL;X`L?KeXePj zr>;XqBLH{Uu$$x4dTjK#9vv1O8JXIxtWl(j&j5qVi2z{5D00!0glXdvdLci6^OEU1 zH*_>Rl`vZEXheihX1nI<>JLpIo7Y0nDitk-$k4Kji(IO;R!5cWSMKcz2488b32G=9f4D`K`#jN`%({3-moq zJsdrGvM!Xt@oX=X;_~HNT&7qzK`fe62z@Qw{L&t_s}`^*px?fa*}v>p5P^9~%Tt{BzHP%*=9 z-gWy1(}tI52%s=w!rQ*BFJ>JLq820?+XakTyS5*yR5v0W6n@w3AM!$yL0`gr1vLQu$0`A zwL-y2>RkJ%b-Aa@Gc17shmS`u8rt5#*R*^XH5le1YsmbA-|lPbJpg-$`+$&e>TEjA zrb<$EowP#SxKJWb)BIFQzJAgTl>w11E2A>Uhxxh3cezq^EQFaJPny$bpL5+(&Tec3 zJrN+kB~XJ%&nnB^x&|MAZ{{cekFWQR$GU&}$IqsQlr)r8C@CdWHVrE(rIL|NDx>Ud zO=Lwzkz`ep9kMHBhD7$v$_^p({5@Y>*L~mL&-ecRu0KAH&-J*jE6(@%ejTslc&?+} z_@9@#0xvUC&3Hss`ksJ>Pi6sqTx=3LDKHnhU>LKTT+KQ4Q{_tGhq+(R2222mAVgFK zHw2REZzBp0%COyk=MLxP?M|jayL1n?F*@KKA`gEgQVpC>OX)(}LWiBOD-kH+2F;(k zC3A!f@{Z{ta%>k9;SX{CqSp1yP}=EM+<^*Vnr9~Q%hZF$a(+;St~UlWN?51WDm>Va zdW}-ai12zG%;b)aj=Q*FXMs6=)bkPF4OsEq-hc>>L-J6ygr6nXZaAsMF@NmD;X5J% z)n!1^BRZb!;^LwK{0*5ZfN-zq=;$RB>_g)fT76i?kCX5&kUvC3p5=fHc?E*NaEHG@ z`#{d^|5B4N5FDBM#0A6;W6YbGre6RurSO_;cRT|Y96uW!6#zWY4{E$dm~1g-Y>(@J zVZ_Agmbn_iME~tcwV_g4y3to41FTGlcoO4`=5@M>+m?$}Hw2Rufc%Q<Qi?oQWh-41QghE1D3kL0Zs`Z=E#_%Ga5$zDe% zSKj$u0+XT_(DMdP8hYV)AR--zEq^;xPA>1)!e|0mt}ERQ!PJI>22pICM#E%xF~GxfeN@_p=4R!3QX+sOYhWA}-k-F8W{}@$=*0%L~Vcy7L|tj_gb~aP;)axkz8^j_mv*iNO+=FN`F7(MaNMz ze&e@j2lxim&cA-i2-nQGIvLyaE{Ifpe(8EPIBvJ`Oz}X#?O{S_^0jbWJIsoSU^8 zHo)u9BOFO1j152__`m209(MUMt(VMQ{HYJUk9(cn8{p>U1(DdpUwb(9(9nTB`v>6k zy^C4d6|>Okz6n4k@FG3(_rC{fdNV$Qz|=DuHir$c2^2z}(B9pxJe&k^f!?og;YW() zr8sHA!^4Hpg{1Upw<<{KJ7PE`q#T)r96%35bO_x;zEwNfo^3m}{hyvP0Vn}VIi2mY zo$Rv8fEp;U=`%dLr=}(&vl3$_z^VGD4Gj$|!#pEEO4Im{2K4AwYxF*%SThPfTsf>auzS)q;JT$#E7?6IqB@Sy)!=Jp0!SU4-hs zWL5M{W{8%`961M6=Dpqco3h$Q75jaVt|J}U4bJ2p;^NJ1V`bOW?Q&SLmv7BejqLk`-vv>!9X@j(rpKEy%n02+)uFpV^kay`U!!6f5LdMLOs$^bHJl zVvireJjh?>6!cwaN$q>K65g7J z4?jT?L)0Yf$wd&#*eagK|I0+%ePlXgweMw6A?1+^SfjNG(l~xKWeA`$K}f&wCP(0& z1{zHIbz>=RG!5sOg>F))e+wmlBguI|uiNp2#8s?Xw{9~_q;x<~P$am+p&I~qLEYVU zS1Z65caVT(e8FXvlUk;x2PiL~)w%QdkXPhzm^w~3$)k_ZEAkUay<30-Tir;vcpa6U z0~iawJ>*9ipbFKLD>?|cAZzK1yAXrK8wPcX$@RQQAZKLmQSCBbMN0?%38uk(^J(-bu zbQ3+|UWE5fqZxXSO40-O2{ii)GLKSoy`m$L2#n*q=FT>?<=ss4mQN|Ht)YA6T7 zedK-dI(p#*{Od0;%n|A(6iQPfbxt69mzV0E2i^sjb@s(D3Qw^YNbrmjftS1b>L7wqIE-W zkO(e)#70*Ue;&c^tsVz7TiV+TbmMd!m6KZqN-#i%t3Rt35^jQYA^GS&Zo%yMS-b|X zhp=EC#DK^bWg zJhEGNARDMEs-6q}m7hRY3xGCmZ@S^9*Ewk8DJFa*10n`xTt#2d5HEln$#S?xfVV6n z9s&RjQJ_dz6dL-cpKUEYJH!@X$WdzyLnI&c7SiT0FM>Vyi$m@#fR?9LHze4T6-VDI z9PnL%0y6@7M;DUlTkZFuVoxdp2}Bs>Ndql6q~ zL8psQM-Hh+kJNe|=B;wb~6@WIRe9y|?4{i5tD z4yWgIb$8b^`$Hhqf*Y9`OgNKcIZUGGE?l?=a4a(!^%UDxmtxDt?VzBoq-5bg)`mP1 z$$V?DZhRfG4T)5q;+g)KNKF9P$>1_20#{^3%JlPDW~vMtLdmYoM5KQ}WZJ@uDQw_4h7QO;Zv1GC#IU{OC}vLpX@qlb5e*qw`40kQ zpMpGcoPl!ZWBLyeHAo;#Tv78xCRy(yZ%JWS$Qdo!_ujI1BNV+$?jPSN;w?>vdNPXR zNFERWz~LjNlz{Y3>vbi}r}0rR1wk;nPeeXND1W}RtV|ktEgCJ)K5m<+h{FrK9wIhS z0HZRl={M7?zcFHEIi_ArAqx*i-xsePRts*WAWmlGWjOLb@}m;7(SV~pPnrNr5f(H7 zZU|sFoFy@l10>lHrt6Prwfo91zWkj{p07R&Zu)&^OmjUsTLMBoj5R!Vb>^K)WLumvP?su72A=`GB1jck$uy`=LuB#40Ue zq9JvlAoR|(nUet;EKndY%Djo~>DIpr0W0*fvXPH-(90OZs-me%Qdzy5GvHjNhkzTM zS|t1;by+sN1R2GJv>lWKBcJYaETr(n`_BPH2hwQL{vyu?P+rN($&|!H&ZLMU?D)oU z@$;BO`X?q)?%TS$3@V+5q1+~uD%3bkIIBiU<43xIhCLCrIRGU{xYCcjbyabLaY=LP z8X6jxw)_`@wq3&zR1J~NLu=ngYAia+B@_ZmLgsZB{7nP~A|S>0fyX{~7(Iz=LK}$n zcpqQQ8LTI{SZ zARA$8E@|4XfDoUDbdZC0n@5mcwWtNS5)ZU&$G&}~5j`Ld&pDzfVU8iT{1a7xm(AU;3<*#Fb}W4{QG=_{UL zJ%|9PIu`(9`Pf4V)S{jVz(3)~U;qG#_0U`IkxXQa;E@koI_RPw(;lO0XEjoNY#2kSFr%+`RP=QmYF&3{KR-V1ziz2#^|>;8z2Z zPb|&-ybXkMIBF%7Z0%lj#XJ53gOc-Ge*btSdp}xW%7-QS`dj%01d?D(Uo=ISvkP+B zl@=Et!`Sy$i3_v$n#I}sV@>~$Udwf+kMtGCML(GV)i|4tx#V?B4ByPkF|h>I0{RAb z0ki7)K**qaKoo;{f@t<-r*+Paez8FQKv`4axG(24Yyay?)ISYG=@wJ@gPG&H{!hL1yW$r{Qmy`t(?WQJW)dT@!O?h}@40nE`yUTd;l zCK#`xxr~c8wlf(|x-+|3I1r%mGDW8KwzzwmTsZ z&ZEv}6%RaUI0xmM zxcaaE88_4T z&X!Nu6=&8tnYLN)u)k7#qsG0+90rD2$F+;cQ1w0pO>hl zPi(!m-Bgf0IgP+BFcX_p+HQ6a_89xcSYUg$NbOcxz0kRTfZ>9{2}$n;>#j7P(82NV zRO~dMhkoKOWN3RZ#%aLB?4lI&8Bv;iNWiQ#qlK&bUu_m8jmZYkbKe$?gq$FzM$p z`=z7#$E_i4N&6qDFnmS9GLgqlo^=1k*r^Y{RXYGZ3`amd&UicSXqLZVpEz!ZC_6w& z18GjOLT6lQx7`7t#4L7e1C$p)A~)jSvTMa;b5EG>SVoYAZxBzLp14V&cHBq|OXg#x;vpQU!Yu~BG!5dj2WDyIgryzPImg%&tw6qRR-7o0FC~f~>f5Dfvq@`CN z7aVUxgnmhOh$`~btMHd1LSvMJGDtorfFOr_;yxSR^TAlYiyJQyDQ4d4hxNF=sj4^*3u>; z6F4w=BX?>gl!&sYPSKLcC<2=c_TRcXWLI|W2Ha+c{;H3M{Bz;0%h6m9z-f^)su92P zOX&O6LspX<8R%#i^p)tGT@eySd4Xogs&wC`HFAFXHAaZH{#R{t=+@V>;xD~}FrML| zZh*d;zkj?XH@j%?iX0lt#=~8=(#QYlE%UKc74+VH2sd+rE+MJ&RlCKFq&}h&O+4zg^faFMmWvN}refmIQA=NA?f6 zUQG*F@a_HDXI>14dt6e=th9}qOsO5OO)ica|JE(=Ai68kKUMEzW=InPVh%6$HF^&ak#r>p)1AzbTXpL zH-ooefvYh-09h+BBci8x2ylHt)8_U}hUm4{osq@?_={jVUnrmu(j1a4{3b31bI_;K z(zSrW5%mC{D;K))dj?BQn|NLWDFWcQ>}JPQw>-8jo)CJgowSYZ`|Cu z(aG7vE=Mrt!ruD%Hg%~P2CMR|&2&Zl5fedijfS`lfF*Cgd_L`vVP<@1(haTmdD{{G zM1$n@b|6HkfmfAS#OCXtcRrj^V4hfOY$#RJ+1`E|1T7KWLvaM;E2X#xE$TV~F95ZA z0Ye+W*i3s}9<5wv05K;tHJ|@Tq1%3Fl`}FYD-o%N$5AuaotGp=IS4x$guOaQKc%=3 z`VVI|CME{b8KQ>3Qzse;bnomChM?X3g16~DghuOdeFM`!2H7WBP5Mm2aXV(FPte`M zOIKvK4G3})Hl%psS|l1CAjX6H=UM)0<(B8XH6S(E9Iy6lFc+X79kIx9C0aj>LhE zz~=|H45c6PU<@P2T^~Hqg|H1r7Yu+bemIE?d>4vf_mxN`l-1VWLC8iVS;7Oz_|~xP z!|jzmL73AavLZ4PCdi;nYWfeSWxpQ05;qU;Z{6Ekj_Gl=Sji;=>CTw#WuVI=UJIl? zlP?qtgA!kRlMWin|1U#EKTi$QbUqkXl%uPoEA|EIh(sV346_AzIpUNP1VTmYWgiLG zohf?iCPagYjm5ygfI`7U?a|6L)R&~fvMsz(d`)~-~d}(w|LD*dK5*Ts{O6=C){HFzd=d0@a z=lwWWqYeGUpeUx3DpIc{dcfYKr#ksrMrb0{;&ORYd@*05v-#zLup;LD&1W#*EurAd zzO!rgF3~I~@BiP-wAJbl{sp^)y#RKBY5jm#3TE~z8^&|rz!Qa+0P1QYZFujQn)}L> z&Twu%Q~0lwcjo|_TCf8r?)E#<55!P^Tu(h4bHU1)4X`iBfhUN4mF~~YVYMi>%BG(Y z&D`9$Y{^ke%R>-Z5@9PLi;Tt7#9R~iGtk%1tA)0jsVgcp<%P_Yj<`1!zU&@PJYtwt zn;~A-d-Nq)cOnEa8hP_8&wcH7>)DWN_)ZcEmQPUG5)lYf;%ws<_9f&+&BnZls2cUV zO!f^PFbv80an8!NQ7c+<3Z*ahP?tHcqqSMysr&Hd9`kelu{Kiqb{~R+(@oW94z6vK zuPvN6Pd!~yc1XbF(%_YDldLDHarJ>Szap9s9b@o6c$EIeo`VmMzsR5C&y)Pizwe;H zSK6Mh!iL@Bvuh;;#)OA0B!Voc4sw^RtgP_*79s_FpVc1y2e?Efnqqd~5|Og75WrRU zlI`lV*BUeT5y?^NVZBgwtMx=e&urm+xPks$2#m;xlQ_vjv@WM1JKRQGL>L@*S}ov< zbcF4I&mlp-l#0cy>iUIg*$l!XkHEZ52B9ESYHDf@^aA~57{8x| z>0bxgG<6vkTqwvRCHoSf#94}&BVvD*8j55D?a{BJTk^7_)mn)>|LXPY8y$sf9!1Qb zOsxpYWPM~1wU;-k{}nntY;Rs(9LvSr``*t)OI1a)*~884D0urHd4@BFj(+y* zJ7{$kVc&u88!1;9Ln}fsT9GJ7Pzez+O-;x0E9wm7a7!t(dDKa&$gE6crOGB}+<8GW z`*lNv%-E43l0bEaEa!-NTGI3c><{5kdjR>sjIQBSn~}SX0njN(nMf>7Db;@VprNvL zenPOiwl*>&qrS~t^nA<(GVVg{5BfEVExkZR{3)N_O3DlT>bUv8=dtPWu$>rOLBZ4t z0ix%D$u`fpgrs36jtOgqH_jU#*7fhZ;2hC8zY}{mBwH%*-o%w4lzb_E2Ye7W508|+ z>lK8)Pq{Sxp1s%UGX7}bDM}R@N-xY`OV*43d89oh@;&#l$L}$_Z<=v|)=eAs zSAxm`K_ccU$O)c~H{vbpfL891{pdhurpTcqM~KRG0oW3oY_fo!N(K1Vyn`TyGwdh$ z03X1OW_i`yj$X-f7d6w2c?*g%Sc-3RuqddPJfF#U@L(n7k%O3ntetY$+sNwCy%_qy zoTHUJpz?emVK7LkU${Pyqn2U9d7{*}|8PCcgyMw99K+N6n(jQN@iigy9H7}THX7}%!V2RcJ>jUAGSW~LTQY7AzcR4sJ(g? z-QydABfYHRql8&r+Y?~~rYIOOxUKeFNhx$(Rk1CA3wIWR^$GxoWqH1mkt%r^C_;%C z!kw)R*6S9OfP7HM$K)re>FIG$J|GP5r<~j=plh<{&!2Z?>fuxrywL(B{tD>NqUi2_ z#XfLP^1g&w}&<$IA?fQ*Bra^^uMGR~GHnwpk}gg>Wyfp%8Tf?*4=D zoluUVC4(k>1ZKchTf(?uUvl&DDTE4j$-8x5g<#AG;c0w=*pj)nXr%Z|Z&ibAf^5tH zkO^Sb`Y&1iV1@uU;Q1U}T(VUAolo}iCdWbJcHnMpa71SscN)@pvj2Qn_zRexSYM!2 zDjn@oMb`pVOv>)kE4ECp{71J0Ll)iF*Jqr}v#VNCcxcSM!Cgc0@OG~kh15a+Zxilv zjA+e-APJavPIG4Odkf_qQGm~^VCM%&f%7H-R20Wh$E+nF@9jM~<@umir9He1z>%?i8(PK5Wd9n8kiInBU=*4RtD0HI#U zmR{JdH(pj+TKek-Pt1*iQNbE-WIL6WOezOfUpwC_=x@5Gtg4CuU53CD*YNSfwYU7?jOEut*!WZZ#YkwheW0bNl5CeK&cSk6YVw9|KO} zZg(odH%$*85Dn`sELO++Jd56*QN(f&68-MLa|;4$Bjx}R+!K%d{357>7>Ru(XWQ3P zTrj4$w^HZR=Yx-)II#>YA|JLT%uND(Yi@rAl|Yy)=4qES!)s8N0_P*v2-vE_V`5HH zg?*V<{m}H(5$$_e_+8(7dfJZiNkjcc;k0aZH_N!Q^hSz94tbXzcvu~8e_)Y-uCwP zm19e^1t$~SUwh#KLnh)L+eSSqgpTfLxY|JY5(f-EAhF#pyUKLqCS1_(9j5q!kp8LI zJ_q`lxKhumt9t+{X6NMmtS?b8-D>SUkxfn-8qFlI0eHVt3S-ZHlDOw4SKL`sVLsr{ zUZ*>28W=RXr`=KL!{2OHUGsNIV5FyE&Nqv4GN6VHMkV^4oR$~-?qE3|Ep4>r6`eAL52-|#T7@k!~v1K!&B;h zrhA=t4#}=cb&NVWB{iyi@#1~l zIDZBkFFl$CV?w}TY)W4V77BO$F>~|e;<@uPoF|SpQVg&jdD?IT(8GtAM_x1rJ!qH= z3T@8RI(!KT7P3@VQ{a5MSI>~6p4^(o`5Z|E4&WLI>khFnw7?#aJ`tV}+pH-R0umB` zgMz|Z07nmSkDrMBp^Jv34*7mRMwlK}U9jbLf70XJ{St3LqjqKn&$d~Gc$1Wrni}QE zDaI0oqO>hgfuanNFdE#72WM>3YoebAUb7*z4^S{nXucj#O?yrN z?UyeLezvO0_f2!9J31L2ueE>a5puvla+lQHp&BjdT?p08;vpPmIulxNuc0eaT6!U~ zt}u#%%fy`sKPipQHofu*ir#_oe@2s~X9RKIWhG+xn^^nSP|6R#3gh>xswEV(djfyw z2VoWB1H`TFTB9eQec(nB#<81d%0t9|y?+ESNPo;=Z$M79pwYYahxXP?o)kJh!R6f| z35TdQxV*nmZt*<#d|bQQKOp|k7{kj(S&{yoRbS+Ss>VHVn-JeH2CbDoeD8-3g_cX) z>Fth6d45pC(^7pPCvQGnc~n(!L|`>U zPHkyqkr?X|>Q#~$+a+ax&BWvjZWmDpRwgD7h`dVPu$**kD$~2BQx(us@$`+)x^?R) z6y(v|4O2hCJ+9c>)pxa5DbGkd4u3W=(m^q}Qu30#y-udd_j+Ew=4Y1C6Rx32RK4lA zIx63s@<5n~pZb)Ln#c^-%aF&W{T(T|Kbx!@O`4s2Xj5Dbdj`9n8lYj3I=&s?KyXON zIi&IcNsY-jyQLI%N!6S>txSlsloSisck09EL$;?M01F1B4LvDf-4CD@2?kH7ad)og zAFy43v^ec>wB_T5UH1}{8`IZUp>bi$&e@4n^fbshhTf;$$IDyjM$fUlqE>T83(UXR zM4cW9>;$+g;*jwA^(x>MB!DOpm^vcy=s~)XET9o&_Iw_ z66uAOyP{JhiUc$s&Y7VxGs&dOEW{UNel3bK>gNJ!mcV zs?wT^+H{PspOH(K79EBa9Q#mz<0aU6`0&MQ1A1SRm}okeB7YzvKM{*vKsGV_bv3mT zVWG&4CK@P`-wLP>5J>D0{5@Kx@j89C)({^NQ(Umq*tG6gPp=f=|B`j0(gf zEDt_7Kg}0^J3w3!M%K@>5aL z)Q#peC|LdD#{xJrT$*YU+>g*pqSdaSQmLwONt37qbV!_?laqq|f}|k& z#|RU`S}7(o=gim9BZ`Wpjo**l@Qm&^G7%qx^&3<5b|xmcr>>6-m+i8ed)z3|dby^C zR7F$I{nOk#`(7o@N4$M|N>U~I?0*);qm7-QB6i`j{D>}~ZvJ!>Q>6cN=hfbVJ<-|5 zmGfmJlVzbUCbxHXB3J-t$v9aoBZs=*W^aJ}x#9hc`?QiuHQsb>_; z6n^J75llNHc#*A=%zXRD~a&xC* zqgA}UPsU&hi-3a=4aiSuhorGly1HFREGEHTT_o*0pq-oec~Ir)j{N+>B9WEq6}&xt z2#^!G34kM^V*lyIf?LFC!oXfja4R7#ULXR$+GQLv!0yeBHR{P+VX4G97C+hH)3 zdUzKC#?am^Bc8W*gmD9Qg?s!H6mgVyEEaR<*QWX2(DMDDj%J9z+{fL_SVMEID!Psh zTQ>7C%}UPyyy&TK7OCB&mC9Cw1pd{OMH>4)tr=>;~C1k$)bn(p!DmJ zELF{#$5mO(^0sW{-?CZJIX2J7zcMLcEf5KsVWf)f-dqC(JYmhTAy%H6eS1@<^-w`S z+k~%athEG!2AM@H<^FW3+|}bKd3?4}*0fQTyWhZczB%v5X-;2^$Rr{n{w24^zgmF9 zhc`R_&1Z|EdsW!LRes&r*k5R4X*Aqs*6qL1R}vGUernTm@KsL+`u3GpB!Ypb#lH5p zOU``$JeqV$SC<|832s9{M095U1}deMB}%4Nujh^{n3%*d?p&A$eea(8u23Z<H9VJQMbBSko_*A#psio-_n%Li%pmY(z0>=F#LI->hFG#F!sG3BwNdeBg zo(Q>-u1SDMY=@(Kz#+PEGjXRyhv24HF{4Twg;^@p2=zvR0m8Uuva8{U=nRB<-vBD@ zazsm{lBj)K+IC4`>Krs?I&kJN!jelk6-2I8zO}!S_ErJ9XGmS)Irb?YPRh>WlD1u& zlN*R^|D_bn>c3hCH{7irS2UfOEsu()(ci{B!_7zFFuobaPnVU_9W(SAFKr3DG)c&j zz`!j?gt|YN$MjaQX$b03`nT! zI`G4MQBZHU7a}tFnNt4RWS@D#BPO|1SX-Raz6X*uVwJ#r_eAi9W>7`O@FA~7pvV7I z$qaX(SpIhipD<;!_n5xp;nULlG3zj`FeLc=Mxs`snifnn5q5+5uQ z1z>#@^dSTMNqZ?U1=&0m%Mx|yE;W;z`Wm!h@C&|K@S`b0XEM?`!dKAHAQK{_@cYuF z9;bLmKaQPTpU#$KJQEL!6<4}$+tu0mi)%8+POUnRJ z{lVhTG?zUmk(y-I55YAAnMueYr;y~OGR=v&%u?Cj$pjOx9t%!G29Zc)t+o@aTPd{AZt^)#IEJafX-Ws z44)CjPYACU1y051JnwL_<56Qq$c0>wi~a{6q$(b zGsyW`rnO&fxs*8U7JDz}I&9N&91o}tUlrllqpGFFYsSeL2qqA#I9Y)o`igAgKLMB} zolB2X5)NGh7L3I;Rj`JencapMeaBQrRu&0=KuEe2hAtwZ7`!o*GpUIhxCWG> z#!7xdpb)qLaZty8_LpNyzKOsYoMJs##QwsE=K=h=9oD^+(}At3Mn?Nc0wbs`=%lfs zhYk!FK^lnc0MzJ-S5@J;xvU`TWRa4DSD0w+Fd~5~Q~UkoRKV8yGw=quq%HYX7XAll z5ivO^8*pPnY99Ul zyKN>BPnCZ&Mh%$O=Q8p#ZiONX;dLx36ubjp+YFm*Hqr|p+0~?oV5|Znc-ge+9*J~S zl$heg8pMZ?j(6POs`&vD)dv_77TWd$2f%k_&Zh&LA~I$o>>y8w^b#;9U@Rxiu?~WK zNjx?Q?U)_1$?H#S!mmKaG91x-fSZIpCUGS=Tg$##Cx{@9_?y+PK5o6iU8oEsgS39| z3u9WOH*RI0=wcq!Ws3Gqr5#2im%U$~#?v8QGQduMM2&f+I$z()mj4ICi3f;=w%S*O zSR85jsd_YgM)h?_7NLbr@E8;}O!9$aP^xb>p zI|HCxh|0JIic3O+0+IMz6*hkl;`%lqNR0gYazTGEz2BXJcaFhjbXbewTnO%z2)r9` zJ>TguNtolM&_cZmf#Lx*H8n!(A~+1AFAZc*Qn(sPatUVH2g7xfMB)5NUjhB-Pf7B?QTddG_p?e(isPIeKGuZe^7P zA~w~0^MmeZUgZ<@Bw$1$)BCP+Ye+`^2%3RIhYmsJw-%>eygUImbg~-&S%THOdiClfkxd(m5g$qm)bw1W%t@9tPs1_z zU=mbvJ+=iKlL~--lWceFc~a`TDJMfBq+A{!U5ql>0Tl({u6?9XSbAWUGUDMC7TGQG zfUwp8xxzAXa&Fb_tUK(lZUa0@&=2ujkT)`J6rQ)%5oDuje1 z!ZS#I7)2Y`BZ~yXotRPfM(%z4?qbQBH1EYd;U;PC-mQB6N*J0kHwb6?saU4t#c5{A z1@Q;WQiAfg^}wn;fSF?!)XS)I7wI`35kI4V5HtKtXDGYu%eet zm4W#WXt!YD`JjCYa1#*ubkqB9Kj+G*g10+AXn=`w`p-~<2cP^6S>3jzcQ*$z!Yr(< zSMHb<*&9AzZ;{c!u`3X}j1SMG`p)PGJf7ykfLvgGJ*Gv3B}BWkQt zOd_s9=;3$Z^}^dt5s_dbn-b?*1+ILhP>4_-eH`BT-D7+;)V=Nh-sPDW(Jvw=Xcu{p zDk>5hhfA-qeabu~H6eFq&e&$^v4Jt4lVGWWt^aR{XECn$#ToOC>??0VrAeW?By_Qc>0IV1VKuRhd69Dp?a#6c+eu?!P6$t5i`xhB& z>tPJJ5jg|4SObKmSqvmw8Op6wPOx8>X*1)#IAX7Jwj9Ng)|7^gE$qNuNv!W&Mi?-X z28hb%#xLZbw0JmAfHMAb_nhh-lk-o>v;sm>WtM$IX-GqAkdCzU{j$K~X<1Im!C^~m zh4V<FMix2&IdaaJ=>mS44Ro?*?CP;8qT7(C5l&6Cn@ys0GL;^v4v)Djf(* z2yXed{BF-OJaQA_j=)fYtcWMGtdpUbeo8ebmjLO$;`M44*|KW>H{hsDga*ebpWSbl zMWY9wcZ>HxD%&m{AyLs~8*b?CsF5_+=Q{Ju1xZH)Gp(7d*K{j7mqg`Y&(Nj9Micep zdV5#bE>a{pmxez#v%Y|V5n{gMMn&H|;;d=F4amI8Hn|+q^ z>CU2tp7f0tr#L>$gGWFGazTnw{S=8uZDaI*Fv?d=6`3BBk%}_LxD08{mOSd4KaQ*D zeVdA7!n*3FFjXk+7EZO*^DOH>CS}s%G-EZ~}{buk) zjdx=Z)^OlzHlxl>av&6Iz1VLG!~{#;1(c%yCed4%!A?;_K>lSMyNlXhX`4UN$1@Wo4ug=7jkI*Ox&t*|ZjbaS&aMXU|^Ew*pp z&SS?7-MgGSyW6fzKO&85nNW%%JjVRg}8CQlGk)$DXyL(GU zSptwng+TJp{WI2QA}e=5rSzsX*<^1O=8^EKUgXv5RSv7PRFkA*uo$=>kErkNXY-v! zh!bUlmF_CM(uHkECNbEsf^dWg{xt*OZ~Z*K4gbOr&Hb*J1HfvbyoD{e_(S3>mx zaN$riKsa?|>MPCSi~oFb38a!+#411>uYS(u%j{OE>6rv#rebc-_~n_pc^vA9&WdSS zZytE+fzqR%UU3W?yzj=mc}9}mZ{LKX6sIh{jo%X!fg-fY8^R2foibw#wTpAP$F~{E zVvm+L2pv+4aSWAQPf!b4%VSM*6!-slZ#7{}4KDJ-0_OZ+6F~uO z1s+}qu1IHMctD5kI1DobhVIO38^wH+H4tL~k7^-W6n3jU8i~$3cVPuPu|U@B(m+{+ z?Ce(eQ^OayBQOMlPbNONtD0!4rt`qpx{$W~a2J7&NjNWz8@l|@CweG6wyc~OXK+nI z;2;jcxc0;_t+jxrF5DLo8pTb9C#NmOoF6t;q*U7u_~ zNJ+GudKCDA)!pZ>xg^xFSZ^%BwkFIN|anV-s7%@ z>{E{Afi(V*KfH;J{LWzQ7;rNXPv{HViA{@84`}^;^6p)Fq3D2)#VK=u^at9#*+e+- z=DTEnBbL!We-7O;Ta4T(Qo`4cS^=J)VJ@1UeHZ;qFvXV}owh8{Rw()DSy=X433a;E z(X3I3uYGC~nwO*5lkWe0NVZNMmnB@P2do&A3$3eVOh*_a{jKBt2Tw{#eZqc+2)Z?m z5+CXzWZT)m|8-~jTw>jbib&!!CGVMgy6gL`fJZg~BUYwr9x$nTg3(0>^cnV}Sow_l zsy7b1gIz(1Ry{1lU8>G_yoC@8*b7kaC-JvK3crIs%RnrAJA|E$NoMFML{6dBQjVvK-EfO{TJN}J+HQD}PV za_rN;bLsOdZut(4>SA&$)~cHsMOD-^d4~@ zmh>}w&GVd1_KAgYWK?3IhxX$!5&M4U!OdZf9DIoqXR`no#daU`EzO~?G1%zAT#$JP z;d_kp$j2|)%^EYBE-R)Sv^Asbe!*z6_p|hnoK)M4)NKmfUE+I%Yp=f+*d}qD>WmjWT`!RGO_Js;XkR#E zpX9J2O%d-Zw5AV$FR11ffBiZz+H^a-D_D(JR{v_2RgFewMpu7d-w`5;vA!+dmtq)G)V7oouf0;LTkXdWHt$A1L!L|9J%AQZjSv z|6ty@zSP7y*1tm{ye{7k`vn#mCE7}i65+Ty3#W?W1}CM^#p9<9jxyI*mZ*b(CJ*^% zOHbma{w3}opHFkE)9sMgNE+O?wzTvRBoj~F)SRi23vho9qG*i7W=7J8_fH zR~X1Rtr+$7lmbNinS5tYR-SQ2dNav#g(jLTG*7 z#ohIzuFegZ_G}lgGY~GN9nsYmep~ui*K^buE!;->bn4X%m~3(B3jycU0p^ z3oomupV?iL4wRvbyA8X`!U=ixJSB+#4Pqt{4i575#Z-yOfkXD(yn4nO-rhx;{qarZ zVFAgx`Z?X*S7s57Ck4+ia#Nz{TxlOoKRfrQKUn}}}co6dhiLj)Q zxH-HdI{XR$Py8GMR+B#KV8zmBVzwKxiNRa7Kk-JZ1hLZN@D;%J`5W4l;KN*JAT@`* zJdW<#gFvI}In2Jqji*pj`v|xg3-N(L9Y>+y)*}c!nL)u~0QI9#hzJ*+*4npXCOMkN zYZ}X|uSnzg;4(tShA4@#NAW(%;=Kp?vTLzn!-_E?2B3wbW6nGkqSOyCqU|n?kBgH= z)(7nDOFmpFH9^!nAMQ_BJX>CtZVukmcqq!H;j4PhPBuHr0ASl9zC%lw5TV z%kEQ9-(QPZsc;(gMbfn$E5w#jAZV>b&a`{vwGjUqM3o?A_oge8CFe6l3vLw&jaRUP zs3~2Lr+7Y5qKJ5Zh@AslyFz#>e5W;QY%>Fz`c5ELA;`59@CN!XqcN4J3tCz}5Ne>V zeT3Qzts0sg=ta_Bmmap6xq+BL6ngk=JYSD6a{QQ}SI5x{nMoPRJ{)mDC8MM7L2OlRe_#VX3fWXQH zk)tsu79TRZD1taVfVFr#pODgjblf zBedZ__h3w1+!y>V-ynLsb?X*Mdx3xx2-^!)i??J!N4`Cz1!WMCPE&nYL?7TVgUoJ? zcrVhUCyxRJRQDE-_6qLqO5f|On_{}}wrBI|pVH7^0iwTzg2v!Z^Q*olUK>L&O(eHn z#FIV?Z~b2^?SZ_DQdhBb6lYMyTPkW3iTNNYtcc-}1Il&smqo!)Q>J1p0xJNT!DH=? zeW<^B=({B1A|dC8fAuF48d*w+PXPJpb??nMka`BS%s11qOjrnsxd$&i*+sx2(fB`r z?G8y~jU$|LT{aY9(5jq(jEF2L0$#B;jrM%M^iL8sL;N2&n8ZLu^0)Cpi6WWEg&^TY zYbxYCFGf~xV3QOAOphXJ76_7(>y1Zs<2Bj)bfwshAYvhy7na938)bd|Jlra%y< z^%Md)(P1i)_^j;VJ#^;|I$fsL;$2~}cbYYc*TJ1AQM*+KxKiWO>vPC-a)|r7uAZsGF`|v55 zuq9z^C2cU4<4_Mqrbg8z6vs*WCO>~-k$0-k`tvAGk1R&HeAoGt7x2757XL-_ja?rP z!AL;eEZdj3DJ~{vHPEyZU@oKS?i)wpZ;81EPaJ={38&KuQguj-+5OJqy1=*yAP>4* zw@u}!b8T(rczjabSZ6M4U;xl-;fP|pGD&Zzkfh*=JqbYifdg*^p?HV(=P4YWA{@xIn&5_lnzS8yMTvU>9XsxjjDe*XD{98|1IBz{_``C1~n9vvF{ zC3krJ!wX{{Z?QmENu&+tBJq+Gi@c^#+{=&-S~DhS!Q}(lCozNU zJ{`Q=WsYZu&nW+cE;%WA(p-Y7oVX<+m&~%WVp~>~ZCDzZp8qL6f6hC3P2)>J0cdFk zjqlh``+s-|y8l~@PY;H;@3$(3cbrJh%ipMm_)qGvYIvRs&(^Bkh2zO2;UGlR0J|K) z?%_6ENwE|P3DgUbl2)K`C zX{}$-g)Xii*8UMK@Sydrr|@)L?c#8qFpvYP2eSN8K!Cycx(k8PbNg#CLZPLJ=u#x_ zq?C6)I$?kh;NK%UZ}dH@egxS`}C{XbP7sTZyZpz6eL<94OVgl!ngt z$o{A}X6nxT46|3%1}V-}0rCbnZ<44Nc8e9um%m6#qF0NnxuVC9BkwzfxdNM~$Y8s0 znJQ(2|E8fFMKea09Fn{kR1E+(1sy(;bQAytm~jP35F0uHM6OXNMBU{u z@?|UTfGs5Ttj z(|lt-2t9&NX&Ze1U+|?oT*w+hOP`3fQ78nu2gRbp0bh z7X%eep+KBTb~wIOP5IN>irfVm$AMOyin-B-8wKjgP5+ma*=WQZ22+#q6O_2PIHG#q z!EjPu)#F`b}vPPwYc&p|2#3 zp@M>kgbB7EUzt<>I=bcIKh2brT7A3&A}kAz7aC0jkP_(DD&VpQw1S zbqmB3A(CKKb!X+;@pXc}W5stt+wC)lVY>gASWL zOk(rZlSCMv$qb!+Usy2N!j)rDQ|Lfr zXhSRnph5Z}(pmmOk`VXf0`js9b~GcDx%OiX!eYT?P9Q6k=YjX^guBLjlY7On}r z39YW3NpoP`eDsYQ<_b3NM*Sk@N?B%B)CeefPaF%t95Xm72Dq?@6*_e|meuL z0;zeW%0TVzcuj7G03H88lI!mGq}pj9GA1&x4dWK zNsF+?nc5f?wgEloCJEQOk^jog-+8r<)am(z!!e7N=hyEXj9F+#exl(fP870Env`=A z6@-o4%W#_zM&mEy7kn_^!3waQDHHh{M1)QV3*TC`+^FZWvO{ApR*AFG_E@m*gkH8C zbRqQa()iSnd%U3zU;$PEDA17v=ef0LSe8=I4u(UV0F*@vWdPnD(M}tqJm&4&*Wf3L z&HbsOxM0ZA1;aT#3}Ty%S;R&vF^DoJ1I`XeL+0nb`jY#`-@mWfn39c|5F2(|=)wvM z3Utx*CGVG&<-FKz6_r#DkfJ84wAVpqFHTavNqX~3H=8BK#n1b-6n#!NOd6nFML#-x zP%|oe=8%0$`O(Iy(N^lb4Uli}hAE{z|BxdtX=y5#F4cC4l88nULgW+hS`;QQvf2)G zU=*D+|Mi$FW$jqsS*hCGF;RGIkY&tU!cRycG#`C7-%0($lB@YKED%E5 zZxvF36HlSQ^#l2bTYafBggpy)h@c>x8o^c{{GL9I(Q3i??~0RH714DDAOgegQy&l~ zm4tqhC`EwYY}s#vT0_<%mZ@nPLhkt9cI@Sjtw*DHBzLAo9`2&~lii}C9L=KBOeVCPeAHri~dKjUqPf?_7DbF{PkKC%ZCY3)iz~qbLKj?LWPc~ zkz}pKA4@%wsEBT@WcQhvs@OMgZlazas9n>!#Za-zOUH4;k>=q32gI5W6bNx{UJwYS zI2Y#DT0&kt#!^*JvqqimYfgES#5XBYC(FL&%RgYu%-yd)d%T)PVK@fcaIvijgSVO_ zpSjIqnWSRdED@5-EwlcAL83?OoA15vsjC{~s1c8Qj!*Dw^jn_Ngi(RqkFa+sR-#L3 zTY2|!b0?h??fZJJv@}@gOWkm3QW&s-8K$FTi7(03BHhZ1ey5WIV`_SZr;(R)3|#cY%3MZr;ihA}wKJ0@$oD*jdB-O&EK(Ii=DV4$fz`d~(ibz^X&%)RSI zgN2_0KVS1mdyKewJVBsK9=SX_h16^nQgds7v`AvQv47^%xlzcJJ|O(FZ4p8neoi%DOAUeqbeUaVkXCnpWe&APG=^_P}F~Kb7hIb zn+aZ5G)rv?Kn;;KJalHPA82>QQBt9A!)B29a?=jwlyPx%Zd0_pwEu;d<5 z3l{5t7a5)Myv`<5DJ?~5V%Kqov29y2qQ{={8bp_xv{HnW?fC*td+mKE&X^9Wm=4OA zP9`}zI3RD|q{b%TgJ$W)-d=MfS6$$-pKxXf0#k4Nv_>~4b=a3pt#A1}VXWv7a<=L%gY`GT~ zoh#&idRQgoR~E@JX?xZ)$y$Q3yhrNz>x2Xp13rQ@KoO~Dbb+;Lgb$isp; zslaG!R(8XfQEl$vY2P=@ECHMJL==8p5h}=Y46Bd}$CO5>X(Wk#Fcc6;>Y1*s(qnjG z;_Z)Dv<+^YUyn?CCCZ+s3oMjv3@rF-+G^mf<7|9+qY@7i>Lbcc^mv?;f?_R?1FT3- ziS8)lCVI}i8G$A2^aQYnwU&ld3+dCR4CBDYer#-H!XE=gPxhWtxV!%o84jn;q8S2^ zfo&dwPb&b$FQ<^@K`pjDEGdDGK$ZaEk`?PD9tUU-dZVhrVVICJnd_cpHNmVx>~K#c zoh6`Exk-3?QPHf%ae=hUM$jnILQ#Q0J}I9uzc;h@TD+BhFj=6EeZmm?W{EU&oI~fg z+*3~v>MRBFcpcD_rlfR`}^GhjY;($^n&iU9YXxt#z`UFP$0hvX?Ye7M(f(1?# zviEY@0q=4Y+p2yT7sQ=d8@KdSiCZBM6%gd!q3C1WX>rjer{fDh0cnrO`TGAc_U7?a z@9n$zs&>a#JROXq?w08p%LQ%#tgoMO050!*$WX_Z+$(&&s zmg!vY)w939=Q-y&zt{2C-lb*vtoLx=*L@BAEONXSyC&EvpHcOpVMH_-Vb}ikZJ*qQ z#~u;~)%w_y^8W7QADp>+MUGb`!?hd#Z)(+Ejdq+B@j@*w+4qDsvfs>a?=|e%b!k>@ zDP9kS-%D6DQH~oKCCFAuZ@~FA1U&5-TnzxaNh2emuJcK;e`RQoLqx~vmdIwzZP@nq z&}D&MNX~rQm{9cNJx9y_*;UuCN~BsSG*v1z1+O}L?)na)NkNcM0`|xa@t*Zp$+t|u zsc+=^$FCXN-qh2@95}ch)o|ST32-u+O1&g?>Q-y&*WcxQX<7OTKs~cTPWnP;mR(!7 zqt|?w9m@>t7SPb*Jod7O0>bQ&*7No`j7C$_S4~ze(RgCl3=9;7{Crz`PcS=4Zp}{N z-zNGM7xNy+jt%Qnh5Q6B-&JbHojLUC5$*6Xcd8-t`llpj z^aPwiN$PWgbShY>cY$vJ$-+1r8<+69!JdUX{m9tQdKC2J%zqRV^n1Y|Jb_jc*Azhf zxC_>UaWH*Ylpxx$7+MBA2d{*l|0-PCqxh#(vGBoE^w4M#pJ> z$NNs3&h%9!AoUA?)WlMc{2~G{=Jj?ff0JI-16Dv3%8>LqhHSYs6&!8dM<#~oURmFO zR7%lq}t}po_E*U*->Q*|Oy_ zl{-7NmnfrUe0$+96gZpr(4<=?xAsk3;Pw^yc<$dr!n&&0|U&Qwquqf zi~K6^asi|a5-V^D5e>3Y{zSRpB$HSVXD~&^MCkN8EEr<03mX7Xic#lmBT<~F=!nrL zwnQLjrjx z|0mpOIQ@Xuf=shsf!90pTMAjxdK`u9)G zU&t7`D-ufZFY8*MrN4n2{{c9yPy76^y|&)(px2=Td z>ipY84iF*>Pdi9^PsE1@O#d~P>*(x!uGErg!HFC{0Z`s4$A1m?h_&(Q2Rxi?n>~4K zkkH^VH(G)Tgx`Wp4KvJ4cJlKp)m`V=wTn1KX-os`a_{SAU=JGHqI+?P@P3VGM zCaUEO&CF!sV>>rLZ^j{wDrY#Wo9W$HVANbpt8Yf~F-(Q%tA}27o@M~$3Yd)o$|AOG z=qohmoEcd8FT5-2;B72vkTv8m{;|T0T6s*!?woOHn25~-x82`ql5(&i;j&xB!;Lb9 zg_ZR_4y(&^I3zx%R@NqcQ|H9^z`Wj-;(QnY0g{4s7Z)*rH_b5BZ*l);rtlVXrbtN` zA^7JL8Gj05VDq?z$Wa{H(fK@@c zwM#L`_A~)Np&uu?Wu5OXTLNk) zZvNZG#>DCbxL>a2%bGXH}RpC0{oI?*|`+MO%NRzPqg$Z;7?+uf%(+6W5nGE z47y(fZM>{l^o0Zpfh{-4VgAUYi@Fd0{x8P-Y#W-v4>qDex)U(`qrAnDMU)O+(S6zQ z8XznI%o)jmUb3x@jh8|Q*MtO5HzT~i|Kx_>LKbqrd)og&52u?@KaL3q3EArCaCCKd zJHJ^ycyGghjGq67fLwIK58_DdiKP@cMl^L;fMhh`K7!1p^4`qJa&)%SgK1S0k!?8# zKtm;4a78fbZE<2CxS^PSbTX|gI9T9-9M_wbxTN0^YiW?Y&-b4%RX7=TL?cIO&8k(O zt2Wndn=&G^-#>7agH2hSizf-7(1WOiK_mnt0VKf7eq(v)sYn1_TFOpTmFT!ri&_&< zVv^TJNyFG~W<%G2%Q(QR#d#BFnO|Vtl84<2N=l21gKf@Q7ws0Lel}YAi{1C+V%o7k zKEa`QjbUs?K*D8>%gsRv+S-|eCaM|K+_p46P2MAIT1Sqw)C|4}Rn>@Ewa@tL*u5=F zWlk_ZPJA2I&N=r)=EgmdqOh5;@_`wL35Rc2zmGdcj%SCB&-~pRb{iuKb=^sWO?duf zMkEo?h#@HB*u&f#3zZn|jjZ5rYFLA$*PXMM;JiXgd+>+Ml{95$yhME?9$}t?-0K^0 z`Y~h5Ci&!WMCF|d=fNAXMQ`eq3iveA-vT__T=i?gJph`(1TUvYQI20&13$$!&LES? znYjHDNo8SGL9l13D;Dqe1HwyhVRXl^44O_@-GQAhvI8we?2)UYR)0<+;W7Qb1m5G|in4xwd$+obFk?}Yw z`Z-E=&6A27=&8=w?v>#=JzwoRW6YkL7{AvqxI$01MKcY3Kr`jX?|f0Vpe zX66LNc^jDnEZ$KwmfDAynT;+37KBIoPR6T+LdUa-vlic`y$^6Z0IZwsSEIm3b0c>( zEgUzp_{3*vpN!Co8{j;Mg!?v`X3RV|soAGBkCK=ua$zD7R#~-bnuDE7|4k#m?hvxj z10Nrpy?k9*Q)luuo7ZVx$+@4>PqJURP2 zD>2w0SM|TVNr;S<;i!29SRDkqOLW|3u9M_CG$uug{P}lCP|BrCj7SVz+>JXbkl@n+ z0AK}$w5}-FUJ8a2`4i|1CO>CLJ~6~WYcu%3#{~t|>~)2yP&ZI4p!YY&m3LIT$gDj6 zF&&kv3ye^}`iSn-*?R=GapX88c3T)AY^q4agaz7K4$9GxAG@cBpa4jWPfQF?W?aRX z3K`OaV$?int1j6OGo`3~*aZy+CVEz9mz3@6FPID4$^T9&952BP4Pc{AM>zlQ4=rNUt?i9J0eY6}0m5pQKR zk9@$7^`57@p*n+M>|LO6)r2hX|IzNp=OrZCvuMW~6MQp?hC-3-C&%GPZ0a_!Z(#N> z0X6Olutj_i7gtRls52y{lN6Rvj>+KiAYa$E!btUmva&x}n^$qEl564KAKSP@{}pRg z^OW9OvCnalw{bb9z72N$b*qW#AbHI$9hIY z!*BJS&bFQp6usP@&cCu2cjUM(vcZ2Z@fjxsUNFSGneP79LG|i|mF!xSUZ6?-Nleu( zDHK>m!yt7Tv8#eEExy`7tIZ9TOH(W7NbEX^4kI)aa92oX!azHT-^47J%m=aNmoRwg zL?sUcSJWMZGq58cX_O=Yh0_1EwhNiPIDwZ@fEC@+G|w)kH$kX~&IN%^H8~7$9^Dg3 zBHh~ns-GU%&i@-S=tU%LUe%xf@6>vIf<-{>KsH_)Pu&t5*MT0s0N! zT@xk|jtf6Mq^^*3Ug=R_Z1i^^mY}F$EY_-&Z2mIv?(QN?Ff__a(p7op6BSb{SS371 z-D2+fQXnWY&n1*gegn9Na9i&V5>}TS8@mKoihoRLbKc1&X&q2B`_}RZ#0gUM|IYYa zF@WBL3Z-?1~l|#h8{CPkB`f>hZS>U*&@mu<{bEr3o z(hIANq{al-TxmDiK9HwBxU5YvY5ebqbGj+xbJp(m)y*T!5e-xmHIHMPUe4#eXk3ut z9Xfq5KPWif7N@1m`4-1BW}~IClhbE+Z#=U*aB#%Pl}#0@QPc;=WWI@Lh-6^wOsx6Z z*89(5K(`DbNFF~9T@%o7G`a3RV22%m4=7-NMHeP<2j8h>4&ek z*#8ZLBuWz6APNOxizC%8W`5xbE-rsw*)!my{p>6Atza(%AdxN)E9cIgYu8?O$x zW)t!_UwsTf9(?lY(*7W-mgy9trt3XsChI_^p!`<3XT0!FNS@79?j3V zG|Alj-YLpLL!{E!yJX{ojH*GC^t(N==fs)TCJZ@jO=>GWTZjt{tI~r<<7h;jCI|ac#X~VR%dbBH(5+B{rq6~r3ptoZ5YgtKj(@S=rx?$?#kkLP#wyneu@(lV;7DX#IZdr~Z# zHmlL38!g$btB690=)Fm)9wn{JN3EC2_uW>1Gwd-5aw0+=a=xBC`PXN4$}^nPS+G`% zaOhf1dHd04y8!HvPeqzkPC})cEz&QF@(0WjARMej!G#No@)qPD0;iA=Ot9XlZVN9$ z&EJDnMCKnLyhSN%KU6s;xj1J7bEDLE8RYvg@Gc<&J23I0fXiS$MY)CB9$Pd!CsCEK zVez8G&yG?V>>bcE@ad*OH-;G`HsU9)7@_H0js7I1z{nleX#^PnPqnnPbUpih!iOXL z*$j(zUreA>Y=zH`O->>~GpVF@%i|O+0zltdvh1R>id1BAY<@VlF z1f48-psK^wFAZGbR!-=!?2-SnzY;%33+a9cl zFS*@lz!T8i@5N0Uu;F9z-mue(RAzlAQJE1u0mUdHr!LwG%e*YI@+wGmsjmXQk}AO7 zx28AcfxOxHMW>W?r!?eX5ux@zjn3?93QWITx}-Ffxretv#AMxpLqv2q`uPTp47HH|uG8Sj3R zSNC2om88gFwttsLo_I%Maenj9L;k82j2Ezp_C^GIzDa)d>H`3}q+>pt!9;`e?ET(c z#97VFwlA7bw4=b^RMp~-MRhvh4rDQVBes-l&Wy283)Kd2z>qmHjt{?HGe1xIo|pVv zF0BJ_L&m2dWw7FHzA23K_pk0~hbnLFLOxnv=+Lxo=BUMWmjXNymz3N4GVjr=$jVmR zfqka4rn8k-TBiOMmQE(zWTXRNW_J(@zsRBXZKjL;ri%(!3*S1O`dFWBV}PO?Oh&97 z86Scd;%Xz&rs$iA+s4SWlW_1*zO7;QF5 z5xHca39kl{t%~+w8iHNcxg;#WLNvtDBc4zAQ{{#inrFoao)6H@+qzo5h*UmlGj>Tu zVj>0~#?je`?wZKj$Y?*lV9v%54JAc=+ z(&ERyeD9mo^V4YYXN{kMA}{;Q1gk-82`gYZ3Zd<0#tj|dPO9&nDHn`td7cKObaP>$ z?7Bwqqncg>yOpt2(z5(i>C(I6XPoNWWReW>TxQ--rQ#PyfUn)}<$b9mmRlHA!X4F^ z`O-D-#fm)1v`F7H2iJ!6DOGH7-JV|uHyL&ZCZI z{n43rAI=)>kAR_pKAfD-#Xbf+j7M|S+2^)$Bj1nkvTGMi&-7vl(!6KPJ{qvh?#S8_ z$Nlq_D%ur~={xB3<4NN+3O|~uyeLP%H?)g97Was!WoOFBM8r%`MN5`8zaOiS;!g73 zSZr7|y(Rza8568F2FD!eag?-`n1p2EBmIw}8s@za&EZx8%=zrc`J;UBw;=AuAaqkG zaGzdJx(FyRNCw&Nz|~})x-gkpNIC-&1V#d!x0`1z0Wd|F*@TRI?6eIC@TGtM{TrjL zLvv7yfNuC56Ic^`<_#2LMB3`m?c<}T03{8s0wJ^JJ6OgVyqC=dH(Gc9cneprRIJtIRCV+fqH@P5^pCsKRyVb1^5)Ih+D{E0TRn!^e_AW^Vpz} zBw~)L77k{b(nZ~aFFD8sOZ;Yt$EuRl{3aN#eSAesoUtT|dXRv~a zZSSn?@r)WP9#DW$G`x5v9-?^B(JQavCr^fJhO5Erp~SQyP7&+ha5LJ?%$hEmE>>Qd zRWq1X`<+nC4kuTJi!GxxCI%WmJ+qt8xXI(fCoceJgKAijIcfpQ#vFQ+^YIs+qa;>= zq-l1+zZfTJF~$|5f^B5{!+&%jg-xRBG07UtKtp4DX)T(w#cWWybh;ViK5j@zbkD!jhD#!MN@} zbRq>m4y3h@(qHZ5PswTY)X6_r6rOePiKk~e9R8WGJz;LJp8fZ-x4qN^zla8AvFHQ` zFw8uF;E6qMAg-05xopGsF;+cuN;~tJJxJ^?ojeZC>JDubbibaePMq7ia3R3la_$xe z33@=L)=CyR?su(H(JuRS@KoU7ArXJ*qd}nT&N%x2d-U{sqo=A>i|3Dju4c zp1a_?ZNM-;99xVXxXK3hdoR{*Jw(CQD27MglDhoDdE|1R#9zIJugu(#g?o{{pTxam zUmcdA){)iI)sS1APSSc->@k?n7L2w4e(&; zkBl$Sx+szLJ;dZQ6o6+!j;^LW#6*XX%t?$0kv(EGvLxR5NfSnEuNq}3uTf02g8W0d zh4c;=AQj{(kThOQ^NEIlLXi(3^8%7jXVG3jvi2w)sLH1M6I0IX==h?Jj0QNzR7)~5 z@m4wk^5Cv|=d}2^$@C+*S3m;SVks2+ZQGGdN-OLJBFt6PP}6V8^fQYzYv0CIvdx-Z z(k1Jig^=muWa@m{yqL7&Q2S*9X=0DOb$hp>;YidyvdMmN47#yewlD-iP2@nwttLvl z%=h=kiNU6gcy4Ku=PjYnMQVpZ;3#EnNd>UFBCt(vxZYF3h9Uqf1Ah7k{cLbwgk(0= z*G5`enhZ1XL!^Cfv$HSK1-!8);p`AiJD|qlj&u?0LrxQhl;bGCt%ylzak0qUIn3@z zgM#~0BXcvB5=L6Yrw-#xOQ_LSh4WiA{;Ij=oZ|1%J4~gxJ;Y{@IoDlWCsAf96piu> zBaMu&d!FC5*>lA`DLkM~s3Za%D4CGJcn=uZ4uX0kxRjk_`cm_^&TCzdvGL07_X?`q z6-76cNTJogAK5qA?}UXunEi%>LN4QGYF%{1{tt^Yd4k85uucNJx_UHd8J@Z8hmA1=`R#GUA6~yObWm z((KLAZzdtAyUs9Q*ZPi)#BlW8h0m8Yek@W1Yzm_qj)a`q{Q$OPxa*4X{>iijrRw=n z7uk9fx!J@Q|D3k_POO>V*xNyK{n}$;g}QDJe2U0K^Tla88UZH+B>Dk(fQ0jc?cRGY z?pkdYc@by#L5+@8*MSv=PKMxyIFI4^d~>T3xWYhFt}QOu2x?kErNKrzE-X!}A!;KR zAKzLcP6d);-oSTW8Zdr?0ndIA^+r8IkmNA-9#gFIKuVA;%S0j8Hh-`Qf2MD%ROxe$ z=vS~FxXqfpu1=gk=?>iHD0XIXn865171_X7=1pBg)mYOEDFZq9TGy@gyu4-4{fGu_ z(c4ujj|@Q9Aa zFHoy31rJ;h;H+Nq&}t6#Mlt>cF>I`Uz6!G0KTVReS4hoIY-AjiVY?p(1!-7l@$>Sg z9lTQzkl2FsyyzU4a3DgUtgixX>8KdruGBd#Fn^)w*DxwNc!dsY`95Z zM|qalKDXM}uX<8#_@>}vZ(afpjyjfpzY^Xk7v5MiTK#?@C!io~$hStVc67;vNL9*X zVXE~(NaxmqC)!4TJ@fsijB{#c_|R#$umdTg#^Q*)kKw@Cj=)b#O($eb!A{_mEg|A^jg!TM6lqAa^|2>$iNsS{8xNkQP#%plH-L~M%95Ai2>J{>s& z$iNYV&rlQ2Vlfi^!}d9vD!uB@{fh`i^%eD!*@M zVYx9rEq0+@XMTSEx~r0+*%1K&W@5I26LA!S9MSpw@9Ba#G>%lD{|W6@cJ9l%@M7|! zni|eXc18r{EUeUoTZfa!ZpMySmMr8%N6-+0hZ4X`k3>^wAw}%|&r$7QtP74F&zeF;;QQB)nVbo$PO~d@m@Q*b`ev zg+_VDr%$bm7glA=zepWQ8xoVQLt6~~f#!&=-mC>{i&RVDk@T8{aH@5WLLSnk2e%Af zk>EDo3$y^h;U>o2ECMY!0T+d4MEEK;X7zuv0^%M{t_(64hA;&lZB7-I^3Uk{gjGImgzXo@v*Fde_Bh&2*@HQa0s&I zoi4{53qH|Ix~z4e%eVk8`SB%{8)_2~@x{4u3gE^S9T;qW#C7gX^!V@~oObczvz}_K z?!CNjKv;8~Y~#x8`M>MgsND9G78!dlud5e#S6+M*i=U67<=JpCvm~m`J=NJ&nl^&~ zIHARrLE-|1(x_##7Ac#n;Sw=0<&b>1A^QV6O~%&Is59i!2Mt}NaK-d7=ll6NU-7=c z4uh_11)=Usx;We(v6}l9;WCq(GFh%@?mSv&m(!4vOLgNLN|;qm|7_kW&|vvO@?&vv zC$!k-N_sql`XfW=MNZ=GO>sfaYX_U4$_DTQYx9l?`}8`UiSrhY+GderpMq^9nqTh8 z)48s%uVJeD(rHb$ zlq%CTYuAFDp65{ACk_bcL8++__pxJYwp;J*a?-LBtgebvX}KAl#9h!_ajg9TDmLQo zLsHhTFv-D1$a^=tw?R@!6rtdxZO4G~=FF3(`$w=mNd6zJhCEThcH+MOfaXMrSS);A z$XRZD00$yI(7$-(4?R6&el~PIr69xP>O#K)FylK&?zn9h7FRPY{ zcPmLd2quu;bGji zqyzOD9vJnstzJnwYA!CdiT?UE#7>SV6>;!+GL`TVvMSppay`6JEnIDOw7Pj=zetrSuPc?ElY+>(P`#4p zlI@92p}qWgDfIPGv|1gy23_Lh9T0cpzrW*E$lT)GLap&_eVoGEVpeYuq{c4Dfp>U; zsDRL;X7S|%%O_<5M(dPYC=$8$>?!G)KysTeYTaWq+4S+C{PE{}Sf{7Yo%;yrl&m7+ zB@ZKxELwwR(z^bv-U#Q1U_amxB(5IdIUL7G+iD;wQ#5~_Ld4?ZuLpY_jD3=<{nHA; z1jvH>z!D0sl!HBD(0+!NwENRNwwF12t$&u3v6_Nz6(Ku>*7X@PxVVDau#6j3M94#! z4t=&-`&68vt@VM78J|t*!ol+GOqng*nR(hnyrH>;!|?`$!-3Tv`uLuN#!L6%ALX+3 z%hbk_UcHjR^c(aj5{NmFeGU5Rz5DjPgI?zqziD<&{kkh@d%)(VTc(4CM`r4HBjg(} zQe09eacBs4)Ef?aO}v2RkIy>^u!yPX+65Mvu>t3d>q>~LAG^@6!HpzoKqKekdJkl{ z_P)mXd`uSSvoC6T)KE1}eg|3#ZN4ltErdqho#Zcp>0OE2^VKk|DI7qMEgXb*Fo+M< zZ?UoY_>#)1jEo}QUaIsBUD82p643r{H)~JTUrDUQk-_)+-A!&3$O54ZYcKdk+ynb| z#X9#q`n2wRuH(F7ud%W5s}?fR1f=fasN+0DZ3upc*)zEY2|Eua0c3hi)N-PBFU!72 z2YoxoJ6|!r1=u<{woq?_ll3aWCN7D3 zlg9tTRwmK)PQJ*b)WWDA8Obw}@Gxif6CXQ$dt_AW`YT4QEMY7j?73H$*~C@C?qKyN zQZLg%3Ah9M0X;Ctzy_6#&Z!s;bRO#&DWLD=&mJn?*x090I1D$=VrX@uz1%K-bLG`A zJT|=5L|BCrjT*^~iqkW`AN0}sRt{Y{qA=veJsiU`aQE5nV-XS+I~nESR6bxl+j^-W zY{1HwwSRSrTD{a1uipHP`Lv5BCMHQO{pF|2Tm~F-7Sl2d!J@j*<{(q&q$5!!(HtGS z;AQi(vRZHPx1X89I+0B*Teq%4E5$g6v&cET7Y@aORo?}i>oZJc)zrJ5aU7S+>C z&K(v7Jh+T<2x&G0zv-XFWhHmC@pSx&D(S*SH8(YBI zqcq;gFB)8N)EGEOo zQzBV%<)y@y`t$Y^3d6JdT8>hIo>T9>IJbMn&&Rf-N;SUW^GrFRuWi)<{>Fqp)-$|Q zMcFpmt@U-yHy%tpaF`7XDMuuvG#P?JBBhy=lvJza~eVUxK43}&E!v!eoc0<&dXv)GcyG)sUEy@`u>U znQPZ|m=ie?V6;C1Q`o>sBBD20kIwa&KB6MoDK4&s3D^P7scna^tpW;ix5py=%|#f; z!9$csoy$QW}pvR`e;6 zOUC}`#0bP(zFcKOeM-IeX$tGu<8s525}ks{?=u5ZDYoL3FH#!Xxn+Q^f{L+`{oZ5G zn@Nvv#+*99-!pEvi-Vk^2)Km>d@f%;T26*Z9|Gck<+$YB9O}0wUEoRJ&4I_(H0Xv3 zJ1<}k`Vp-92RLY>umQ8WeZ^pia2M~HpkcU*S5Uyp2>jnT&^ycdukFt5EZWfSWRA{&s14t$I zk&Xl4E@V!}#&^hlVVqO_K+vfcyt(_ZmdSc_!zMN^jvGErvDSKyV&8|yRA(2O1MqL* z_=g$rNmb78fAG~y*-!RF_5T^>0^&F%8w?!*J}eO62Qr&JEs{*z+(ZFMiuB4DUb?rh#V4(i^i8xO2leI3fwvM?g!bL1Na%PV>0-}w6B82vc8F1PRX{NlMaL%P0% zln2E&>V|6KbK<`Ylv-GL8;;p%gzUl5p1Rh zpbwW9ZzSqmQd1+&DaYFsI|g)jprTxf%9C>Z;>Aa_ajsrPVsna~`l!SA;OP0svp8Vy zg}n5*^@YA8Gcr3zQrK9|_vkU*w?}B_eUM)LnSgBh%o-y0&6*~?f3KmWH_Lqq)wcj? z4-cDMxS%u*ICd$Vl2Y5&r`6@_wA64wtE+FUepW*_X)Z!9B{>qtOXQx0*fNz+rk@^; zt+p3&>l!Jb{99EU9TkN|7~5oGq!eCW_tm^rqQQ~}##d%jGA7p#tc*|j2Z6X!4$k63 zz|H`-ea|f%q&3EiAKJSH#_39uj?Aqnz?4DueRN*71-c=zw8)KLXR(rbjsSd}y`WHyK3 zc7jY3l?ZSN^9s2&xFZm`Iam{NJ}6T(!N?u2`T!|SgJ1Kv<6)Vf)#UxxVCmZR>%@Q+ ztL`m8_)*9mt^(gDy#T`{47^^6gP!~OcMTYTWruMle$zEDB{(Ld>0#C`z?f)xvKf>TqX*l; zFU>o{TZCpaFA0GeEMH$n^kW;j$}XR)?-EP7|YM1hEsQ z237~$Rkpi~^gFI`HqRXrBG`ao{maL89ElN0PBa8QKf{y(PaXdNc)R_Rg7}#Le6qy3 z3XeTaWtMkpoHDR;MLTVNa`(MN)W8op8z5=h7<) z)=q423y_U@s$Gzt{rjQH><{5I8Q$IvZ^wHQr>F%Q(-Orx+MIw6iQ{Nj4+5h68=SkKkD%(XQN8uO+QVI5xU9D1(wufDAn&{5Pj))q*P^7sm))JVcMF-jC=o0yX>>aq*zV7JFrAzLUGbExx}^ZE2pU9 zKx3l9#_WhuvSP6Qz0tUlka|KL>~g&Ssxf2on53l6rEX?r+6mrnLHk+-0v%MH@1|{Y z_wJ@$MyUz2(D>8M!yoM4$$ZQJmE&|kouM;kIJ3*fNXj3UDu`D1VjnwN7>7Wy*Pwa?f?wShp{wR}5W!C3Y9u%rJ{vOi1`{A{ zTQBM(LNO?$< z0argiJ5d8c502^Ir{Uqhi&BGY7i9XS639iY!QsO=z;Vipf=|Y21X?Gko1qwqpGKeM zSyF3Ipto&kdMlr9cHK=EEf^!|o~FcLQk)qRcQn62qQUWd;yst1!_A}qp#{xd&)Z@5 zqXf~>CiZ(g@?D>lL1i^l*NG@oGZzQ;dk|{KNAQV>QKy4YT!SvSe{9Oc*f<8&xyZa@ zc5ftZw$MJ^EXxx)P{g#2@M-7Nb+&8!$eE>c6iOK9>I8O!X%$R44V6=cg4~dq%0Y>S zdd#O32?JiUM$eH~(Rj+L^UU&f_uO6TF zwN&*m1;k;f!PV64wHf#VHTVG|wr&B}^2V%p&*RciUAjX%&p|m=n8(XZcVI?gLrVc~ zT~Nve3{dv8!7l3NV&!DYkjpNwq4v$j$1_nznJg0rDQ@{}0#{+HWTW*u-iU6>q6p8Qy$rU?t|SGGRF zOd0lbC?#PKc(7^CH?5>l(pA%@bF%*u%rV*|exRn!oR@o@`dDN+sYIp&%)!8{2yW=m2WDgQ>b^!#{f zGDE!^{Cg5JsRgH|C1eAH-8MW;;Yo-~x#}n)S1EXhkE_Lh6%J6J2KB^z&dqiQYZY>> z8r6&Z>Ek14^RByAZ8J`Bw@ye!y{G6_Ff0TGlo6(P73btEhGYZkQ~+Tn{ZUCXER67c z7B_GyyKjIh_1UC=&9APyr8SycV=!{Clg))aDO1XMTC;VeLWZcfO3>>f#M=cn)^0PwyEEShWJo9g8;`<<(F70z@5aMktskI~OxSO9?)y^0m&BBs| z@Z4sqhP(aw{p>G~fVW}<G0HT;9a=0q>5{uIp zetVaaHe*)dg4hSlUH7cS63~-gD8dPzR z=BRozXe|^9X;*=9b{OLC9~lURf+o3#0Y`CZ{|-zYBqS~)PH=w+NeM@n0FX3P=wA+1)=F^~_04l)`?=+7%d$ye_5^~eQ9+*Ew^&9tTiyzI`Anbfw13^Y9`D5O;* z>eT1+HPLG}w6nGOnCWtUnJf#!Sp=EWa>DDcC`_9lSk@wyy%B-w)~9T3kAhZ45^b)4 z1dpd-3^16RObXDv5^@o=meB|pLJd}ga?*0V;+Q^BrXgBxFk;}pjGLEGNZc1RKCQ@f z_`KNxo}?E=UUncbE)ol$CWgK6(uD%wo2le;x^QyTz4SarkB5_g1x`+ILw*Cx zj*FMWpvK~UnEsVJqdv^qGsBy9r7rFg>=55PJIb5TLw{R3UIPXR7Pi@#jkw2p=6&At z2mDhFpI6vuvu%6KBaeec5N?BipeCs9EPZiz;ch82xWlM&P`XiW4cf{751r&}`9J{M z(3Ucr3cM=-B3<2Fb|*}m8iLh?BH&(UiCM>8jSQWF79}RJBeUxmPb)Wd?IBOjB8+8#3soG z2U}0iZ)*U-1Eks{pZkxX>H@GrHOh}yZ6@&Uh5Dl~$VGcyw8 z`uh5aif)QJMQkAnRE)??VpV#`q~QQ4$RwQt zr4VLQ4$x{7n+1<`Rf&jaSSZ9JM=$cKQS0f`r-X?c;!>)vqZ3gvG})kHl`EOyardrO zK3l@cd2g?8d6ueG-Ai_TtYBLyrnGjPB?^ykAKkG*y4NU`<5SYQs4>Bl5=TQTQ0Vis znl+ARtMC(;lyso*u3>64H%j%h+`^sS`Qk@*gkh`;HLF3bs+Zy$`Qd`JZqb-^#GZ0R zi=L=Vw~OArhxx!(Vn{Z~u>_i>xuTi{O$l!SaHrFhqqufBdPvwJGv4TMINH)=mPuLMH*^(5s$?}5Lv!&|c3*jtA3 zw;TkS)?id$4}omC?}ayY0vd?216muTPUF za`d?$SUiYdXxpdYJ3yH%jNvdA=Jb5;mM6g1uu|f&J`Pmkx(n$wy8bWoY*jn4lJuk$ zuN^QQm+7a1@s4@N29QEn*zYTTDSXI5dQ=e+k%LK!)-t>U0fbC%D4ny(_E(Uw(KW=0p0 z)Z(@&MKQ432O&3k?WsovouY&89t&F(=V0kdAiZ7RNi?4|7Dum=I;2 zptG{cMFL5~1qvniVT^`JqMPm37~ra#ekmJx9tH;o(_%qHCSSvck+FponGV1=KfdPY z{;&)ooNwHY97>Th_phgS>!-W)p!BekMN3cVfT+@3UdhNQ$@$gz-)d`TKH)pKkGWEd zr3(pGLxB^<>1jnB*~ihU&Hj*jhzBCV6IZu3dJ1R`lhx_8b(3xkQCqiyLZtgQ$#|`S zUg@L~3%};%#&3qzQOhZah|9S=aDvt#L{n8G*a=j4*=7~|<(ii@+S&=fxJqJ*C~lws zC`x|-5Gy35VOvsOn0(=a{YQAG7I#s;Oj08le<*&LQ^>rPa95tgU*e`z5vii7m4-dB z=*QenM9yr;ZUHxs1iN`L-H!kBzpKuU151LW-v`ABd=xW!C*$G`suD zBB#^FaZXjT#KT~XLK)S6Htd2*P3!kBfytH5i&E?+XOzD4A?*~FK|AKS_m!|UAG zCK~*52DDx@-t0D}6Nd|^4_Z0=zV>s@N;euNNtC7<)$UFQxbn^-EV)M0S%8&VZxfUv znvfI`fA=e0iu(A-xE;T*99wPIuNqi*<)WBGhE!0>EWYLFE+}PE4F;{X4`tejW#*dX zN)RxfkhtqVlnv=+@;Y(?AKnDK7fnv$X*!QzT*;+xPnt_Q6^=YTgVQXk==_7~ag!(axBa$eE2A-VN~!{o0(@>?=5>rrDQRM&=S<^PQtXR|8>w+w2zC z!!=gEK0d`5S;Nj{pR;xVx5nk*i{NJwQu($xe>{{5jdRItnW*q^t0El(riT}hLr z=+Ejh|HoDZ`4DWn-J*YFD!0twxtGS$riYYUXd!GkmMFKNP|fA$@vDBHdMOZ#ybIzb zG~(qCRKH?(g6T(M15r*|_wPQH^m*WmrkTE5(jlS-bt5N;!?z_-5!e2ag!YutVYVvO zac{f%`TC;QKB~#4i@w;)>YSz!kfufW>yTO?HdyC9ylr6MzZ+&Zl;c2rNs)u;J)x;% zYV#h2F)_9w9MrA2yeS<}J4r(`$NmDw2dlk{m!ha5p|0p98wyFt6-MPSaJPK&kjbu_ND_?be{c7+32;AD!t;6bB z{Pt`$i)?B%T!a1Tz{ZN>@{mTZmEb%+EPYtC|1R_GGDFj*;ry^0@2m)K_Y&3o^W|5W z!?77K6}+^ETE8*6#w7Pz0Z@#C9GoR}EPjUK9K*$va+T*bC5#mCOIl9+P+rbOT2gDk zdc9IYkt+*q`!0~y;<(JUqd2nR36J7uHcDLhDZc+Ih?UT1L{X z3#_&br)1Qqc>^eOfdK~51Iv0u?R(`OaW$r!4bnD@J%Sr{i9|iNlPAm^pd9>1S5UWu z`1=)@!HSk|Y?-j`2gQ`cWuv-e!j31f6)s&agpQN=2GtZDpM5GXj?$BPfOlBBtoLpfyiQ(y#?*(H$eV4$nk(qg8hV%Bk_TP|Bx4x$8Sit`?ry8 z_$ZAg3vC6lxgp*xr~lY;Q0pzo7R+0>5=Xq}Kx6Ks-ccuMyO`_zwtP9sf5mL3Vav?k z9?*8+cV_;Y4}o=H7hXKtjxz{1?+%!|;IqTup=i7?SNvDy@CaU1;9BYWiQzU)m=r0` zj#?d~j->pc?|A9{TDB~E2RAMM)wplM{B%}m^Heac(;ke6$@o64E1SSpp?r?#5LW!) zn4|*&BWM(OzRM|VS*|*2Kq!tioU~}(l9BY;q0Y1ClHA!6I8Hrkd~;n9Z^e`8wr5x! zj%>RV?EbZAti{2kzYB0yXu1Vcjk~0=fl@9(dncE%(84LCrG1m66*htu%XA~{GNU;_ zRr8VfY>{FPt*zQz(<&J!vI)rBBQ|J^w}*GQjCh}efU-$Gl+o=eq1!`VBd_QmMt;vC z|KS2)-gF8?1#hTf$n)|11MX`=l>Xt`oi$v{Bh{A+T(T?dzsAPI?0~{E)kQXcM4@g0 zu7Avq%`hRfT9|Weh3)}A^l&<1B|}OGBGH@1T}l7Pm}(%`iJEt?tlG_A95oy!1V`{D zi5WLB3?cO;Sec_J;{PkE4?7c9TnaGpT?KIX9ya11@Vg;AI{b#8q5CBasDZ|m66AJ& z**gL|S3)esJWLpLPt3_cq+ChC^ata#s1o1XHH;pQ2APjOB%naVH?rS<39?5Q1|=T= zsonUb81bZ{5%Y)l(n^?oVair$JJ+WK!N1w1C9fBffjKiEK~kLay*DP z7=b<27tlrTCIcJ7Pa^#h@)kE$rNN>ZaBVT^CIQp4V<1<83RM6JPO{@?m6Wh7#n$88 zfY%>05x1g5{t0sv-jES8fCJx^BnBFSBTS-EZHJmSqcT%Fs%tQ1kDi4*Sy0=P5dR(j zYYVB_x~{L6(t*zvNi}s7$zPkk-91#kja;lKgkM?%rXjTxqcGs>38qmz3)=q4l)~+osijdaGm^X zu6gcd;chsYZf0A(?>a305QJ930L)LWI0T=!1M06S0X&Z1GFNhKK-A(o%v;!&t@k%2 zS-7y=5`d!Mm%j)T)vSehOhMN7VePTj9k?iYfgXV9#>5aEGguj9_yyneB^1&JVXP*4 zCJt3GnS2rj_MJO-j!w5gsdEVGvE@;~hwvo`%QLuWZP`*}Dnw9Z@>ME~mAw+$4(BOz z5;+H5b;!@5%yx)$zqt6XW$?e5{c~kcor2}#@zjZID4<%QWmdIaB?HutwCRk2K;7wU z*LWbiWr%GKKLG^}0`u%Srj1$KcpRzyC1*pb;1qHy2;@*vb1&dVkw?=n91-B+qBUWe9m)d=$f< zt<&hoh3LbWtay=VPqJ@_H4N+?-_tXBYY*(*``VfRDM(5;DnjmpU3xil2Q3 zkNQ+V%mYOzZiSEEU?{*BqO!yQ8b!CNt#I8P97lvQ39`=?fE}q5D8N9U^s_EOm z2|PXX5cM8Ooxs3C8mL_n2x#jvE82+$|$ZFNJgJXK&RZo5GD$}iFrj43zh-^a{{YoIgD~)I&udn-2Mm)XghUaj!VLl zNNgoYI(Vfl*@mVX|Km}j86!ypPWGEfef1$RPdO|itG z`_BL21^o3LJoL%3Z_F^!`#_xk;QMar=3ROmD;w7|56bGACkS}D3cnXTREBDuxvvg< zc5f0X!S6ofjcO|FCUIYZogfKL1x;%(S$io3JQ+0Mg3ZIAN?_&kZrjc5-vS`3dMB7W zMr4CieqL8(e8MsuEI6yctRM-Pa3#k(_22C>PiurH;uD$<)W?jkUDz;P5CdScd?5E^WzDl(Rf4`>ZtD0&z?vfEIPogft+pg5cYOFmaR+sdq`74VXm<0b=Y z;#>$il{}Q?_fQUtQS7>l@IEMG4ZE6(?BwgTQ1&_ec=SI5D3_|A8@|T`kYL;h_)*t=b*3LWkz(tbc>E*q3YEzkColsPlK>usEN<;^ z#q8wYDk%1x1^PfIY5;OC4 zxDY(mc|Lyrk|GqoFiM?^bW&T>9dXe)|ExZ zu`jy&l81ah$(GIA$+^ZCR>x;$Wi=T&hBW&nX%OS^9Q8P}^s$Eig-M(qC~>EuNcjv7 zM)BC_QRSZJB`(y0Hexv9j??{5LLZh)+{JJmp|Kwm{626Hj~-Ks+ppSJNR%1&e40!t z=zj6h#Ro_WjD4J}+Uy!TtK1ikjQH(7+xInJ478b*6cRE66phvO25JoAMinQ`&1KEY zCsFkNboUKG-;ED!=d#0T4_oTfv`xmh;PgO6exah7Q-a~{(_HBkH8KQ$9}ThKEbov{ z$NPq0@k0&oiLD$uHN?xVtdfs5%;=o!8SubSLTW7(X#7akq84a-4?W*UUG&Qr^Gkf$ zyePFGd5i0r=c>Q%EPM9ICMrllBjKsd)65GhX^DMjL-W)^dk?3X8#`7Ur5>)$VS1YO z^k%r?-A`w1WHxMGzFB4c-DQPRbMKCA-1IXnt@5XnB!>h?wunIzChSA59fMV0%Z=-? zbZ96~T9VeuU1`mk5;j;AZMQaH+Y|AL-A|Ejccw5opq4$uFV6bKe0P7j$bz~~Ku@Lc zxn#(~wQ7oc=Qf{NHF&yi`7(-@EcgX>Xas8oC~+U!cMa!;ja=3uEPn(;nTW2?qO|Ke zezi83i?~19p%YoM+~x`8#nTA6-jw@d$=Hnd&En!SOdZ``_qeF-sxV5VU60t@`@tZ` z#Pw!cVXMAW$hQZL*+X75yAc|d3hTcumDlgr=+BAVi!<&0i!~k|+3#8R_6KwvfV-aQ z*B4$IQqJQ7?3Cd>sL9DV0qR}d>AO3U{|4%aJE9SV(RY@>tn4)OMt#tV8COT$?c2L| z*}*s2h2T_$OS$X7OTZYUnLc65L*B&~2JarG;46#e@%~E}K+Q-839t=P(#E<5G>0j; zD$4QF0Y~8?hYTxSnk(v;ODI|45$9Ak277lSa1qp87ja7S$iqYEzOU~=;HWB0}pRg366zNbq4S1$Aq0`s4hYx zCt=592ltL(x|Rthm1wn+K({sSuS;7Z-8>UMts;WUS zsffbG{=|3LqbESJd9+mnf1?b4!mvSU|!MdgJ3Uwh2mgN`s=9u_ax?wchn zwB;*Sh!)#)w9csauytybZ`(7R-+Cz{jn_5k%U?%^mpSwIYISRrH|bVpx7JoZR_l7u z{l3;W^o?%`L^pkaph(zvryz$~cjat-eQ<8`sHGtKsYYOpb)c=~rjM+8pgG0SJE+^M zJ$$D7gG%h~={@i44b=^h; zSi+GU|8`ZE;t{b{^SI1Dg%g=b2Ymd)tiKTbF&53Xswa`avH*wQm2G|B#1#45Nl&EB zCk3CSdsG$OVo#Be&pcQJ`bywrv|4z-5+cDWq-x*fDN|B!oyU=6Xp1+ukaOkQ3hSJ|DX!&#YWPDSQG*PyoxZM&HImtUeU1C7-(4t!ZnK zKEKlA$gJB=QR!G0U6WjF>Fmk_5$5lA?`3;~)_6PX`)U3Bc0>gvRL?vAYGTftA?~E~ z_EB+JSy|08x6gf1(DO;^qwD3Byvxb>p6g9ZbMySizJt7`7R4N$ zcBQT6Yi+f()O#EgeCNyj>gvktdzQrbn$S1DDhySVW9Q`W2rd;RY#qZumPv`%=(q~CO0{v)OtE(^- zB(mD^4;4iFeKZn+tp4I2Ol>Mc5zt6L-)Ev~-ou03$oTdM% z^ygfQl%+Lwr#~=x`1`{rft0Uq7@TN%OQfugiE!@tY)s*UOGSPxWYUB)r^}g9YGt?O z`0KX|jJ8FOYWA#q_UrVAQDL#oi|P-Z^tDgD?DlqlyT2Pl?qr>zRvdWd!yhex{mN(*|Uj^Vh$_YSG-7lIem5gTPqJ2Cujrq zXRyo9Ke=w4C^NyB(sXjx2Y_oFvw5SFx?LrSnxUizk#<9F~(zyWK&#)nRKUc)dF zOlU6n^n2=^GwS(8_w4$kbC))3>2f@9YV_8T7u+cIrylWe$PVy0=huE@k$>*#)8pf{ zvuZ?u_q}`Scw0;VSyn4Y_!OqZviB{pd*+P}s4KaViE?=Z_O%$A>~SOsr?Eq}DwgS& zcI_-J`TPXR2=WJ`Msh-#HWh)#8ZruEBLJ{ENrZ{9ed_{A6nGE~md> z1`VNXk*wsfxyPW9*026C`tb?l8Fw-nq9(?ykNv_xE~~h!Ok|!xu1X>n!X5DiEkpya^2-0nksd=jy2i^MK)f%9 zF!z9HGxf~a$pi*pIHk50z8gH!XWWlmoqII&*_GQj3vZuaa`DZO-{9#k;A4ekGYYXO zyW3^T(A|*Kit(P_az6fp?~L~jaQFQPaN<(?gV>t15t5tE|@UNeUs{Y!odJ<;%O;n3U+Jw5b=v+|aTkiOms?m^0b=n+6svd`I`P8NHR6>a$=b6|zLI|d*i3iC0`v@ITrgzPc z!(&aJFz$%2D={VM){X%TKbmiBzkf{XcDeyZy?;S7Xwj*)5AstdOyIFB7#kiHl+*3l zQ<8`A=VKktJT&zWUEZW!{D3d-heWk#-Fj@sDS{ViIM$Fn;}iY)^7w6YKHXa1DU@me*kpuN$|wbZs?a#l5q~j|H#(&}HuV$|)mrGfo5F>{l;;(C6&*-#R5Z?OiGN zd)lVFI{u`hA{jE0Ydc1=a1C{IHW|vH;_!7{TtfPob$7uWDxtE2r#+i|s`z<&v5umA zIy|Z+C=(pqHFVkeK*EH)y*=Gw*l){Uy?Nt|d~<{eJWZIA7^JJ{ z{HJZ(B&c7igN#3El)|hwoNr~J#|j3kApOKn$aqucBuA?I@QlB5J6~kbp@`-R*N355 z#A2nFjmB2%!|<&Ww98gQ?3J$@rr%SqegH?i@&=+-0o-ohX!$iozauqDVq&7~wbFcG zi>a+-;5_RDwx;^Qy`U(zoyU9onTn$OQ=dL#`M|yOv?Cw2ee-ne0k^Hk+?&NeIcav} zG%polhT*Yfev#kO!boNFkF8q8Q#EXf(Av5Blzn~GBKPBgdzo@C5HWAG=ZzsvZQ>xQ zLZM;f_v~y>mUB<`DO%sAf5R27rx!02 zs7gauy8Bl7V$9u6pL}lR-wguoa*B$!w(}?+OF55mp}YHAq-F_KA&fooU#VIs0y*jQQd~3pwhxC-JH}I>SZEQ+- zzD6#Gr#aL>t`i*2i{}H2NHPmWaL}f}8^Oe+eA>ClNTmwH9I;OF#Z-+jz!V^xSj@O) zu(A7uyDT{I0VVWjW?qBM`MNFcaN`5*9DL6NJRrIJN)NevJ#B2){0&;l#14c-_z^Qb zZCN{OCwO#OUlUrWgIZ+yFm!P&U&j?%h4+?U3Es>EunNNO{FysWOjK0;_Ho(>)|wiW z9gy)0`P0xCjxeB^qDn|)HZ1dOs6+!AjM+S_KCh6%bdeF5w+bLAXR@IOF!wT#m~Nk~ zjQX`dNi36V>L+lBoe;c%j)_!*yk|6&>Tc5J)`%r%xX8AE;f?vH7S7EZJ?d8`T92mJ z1V(Tt18cWLX!rBExql08gLF*k1&PktLAre+L7MyyA(fxvTVRd@82U|YY`nnAg~j7> z##I&1y=oi95ReYgwa?QE8EL)d%a+GBQ5FA3DP?H0*m4^%9t{Z>$m;GJTvh2_nITsKG9 z%bTOza_7ON9X>3%R6nS0=}My3PFiZpxvy-w1mdhAE-9YwFnk_q-YdjMz#sY1kt&%= z(jxIseJESMm!2&arD)H>oXeM81`f=cnmXlpg=s45K*Tp))MTQZ*OqPCBsOemvN@uT zq8it^{OiTekSf_IPrg4W{bQb=*;V1{F9{TeIa}c0wt^UTdazcJqy!&cQccce&D}%$72v z?1F}9=+LRtFaZ^-x}Tl_;Av+Sv=0F$89571@^X;w=ZoZ7{PsZ%BZ-Ol-HiI5xwX-6 zU))RmwpWZNoIV8(78Os;xJ+}s`a1mne-#`z_m23H)8r^`gEh$SMm#SNx9VOatKSQJ zk5rs}yK?4^Fu&x9#Tzyx0LCf`3$ll}Ghc8N2e{jtPkrB=n13dv{}XlL(bi3;RusCW z9$TRA$>lm{F0^Y{QaSfPdX1TX>gt-uo5M!Hft4=C_|>RUkyf8G%(sv`AjP3AO@MiG zCU)Q;I`ec!)Py#j*hnZ5+C!@VA2Yeq1OR>TFd$=il-zknQ{q`4rO#o?(Iiqo;*vaZ zB{-6{IyJSD3&w!Oi-UC=U#9aoA1Zt=-?5yLCfB*ZY8P+4IbttgAQ3N(07^q2;*jsX z(>1c6W}03lXFw>T8wA~+sjTO5UL8`cr5yYTf;P6#oWH;2jNz8W0ZYiC2M8j@^kW9; zW~q^k5#k)$;*peX%}-OtFYP5K7oGAd|J^+|aMOeX<4^9-eh6o?x+*8I%)|dde--10 z^lU=%C)H>vqndFRHEA#^3cN&2Vn%hW&7zw@jZ4iUwhzm0@g#@6)MGl9I^VqbH6Rmy z?PVu;S#n(u1Z*;!S4P0Df2vz-&p1U=iLNPber(+6qQBfjFY zd)6ykf6Df-*j@K-yiTulzVkM=TT@fvqwvz^^;}&!Y)s#XZB0Jq^sL#`yQz}(0ZE`7 zSkqHadtd_#-~8cGRhToMLK5}bR`00Hul2io%AM%bORui}GfYU*V~pA#N4SzeBt@B_ z?U}D%PR5w~OzzV}nZ7YHa;IQ(5T+&wG|hwHSi|Mp%pG+@4Y1Gtt^Um7j6+aSdvE~x zBAy6$Aw<{vQlIq@NKda_Oe^j4t@b9;n;xEhuYbXTafPx`ikG2okjZOtp0aixlg?&9 zqsaxfEZnwSZj;{y@JmK?`Zoy4?gIr;BRsCG^gBF1u~EHIrFPYK-dgKBR5!}*F{k}N z;;D>Uz1Ck#>AV8hG{#)OgYvQm8VAK$>wgyaW%Etj2Ina0sNL*Sg0If(^E{r${4e|L z9=nnHVtP%FP`5T+UirlH@|c!?`(54Q>zg~a=6HtYw*Xi6&hWA-8P)UQAT70&J zfh49(v#OVJov{#cT$u2eK-yM^3bpCo+g>Qzfk?p1ANlsZc{|rF#pMm7peSDC{pTytQDCM8z)|!Zzo)e;5OCr<0vr&2PX}wg-=;$DOzT* zoE~SwGAW#s+5SGSA6<-}qNVzQ#dvc=b@SO7QQPbnA9Swt{JMLIG!k!&AFZfRoAn7ieBwTIsCj zK3VMQRob+#toT4bIz{j7l!QeK}X? z?5U~JP}3(`Q8www5v1XTNb;AIX3DYVq*Y94Q>RboDewG)R2>C&Z3&bL@RR@y89uSb|%A#0O{ zSZ~y^V-h~qf7ix^LuIHY$Mv4QRRiv5e{iiWL>14DCMI^M$ntco?FSB2@oa-rddteJ zeO)kSLgKvapC;=6RBG54Ile+tlV<(f4GG`;b?wI4ruaw$7IyY~C|oA&52N-A?G zKKZ(9s~E79gfq-!ObUdeqV(B7R59%N;YYT&UjDw(L!f9RmGW(IFuxsN|=} zf6$*zPLsFR9DDwQ|5o!~&&Jp1v6;!!>oh7k;$lf72jZf4tpB z6IlRRk&z2HO!U04k22_U0yK}4_`HF*38fr2xPJC zyFz}=QRoO}WTK=`wbFUkxqtudwj*s;7x-@Erjy!qW<3ykw}1ipmA4NM!)Ox!aKoKi z{P(kZa?ij)lV0!GIPU|%{%N6B%?UflT3PFjUCpNRtfw4?t?7@4KkxIl^_!}S#_}7} zpB1{kF8#{39dRPVX36irub$R(j_1i6a~{pQHR0`xV_g?=SA>z7nNyTRk8}V0)7nvc zr=kDx$E`BC`;g(Lk-qu+CRypE3}QSZp+6oy1c9Bn zDRCB7cvkBQcG@Sk-f_#*yG}-%9~?nR4W%<)5vUGN#I6V z-+fWZk*?i+U)y{<5{jU?KCDgCF%`$m=}1LHA28>6x5>wQRXU%yuCY2XVa!FfeNC(E z+pkNV>MmUv-|4H_LeGhlTQPU+l3ssS3Ty3?Ltn~<=t%Bnxbb0{E!9z&{74p9Jr>n68+ zCN=HlEi*e)LV5u*7^vOTDu{?Q2(8H#Os7?%nJ?iDCC!cYHeq z{#@8hGG^x*(xrQ4Ae=a9a%zZ}huDh-|xTD=jx zn!O-EwO;V3p>c-}LwFASe&=rO3BDiYWl1&_#4ZcHbCooH**V0RUtig>OForN-W+R> z|3NFW;&9i5;3k-dJ+hWkxMd4yL1s;0wcQzv)`R+J;4UlqLc=IVM`Lj_X9ij(*0$HL z=ESDnK^RShd(q zjl~i+g##}$(B#XwcWuSPwsoROqy@Pc$}w`0w_@o=rlfe-u*gpFd;qI^6IIKC8#SVn z>hlbrC!+a=VBWHTZW6hSD#eG}oO67S#6;W=z_fHa1eGw-YjcL3+rLsp=Sb`W%cUWl#Q!;7zzbnUUV## zpt5o_3W4nnxXvb>v_`cOSX3=&pH1UR(QQ9$PCwKu4b7vWSRcHig_gT9Ai*?i|B)mr z-Tir^CrV7GKki%dT>?4RaeEy;e`yZ@M z?FFH%WZ4w#cXx&u6F9K6-}4OdpgRi})44NN8gnEqhuQ?(`O(9Nd$RQx*|!g^T1P8{ zkCl$nZv_F9OF+W4l?*X#?Ii|R(CE}#idkA@CW-cK&P_#8o(j6TOtx=p4hH~Mn;%+0T@_GX+Ye85=oK_bOKA*IP&+t_6@&`7Zy)h@RlGBYO}>0 z6%B$}$@mBZThlp}ZL%H_<;QnEnXsbQY7|XC11#Q3P0ml#GVo64K5k#QwoMnVo*pWGS zDRs5|pCKPd8|oW0+<6VKq!E-EYCqY@nN4rbje5JKwuR;boE3WWIebxBgsfd&y|6S( z%ciC(?@s2TW6+(+U||_M5EX|nq*|RfZ0&$A8Mp@Kx!bsb88Kkbw;czkd+L#eG%MnG z^(way_e(I8ILpo=1B{9?_b=|V1~aXkHc-Uq^0#rxWlbA3a)zq3%fCrI>`Dfgca63` z=!S;(x1UZ%5;C=&tO#n2P$O9ff)_3{rg^d!G`|c637(uhd9rzJTG}I0ITpR@=Ot1m z%8$#Lu+SQmYE7`+J3QCzN6*sK>NDqzQ=T8`Lv#{z$*-$h@4_|rqv=RHJ12&A3SY>_ ztUxwe>h5q;@2jg%VWC^)hWRH&BbP5vl*!q4ebckd(?g9%gdSTFQVFv58nUeMb?RM1 z+u51bn}$45b z|NOmO!!4hsUhmJNPDe^df7vh?I2nZP&4*8nV0lR0r}Gk;n37QxlVE3MFT#eJqj+XA z?Cc}>Jdt8xOT>3s=S^Ib;?S8Z?`DqEM9TWANklB>`Fz<+_s}?5Q&De}rC?yuL(BK9 z?SBI#I^9agIv*p_BdUM+Gdc|1cMX2Z~h$q z7Aplo-7ka|D!-VM5CGI?&Ky_6MCin&SDWxXmd34`H{~*P;EbZ{lT(hcp`9q^&tYOMXp}77tT(#oshCsRaGONm|ByC?uLI2rTRAErUvdp-Qk?CS2Q_PFS8^iZeMi` zNr;OP;{c>dWJkd{a@!`!U{gru$|+Z?k4)7ZA&k43kT@QPCNK3rQ!}5tSmw1gpAktU zuUwebCSurg?StJx_jSMfP9rmMzD=D|$J>N*3zVjc=PLQ<#mN#{vzm9sZa_%GkRuSQ zC)m0>7AXz2Q)g#mO+aTejJrQ%!ld^2kn%a|N5at{Mq4{kYyrAyZR!DP7y@~dPZ=m8 zq<{z@qMd_-tCT#Q15~gj3l}Zgs$q+=mdI>ij-5PI3FpV&sS|dTGmmZ*Zhimp zyhHyiZ`TlV>DeBtxQ`Suf=t198${572|q&bGa67m01nw9IbS0Ns(!ZNnoz78*KzuA zBqw$P%iKA+KoHWlESVlDH7fP&P+ z5J;8Efbr&e$Y0gC-IL~5-Z|&EIM{+%mdUL6hsmc+jf{qp6vZ;P<)d*@CVeQFZ9JAX z4e2fulDxues-uLOuVEYy6VprfGKa8*sc_aa=GV zt%3=de{Q}+u)s&dB@7{l-!^h5hf`7Em>Qq4f8yjrg3_toJJ0{w+*S^^TuFW|JG%mn zU<@853(|R)C$p)Zwl98d>&O57rO2#bzmqS&cIePy9)jlI;gA&L5W%OcxMLi^DBHhl zt{iU)&u?za=f#^=RpBIaR_1JO3Y`ttVAE>1r5 z^kSzS`BT=~#E%)ja45kmzJr!(oB&$4{bP4wQ^}VEzS=lrSLBK_@+XXf|J5zo70PaD zQ_Js4KSK^BQWr3?dqvwpKORQc<3hlF;tJWL424X-i8rMhWG&kMX!t$#aAj6kyk^V* zgDF)_BD978`7PLe-|A^HGq*90mHVvVPU5A_JxDh=l2NcW)%ngI$n!F6&F0lV&3&)! z{EZ1U`~QD--RR>x{>PzP^4|{Kx#4wTx}|o$LO1I-QT_hahUMug9r;L*E9(vU5M%JG zin#z5xQg>=cOv-3Cwx`|O2~cZjvn?ev0_m7?ANbe9iR2!Aec?h1H4iu-pbd;OmazEfLra`EziITrcfYpyJU|vNYc)h#G7^LEo%vYk0S(Kyk}Rny z3y?^@(F2|HcMj670fP3Pd9|eC_q{n4;WeK>n|@d@s9WjA^6{%~5Pqp8+@f5tVu|oe zF+K_rPrw)lM=Vieu9W?G;^FQM^Fw3(PPRODngj1VapF$@Q?Je^ADy$e+9V>guy9j# zNuft7AX4LX&d+}M|C*aQ8V%lQZHVYsTp#m@NBK60s=*u#BU=!d6D3lU1QfU5e?PP0 zfLro?L-~ReCrCwiJn(UF$Cjma(A~L)a4HgoS!v>;jEc4oqk3Z@5q3cg z3pQ^q_kvNi(7U*Y`TUea`oO#SFS((_ONe(ay6#^q-QW5R7{Iw#L3!hHY?l6rdh*_P<{fA6t%t%xmoWo3vW=6jKnA-R9>pQ*yXKwu47|^X+ z5H=?Mu+#XZ3<(vT2Mjp#OK5MTKeU>zuRjtqPa)+1%c^Zu$^eFoLHoTId^(lhb-k$s=BIV`pK z46EV9>lk@$YkGxiH=+FQrlP{Z|JZI%zt9oob``F=i&9g&Rh;y5 zP4$X-IOqTRdwnNWX4-t}c4gr}^ycIvFLd5%eY5E73ax|cj0x9`z$gkHC0tB|w(?RT zMU*{x($-O!5#{X>`tOBItp)T-%HLP7js&D&)*0C5{bn7d@F?F$Bw6wrLP#cqOngul zLYOToBpOLVZn+AgyNpqTa4Y@D9?PjAsvv7NWMs5V>BM|YT0PgOTL&n~1t#s=hh+-# zEFB9Z7Ffb-cb1ZHOy-uh$|x(^oeTeH(7cM73baYw6N>r2GX!NOpox*GQn!q1$muN4 zOIRxwU!n7iLWY}M&bf5y227z;O)xB78a8NfU09f&Q_j!8%ve|zIZ?^&L`VkoT)KSu z(dj-}L!`{0x8cx}+}Ip#2Z|==Pg2Z4#*L!E$rWr)llk(OuU=gz)mIbnW^#YB9216J z?Z@tzOtNk}AncT6Q}Bl8kpuLBKV^H~VMZ!&U3xuSvBE@|pPN9bkpN`(C0l&tTX8SK z0v}XaHg=xTZJADkpzDRDqJR|18TzU(jgVE|NxG_&s z!nr5R!A{HFF(8%qqMRSO;O@c%Sl=}7h2!im-otxW>}0Z*dS(Z6f3IK5vmSz^;O9Oq0Pu1T{?_7t)e1EB|0d8EeZ9VckCM*q4shUG7VwuzK-)wt1hg>dv@-SFhsR9FwxyPX zvuteW;HOB~%=VflDFYMCT$)sQ&wWJRk7PkVIKYgJM1yk3m_q6Z0vpCLVt6_#$jt5gA=R@zE8C07P5>OoP3C(CzvW_pFOC7*y^O#)M?*;KWswY990)O zoVTT%`4Ymey7E)g$@NP6NRsDosv-9hDS$|I0S9Teub|D}1@td=Fm_7D3ca4d zP*x=Vk~)A{;MD&vd+j!k*ff3GG!qms2GgB-W<%`E>ymnEH~j7RG;3-r%#Wf0jlM^` zIUz-HziF#{JMj-Z5CFc3=Ubju1z^Ht^n@sB(m>L5pb_o1QBEgZ=?r&C`=@fl(NOh+ z`KOun3bEpnF$+qM2e}@G&*?#byOZHsi#GT6i(%izPYADZ<=I$>41X-0Qga^V1e`LK zPD}n9bKgg5sb)53Ks>G0<&>|`kp9!SOHEWD3FF)U(ph``On7)Dlrcrs9_r1~-tR+O zst!N+{9RT7ZPw#?k_F5dPk}S&vwy;v1C2JVO#Rv|CHBnC%<;yI_df~)x@vzv(}+D4 z5hKQxE!tc7WA+b42RaWuklNwa+)zK)dww|~ev1m{6eZnD+g3lLX;$b9ZJ9uKGj&3$ z7*BT9Nb(Z)0t=~RC;^=M2EBSY^N{oLoaZCrQuOZ1(62x84F%{-aHF_5_^`UFPxqCw zmq$yI0DB{^iwk|4vtos2s%qL<10j+7n>&Tc(nF@ps z+f(>9Kct8n8U}81&(l6=E&iL*t%&^C8@F(W_U+q8_+<^zsLD`8xAtbg$M ztKzHG4<2(W@oA0kJ$iyq$HD6j!^6MkbPO1Wh%d{AjBv`uZ)18*9YS8T!}~Eb+hOT` zAM>fMt{U+wgsTX}H~McOR_sP0V3|vsq<2uUVZ4|vTxL^k~wp9y%u=hvAWkK^K_qxTmD0h zeM9yB8ecIp=cE6~{e`AE3ss+#;&=U3Xwzs`;sP4Dj>wom7>E%E&wmg|qP!pV)8vwX z4a^aSs|{JXVueP>gR7Mfv_MH&%BCs_GQ2gGJT1H{m2?SYF5x$VBP2GlTBmnY3of#O z%6IIZSrvt=Sk#t`r3`u)%;!2mNbnLjS{-1U9xx;P{L~%+-$8GzV z|00`Lv5RA%L^;#;WbTQ4X6wkdj=OkL^8F2Mk;6u>YucW&bt^~i;nNv~T}@0b1^wYP z^ZM>{Q**edB?+fPi@wHNyWKexMRN0+yF;~SP5S}ku>{;`)csVgO1WlH2iY1~A6VN# zUty00Hu&JxgQ1F14_A3ft<6I(FFAQk!;8@a&=H3|nDQEkK#o=4xRDF?HJX3! zezCKCCNwQNG&R(+`cCxRbCQZTc!66qT}9yc;i5DK2Bslz9H0V%wA0##69M4FCE?boJUGkTRJiwOaIcKMSJ|Aa3^N?c19I zV=>M9!j{QuYw|9&75h41C)E;?@<0jlOmQJ{;)32txjK`iBO{g7od^De>4bCQ1D+0{ zeXIMYt2ZsOcuqW$-hO$pXxjYiZErL4VH3ap9S0leL+hp3XC;d9f>{TERN9faN;*4NYIQOw2{A^e&Y1Wf87XP8`X21 zJmNKu1WM06e1qlhnkZQXToEJQly7NFX*#OM@&@5kggy=!BPR#9gV=#28${v~f|!JE zy_A)M86}0@ZxP*+yiP*7>YsyKXJq3xAzT^yzB%IIP1w_>GEjw&h08t{55m@wr8D^3^6sOAGRCh2h!@Vd^fk$M&+65Ug&2p}Qc7DiOqokQ zX)P66>1j~h&d;A0i+dk{yO&{K$z*P+TB%;JevgqGfJC$+SMle21M?g#eehO?aH$3g zvOl4soevHZ1{nJjP3lYQ%{(R{hSHDp`t^gizPyPCnLJJ`dpJx=!+e6f>IXi#d+SUO zBOV^BC)Ob7v5`=GScr12TzPz&eaAx_Oi{?6YDU!~o$&9st_YjOP+4c%Sv3kL8+5XG z{t)8gr`&2eZ;$F>%LT=^KLwi?bk{wbAJ(`@lZ}SkwK!>ZLf1-z@aD}T%4cb}`0Q{# zQ{&qxE+FYkE8!9Uk~=&GqhD;4(i6eH11`-1gNySCF2{b@t3FMwU#g_~gp-JgcyJRD zZzE?iBZE?~R1qjCy=cPkX>6?Zd$+>*41wOU>s-$H##K+{YpupSp^1lJ2p>$noDh}9 zs|D;&5Gs=iW&Af;sE&u@e`Pymg@Guk+7dut1$?}zJ-BKFC4#07cj@dAP)K+8Jc2B~ z%ncWju^zLI$T6a`_r8%aX9^OJ8g_*h3{Z*n1(u@_(U@Kd2Tj1e^oXff*UvqEIi;yMzjGs~ac`|zV{^3P5 zf>1(>|5h<~3(uoDJb1t4@T}mF+^;3j+KT}h0_$S0hRTnO!0V7)Kv%cQ?4_BWk}{Ku zS;Lf_?SObvA*3?w%I3v+5#r*aTxCp**ooUv=%HI&T2fjvibA#pLkP%n{7XL~>*Jp_ zOaGAUu$R~>7H!&Ddjn!UZ;0Wajra8Wu=bkHumr}Lc2G~=CDik?vk*PF__gP4QLU0h zAs6CF3m?=15P0Z&@WV#jY3z6EjtvX|-zf_V(OiKv*-Nj!s);##2NCRZ6I#wVnIg0@ zM*Nsu?9Op2{d#CY*__^mtJ-JZE4#eyc8_H}R<}NBcJsc+v{^l)25)NhN5-VI?n}FF zv>358(kOA3ag_hXW@+95J?A$YY;Ur$P0r@Zu4e{(^jceCHe>ahExq0_aHHn>yHBB) zPg(2dzOpI%!l@y>qY-#TXU62 zEw?{w*H}uF>$BRc9?vV`6+M26sN4ujdUexO3!u@~?Vqv5BR}`^yTTyLs%gt=7x{7r!fuIVj@eC|V(BwU1wfXq3 zcKo%_x)F&g%G3cq(jbPI#fX&*9({}BU){QTqz|XKa>erIkf5}Ad%4%ueaJT& z2Btl)UO&r*>S_a~@jX1>7)Pyu9huyvlU7uzvDAYIRg0L!+XoY)FZnFqIZ|7Ez{LMR zE2(SOt96wNF2KQWOf0*ob6#IXdDI#q;xg70UZCrKWIq$H6X{Hkn`Kq^LJ*a=>!Hc# z^0}=j&scs%DHiV(L@qYKyY`>9tZr0K@$SS3MtFq%)I}H4pw8o|k_G`Q<1u>N-gfqW ziu;j@~MZ$+IRYCy|jl*OzRcU{&wYjj>wi= zd0VAr_wk-$?&12od`N#*xFD#R68s0@r5adIdG5@8Y&;(&t;NX_(-jSt@<;EuVS2Od z)Vwx|S!YATUoZ~}_4DP!)o@hite|FJ?jib%t7Qh%XS_3yA1|_NqSH{Z)JR2BrexGd z=Z2FKFD+mA-E~?ZWq(MQ>}a}a}M-8hH3}!lcMckX1AI>SDT48yYxs7f}TUs(dC;jXkXS&C(xaNCv|P?LWA$ZuF#2 zcHgjsS9jjMsh&~(F0lCXz2r|9eUF&Hd6GPT4MUn)&`e+7botp`NY)BJihb+YvO#5#(NfpxqIi6~Jl@-f3x?V_;zG>+!ayl1m|7&Y=J zwKiDJ9?yv}n<(u#K+S2FH}3-M#N__SgLQL_`gV=#Axa$$)8X|%J6R`qXRBh*&C!eY#OeR6BggXu~!4)EphGn zhq4}~n;+_yy^lRV^W;O#F0fv7Rhv5*#j>#O9+)9Row-)zR!}puLA?57Y>)UuIrhatI?uH^ z(qco`d}jk&0#!`E1u0;Ci_nij%mTSaEb#Ub^MVw)3{k)iyERu!G035jZ-XKANlpMd z%fPp8Tta)?(^Rkj;;|wZ&sDq!{#K_h{qF;WOO-=USvAqBL6j{0^z93my$E0DXFlWF zK;%#-Y`reW{Jl0BJD(3~rfQ7%p4R`5K*V$nbooL*j0YSsdD~j310$&XB zdE&hl1&#?I`_+cty~M)0#Z1$P4Ut)n$5aSvdbifhmskh*vA9D&bWK^NADUMP6F)Uu z`yo9$X5BSO);de1djgFQC5ea>YTeT9Ts}8bxHcB2W$V^6SUg#?lTMi-^8}%=G}u@s zEDP6p_`6o|ip0VWFSIj+6v5*ZrN-Cek5smg784Cw)Iu59dqL$L3tJ~7p8L(@r7n0% zStFKC92vzD0WLlcY}0=0cLq~}AOAdrWM~kbvlllK3idXu1&9f-`X)3!+1rL30`%lI87Bhn`foDDI@QT&nN*Uh>wZC$Q6G zek@NG{GqY_)>qO5&iS&181Au+T{ev`tm-OVNd#@6ili?kO_~ZGU){0e+!Cd!B}9kV z()pWsX9G3*knpt{4@cb#E~J<-0R4PAF}#iko(s}pnQ_tqKdV_GGIrz&Pt)k_;a?Vd z5z1Em*nQd$RLYUvgw>;-8v`uWm~r}En8vZF=J2Wsea;M8m6m)>=UFR~1=&A|mKvG# z^=pK#k9=rd`Ow(sd)J2ej3t4OFR2CBGSXF;=PkKf&o7Go1%sYu@P&pUR~8%q);_{nQ+5WP`&5P|NF!SECHj5;KTt)Pw_lHnJ=8S4fa9$`C09axHjp0G@=vb8pN0Al3iWyqlX8mRT%9aS*N>%RpklQB zboP|!d`zF8aw7QEZg9uI-Z-oN-;+qjKx%F=^E)m53+f;|-8q^xoZ#(!fp2JJ3#3~% z!oZg3=S=p}2x2l$#PKLM;w6jP(Wb|K?7}iMMvN#hFk5p6b!6bPxVq;t>^9Fhqp7aW za(1!+bv|?x2n@;C@D7@$03F5Kcub1tXuJ+^D?NL+#EhzQOVgGaDj*WI2mBVWcKf2| zeK9x;1eCAS1cE7jV;w^wb_5!K&}n_!34T)M$56-507Xe)77>bCJ)OI(z^!H%!H5<} zmkwLZh5|t?ykP!1fqIXntvEV-Mi%}kjr!{%lQ%mXb=kZ#R zuP=roX*k2@HB^*1Ss@uKAc77equIBNd9T$EKkNd4QF$l^BmVnHkrRKi1+qjF5C_iJ zEJ_qzb>G6HHRzlwW3<451m%K~kY_A)tMs4l!HNJ zzMOi4?o1G+_*$hmB0+iQKtruKS4H0Dacgp>O#1@a3atJMIW8Y*P`nE)uV#Cfwt^RS zeQ`Il0GX$Tp^lOXF9eDUoa5I8ATE;vpBEo@=%l4Y?&)b+o6knjWNnVRo5}s5)@%RB zp3_G+28mbfw*+vB5Bz-g6ZbvpE3Do(rNJw@UP zU|Fo+{4x+A{`OJ7t*|x}s2yZqWl;;#)FK7uslatVp`k??0*yL{wOfk<>Rc?j(scHNolP&KRckc7AK+Zmd4K0+^<951-rF(EHVC!kP{ z5Pe!=fY9VzzDOiG6n0)V;t=^y7Xn{DxgtX-1jQA*iEzrCIR1xfR#%M1;{MR=Xai^Q z0!h$X(aea?tvN%r;Lj|}*Gk!LjI$;| zH&QlWuv|pn`wROuU_BwA~9{AXf-lx2v zhNZ1|KJ+JFX+2vfc&BhnuoWLUwelTz^0Gp)vR(5SNN7aIRGux{)nEFlWoR6Z!%4m9 z`TlYbsm0|?SSVY@QAQ1*-pTqXHPx|Ua-uYWTKQ6sSLin3w5KR@G{jJvEHL6JQ;*4b z3>R(>_;#MWhf^cV%1E%|$Qa~sakLZz8Z?*;x)9~P+w!xMAV(q{NZ1bly;KzN-1ouC zc}M1{Hx&5tJPou33CbXX!$BPm1CI<8+g}E`+zuwo3H8DBjdJGPOsfq+8##qful3axaMM{CJDbnpuveN9b!0+e{f{T$pS2m}29TX8s=@|10=m54a zd(>HcIc$CnE$ygP%xxMY#KFVVXem`_ncV7FCm@2WeN34j9NLJjz>ys8}7t4H5d`pXcBUA4~#pm4Q?I^2@KA+i8mT?TKtL z8s?+8R_OpW;ASA;Q$!Uvx(_w5QKM|A8e@tj*>2KIJ*W%(?ZnX)GMwX-aezbUb$YS8 z*s(PzVk0gal}f2Cr6PTxOJzzbVVT8`9ORhbECzq7`O=N68goRX-+B_O&Wv}kY{|sn_MIPg0;u(*v5Vf z{0|`XQ?(1tsIkr4VgnGyneA#pi!t7xTnSP7MyP|3PS?C0XDejgS0N)tf^zYp&&?6U4~VIifAv` z;+iH51aG75LxwYc%V8AC6-+{Lp#g`!_PyA;wmSZOuLWKA3?#sMv)OS_#}WT-19`iQ zJ;HRcW({e(;ypDTkB)UzpPq|+06izBJ&x}c&Dx3lNOf6z=2kBH9^$Ir=9r-Fsw`lB{9n4-S!ZRY z5DbF^Ea^|EWe|uAn|jdyD3)?mMh$}Iz!gs;yh=HTQk4RRoJoz25)*$IWcziZKaq+6 zZ%WOZvMRDC#*{e@pb1rf-)-rBZlck#i#qa4olQu%5PHTFjEQI;PyqdLRR5!vchQ{CZWpS$M`J z#nYfctTO$U6N?W6>A2@*Bnh^+M!sm)qJ^P4wK_ygxo`=+G;6vQ?>-l}U9n@WyuLv{ z8SKu$ZxT~ReL!UG^ES}lAFo}y<#SC9XjKDP4fLpqTtV0{2Av4Zw}T?G|0I-BeA-2u z`dQU=_dLD$LpnBn`J(cir1WMv87?|XgIv6SMlU&8l3U+d-dO(}248BILYbO|dyGB_ zHPb)X(*}7Er$dJgs~}_C6lIP})Hcg%PNDau%j~N!>> zQ}ehr8fWgsqo+TXccE3>1*<@sxvsaHLi6%bk+e!~^13Co+P4cj3>HU< ziu079G6E5_ZYxvH3BfK0Cl1PU=R>E{6~DvM8~{Tn0p6tyk@j$2 z*OveC7%MBziqBcZEP81!gXy&bhyYSJ=oD|3%#d`>+^w}gSM+}O%&?k?nhy`e; zoY3ckux(H~64@^($!aCIBM8e@=2qNq7MD#c3NLX}zBB6zBbaBaKZyc}i(#S*E){in zewk(Bu}T-7{D!zMgf?&Wd@zK!On?@1GqKjz(Q%Vu|IP9VUJjQFk0n+~#$bEi1ev_= z-&B>&ca_d{F&@gO<8p2V5a3|#!A&LY!bv9??og=JFT%f~ajERNSYt1<_MB5syaGuhjH~Z>BLLZ{sU9`2H~|0}1_Rhqczb0n>8a z8KATkXTI7TB;AfQ9raJKM)AK;57+ZPu^)q$=}cS?K@%0nGGI}j8^ZuC61M!9xk~O~ zYg4&V@Pb*RstQ9gp^&D+Au!}m1*L)hr9?I%B&$D`b&$V$86-w=@S_VY2bx6%PX6CT zWu@;oD|ST3kb$nk7KzCw_TdlMtu)NFw*Ei9N6Pt+H#loD`9XF@v<1r>v;bMk;T57G=PYIQymI(BO(Xs>UDKK+=jSMr(P((gXmoFO@Mg zn@90*N~Z~xPUSn>>Uoe=lYHfZJt~b0z3|en0ers-wUajMwwYd^fPuU!k;~hdqD3>Ss+opS^RQ*TSCjpk}7LQA@>MZBXa=EVNWGU z79R$gWWLGm7ebecbn}YmT%!#^1LgVfVNDUEMntiLrgPBviEJY>J7fVHY?83|YTZWx z%v~4JrV1zRK8@NVzlp@T*826I(n5rGDaq3y=ljNuDK1>4EMfiqa~NJMGyqC5)svF8 zi?Z_Zm92%fimvxcNZ}+*Fk(rKty8KGDV|eU$iJ!@AB@paP5*fH$~euzEw&{RTOdS| zKJB@W%Pe;N)C^BkVLdTg9Kl@PU7fmgBo$KHv z?1V6sPHb-%fi2yMFV@>->7sRLHMWa;Xxb63v(KveqJr^GP$r0UO-SysrI~72U)=gK zT8Z!L!@A2E)Ewws$@>7AZtiKnkc)1T;5I}>{jFhf{M~4E2UEHs4-17YdLYjuZHrZ; z0~Fd2c|L5Z6pEJXY>d)?KH~frM2o=}n#S9fEyLKFY}s_uA0bLDH>CN>-dF{AujN>b zY(;XX*HT21vr`A=J_ zNV@iDr-iK40iKDjFP7F?1w?*RG4lc_N##tHHX;hd$PK{<;IEz{m{_!fZ2t*s!ot^& zq|u)Fo;_ux1mQ$lG*e$VG*Sk-iNhaNLjCb;QRRGby%TAAkFBe`G?%fn>MhnQ zSxMOpq~91v$xf;>e&81AeE^{u)>J<$<4s+m1Dix^z3*o_{?tC6T1h}x@E)mY*-E9j z(W+G~XRgy?*z{Bw-H z8L)wDxH4^hiT@ZXXlW3gUgyGh!ZeGZ%mX#1k&`#;75k{CWHbU}`LZcE#!t(N>-!(S_^CghHZ7Lkz$Nvmyf*@X?FG@pd1BNxd2fAI5V83h_eh>hTxh|{D1=a+EYGmdwZtdoYN00A)r;-4AV`l>YE+{>fI|$M2WT$j}`(hVn@3a!X^Ue}XtY8QO?vi$A3Al*20UR#pBx}W z&W>ikRS1C~{4H)wX@Dm5_P`1u#6LP(R1Zwg(pH%jU^PVOc((wNpFgW$DMAejNcOns2HIvf2^ZKp2lXW>0>9l3sW5W z=8ENskm@A6Og|OCVOqi^bx;zwj0DrJ-N1ssH(BI-49 z{o7fdg_r}F=95T3*VxW58>si|R*E73c`MVo<$wYpu?L8*g$g4=%&Al6Ty=>_{X&rG zmw0l#3D=HDw;yLg<351jwq?i`29PS+mQBF*QZrM{7_u|S%K@$4qDIlDckjXIi;4tL2r$)l-1U$T{eoH;Fn)lp{|O{L*gEVi_#$dvA&p z1_m}}nTeM7QG9$usAz?52W`jIsoQX~Ugm@5 ztx#nL9QPCosfxv^KwQ=kF8DG`3=KIKksZ)3<-`-PAc(d~I|8~2q8@iGFlt3NzOvOZF8J{qL6k8=DUnTf?P1AjS}~Q&exmL z!^a1ofv0D+ZGE&z%4QEH;>v>&8@@CkK)YQGv4tksER{2e;Y8(v8Bv-=VY&n6P;2(|k5W#SBNOuJMnRlA6A;Iv5n z>5D%E%8aB@ddef~;?z19l7hqQM8;xukyHh?mtD-YO#P`e@IT%=`0IV-F&RvF5P0OEVe5nu1GiqMtyiApS}Wn} zg#{5eh5?-?@&MzV1EMK2L?uL=mT4tow~X~J9@5k%C~ry2lON+gMWE%1-Mx&y+K07^}HV5gmIKBj{T-xVI+~(td)P-GJ$!?R+QOR1 zk%I^5B9mVABP)p>!{K1AGp1!1L57n3!sEaabNxL?!OI%{w(TK?1DOzw$FSSUk`zoh zLevt&EP!ch>AvtkIdMx>;o@^lZ^=mfUU~j(MW^l8$Yv>E!g3~WWhU1hqoo8Spb`s` zhSVX~*5oruSBOXOt+UuatSQGV84mOEW1VyA2H$@#6PJr!zEc7$wpNZb zOFeXZ7GrTbwEOkvoM5K9iFhm1$50|NA1+>4>W?ZaDOPF*;8k$Vd%0~2(>>ognWR;( zk(NQ({jin;-Ohb#u6p)>=VjuVp@G|!m0jr5h4eO!u84o(36VB)ABz4v!7eLX7zY;3 zL^ynZy0sE%w3=f}F-5E9jeajq?ZGHA;$y|_gcAQVVO~P`8r4y(g&uq!yoON+<3rR& zZ*|Uwo_*8jkvTpTX|S5ryT~uK3vW&BTM=)fylejEzVhzFiz9!0S!Df3iGShql9Sb# zFDj(DkxHDG%xEN|=RHlwoG6QROd$L-%O$nn-7(rdUc62IPD`$S1#eBuvuxVDb!)lV zgu-aK!zaUy-NwB=YH5K=Y%=cXe(D?d{in1%Lx_2W2jWcavC(7tRl`05}-SI;Zs0N>8ge6#VL6Pl$ zdT(_A)6SdHQd!X1ZU1Iy5L2)bYKF#j?6m19^);a{$NyLtX4=VllkOq0Z1vncupTXP zf>B9)8$`PXXY2#9mDA>|nW5M8!cnY~aX$}TSv>#H52QvZU)Hz|%uQp?AHQrbYzv?; zowF%M0qK0mQ%WOb9t)RM6^-WtnBCN~$7TCFl0=2DlV7Bc%-3|(G*FaKY${UZ4<0ha zf~+m+mXIg&7!sWJ+HJ|DT4=+33nEA5rwM#rfXb95^OXzdgPAGVrVIldDnt3vcI)H8 z8YD0O{dJ!2C*XcWP)92?lQ;t;?iu^Xtcg5Q@i2=AT6i3|5=izNaw!pOIuq+~d~+>> z?EgIlyMI~HjI~hZw?&Im%=K^b}X?eUR}PX>tZL#;b`sA1MUv5sJ>dvdf;yqrh}4nvjab$85KH)-g~ z7L$IP(o~2;2|^rH!BP19rdeIw4C=l6cEmu;s`wY~z8%syz*3lSf!2I~52OUa9_$!^ zvtUK0f)@CFHT`++=QlgP%3!A#?_&rU8CzFIZh>kyvXy#lgv9yMFDB0MtEGq)f>QdF zWCki2uZf;UEZQlGcPBMH`}JNrNsFnrJEu=JFf| z=4$SYu2(O9QFnT=TI%XPdt#zI9~C$J2T{DKM@LhH%3T+Ew(d8PEoYCNc!lka{3XmG zeQQ+&*|z(&t+#>*L#m$c0{xcDh!0u^61cizADcweqiStX)Sz+Wd`O+gK~{O0=aDX1 zufQoSBWq|$l#Ub83uP2H)$CJoLP2SW5}CJ92`D7VN>l6eIjY!rB zL|rLPWU961Hq8b~q;^eNzu!5-#$Zul1R#&*F?3S8jU>>je}Up#E9ab5x%V~(pm02~ zo-(n{RcEF2u1qa1S#xObncj^PdChjKR44PeU5?t@R-Pzzv&K(n`!e9gsW%a9SMOs* z^PXI8Bh9izEzMXhunOlr#_>Cq?ut*YihIi!BbBsOmUn}PU;31O4o$MZ2RoH*cH{G~oY+Zv6gousL&%_dVMN4u`pE25U zjMjxetG-UH_k8E@bw7W^Az(kT7s}YM4YbMSUwr3*P#>6S^Pq_?=@q9DzZO{N2qb{BWF+Bqj`Zei!LLy!AlhmpjcYs2YUvwcmu# ztN#poz9fDuOu@P$h+*q0UN&%9ef{8pghYz^Q;!!eKl|7FpAFhI($Q(OB=Q0=UgHIj z-R;W02mOs?G(+#$|BtCJ52v#IzCTSuWGF+%P?RKON<_v&87frD7>Yz9Q^+iHr7}cP zBy$p?%tJ|1=EzheG9*Kpe(Uc2e6Q>GUjFFv9_KvgdG34fwbx#I-M7D?JC7`HA;W!D zmJ6tpkd0)Pb@!Q^tDtx(Vxk>mV6w8=sfL(?yzm7R~xBlkl$4ihe?0 zES=~bddqsRFw3`~B+LPgg*>Nq6O7VkjFS=kj-j0sKvDh5l=|W#lXX!irk2-kEt#B| zX~nI$RI;jQoAe4572pUR@sVs>ON1gE1&vVT zlV*$24Sa~b+k4c-VB73Pm5){v2!j=jahq!|=VsAoBb7pr@wz@Q^8;LcJUA=pvMg7j zymfvj(LR&;xyBO|iHGFfmp`8`{QT$j>dCEPMM{Av?^TIMFf;?YDDa7o4Wqh`q+fyt??pK#CF%YvaztxRCP>lZZvj*T<-bGF6;p*tk7SZRAjIP3 znlGDP;%yx!$j~zG#NRuc!hX7x(6WizJ)rd|`3h|k(NrOElCBbX`tmFKcW~&y_!XgG zP48DawRLsmKo3HxaW?pjjVQ*KuVAX*09&1Se}R0*VF?+CFeE^asBS&&iq6DlX6DNc z#cQEUgN{p5cbz2z{)y65A0Kt1)YXw3Y(dn3;7K2oL+=ojfCl;!fhBd|JW(ibh&l*g zthrH*GC4=C5mEdESn3($p&Gi8mP|x!hzTf~+Y+{-z6C)7p!nomOv|BRz3OTQTs!`G1q{vJZvIpUSwfF3*vREgQ(j0@%Mv1*}SByH+f z2kWC8Q42X>)ae7$dGNi4(K&W1u3br;+(fYdFGq^t zy$D{A7?!QU^7oCQM4N5byiKOWZRFO>JwSCuv?XxCA_q+&b#?!Gi3d4?*^#SGJxjx& zq)>DATJEF`vY0(j6mY1SBkv5ew46q>%|A;p0yp zAjR$ifrUFolx9Q*0~%M8^oP-%g?W}9RD7+!d3QAs4Lu>_8UmOv%_LHqq7o8Bz+pB7 z#S#D%wFz@~#LEP1)+=%@6g+WlQRNU=#DmFuGTQr3#X(c9@_+dO{)A+_3Cz3JzhZG6 zMd^hB%;ljl>AfP4IH_$zwuT=b>l+*cL23*q2rZ;_*OuQWxQ%=h;9_ztDQM&S;|1`i z1pDP|asQ;axOgFV8XUB<@cnGTF_Dv-yN#$Uy&)eVy(BQi#1Ds$T8$ zg}*P4+$R*F&`5u|^1k2U2}VAso>H1vVTuGhmvj^cM2JuNO#qT)E(^Gd7-`tZF;OG} zK)^!$bm?!VU4G|pKyS{ct9{Dqtnx>QhK-zC3iM@&0zvND-{(MoO41JB-m)NV9YVdA0`w z8CV&lbC)dKH;w>c3z*1(L%q&=PN~5FB-%OOu^p=VhlurkcQ`}j?jHr8Lk!r+PP#5f z@u^-C_Q?#L6QXn;Cg)S2-_vRLBL4li_xC?50Tfvg=S)zb-;dP2di9F@?=_%{9_4@- zB`DfhwEf61nkbMY(H&n!kv|E7>;xEy_=vQ}kMY#cO6dA0+yM4JPqc9eMxUns^O}0E z#N@LO^2fo)WAje^Z9Pt~1<^%MmD3hI4+soS3d}mmHc)g4V;incM*sr(i!29 zunevc{(1$JKB3coqajVS(Ijdj-Tphzl8munp^)|naS%ixBm_1ZXsK{<{%37PbdiuN zLI;J0*X1X)0>i`B|BVDZ z^G9#S2Ds`kc01C7+`4t^NNgdP4PY-5Rb%(%$_kte_yFUP zUH2R(<@}qB5$tnBN@`8hNs1RdqUF7tvcB&zJ{=AVxsfHZ&;zg$5qd@cj3!|NWPk;CT(|j_t+Os9-dmQJ+HQX z45sGu557KojGFIjEqbge6 z^^%h?N-}qFaCjH_*-jd(*skk24Y?aaj+Xw6%ItAD%*v_4a*9mKR?H!)zQ_P;d3bmP z%qQd(6x29a`1~39dD4&Hz`Q@}(W6IQCSb#OGdmoAnfeGlu7UKlL=L@n3_+KpasEh; zNtrtKJvpVPeZRKoT>%9JZWyd@c06wRB6&$x;`53P-SQ0`)UP$>W$LzjpGW|*4BTo30lS_|M2-52vrNj zmdT~1#$(A*@sD(OOajFB#abs;V8-zVxTaesU*Sitf-z?<%4CN{Wb%s_2G!9KWkp4@ zCF_*p8w1fYj*P3nwew9=69e?9Muqm=AnEwYr|-?1%rKFDkdm?n(5xDI zuqlk&n1N2gSu`3aPOy+6J-hBACVWZ2$@R}q?H(_kK5F;*1wESlQgLx{)yu3xjVQOK zpp^K$wA}FRGF}%dD|~q`6%|$AzySZO7#=L6GBuy2X7n4&`uh5E)CvzijZ6k9F0R66 zHhSeQ1wwi1(#q_m9ipPF9{2pCb`llEAx+InkObF3wDQZyu;FGhdKlrI>N9V`IpgjV z(HPAqD)x>dFuq*jRMCc@9-;FP! zSB5L8Z?Tr-m@-+JF)_j+j>m;rNdCc*OMM_ml&@V=AhuT^S2f1Wn3e1OfwR>yoaDVb z`cTx(o4%-Mm^9R=`D6q|MK{8&q6%6dU-)8>b>7p{W6ltYo3fdF05$@-5^$}qFc|sp z+hV^r6EgxHMSOlgff3LrRe5@Cyp*Qg%FWHG7Rr!`EY5o zGIjC32>RdetoHJ__N~HAt`9$~qoaYNGoZ-JL;UcBkFr2q4`XHS*;Ogua>Xteb79HD z#e;Vo+5IpVH$H{$|J!>vkqpM5W~;vT3|+260{nQC)iX^ii%l-=YS@23g{P~Tu)X*U z=TMgN<3#xEFQu&)0zlXVr{L8RXNVOhI}guL4yL)u*c-0OYFAgJKz<|o7?xL;W8PTK zr+NPsB1p@zUagzKYX|vKw-zuofSwF zQ*cMCYHw%5(y2oeD%l`|iIp`FhqyGUNFx{_pIwv$N~py{kri`0(+gFZnRaB;X9WLomsk$IWW) z?A-b55KU}XcTdk0I(5#fen+4s{I|m_u>sIQ;ll<1BIzh~+lxz_#BY)d3Ru7l?1R5w zHd6pLlBJ*rl-+KgG1`JvQ17epF!A|!%NiOQmf~s8f9_ol1VY%lb0-bX>iOU9I%Z-L z35-a=p?B*6=5k>`i7!C*fEYVn{rmT|KtGHSy8gGjB-TAjOPij-45lxl*A01o+*k7l z|2CB)dM(sVGIul|8@;@;Q<5XRK862lEsiXNS^6f|{s1-@OIvlr_>PQ2bX4&l`v9b- zd-CKy{%kf%q>k}(8zvZF=AqeWQ_%H>ho8?sY9(?g!#^th#(N$As8}n+ZnF6?O8mzI zWgUM+FrF%tj)Q|3Ip~ll$W%Js5i9D3yfBH$cC-PjQLb|4t&G4X=3f%lwl3^(;q*p$ zWnyCsg2T!bm8#Y5f7=XDjfs=9!Q`|EYq$5x5_xZl<{i8dQ6bx7G?R}D|2$g;hwR&& zO7)VDv6k7`>P#3I7%Wgql9yfJ6RW#ld}ifrbcpw0-#^3 znWE#x#l$FB26;gT|Ch5q5u8E7Kwu!%*KglY_R@D0UgE`syFWm+UFWlPa4St=U9-(! zTd}dRv3$&(>BS!z%*cNS_=A7{e$FFDj$k;W2E^Z=vp0~AtgVHJ<#DvezC7Hu zb?Lv;Hg7IA-iRw-#5n+{xc2X$ijUe^Sy#6nvWsf+`EhX^rQkBYPfXOIS08}9p5{d%7~;nISI49RwdN27KPMj;{N^F>$46g2VoA3vD? zWpLGxy}gm3mIe{8RPl5qIq1oqC@L=Qhw4rp0p#`aUt8q!=(wqW$iW|dV-^(^6+C+g zzH4wODc@`q9#OE*e|Qm4iSNJx9>f~`^xGWgqtEMz-nBrctZ!)Wdt+G%f!QR2T7`LD zu!5vSz*tv7s0@?kHf9?90Em;#l%U|jN*vn{32gIcto+~^!zgj0`A-O=#3mHRoG`(V zU*87u?CZY-HPDIR5~%|Fh)T$cRY~|@yzC6gLkCFFGrJYvRv}$o7Jyb3)4~lVWf1iq zXSfsWJ3Cl!_ZvX1;>{Zx{q)Vd3^J7<(dtm)_t)O~A3Qt`CJ~7V$~7N?{>jJL*J2E! zakv3Bj~d7v^6EwHkG9^ld=~NhuZrS8(`p{7E!N=QsxfNgGd^zbb?e=|Mypboh0lWk z6aDzT)=*oU&S%$~cc`HyhnkZ1{0gRKf)9!eto5cK4;Un1rovPS$(@| zb#)m*Xij1fKRGMwr}YZ=nKNhDIXL2cntO}TL1%|se$*RFiVvDQSj6@%<>eG(V`E$m zS>|{;+Pm;2$z92_SdR&7$MNocWVOg%`OXL(?RBU^$p*r5t?KK0&{4JBzuTv5@!KAw zXO=YYtfucJ?Uk1ggPm{_xz8XCN#TW3ESdvwhnnx0Pk#R1J0d4nQ;Kk>9$;7edko6; zW51CnEI_kTlxS-G-(7|gkLB`&AFXH&b?PlzHa0s@ru)L!4-L7#TRI1>CnfQsDhvb|6EVuAKqyfK#^XuIR=(Ac z3CUpzQ-rxRt@dQJV#dxB^NedS$?)Mqfh#5%`-g@Ckpvm3{8k}cxMJqN4=0+_EuJuymzj>I~$Z`kRmNbV(B7cGWr9#Qf*QgeX|syaKjASPl^@3FcT zFoRaJ7cDYh0!pk(t9%q2{jV3sH+jhVhlPR;?ZbREG!y&LK90a(6gk&;%q)86gV(Ql zzz$`d@m`CH41okMTMs+6mg7-&9MQJ{!C`p~huex)AUe-_u&_queFSFYFFa3a5qR#K6!!0JKx{dWS zDhslIt74Lvf}6=I3ceYL=$#XO2dQHd$BPCx(lIbp;XA=Lj}hM~igPQQ2c6GGS%pYwE7_~!KSXouI`s>DVVdS2dB_+*0J>l1{ulhYZYi?r`>|L6cRwo+L zSyQtP@9uEsjPIJvm|Gcqzds$+xECbxb;io2PB_*6z`ED(d=?Jq*I1;$G zjw9S5dtJwb#mnO2scV~AEy#joRQ5W>33BKA*w|XrG9JN%2BN0{#tSqSj}q@ll~?@s4(DW_F?i$)^&0#xXvJSY}bI*Aea)TmqbNJUx(@>FG#!I z-(qg9U6$d!px^Pmi&U73Sxsn{HmgpaQUM{MG`*bA%7RmXBSj@8(^9AVz2x|g9lUsP zH~h05KzVcRccJ_F^Jj2Ggu0cL;PQN(BIs0>sD?B(O$k2#Fisbfo=>0rzI-{0#UAl; zy`4mC)a~2;m6ggc_w2{AnEdtY*#Z|9)d3lYt5*T^`{qUvcv@jzwhC>QN-#hEn6F}l zSiJ%vJ~}E&Y$yqwl}=PrQY4DSW0`M{n9n$OTpRoFfzjQ=W0kRj^vDJA!xlZaXf2|U zzH?~GvrnQcvUx?Po~{iAFT_Peg(d4bFLp(a8!4FF3-nt0*~;eEwOlCZs6v8Qu3u}G zCs^sRvH#0G3%a+huWN0+@c0^wAs6c-M5MoqP8Seb*z7?|O@xN9j=) zn>!u9^`_dXNv%2M?exsh9If0>+A;JWpOgnlS&XbCjb z7QEHNvuHD{Qoigdv@IbcuiMZi`%zo~Zd)~f0#3G_OUcP;5 zBaq=DPt9FFGuZJu7ElDM(x!=!504OaR4-lHgM;(9GtZQ;u357Nw2=Dw^E+1(n%nxg zZSOuS+V7Gx+~2<{K>6T|77d>z6<}>pvyCct)!&7MpTDm7OZ`F=nb`BfYsnq@=<<Kb zR6S%8@yEg9n`N#ieV?Xig0`SvWMtF5nHw~*JCPx9iGLL6#4eA2XRmv^BSte(=r0B@ zA7o|GqqXYU0|(b|^J3~)N@g~nn9D?~ZOxs?7>4tCM)ONa$Aw>AaBk>Z`9CedMJ9@X zx!g%8McRTVIkc!_U70@{#rO%H#14j?l+W9@nqJWPBE-ieReOnI*naK$^#XEoal9CO zG0HVvr8p85KaIkjutvy=ApO`pWG%T+YGoQ1GXp^nhAU{0N(*}JeuSG%Z9Zuk85^Xe zq&|#XvAK9r?bxwRr%s>#GyUR)^c5GEhb1K*)u{`vzh-9x)6#^X4oO`SS-)pZ-jL?MV7@S}+Mujti@*sZ9w;OWzsd z;GgfA@Ct%qG2TRdEcqX(#R?7k)ZHBh8_PbVUD?ZDskH?+A$lO}I=~~>3@tVR-$OYX zzz`UDn}Ya+PgK-?wfcc;bQ?ET+DQINK^g**{ysjg4&dSL?mk94p4(T4UB2vQl^?ra zG5pRGN$%W63)al-+Kg5eu~@gLupFG62Cv6u9u(0k(ie_dycbUYbvNqiCG1Sj#DYW;dMiP-rHj@JCSlh+MW zn(O_B@ip*kjU&&@uaBg#D91*qZ|JZ%I9a((?9SHI~R4VH=w$TI6)bZSiQNmCd~;X7Jrvj*&Iy z+#B}Fhbnfjw3Brw)y2mOu>S!b`o4Wz_YdS~!teh5TdBRuwOU?Y2LSRb;}s%nQ8Z!I zqNL+&@0GcKH0a|;{g$@2huPU1u{ob)WvN+M2y}h^T=(s4>*vp$Fxt?~XhqrWqn>hI zJ>{UP>RK$Jd9U|`Qie}(0LKkx3BTiph61~GZ2b(U8C9Io}r)ak1qq< zJ?~K&iH=QqZ!a${rNzj%n=z$1m}IB_H84P~BZ8p8s)-XyOd+YuKad*4C^0Q5Bcqb` zDLFlz2IT_wq~}pS`Ij$Wx`usG-IP6nj__x0@Vkp~IscJ`(7w~~ZUT&ML^%RO)IEKe zICTYF#lw%#+dwb0ZQFxKkJd6M{AMHv@s#);%Rh+6f^XB+)#chhg=F?RvSy&>m3I;&|i;#!$@qXuh9f>j6&$l%n_t-*31*5qtv=l&79M8SW7(FuM z{`KqEtspAU*#ODtqsosq=LV8^!5($vG@|@*uA`(NJfWbVu(%2j*Ptf@N586U=7ohw3V&uCbQYw*BoaK3`k^29sr9%>Jo>P)6ZON;w;y5ji?KI;FHv2Xop}&{Du-17vcE%uHOdtgWH+Nj);U zxPx^;xLfA;^t1}X0u*a~6BChW(;#Fji{2eHEc?p>2L@UIz{6Yi09UOys7uYyztz5R zY;5dnF(qT(MF()#IB)xyubB`>r0 zyFRa2ug~!7Xl)HhPUZs!ys@-<@*2Cekok;V$KT|^6l@1X2^6USR#>T&8wa=fN1e2D zb!7*qMN$a%mWM}4PpOG(u3R~Ksg`DQbHK5l*%PCq4N3XMilZmBro9kj-T?q|aB?Pp z8UZ(4X`$6oF?+G3qy$k+@ZuS*^y9xce%UF6_N36*vg42~rIhCKo}O!!b?6PP6^n0t zlAW!7?%Z~~L32k(@ZZ1g-)G!Gb41D^O;>qQN zS5{K@S}sWSB;699nVo%zY8hV@X=Y2FV9mhJliISOKV#`cSOaD@n%e4A-qV~td*~1~ zSrWs;GCM5fI4BPWVbF=u5FBy}19g#=bt%U?xlTuMB3=FKs9z1*1HFL=j z;gWQpWMy4jI86M*(olJjZzd%b-ce^ZWt?fK`yVC}DmZ$bK$h-q*X&ysB6l5@*_oMF z7o4KUIU$ERdHDw4Om)@%y-Z^pOsZB>Q=g{u>#3;bCj>np@^Pj6d%SVeO7U&Y?LJAD z1x|VvPJX$0#;Mck>eZ_ya@$0xZnUzQ4YMfMvoOauTE&l*U9qvD2DMU)VFCw`K3|81 z9%8RjaQ@#7%CI*=@P+L&N*qBTI*s(mQw-GRvGFp$$DprM&9v9Y?C+5OPU#FvrZ_pGj3K(B( zaK4reem}>1$+i^3)-sE8&HyL~g&+%`JbkKsiC22xI@5N#&?A)|9v(mACON{@c^p1|_~3)}i!4!fp+H$U1|P)? z6-97lWF6Rf(wGCka$}ldcJG#O^|9VEUX)hI7pn*sAq+SMBs4(mt&}1ak?u9cwc-f| z4mYBtA3OlF$H0dV`AMCE1EK318`Y4d&~-vE7Ki-^kP)A-FfDco-f?nzx~gntp==P8 z?a)f0h+eCm^t5>d0=s8+g>TSrcZH`@ zpzVyrfZPC%u`*`}_#eKqdX89PX>C1-j$jo8LO}xq<~ugiW}Ygb1+Adw?*7-gXN}>B z6MS-V9KbvveR1ZF@L4F-x9EMpy-wuWj32haYjw#saf9oJPV zVjik`yI-W!`mlXrW*sp<@}1IgZQRD+)-1)0v&Djmb%-T9KbK;~I=Ow(n02w{fR!Xi zGw5o-vwPZtU&bP{2A@6n-i!+Z86(a>HsJd8)2f;1ZoX!d;-=rYaiC&7FX7zx@++0* z<}!l#=m3QQ%OBEq87OE!TLme}92FT$IdVmTq8vAEUk?J2*JFCPY8KQoeGY$*ehWszPCRiys;Rs^vEeGiDy%@aN28@>t$%j2CVm|+g?&cSBHJa1iSnm zk>l@~FFvW?MeyM?=GqSASRAg%G~x~|G#@=b_9~BAU^DGH`~c7$xo4!jXF)bTGS69D zn$2>Z;q{~;yD^I}hb-6u@(T&A2kSxcVM-dEzvklX9R6owtBB?{JIV64MkCLZ$ zjayQ-^z#ytC@hVY)mW9J}RK{DN zQ31Llgox$2bN%S2g8#dx=zRdDI3dt$VW5={nt_@ptdL*b9ns0V5nmw@-3^7W=-9X0G= z&JLzDPbPF=T9QO|K|v}=4v%XGFiPx1ggMgl6XxeF&| zWerl!S!H$%XVh%VlT(QB&+D;}>SJY<#ur_j29E#v<4P_E_t+nsnuFIoJ;!cL)5hDu z>~hK%6j0p24eH{z>tWoAglVDi>C_tXa<;r1TQji^20weDWRl>C={T;;4o#yg)}uFd2n6pd(k}k73gVu3ml_!~* zs(^5CJ9}rFAR{UHAUU~0^o0R`^yDjt5KYsy_P2^$7bEJ20`1P$zpu-z-Fn)aJHsS!(sr>sGJJMl z`+(~!iu!xQSa70W*uI|P8XXp^EY2AmHlC>Sck5ye4agDCpUNBMY*=zg*lQ9BP?lp- z{r4Lo-R~X8m3jR<_h(Y1w`Qv7)K3lN)J^e?RQHe8E!4KQwoVm`oc_Ey`wXhVu11r9 zaN7WJmy}i;?%lQV_xA=23%Q7z`g`bPO51@}XzKqlF`^XrFgoRQv{GmW-txe7(VP$hq!q0&s6 zSorg&6Gvq8EFS1;ZFR18GPTrR9qPOvbT{dpP*U2jnYK&2^jM6_R}SMDc_u1$@xe@D z15Du2SVRf1b=x*V_YmqDS}K$vLIX+hU~jfr*q$b=6T%@NAYq+GM-dV07WCE_wk-vS zZ$eqS_@(aCr(1JptYnSZWu%eZGQ$WFC!061h6hV+m$m~&q}#KT2p@rBn{v!8jTuydQ9ku>KPaWK7A_e zwTwbxXw)3I3XNvqD$eMV${*di*G~4I6(3zyi1xHRgt_QPRQL7u1t&b3opnK!Jec-r z>fRgNGKyjLJ`iire8YB21^sjgXvHw-Be$Zn1~COIhm=3aavU5S586lntmL1~DGZ&s zi4f%+8ca^_O+$0tAfpD{Saxikdg>mKNP|1kE^7Ypq1^VojI?xD&5e3Xi4s}OS$Q!r zMt~W4b-xh|w&65$4+Bh^ z5T9~Xpud11jEf^YaN=M_>kpb`HX+Lau#~tBQ?AS|+!hPjC~X&uEf%*xiQnzPa=^Oa zZiiIZ(ou|3Dhb}2vQ4nqEu?N#a`+yDjDdWDm`l{pyf|$^uO$oH7DAKbzi5r|q7}I= zul&J8TOedi8@PpOA`amn>DH7jW++<0dqS2YL4d8oY7aX*yXPg#fMsDF4Q31bu~A&y zs8hae3zNROdG-U9*V9Wl%`1sdTACFYcc@G#b0}8qj@G=fQQ;>?9gX>g5wwNTJNKHX zxo|~8P0bAR2_I}EC9St@O3lfMY!|ZJCrRbk|8&^P#YB>`sHJ<|)Ttz&g>y@vfq zX+#W+jja89+V|CRg}*TPX_NU^fV4jWNoWdAU2A2xt24gbmsb2-%qza<7_Em#-Zirq z>K{LU4n=G7OPPzQX?ga<(>Im_3aiwsUVFa~6-Y45)p)Fb{_g%aiIHtNK2amu<|U`< zzB)c?A9d_2U*(CBTv@kY+dx<{ZrKt7?I8buoj{`^2R=o!Bewx5Ad%sNRFh~FAbgJ z6g!3;SBrl~-Mza$v}U!8Ordyu%^E{NCXA!9pkb2p*E!2z*Z-siFiGgg7&Vl22f-%$ z?AjDgYE5JirU%o%RP&YX0(hMVqhYlY;2!RqNaC2Uk+l#T+K7MczYEl>| z;&^mep2!nf3qk-$jUouM9P7BR_GOohb41_PvVRX9&^pkl(Ba@YWW@cPrX!*a#Hn{g z>;@ws9(d;|pb_{1{cMmxqyQtzFpN|NeEE%gmZ3%}$421$VSjHLXLwZ=y(jD9dll3KI(j-mC}0 z#rrawS8WKBjMbL!)ay{Kohn8r$-`qI*hi(<*xoSgqqwV1mVwG+{V5IFApzW<)Cj0Z z@TmaLElA3Lc(gd|&Y$nMy->;DEOI?!dsV(wazxPNHK4)^m0tIaeD|K-WkItPk<;na zcD&Xx5nMXv1ghip^DH&)d}T*R0|`r5Ov~yyU^W-*f<(|HLa~t3>92xzJLqW$Z48&> zA$!2kQ$L(=h@J(*b@b@NLA*x53lw%$P&q~2yBCZ;qh6d)AtcI8-phLd!B3q!rF;Ci zKUU&HfFNWyBPhM>i@&iF_zhk6BY$gUEB0G&{E22>)^T91*W#20b`v_xTTx=eQHm%_ zpafFyVG~qEg+~O%=$(|#ud=PJzj1oQ^j+`+M7s)(4;<@(^)qvGg`ex_si}S7fP6;J zZ^|;yNd2PZF2VfHu!x9_C6y^-UZFjHdCqeHu_dau_!0*qtpnKcoMB$+hv63F@8J3S z(Nk@x2_RKxfZiFj-IZrkFW1)ob2$Rw3G{C zQ#|%{4(EEJS<)=kiljK`y}6m0CHOqTrQl!I2>0&YyInktNmC25WT{#;BSsm*I2FbH3=9l(ea9He zVlnruvLg=({_O4J9l>X1shW(_k0jr#d?7IoIX6+1uJ?oVjl9S5dy9Yj37oSZ;H1 zuI{+eM4n*o*P+}%{)omkTnu-FDtPFr*6g|Wj(VEUXz!|7IayhDU=s`k>82mYl|N+X zRIWckPe=Cvw@XIY;>cT|sIo8AgCammOw7!c7P~s!Vh5q|quiz|EGfD9R2D0KfY=1$oY8PksxZy9{r#kUl)#Cm zBy#7Z$oUgcA=(vw*(2{w+iT(Em=}C)W5Fq+=1Cdy-_VpiR@&9wZP&gzq$URwoJy&KVr=E9$%6hRT?GOLHtrl)AQz&nnJc~E5_!|Uqlt$KBq zp-=OEHUX4@fnBXiA8jP%r6sp+HLV=DAat|Y#{XIyqIa9V|MfL*G8Brla5@F372g8*0tw+<%*Z)-^iI7{uBZF7Y@8-MJi;f#2;a5r{wuX<{BMa4n*1f_tMf?~^4^z_M- zZ-yPv&O@K9FRuq_!lg+?Sy?di>Ic=tBoaH&+x@G8lmh1bkJD`Zz)n=COq(`U4d+8w z2g1ZxJtY>3HD!Bkbb?_U1*P)&yJZy{`{N7|xN~ZlagfrSaYxjb_V%mF<}<108#9}2 zo;SFin+fXpvcbayoi1RVm3?SUdtEgBqe#r&hTnyZnH(bGWa!6n;*z?V8K0(>)*sIm z%xB9d9TU9O*~)(`qjeEaUL61p2lJ%<^m>WzCfamKa~mvVakXwonM+otpydMiR|NSP z4P6R^TwNOkFkVs*rPa%q956wuLsoYC>3ib_tyj~)=x8XK%a~u8KBZ8(aJRg?ob#p3 z=)?ru_M8l8cf!NN7ZVMQ3Lj)=N6f`uy?hz|v)eE}36W9vP`&XD5P&Dc}ZG_Sh(C)B|!LYJnM6fsz?h zqDZ~;5a*B(4z|^kY|d(i&0jnY&|Ns@LglEKwt8v#EJ@f3+EIf%w&NWAY`D;2yi}XS&~L z<##k~u&fNt7aMSC_!C?lDCNjBC{CdW7+T24+$f%*CNdTd-IvUWVy}61Ex6ZT2TIUw z@nmS5+Skwnl8%y{z}s0Ion=P2z-xw2_si!Oym;}8hq+SWKJaRy7Mw0A;p$bx(IPAN ze~u#UXkQp_am|TFz@8cv990zU9!$^48J?yQ5)#6DYz6&IwCi|qu$C2ros!<)>rv^E ztzOpqZn(cn9R8RW=Pq*fB>Sc{#`_c(78a&o@`CS7TZ?GtHWCk6KXqU2igBXJCkAdS!6(Y?FVqI0uB?MCfdn3zPkdle*(cpFtPnR{P9Swr368}i}Kl@M*0Q^{lI6M z!Tn&dw+#m4W65Xlf|Z9ZHF0G;LCzV5O!VkhlOZk4=lQ{D%1QIm5U|J~(I;XE4CYO% zAo2KzF|V!4mRtnq>xzM;sSJ~)AJ!|VKNVyh`Y1$B2YW#DR(_>wlXeBv*kapnFdB)l zlKKXC44q#U@P=P6?;~iG)aLWw_IU5(qd#sH4{BsHnE`-OsG8^PiDr4f|JoW7w*Usn zp25wkfAgjSbD^dZv5e5vV_Osd^JOHc3?5%~dW)R-*)x=TY( zb%pCHLh%J#TQ^4?WwSd^5Jbwy|XE2`JFmhK5Ch%hra#)22Fki)7#fVpbAv6_jM6z0ZgH#J-P1$ zf;x$%7JK?rEK*Lf9ul>qe&?HKw6%EB;+WY=P*~FPvKLR(PP=VY=x=cH<_l6+>I$JJ zg1rwERibgnl8uRJRg9*Tz#tPLRNu6rRSe4G?DIgDY_m6hxU|xf84$#hYI{=*&?Ejb zQK`PI4ZpxZiQ4k}dYiw1X;9n{a_Et|*)t3D+`wdvaV$Y!F=_4}Q4i9RpX@ z>Kk#Q2Q&yuShnz3^G`@1Vx~inKQhs0VE7HHUOjz%3I4!VtSne*6D|7dm1PfTrV+O+ zplu}J7(RIs5Ih|jQ3wRoCkh%!pYYHQ;-O>Y@qvE211hOW3%Tv}Ov>3hVA;s<3Uoq? z7=k2SGt@q~{^&b*0#Dl)uLG%Ugs~l#yGf4`#gNI|n*DGOmJ_7hp^roc?f1wesdpg@ ztja^_i2LUu#o5zRL(55HA%Lfimc@oX&0D`wOHZ!;Jm!W~f_GP2K3d<3?*{9;0Z6b( zO@P55P)bzL=3%Cp2sMq0FK-7XL{D)KQJa6Y2D?`U`(MZ9MK^q{2LO@?bQB6mGbAvA zcu}1%f`rJwaH$i5)fX@Bu*GMADN|Ehhgpv1wl=B|)zw)Bp|Cd~T_#fc!{%GAe;s6a z`5IU)XT6u4JuzHG4aN_Q6PH$JZeT{G z6Klv?MItGb^_Ug;H_Y4fk_Cs*m5eK1l8#U7UW#e7BIpAK-jNXUl8^;lObRIqG$4F} zf`Kwg7C{CX_X|cBao$a~xH)>nk_ku$iriQQ>z)2 z)nh-TXh!$twT~%aogzg1Jt?FZiXz?KUX+L&(Xigk%K9)flg=uC%lP;>NYKH?wv>kt z=Sy9l{b)F9lk7Wf!G6!RaQ|32xtR2E=ykKzl;eNH(SdpbOZsXHVh6 ztIW*IueM>}p8r#i_0yN*9hi7{-aDC{F*a6RKAKvH0`1F{($}vOW%zP3G6r)_?v6wy z$z;17Sr1r$vw$`=-ymiH*Q4))l44+b33(2s+d;uwe9#88^O-s=qs#@Ocn8n9TC03Q z=KkfVl;Z^agT4U1g#;X;^;tK(4CIHk%+)m`BYy1FMoS?A;^9*W6GtQ)8D9N{`IT z5oH<(FkmK7VM^FHAeG4M7TWgb3)fp0oFeZEMhPi!%JUmIMAGboet@XBfkXP?<2>tN zy%{9Mvu6^7i$f|0DOL-f5c8@ZEp$cD&3q2R+z zz)I8o{cNBzuwqvyeSY`Ct@pS%W`Mv^kVr+UGZ7Io-`d>Tx(;&9EQ9_0i4xc$9N|_5 z6KT>iGC1-Tf%SD$P1{2dD1@e)O9se~gf)b#yZa4=D-vrU0vP~GUbNO{=dAb(%Wlmt z?J?h)Xy;6D09TLU7k`Kk5|jQl1jI(K$bCsGhTfI(KzGO3`*b_*ZG3#!-!pv*t}#D& z_%IGmpmmrUP$R4F$rEbC5K8vfN42%Jzg}^f-9P_U?G^JHq3$NL_D={*Kpm7K<`lxq zCnn{>1Re@`J>Kdq7ce4H_w@VBU#9h=Wx`>d&XCEU${KQ3>8SXdC-)lOHrofT9;!VC z9Z!=ZuP#MK_b=1Rc8^Y5QqpGtWYi9 z+S1Yo8eYx7pe;BsDGb^~qB?=DWbS3Q02)CA86JR*0{&X$%*)MWV3OFE*YF27+x#1y zB%@dWp_pH&!~d8ZHCf>R%4P9z{nSQgw&BZwLF5x-$;K>=d;bxr)O`7GP+CFc5=3?t z=6YqFe{6>A8)@!Cdwbo6n{t;i29%Mpi)h^CVM#am?7Skh8(2Dep`CYb-=3sDfT|BF zSYl9!FWp-LvI+Ek3-eY~e zD8WCS{?mDRJflB;%r8H}pxq_iilMnmNaPZjISGziX|j=wco~QuUN}m@FGf1)$0Lef z(3*Ujads*0awlmIP{*Y3G6E0eZSZ$+Gdt<>p=(!c1TrXjSX^>fs4A!+kdabQUIQp#I?B8i$@m*$4S6t_04FsMv@@wo3V2^}oFE>I`8-k&K^U@S%a)EJ zM}amt2BnyL(C{g4;owk4hQOVkM9o92YcZ(}K`UuAAU6F$bWjxd6;aQU`5iPm4d4xs zp)ZojmoPnio0mFoX>E?ojegM{bXBZh*2#GK6uF5)ff$(4weGpltvz!2RlMlhY-q%a>hO89^J5K^-qJ zb`bFyjrAXOLlxQ7X;jgPHUdVT0CR{u7*19M%c0;R^L&KZ|D#vU@4b*IgI?5|lkI%XGI@-SsU+=OBtXTn*R0HZ z%9%UPgPVZQ1?d20tz>E{^@;_s?_s zuMv1W>|WS;Q&S4`kpkvF{UZS>A^!g69XM`A6T1ai7HnFrasJCw2i%dW&YVtNRoAUG z>x~(zaMa+aR46{EcTdNg)2G^)BtJ zvwV$)DcT`iJEy%0o4`l_k`pLd(O7!1kPlsmu5b)~JdfOY#mX~g0lK|qKK>mok}yb0 zm!QeHH&Y)*XVA-izQB=L!L#t{awb#FmlQ#d{A1WO6X~~cWuUOJBfTO8!zLm^LsJ$j zlF~6VfLP^{_k~T=SPA-V2(ieJFxC#lM`oCI{WrQ%@2{6 z2{VQuzYi6&$s8)0*qLxES6=7N{)WFx`Z*@b)LRsh7{DWv{DCNp^7=Z)KuWHia`{j& z-qlf-Hn|+v$_bTd9VF?0X6#Uqpgw2vs7C}6{r|%{oMf;{a@ub~F^&OIG`B(&-qDyz z$Lkpxku6R{S5P?l)RvUrbTA~Zrs=epKA_(BsW!AO8kRQYz??*lxYxpGU344LWU#Lzmu9Aci-SfO#qGw z;;(|!p*JEU)4FoMzC2@_HGM&0$BrQr&q`1CeyQBj(uCpfxwd?bYN1{ndU*MobRVn>#FJ?6MsW@4AGEr$ENnmZb^kzein zYFb|(^N{WK=FIso-&~LuEE$P^7Q$(G?44k|owl~Qr1--pd3>5IBOl{8r?V>QDee4d zHS|Y7aVRAI?3EquqX`Q>vgOtrt0wQ47~j3~G+(8E0(KW6m<^2uai@LcNGFE(F=A|5 zxcfnLOiT@i8k=Ad5`fai`%i-jvB(hIbZCW)PMkh{8tFGTFR%GZLNDeya`z-b>x>RQ-ipnTJ&!wfecY^q@$GXQlbyxLJ?>*cuF zqsKvrNMvm%q#66}q6$>UZt(pflcV3;bCOa8yn;ePXaM&YJGKX5#bU{0zB&?(X0M5h zK+9YJpdi*JM1zC@2Vzi>o1g#b%5!^b7{x+DFo~9o zt=!wlo1=83lS<8}da13eOB1^YK3h9*+wQJYA zckgnaJu}C-MT(;f+XMwAz)B+Kwbp#_4u%jGpaKB(t)M=xNbyN}dI(Y+YC9e9cd(2B zQb$02i~dz>A*a-Z&FJp`AdEaBEdGfD$<*3H0%|d!bL_+kQhK61L0xf7PcNAVk%-I= zldz8i4}J6U#03Qf@5RQNnVb9K{z8Zv<9h}7!2J=N$52hEARA*$5^_adBcns0bSV%r zVHnoJ&TjF3a#~vZ_PHG)*;>iE=ph_-bey`Xe)w?6%j=^)tJbsxy+?x0d;Yxo?OR&h zlh`Ka9$)?RZBkM(K%WF20`Iig@Uwz_IRNPJqIHSj-%IxL9gd}uXvFI z`9NlGQE-5nhHfqjlZg#xn~t zm%gku#o0zbdVjv}ok;Y&pF$&J-@R2q;XdLW@Bx}osVLP@LSXa7O4+i)fwB_yy{)b7 z`5_Vi?=B#`pdS>1QV#dk5k&_+KFH5+O}=$gZDS+p5fCHRktYg-TY;Vds+>TyJJ2l{ z`To5e%rHnf^hxdkoG>KLY*r5Dg^;`)M`WG1w_mRKj0qZYz6N39rKFZxdo%Lgl)<9{ zRH2Byg=YsYhl1I`kKv&rcVJEZNaaLUK*56v z9Wn?H??O`?C*9H634d|AeW$m+^aqy*c&q_F4Rk2L4cZ+qAPD}V_m;~Jr_5( zqk}^^3b&!t5QYcy>YhHWh1`vL8mswf4*f1+;g*?cau={vVa3$zmVsy99z2kZCZ%!l z4%}VJ-@T(dcI?>9NidtoPUdV<_Ius)Km^O^-8*gUYPxa+ z95ET0y2{Fd7uW`S!VkLVqSnV7f!2Hc;DOSTw4!1Xb`=F|);)2Hz?Y79{rsw$vSqfa z>R@m|)ygW>-CG;C4%O=Of`aBW9bUYWyyeG_%zO9l71_NTclf7NL9oZ($NF!;(}AZK z+OtPTp$R7h=z!jxY%HFG4Vi_tb()u`6c$_l4h16w#T6)VL*Rtb*%@25vNVB7rj@>? z?%LWwP@I5L`=E@289~Y5mi=;az_?#=FcbJ1gwlf=8tbvdD{5-g6ksbTI(qkNu;yb_ ztid?#3dsC0UJOYy#G~5U+L-IBZEwE|Hc-NK()36j%R`MKw`oC`!##TV&==du5zIaM zd@b}}albO{6FSfT{@xtMDH8#2PI35%;z3uT;whWXYfjNe2hyGso`9IzBY+ zz2byLg>QuJmpX0-KqeiREF+f6jB_Sd=sT01gBXa0_XgSxK1JX7DN)Ga$p9NCNPusp{$iSI0SX8jXO?tL;awc|@K=4KFd>qCe_!8LCyH|L*__kdt7nla)XiB?C4)`; zGnU^(bRDpILZ=x=XuU%b<$m!Gy$M*)``7*(HZm4MhDtIfLuQFcWFAt8 ziprdjN=h;lB8%-G#IM$TK4|^&vmYIuJc^i^E|)(+tl~_ z`Mlq2-Rr*ZwH8YnLUSr6;*5hSdN(-ID$a|inVy~w;nE+*5lcYs!}O@t(CM)BIBX?3 z(*(n42#tr29=)`C3KTth^ys}oIclcn=3$xB{CGRGi4*Yms0}|t75@QUmM*e`-KIQq zGELitfE|(7=b(=dxKl=ZQD_k~qpw_9%t4wnZ=UU4hB$Vt)Eo4@izt>q@a=oH@s zd&&LBkGruXr}}tRQ6NLg+ajD(R_+KIvtzm5%BYa(JusC{&uGOkf743a^XRZ)rgi&q zjhvsnTqW*f&a<}jSkG}z>FvH0M*k{`heRExSLsBQAHbFi*+N)+9S(&F^^M5BWw8_g zES?+wcA|*RQHK zQX$X*n#+t?rh%P!`u~s4g3xdUF|kpAi0~yV!GNcga{G3jP2ldT$c|r&o1t3(ie&sI ztR;LHLrWGitU!kms2Ls0mMvZSftl3uSwt@>EPTk&|uU?oveW;X%OlTp9-TBW(+3zHYM6bFx8_+x+J)J_Y}3Xw2;E`vl436 zZmcr=(~)3?;)2805Ym8T2OoMMFfhuaDJyu|Gnw0Y#$x{d;)h2a-iCf=2i`?&Ch*OT zw|!i)v6h3ElbuZ;nV56lKfwA-48qPM9CrD&b)}sZxW_=Eh#|e8FHRA%R(|eUKfuW4 zj7b!VW^;NkHpseW2mlu&r z=9ru7GQoRFO7Uf$%=k%@wB-JM*Y4S~4(^Oi%)_=`wQAqqz0H7KCYM6n_UhZ0WV(-( z=v*gC9B*9Yu&|!q-rfS>KuP@Q^)K4(A0Ec6)c3Eh$J}>humn+pGe^cv;X1#pZ|(N` zwYH{FrJ0FIV)mUK!w8+kT4Jg53_AjbMCzz4OYo#55sZtlD}rAbN6no`%E}6aqON?i z<)-1z`HPtorOz%fz|f!kBL1(0AIQ3g{(}m-Cqx2a`Lq=Az*i39>>)iUMEVju0rT~! ztp3GW2Qwl*cE<@Z!_@S2=7Ru!70(>>tq{M=b15)Eod_BidUwaQ-yAe(RC(LSjz#oo zIS;DDFlfQ8O?BqXoomB`B6sm9_=nWkc&4IYae$aS^m1b z6)GHLMP1X+I?+>o=J1(6EGCBdNFE0$ySiR?%d*U)v$f8GM9)TFKPFSn96ff-mX?ty zJI|_s_tzY@0ztVd^4{pF;c(F**{^^9L;?%>vE0hOXO}+lQ$YNbdO!|(`)3+#$In~m zDBC&g9qaJL)LF<;j6cAdA~b$?`{I|;P0*Du>@@U2QK#`<^a`p?PQ1+<2qB| z9baA@wo#vq1kBb5eC4EV`DA8+?jkQ5+GthcO@52W-iY z|N2%*O%M1Jdh*Pf6gnjR1})kH5A$yRJYtqB|&7L4X#J|7Ak$e>jUDzJO*UK;ppaLK_rLiSYa?avp~*2{25- z(3~{))p0bD)8G3|1fz8JVll<5EjEuZUdyH>!@VjXw4 zkt40%JN;rjFa<{Vv5PJzc3dW~#5{;I0tWsItk4N2Q*`TNj|M!sfNZbmN}Y`zj_=5 zfQiWm+q(kOTF*pY?#Eg}k}_Hf`o})tv0atAVrcZic zE!~=IDN|lY{Hm#GiRbtep8&^y-IO2$|+`ei>yN2ck?EI2`sX%;dUki96? z_dk{gI5|7F8@^VDl*5R78H(yH9d?W>VDNM*RbR6{vUn3VLtuQ?LMC`hs66h(Wg)#|ku`Moc1UZGv9Uu3Q(LxcKmrj{5 z4^5?qidTvIK7v}z#@d=2jyw3pOD&L$A)%mn!fN9MJixFh5TQ#03eG;>I4QeN+Od}q z5nwZtI*IVBT?~o_HQnagjrNOIt%}OLv;-jCVHb?T(mjR%FAho5^NwVtr|3o~q$_{l z==y!>sfZh#0EFY($L?%Y?z#GRIf<{Mv@mrD3rx>>~Tq?62IM)joFAf*}1JfF@!4}Ye{(SE% zSFU{B(iVp2rBk7L*!RmuOLYCIEa^~dH+Y3AC=W|8Q&Cd6C91>Mo(s+K>Jv%8hb1Yu zd-m9HFnCkOe@7=>Qe+$W(9BaXni6!r?=FL0Cgfxk?6oRXMCy<6vYj*A4tu=Dw2^t zC6_E&a?sb;7#fKk#J8cmIJ{tk=!+K<@7`@dE`g63q-KeHnZHK6SFePa`8>PERmJAJ z9$)1H$9e2E{IP;S|8>LKtW3wsq75zq39SO6&gXW7IL%@r<-ZB-1ffe1D=i}S>*s<@ z9M-Nqa;oa%?BDS}!=N8XvRi?i%zBi{o&?2uw~#N_4FBk$ETH9`4K#RieApf8mzV2b z#8-FJ{vP@9>aU8|ziLO!A7q{QPkF}#sQ*ISg3(Bqj7wE|6|+Q1LCDMwgIC;o^TwZv z;?azsrXJnAD!nHxJKOC)qi|P0%KA-|VD{%G+G5B9QpVv9{8~-&uSod0e&_H!%qI9Y zu=0+k;0GBP&7U8LqecvG{L)aZ#tyULdL7{x%iW({HHL8GLo56!$k@k8(dE;zC~{{| zP_}(ZhxYCJv(l_tRtL?b_p`X%+!G$2shQb^ylO;!XUn9=&c{nSTs-3F!u_Hjaw>*! z2>Va)vN>Avc>`ok#Tf#tocl}FM25ANSDJ@;;ppECW4L=7i>>dRR`?lH>*kAVIA zrJ=78lQx2;FQ5zJ#MQMfF20NN-jC;VlNPVOtV^B~omB>(fdQr%GXj6_{Ra=U=wOve zg!F21{=h;q{*?hNepz1)DUXH{Jo)=5?<`T+%AJwui+bu~*GkjKmuA^V%q~vOj9cGs zz~ZLz@0ekcOp1J-7P}4pFOTfw6O$bnzQp|H}43?dmitKbKWj#1z79JpN1Vo z&y$_Vr1yPX-%#7N!vm`0hF7{fRaCCDw+{hp2zVY|JsYqQVilh69RJ?2{H^mibXwTy zany>fS{;15eDBbqL&vKvEseWms(tuthPw^a01q=HC`eXBTx3eOmE(e&pj3ubZ($Er zG@3iJYcmV_ep*}n?mkrUb;bc+&3YO!y~isia&Vol73Gku$lLn}HOqUve$QBuWX6s> zU|Hl;>Q>&ic&G6W&S{fBNW>E?GqP@^CA0;rz!^EC#*fKwF?JbUR?-;c%KrjI>;GS4}!wEst zPnv22<9?K6X+UpnZ?2Y#o%s&8yJWG`-kD*hh3~E(l!YbyOPS=#h_q8*=2-f3Kp8K8 zuf$~fr>Xx(gYr}$AHcm;Wii#icW)2@AMk5upR9CNPH`DUon?nG)s$5mudz`MKg$-C zkMj~X2$!g{byS^t4f>%CaGw${Eqnf=ew`iIW7JtqyNFZNRAc0EhVGU7H>)*NOndt- z)_FH4h3!6gDl~@=pI1FZ&Wn`sKrD&I(b2c>-VMztaaR85%N#rGYzT~FNreAa1ETIv z46$Kz+N)Qu`tf%bKk^r~O!iDWt$@-PVG2jiPa%vs0*pDgOINO3%(65ong5S)uz-a@ zaf|mw<^RMf!|D@F_S{xqVU{^0gN}~QYA2^8rVCQc_Z-}-I2^9)J2OWC*;`~52IHJL zr~ckA7lAxWKkn}9&cUSkQ_H=B}H(k*@zX5{r$$QP9ek@{0U?S>SZmsD|i}68+4vgIFX^)(HP`0gO@9k zklzl$$I=+Yy=D>ILy9N!%gbA%l+nW}S-lYe0YvK)x4v=>15QXQeiTDotgcvFDo!=h zd=bx3X`5@ zQAc#af>J;u^iBCNML;TUBQ|Fo-k@*zClDEmDg-}nS8T21ZV-YzIZ96^F)V&^;t>+h zKsB=;t7&(X!il&|g5t3=G@%Kls&p$-)KjvVbf4qYj>CnkuLYDkH7MIs&M*uS+`-f> zF^};?;OnLsw~k99UdjF7mjWip)Uc-u2$W0^5kes$A>rZoN(BT$8D;f{fzBZ`Z1IV3 zyE4M%r_0KSkdR~+a3Pwc^eqmP>K|31ib?KhIScRY*F-G8$eb+N<#Jc88A7>(zSxaS zLiA#nUVU_)Ih+B}KXZ@!=g;`70KVhpvWCpu63NdMPi*FBG^D9%==)E{v(Zya=Plhl$>k-e?ml-AJQM#6J8QaIVeSd6X2=-+!8d~>|h-9i4 z7#a;chm8#f2DrUHN+FJ&Qa;nS52K}XS}6CqYtg>}l1ZyfxCwH1NU)G>{O11b4 zCdqPqp{17Uh2}5jz)qMrQ6_HT3P)xZy%VjC3{B;-CnBQ2a`+DF{sc3+!Wmm714H3v zo)P<`-o#I0j^&Uh=nN;L(&0dHEj}~B%>jB7DqfUzd@BI%aTV^3G~KpAuBa*)|2Fi?`bX}Q;j6`Sz%$@SST9|Aj~Qvw?EoX_ z@7>))?4sE1MuE~0z~x#)W5z&>abX6kP5U!ZDg@{;hJzi4#hS^;4B?UrBKZiD1N6+E z>y8~Fr5AO-_%{g8C}yGtQe{eU#QvrQNb&yOuNOHLXUih)VQULj5yq2l-`)&Yb&=6! z!|YyeWm?=C&I8RGGMk4+oW*qf$n&o`QnQJtPi}cJXe^!+(s7*yEaLtezdzs(53a&l zv9uK|F@EdLy?PZ~nPFyD|CW#xBRA-Qtwgay8z8n0JU(}+KMPn)s(q$m)slKwe6O;6 zBoLJ~a!^42a*@rR2i8brVM9&H%Y#}}+>qM`#L-z&67^+h!Y-y+?;Vo4fRY(HN~P*^ zqY5wvLx!Y}zghR2-wDdD%%ywHXmonAaGPF&=RV z@0dU=&H3a~o_pNd-pKbRcsdaE2-y(1T+V4|E&SD)ZMP7)1~+fs9D;DUUL;EYaGD?w z!7y@_iDq4T_1aBpxVul|3EaHj$PKY>txj;hR>ZgZ*c|UPPD@`JZ#WLH7hUjEkoCsx zQ{Rgs>;|oL@GseNksrGp77ET@2mfczGSG+Cikk7kG>;M~oS&b^Opnp-WkVlh?~c1*O4_t(bJXA8X7S?f z$bY28HTHjcT8}3 zSq=OUvN}Ndlri?|#Rz)R&m#gpg`#v5!hq(wMs=`TzFb_o?(Daq`Ob^dtc+1%eg-wA z`%JDGDUJp{L%~>}iVT-r%poP5N*@Ming_Qr&u;Ru!Oa+wfO)~e(Q(ZD`L)GaEi^s0 z3tXuwdOQek!#H%fQsxYTgy>qDWVy-eBtHrPfNrywY?s`G%*2fswh$vU*_GGu!qFE5 z2F#lJyi}YceIme1czJ|Eg?1q0K$!iiDB2D4#8>95+Su9c231(NG%D>iXvh$;yWm6? z?@LI?0Y5(xs|eM}|JrQ$v`EcI%3adzVC|LZc1Jpb#0@=vz8UaSN-;`WzR=8!eXR^< z3ctbNO2D7=ec)wm(5!tDlN#X4J9X-`=`XVqn!gCyd?FP&Mt*LMjNgDkp!oRutL??W z`A)3?7Vt$#{Sh90?3XURm6*7Np_jY}e$TjEq5|{?0lzA>IIMrFa8z-r*v&UbJW%8Xz=+`swKC86##>#7=~Z#1dmmmk$PV z(F>lE^{1rZeku{O_VBfZoqF_uS8pyHC#y2H;+!HhM4#SR^Ie0-)((kDDtiF}f0Jo9kF78uxN7BV_UzGP0cweaQJuM$ z##i)iqFH>6BPg48;;TM3LGD<`CRo;wA9hX2ngKsa1FkjO>Yz9-fcn)-uioI$%hO;! z$Z;?&Jf(E=LNX+#rOimUaSQv;$N|?pj4{@{4b054BqF=0=zWfQTaJ%J5f(X9<10ep z+^eq4dP4fYaP?}2d|A<-81Wb~@6RNwY#J#fnhQ8E%zIOS%>hFSZX)Bjim&Xi zxx6#EWMY`959J#?HViXys6F_e)-G8?!N(I%qQ7@o3(&JHP;vkD<%~3`lZAmK<}|ba zWjgg8c3|{&B0ZNZzm?6N{NeXZ7}sO_g}o1(!?C-Bl~|K z`Lp3?zXv=_?~SIr8h0^)U~l#m$PXUW8>)LOJV7S1f-{h{NtNBGG%D7@6oUss-lJwPn_#$0wsAR?}yJJ9NPxle=C zik3i4=*cchX-H*y<^tpgm($m$uW~9#@6C+&hsRdM?;he9)A zNQ;5f+p~A?AT={Z&7>$(3yaB6G_;_=&dFDXd4Q8{@Sl6Cuu$jGrfvDsQ7Ik_G$HJ0 zyyoiw6#lz8bLRA8h2fjXt?Q|y#KCLBVf!mNUHDL%L8c2ZLdNJXMPpG&!(@rT& zvD9|u``ED*h`iozEIYs>`7AwMvMPmscZM?Yy?Vau?h!*G5vvn8{wH&lZnF+~wyQ<8 z)Tn|78R06HPr9di?O44{*VR|ETf^Wn zkrJLjmRaflcseHGr~gSpAWcV08*i2$BtNa62Ne2!Kf7uFhpQp?2uAv z5+(aByr)bC2SthWxu&_rkD)l41;fx^7Km*`L|D9LOs3{M4_NtbD75KEV@uYK!5~wX zA^n32>SH?)&5h|pT?>YM^bQLT?@T6vbfjCx5Iuu&woLvHBuNvj2dd5385rVtq848y z6DDv!-=mI0Mb1;&SS2ei)=WKl%#9oXf{bu0`A|uJ<03FMAE|bI<&SVvZGQ19R?cB7 z;Bl0)EkuIK#F-&h%+=mYN{qpDFQXr@!fvcCm~YM`?84+WmfKCjPIKUphv?(M4k3sy z?!+)$1IWK*Y9B-nablR5oEkYi-PJ?T6)#VcI2K;~Rj{vEe>M?$ zEh0)EUB8Hc(TZctYd2?uuWYphcKLgEEB4{9QN1OJ_h<6tJyi7UwZB-b9eWx;_g_*J zo&q=^%rIpi#$;8tj)!V_S#<$BK*0G^fzxkum**sTLO65mtItb4mE$acW2EGp<>~Vv z-azn=NXvYL%QxG64bjVsHo&BhYTwSlLmyjT9u)<+v)~H2 zbbdUvLpZx!eqTSv(-LkMZEXZmmiUp&c(tx9QGsNelG4frnADj0Q{8*?kk(Um!n(|k z2y@s72l(Ozl+)g4i zvMbDhqV$fKIdC^ov0Y@72!U`Cf069;;dy?UU{0G1gPA^;Q^DVF)cD~`ri zhNBG<>fe_Q3RWI*TN(`FX0^haJ7I!&S^*PW%)gr%OG^)IxEHtSZ$W;%1KCZW7RKnI z&;wLvE_(B>G6}+!!FX^XO;#mT4`zk;=}@g@Ni=dkAz1X()_&%sQrd(a8oLSF2VvLx zBX}U_C-H_BwY<=QAqukN@RQWf$OY2pBAW*P)|_vYy!P(RWyDE6F)-eF`*z-)U2dU} zTk0NF*4&%dvQKH`ud|_A@4NNx&A|MP7`kb8y`VDnmpVk42&Aa@SRRt0#|Nr~J%Cey zTNPyoT`ls<(Erk`W{ok{C}=WaP>3c(UeSc;K4G0rTeuo54FlC??ono))OKf zZ;neJO={(TSORk}@dh;LwwLMYEwQZrn_z_#BC>%;B=DdBBTiaH51YO7#3>Sn3l};f_`H9&&X^TMcu&ILJF+=1MBzVle;yh)*OoOJX z-(nKd5q0JDmfZZ_91{YCKzVKXm*+eB##e1I_>-+)f_}e?jC%VgD^bm7^lR#zZMG`We+$HLauylNXUP40t-1$3;QF69m-zuXDLdU(0 zea)QVB0@m2pT1(1i!MHHKJs)V2=##4$g^i-W^Fkhy67^MvAwzYu9a(P5)XNbNEqWexsHEc3ik}_molh{2-8rX7!$(=H=EYdh`*syp#T%m* z1rpWCMBOtko|^Pu*}8zN1cwqs?&QJlqCVCiH`bSlb+?JDuj1AZq232T3kqWleD5Vo z@Z6dayV={j7zUnlPp03|E8W+w?Z?4jFFb{RF(p@!Q9}tAU@(6k>q_4d;LSCATU%jH zxZ+DrxHbS~O-X6#!usZ(?2YKdbVl7)-6ns~sI6*D(v3n?POXoQul6T%02Gomrj?mra->|Q~~r%4-q|?m?@ot zVl$*Rg%-(wer8{2aAVDQ3XO&o7hSq^!L~994js0A2`j;w0U(kP{yENfx|3rOW4s?XW0O5+g1eJ$FcY zf=x2ne~=v%aSrchAq>g0g(n*>UB29gqalq1u=$5^JPdIBJb6mWFK_umGNeEXJV@(t z-W|ifj340-`^`|=T*A;_`wxVo<*5&|sJeLi`0%OcZ(BKb`j&BRZBcu;|C4wn5ghr> zq{vB2SF8}7>iAHHx>C8OwD>Pa-X8K@85}0oHZmmT3yr0k&{4pF{x}THhqn3Hhy6I> zQ{dmDcF1f%H~`5%JJj81kyGj!D=yDl{0$i(fDuc!jwtYaxvnWNZ+J@$Im35)Zc|S1 z#X!^&GYrq0--_(D3*(whb(6A?uH8jSJCqH7NTZND-aAGX>?BAM>)Bef5LE(5e9vyJ zrpFR)keK)gXUeQhCy&4b|1}O^6(QkLLs-6JM|mQp_#7GzDeeneuGd}f1wWr2X*mhW zMN*Ko*1|U^rfmgliq^+>!-RH*Fo)htX@{Re7EEm#y|sb$!iA^R@z(LKTGN9k;ymN5 zHu~y=pD6yqJ9MAw*MA!}h7&xN{MoI0^yuAt5eFIuupz!h7~(lGi<1M0hWx?=rXUt=Y*=i};jK%0|200ok4={6Mji~gbxk?WbcsWrxHVAv{?oF5%C2=^Utj$pJFRjl#-)rSdHT>$ zL}4f~XkB4+3X`axJKeMjf_n$kV*a9FGkH?aspbZ!@^RU`tP>5ZvaHEZc9k5&q*bOf zXWjvqD>iQ2xo1x?O$cN{tcE{Wf}~YeIcsO1sX^2CQ|wVukS^&&Z4E3J$rxQ$I*nCz zZ9GG58*qL?EzpRr--rql)J$PWycR{C54G%weZlN3yG64!=+1(DSzU?shGx~Y7 zkrD#3bP15KaqOYL$(1I*;fc(_+e=dcFnx01NXy69QAp!($?o^}4_8M;#F1NHECExd zIJmehDSmeyrshn_plqbf_D}S`Hzgn4O-k|he`^%VOQz#20teh=7anrTay@_LQ#;;5 zYzqjJa~!lo{UZq_8Otf(tt~KAcJ@BO^@H@$WZH;w6%^}p=ZYF@#@=M|5PeE+GTOSV z>?5IW3B{Ygch`a9K^NUnXiex28GOw?;LtB~5Sn;`w&$$k{Bg`x8&nhz*YPUY(4p$l zGgB4Q3tM}ivf0tMz0tWIMl0sjnXxmvSLc)ev~JQy<-+c}hI=gimv-)KQq;cCQe|)5 zEo!}X9vV@i@$>fX7O(2Bby@u3r-kqA#4C<{3y*()=;s$B;Vqy^(t+7gR@P;o?n}8O ziZ`n5_lmg}c~jSJ+{ocd%gv*t_ToUVQQNKf0#;0!NzFjd5Byn<$0o8%`+-YuIbSl_ zm2C3|f|745vr~uy^$C@T;*M&2zu_Th&QaUSo9aAbgqk!=N_llSeem>fI}K?;fa|Ld)dN0-<*f_3mH+Pg zfK`?C8fk{`6RxevZA@2l3pKU91Svy4C+SQBg;3ln1MS}&DmZG?;Lx1g;d{DbN=}|; zQ0+;%B(p#0ckoK>HXfjUn?jlKf{Of&$ebRgs0#iAm(@jU6YN+p)MyJzo=6bTbgIMF zbP*#tz@BG)?-kch7qdD9D1~JQkYMhV&GAdqI%5sJlakVq1b*|rS!*)$0(|EAnQ_Bq zMFxva%#Wn((+CC+_S4lBOqai9Sx*$8M2rn!R_PQge_!QN7Cj?)oM`<}<;l(+|I49a z&(!tTZ6c)Df)b%t@m!98pWZ>%NNc;cMdASd*^s(X=I3x%Pcjb-(B&B%tmQvs)njLU zL&Y$Y69yZ-xge~z%HgD+oq47?j^H{}bOLx`B|qzR)-)PjoRzSToKEWdXUUTjW6#gM zyujXG9<2D*=!mdj)1Y$aF(_$rRy}H~UEalS=l}^WzYH^2=^Z75)oT0pYv-_1@o%}$ zN22l_xb&$4LP}Mx?|k;QJaN`f97Fjt=f>LJl)&^N{S%pEIv1EBE0~zsCtVo-fy(w93>xmQU{)6qkNX4hHk}iF9LDQ)7 zfuzCk=n1Zt)bl%yI)jC1vu+1(eB|qck5KtdaFf9K2hnc^*SHzwa6_7Y*g&gz_gy3# z8z9uW@1L8|7?v>a>Pi|T!JGBFO*^qiUbydPNTkz~pZrhD6u8^j;5K@k$wBY0SkBVzM3m zte2Li)$Kj+iV=4*JgJ1`&5AQFA#wisnHMO(kb5^H&dphvXZ(EdvIdrYNAJ89=lZrj?6Q|8Cni!{ zVEO!QkDsd9zJv>|HwCdeI3S4x90VsztW9Lp01QUIfdfx}Ki){wXd;hQqLCP#(7m#e zz+@8)%$f8afTolc*SzQU*`o`y-j;YV_VV(VvKyXD6&ATl%PfN^CgUu@1kIqE zlXeqU{*nRtoE$j70Nuo07r&e-j8 zT|hLaJ$^fviCev{yt)H%DG^yo)~wMaT$g#kqj@^lyvJ(qLU8G*zfM^s&mBq{7uJ>9 z$g#jsU}60GF??S?rUhV8Xof*U_FR5VKmWj4C(#xwp>V74VnDy1xs+t`#p@=j-oXe^$~5?o{AGHr1IdYSFgF0sAtR=-;;W?9zC@fF~q8Ti|)Sb z-bSBx>TZV$lf3~LeT^wV^4gm6w5++@Kep}f80%K9Eq$PXEm;?SQ0@9Y4TDqAHfPNu zgz6mIeaE5O^c|4PMJ@yMN2d1uQ(0ANduch79;2)nJkcV<;lFWsr&FPf#(%=%F~97eVovZJ>UznsbbfH9 z@TxYF)e;1ju(A^)H+TsvvCp7p6jmjak9wSBT9U85=sTjbSqc+>xQRO?-~;h2Qo??a z>HndpShmz-Vz5Zj^fYwf8de@M*W+oLHLZmGBlV zeHq?5FT=cr;m)W1?*1K*J3qc77%hplFWyIb&jY-CgD!RX25bI-OolsQ8#g55fTHG_ zAGr_yeq~P6D5!s|SxP*FOLiIF1xr1@nSdK*@G?(dLY!b4p{UU9O{*?PSzO;jMESt6 zx<(b0d}mFU;ln$C54L?@UEgud*xKKPuLrpQsfzwK3^3K}_|{%}8neGa&Fy>q2qQ~j1+>XY(#H} z@byTlPF5o{73l2P0eZ3J;;j2!(Yvsy2-C%0dVU<#_NqifC~*Y-9D5tio%rb69s*Gk zH&AmMWfNW?PyDYY3C5?_h%J{|p2H$9u^-$^q*jZ~^rJL^6#K@A4&1^GNFis>Z-e$KfIA`)j|Ot zp`%7q9_ol};`NxVPGC-sN=ib_CX0(-9;yW>|Zs>t3}Q z4O7kl-SdC(_-1Z7ZKvYX6XzF^NH7;eN4#)BP7mzVZ{i-^S=(dHfqweyzA2F0KkGIB>r)}Twu2)T1V&brag5St3PXjIedb^f z#TI9QZ6FWX%r0$NbFZ%4i!N~|GxJ3Ax~-7zZ+cX>#{^)+vPf8&eopz*r5l5kbGpg- zMw(qG0(!}Wl7{%mQcz;~q%0@3<0$LmGJ?0sBVMH$>6zg8YR zMXV%P>PV~53@D>C#dLQE_w*P0L@CO0CU*Sz4Am>E^o9x=~hf+J9=H zymNS8QnHeNiRE*u^!d6kqULMhSeBr|HSCoGi|xwEYLvj#1I3W+Q_$o#+mZgJ=qL zBr3#8{Dn(aJ_GdftedpYRbH ziTi?Qr298AE=I6soK(;2*M~7#XPj+gP0t?pC>B@48=|pkvK_In)y+-72nhOJFeX8i z2NuRU=~U}f<$KA6*?h44H59N0OE*DRabWG?~Z1mJ^46=b*Yb0dR^!IfH)ht`0w zdZwgx=fmD}bmUD+10UV`Jo#p-LsoXoh$h09lXc`0F*gbJM^LooLF0u`g^lHG$$CZ# z*;BNvS{Qc*9YNdBQL%-e$3?>`1{7Ua$U6rL%3$vns;WB?^c~f9DJMEgfq|kfToun? zjoJ>C9Mm7~dJ5k|HWEHg@8|Zjtm|EGwcUWqTkt6qe4dcc-Ob0p^kMuo)Mh8PFT$EK zc5?6;*T$bis7d9tBirsxAKEo{El-add6IlR6zAllG57CLUr0sC?mIQ^K5u6`3NGLE zKo|#>LGblRu=3-iXBOzTS}nrp*kF4pTqK|fd-gZ|9T?wL#-~F9%D(7V^c#wY-MNdx zE%3Ya?+R!qpWKEwll~eRX7;zx*Yf-(%PYtiUcA9<-aqX19ioi@S(f2In2Zlf^4o+F zQ~(3TL?TT0r)O1UDcCcate{Y9hbL=62peC;oKxuktbD#%)i0(`PkaT~WNGXJ^3TJ@4Ke zNY3j+VB^;>vg#MxBYxw^H&^UM@98+wUB)!6u`fuV_?Hg^SUgFRTC;3xL5*?dMq|=< zRaMn3t|7s~cTxvKl+{KGm+JjTeQ7pUY1xuWtDYbSh8asoa74rB3WJ54oZ{3D%zbE-H0cinZ72;9~sOo9l zdKVf&TJRsoAxlg3V)T^Qyc-LjaA{oIhK$+shGuQ!5!N`X&8CAd9omd~mE*oFbzZ&k z!JSJYF2205$jonf%qfz`_W2vDTl4G2;J(1otjmm3r>`#>F&g`$o;o3|kyV`AHhG1@ zTUsS}>;=_)1h^e#8qD(abN8L~6?_U3C_;m%U8Dr?)qP+zqkQfn|0WTQ^Bzu+;cytU zFP-xBzK2>0KA^unrj0+FDMPdez}Li4kZ7vZf>#f z-m*EX%w)!l(WDXU#fuwAk-^F)S-eQ)3c0_P;Gn6cRgcECTNqBoAsc1|f^3T{1V|hQ z{qi({{X2!PS`aQ-F+Lps(`HhWh$s8Ogz;zXc?Yd1q zsvz{!@)wHsZ!Yz;cxpLi%J~<`?@5f!qvxDE%Q#_^W$snq>cIVSyhrg;@Kmc@Il9y= zYPeU+XG0@Tof3H;)Mx|tRvqbn?ZrkdL&aK}{!Y<+3}728mOY*WVDlfMV$ML{b9v^w zJ80DG-j_3x8V6ZH%&3SrTXegf{qwBlvukr?nxkL=vi-FUzXubV8uslQwW`dw3#Xs6 zzVzKSU5}cdOK6F0aw}o}xvDSEySo}URA23+yOVr`^>`9!kivZ^rFgPnO%oz_cX|Va zN(W=oi+YNy0Eg>sm??9|3@5f>VHvbJli%C(Z3StsuKwjL2;h6QXYEHfOYLR%B964N z`CQkjS;K@%`mjLVNJbkt z@Y1s%fo9PO2O7LgY%M(`at%P(u$O|c1tA`1PU~|EBR899RV>I%jnbyZmzAdS7#rKo zZ!yTmtg!alS1rnJ88l2;E<~7WzXejboq5{SNc4kkegl@A;w#Ey%}m(14-hO%93e|( zQandliQ#K&)XcQaa^JP(%*g*BV=c3?(Nzo%C;X$h0t1b3Z674?*dd(*9a zVo8) zSA#G)U8rbX{qw--{3T~DRl9`SEewWy7ma}S0=bKVPnc}i_(>fF!j24ilaGxt$_Cup zcwWw-zHjT0&S!D6Wn}4#^Yhwv>(-62-e&8zrwTrif|OTFx2_lGL>0}W=s z9q9XZEHP3R74eyGr=_)^c0L{%QvLJ$61?83B;yn!xF9}#*Rp?bh+rPt9viE-e!pF_tSf1-FK(g+8v-j}fH(uo}S+pn`@YcGfBmE6X@~R4-b92id+3sHd zp5EudpqI6zYV){|5_0SXeyqoL^@uIN`->E${iEkRbXK{mYD)#iz}(B<<})p7h(VL= z3UZHGRptI;#}FtU9tA9||5+B&)FZ}c!i|7QCTT^MK4tpGZLX`NDYedn8l4QA(@agz zH0UjJKj!-ZSRs;*TD(1TbZA~e}BfdugO(@mS>Bl6Y+TO2=}V##rCbM@Sdm8 zWv_iTBX3fzR!Kte9G%7VIjsP4uW{WFMEzx>@Ctmj=vVCFpzR-K_WqwF)=`X{GR_Pm zg`<dI8jS_1MqN9?-wP4PWx`ybc%NY4~p6UlGKYN%CN^?qDG3^{ZnQHNDE< znsgORs$1lUF3c z*N`vffKpY3(9@@rSdi@J<71M21p;6|WH3eeNyhZV@LMl1OZNgJL3>;(3b%4m>H5jx z53%+f$g+@lH*4KnPvzGjT8-yVpDsW~(cv%`4BfVH*ps<$s-~-Gq#Q<%iJ{mYK!yyZ z9bVxAcdb#kgiD_KeU1oQyaFO>GA*ipbR*!0EKxrg82AJ(?G^Xv=*5d=L%xq2TPu$n z(je?@o88HUL5%fNP`Ep&$dx2)@)oQy;4FN5S;2$SL zZn>^sKgnX!s2M8G9w(pvatq4s9p3-(lnph1{9Mj!LFY-ji2cfo>PEAS{qlYaYg zoaJjB!Mp3+nGNo}hbbvLkhU9x3KvqA=yd5~lx^SZ z)VOo0)fyQaWPrg@gwz4Lx;-CG7!Uj#K!2aY91^-8X2cIqmPAg>t8lRVJ-+iHJ-_q~ zpHlM7TL$gBbMX-GfK5R61sH{*b2Iql6_wM_k_3>=LzL22I7C`|#0`JsJh9sk`+SPQ zLcGKa0NbG@-8EZZasOGCXuI`dO`o8PKF+ntc^+O*UUzBXrZM*gh~69*>>MKRvJFh< zd!cUN@sO4yb67h1W&IQ1&i*gitvxq6KP8qiRIjBwoW`-;3>EBBPxJKh8vr>b91iY) zdEYced107#k=De{pQ_n*bVT>S_#{}J&~H~7Y5u9?g{EI~upLZ?$n~os_na3#h^g5; z{Z}PtXuyH-r@vk9g>BCd2P;3SNB8fqysUQ2@i`T!HsN=PX~w-w;-DXwx&ZrM;*;EI zlP1|x=`7@1E{5W5Y=7+E+7H?1iOc}#oSKazVDLW*a5il+xl4`k`|UJ3 zwd#ZhEEx)Q>zWmGJVVU}Q9ET_HhWj#Wz<>v>EUCfI$e?ZVxx?9!BO`Lt2P`&U*Ex1 zEQoAFM7+&>xHMsub3QO-Ow1QRlRDB81x-*}?BE_(jl3ly3*8MSe>xm`hMQWZ#^JL( z2|{e`)_d9iJ4>B`%pA%%bwT937X0)RG>cf#k;4(A19CHb<-0dwq^px$M8aJ|-1Vu4 z$BYkD!qmwCHSu{QgVefaTu~7I0qXz!>V#SC<9`^G)eL8Lt*lOj21z7iFo&VX_rac> z5NH*qlkffFBcIwSn!oQ8F;`mi2pFB+Asnbtwm|_(j}H!qHELl-hZlK|Z#hgBPn{r=(sc5_y7iKhS6RPoqY^N$V92@d#Qr*@Q zpS_|;&;6*_``?7etJ+B#7fYm^G_d_YLxx;U{5>Cg6Ma7%sShwcBJsz&|CCmkfyr%?&)Qr5TZGBi*ZHLYydFlm)W;S~emD2F@?E)4eP8osgJ#Le_yMAu$`* zCgeXsqgzMO=MpvJ{M`+;fl|ylGGq(BM8F>vGpO0z_S)iTs?hs*?otK4I-W9}* z*AjEXnhJpW$&Ix&(-~JnhxyY;%i%oA@YM44b;7qzdVD`6{t~fW*b#IZJiwdLY0+qW zuSK@VPUkU;&qIg8&jkqY@f{HOB!bn#sBbi5l?DGQpMUfKAZ1 z$|X>4H!94zLMFgA|n(HnaQG0WA!x zdJ};lcE`XBiG~Eq>7~E*)Ys}VtM7?dZ5J6Dq=(?1B}3I!pw?xd^Q{QmWY7JnMO+EI zuK#cfJfZM#mG`<-9e!zFk6rsK?@+6F@<5sE$lQfGus1W7{`OS%m@4T~X&tI<(T&kVwythzVI|z_M3lqy| zZVTQ2eYY&If=FXRjHsp@$%E^UjV)a?{G@A-pJB7kw+C!DWE7MzVW5LCK!(;Q#@s^* z)W!RaslysJ%Oa)4CujA;Uo6H=(7tnYjwuOF^kJF)2a7O(pC0V8}&}+naQxZ^YiW*pHoHOvh93eXEhG08C3sh#pTNw zauxgLETZ39JpWW`xR-3O(CZi&)ZWN@`}%b>_|e^Q9yZQ;x2U2gZg^jpj4;{U{Q9d5 z-@{VpL7qG)D*qV{$au(}kpk5{x_8mM?@I@~^PV*a$JPMJ2LL}{xfAa9IP7%#_2UrD z-9>Q&b6vg9t?7A6L;Jo=RKm10hnc(Y-r_~E=F2>M{(NS!y_u7H&*itb)R*6AG0d~# zC&|=W;T2&cH#42CGjlG&r#B4(e`&bZswLa#7C;6;t@~S8%~z!P@BzidqMBI4D9wf2 zJe2;+j(1h*zOuz@`0(!C?E-rXhPE^d9d_zjk6+g&nqQO=oC-R)$SMb-RVBO2+iri11KVo#wpr|( z(dOBn9%l^){Lc$uc{prV8#mb2Sq;Ze(rFXJO|lraEKu1*7x7n4rv3Za!v#H(eaiLi zCj6VRxb6u*UH>b|HvB9btNb&>tliz@XE!(2o+vMTeUR}q1Mq5uMn*oS43Ij#-t^Fo zMDcTE{)bPW?)N)(ECwkc8t6QLHjmFaId`N@0Qu4!pmPJm()wRNdj9_LrBy~kT|rLY zEYNwWVjnWtaQfwXf$1UId-azu(_GwVRL1HHRHw4&4vX9+m2j4n>uocb4lh1f&MZ*@d%`cbH~oc$aRb5V7!Cx=IIu7>Jm77LbJ5K9nlJ8OD%Psp=(x=6h{GH! zRR325G;?6k&$QOo5v3x*jmOqS(8^kta!ZrvtHK-owrYs*!*x6t$Nb7>z`Sx zN8ScYUh_5?pI+TI@ORIVOAemC_#E+)XpV3n3%|AzLv&rCygOA}=L3)#jT0CHxSl&A0oulQ-h9!xi{95eAw`QS&s zMTwAZbQ4~HnMsX1FYE)}`WR3{4BaT#uXdkgR{pzi(deCiU4!NZ2Fmy+aUsU8ElPc0 zcPv7$wF-mf8jEOziP7uEyl!7JqV_T4a@9&1nkFt#GBIP$)kSXkS8~9l<^^)Ar@%6U z0|5ce?CpzIorpSj&SJ&9vGcE<#du1a@u)5>?|%!}V8<*@v3KJ96w}^=^J?+3Pf5%z z_=SPFTMLGoonW$oo>TrN2!HKMmJ{B(ZU&Gtm#8K3y7Dd~CPhrl-f;0v=A@ZFhV9V> zfwlfU^uYLkxR!pOO^ggoTXH6u1kp;`@%iGpZ)Rbq66uRO`QWnJNt>KWRGZ!%hi&1Z z2Sdv$?@rE&^FYnyeD2^Z-M+=J+RvY5WaIcQTe#y2)*d5ewk;o-{z7GXQ`gwBz(a{C zj3mG#ED22bn+*;hI@FJ8!QXp~HPe0Q`rx!CISd`fvVXK>a zKGA;OamF&04HjeH=+wqlQy+>31;Aosh?1Gv%f#Q;Q;!4$?8WB(E^d8WLf8&`)A+Q! zQBdLD!@oJ8o2{$*rU`5Ej{SauX74HHcYoGRR@3-+szHx} z-`Yjjj!d_ERoC>G*>RqZ3}4~N+462hAO{2e{fTDjSP^B1E{@TY(0LXq2gdtZT>_+4qDTrPqc0ZKwCV|gSj;<$GV^{{M?G#S(Qp83Rw{Bf0Tz?q+KxI@%)9}6A!yhWI zX5~t6^v)p6tXY;1Dr>6O10C-$y<3J3^sp~It#+gF%Dj2!`6RYdXd|=XI!Z#8`tb4N z7G9A};FG+cC8<`VG{zlLJ|<%p6(9zY+h*PX#uo=ur*>p`jB>U=-2==Q(HJorJzsDkFw7#Q=aJL8%w<+ZbOLxto3O$MRD1;E zv1DM-YV{+>u8*pFxmg?-oDduPYe-ZntO>HR`_+9$Ih`wWY?i@$iMfsK5pA$+D=47; z^t*f7V=sKk?S~Kdc-u-tq|s-}A#pZ~EQuRBTW_l0w`G>$&&E5hh~TY?LhXJNE0Dqm zg4H$Wf;O9K=Nr$go?lVulo{YoqX-(B3ccG1LSq8-oENNI`Pf;fGyiWTKBL=|L$XHE#)Tm@+xF9=&j(WLIHUIUXu2XUSjVawmR%WpQ26(&4&#xUSfXs_ z64&*dTLchCI3s*e{qVl7dTiVI@Vs&38ZdwEz@bAzjkZp=JUnI5(5utNU*4ya)gdr_ zyvo-SzkLNGpA9`H&t7KRVBOfpKtEe_Yzcr2Tm6(-!LMFTHWBSrTRYj~{qc8)uX=~% z%&l$tZ16%_-^FXjSTI$Fgs|v#=mSH~Tz&?2^t*J3t}|=+psb^9r1$+pOCG6>U0Cm| zQtv6eS&9o8BQI=}UoALI+hYKD(nzspBSN^rNEW_iW-MN2%7tFk;dw}unB6oe?19y$? zi(`uBC2Q{Kx^ExqbkF<0sCw_Xp7;O%zr(Tjo=IhtopltlA~H*oB%_QZj$}m1OlfZ; z(xOlaA(GudC?g7?s3ajt`+L26zd!Ha<@e{osn_fId_3;scE8A=2F%r8NA#YlG-0O>oxlkY8u(43)m?9$Hf2GL_Kp*u zO;62<*Pc*)>U?*O89nL&m>oCaw2Ha1t%sBSnU{0tlf^*`dS^KytoaT=Sh_wK*C}q? z&90&_LzJ_|Js`m7y*X102Q1LWEcLucSpA?wiHcqa!ml-J~l#f*pkO>h^ zjENngaIbvA!QW%~Kp%K{FnWEg#@d%NnS6G3k#BL=|F%^I>U1wRS<}Rr;U(g!xavFh zhKD~n_tDSa*vaxj$IS@#84|uD@gJhhfQwL@UTbPGbIu$ml4#P-+UCgPL>5A{g$L+_ z8i3KuFhZ?RCivxRo<+99h^{H?1sKgPT=A;`PigM)ajXnk8TBe5sQ-{Q)S)yTO(>b1 z_U@f>ILX+PUaCQyu^U@N-!T-J$k^dO$#m6!lBvH=_QqanmA~6|88vay+l7`X@%v2g zkW14{Kn{e5rqZX+-;8smuk#vE#PN}U0aGFa0S-;sRD;^ULx;p8nl%273GM!hK*KO> z-0q+hf?gox1SmTCH+DKmo@cm?J8}aBV7|X$8_EKv4ALtgo;kvOVaU-5ir*DjX9ES1 zK0uabblav$n_hQ$HKHu7!5}bqu))o#*Nt|0ZdyM1OyB*6o<*NOe*jj#!j5;bext$Y z4>C0mYkK5~eJU=6YnH~HE}g=>Nft2Es5ZCqMIx~h#ey(&kB_t4BkVPhw>24|_qKWt zj8q2-I9=%6e#VF`o!%{uPNWGH=nA&22=gd^TT=wBg zGo3#VOz%BOMv4ZpOveQ) zA9o=iiHet(ZM?Ed zu1#5nPFXTpSC=u`z4j|=TYrnap+0lV>HRCMh>C*eySlo*&Z_H|xdSFXdWLsJMV0A+ zOVmy5taMIa-nVeWU}_M)+ixUAS3D+n#D%sAaH0qeaSJ_tZm3DYo+pn>I+&EGo~cNl z+RvmyKWULd_X7#@F0WsLaMPTAP}W4zBoC<=4ZP5jgAJc@+E;7;@Wjo76tk)V;hpf} z?dxi~Va8^vtK0yy>*h>qpf0->tL1uq)J#73^^`^2r`F{muTL`;5+t57*Yx^!|Kc(G z+V;vuivi8L6Ryt#<6gycpQ z_-Od_?qzExd|5jARU50^r16aPPkU*aOm-ed-?1D46o~D@={pX-4IEHf)uhqyw>LbY znF_lf2AaO+OIH`1wYGFi*_!0-nj37(j9uyNTcW@ud@tlAaBTI1r?nIP=s+wdF87K{<@9n0%V`ta4~Fmnieg-`ld9imPf zu7JYYaZ@#!-gw%y{)!rLsF!zAP3^XCh`mV9%kDr7kO zUaPTeGCE5B%hI?X9a@?9;X_viVtT(jhMC?Mj}_$S4?~~Nh?@O05R^`w#LrXwcbjmk1?-Y;HPkjdF7xrcL`NDB*=Bvwyzmh~&CsW9hKX z0WDYXXX{XR?5~*Nd;KO7g_m%qe!s~LyOOdIfY3}3RRv>2rdj&Lo`v%0dGFU8>$S7= z@6R?E98qX~dZm8$n4v|#y+W-NEN9#w{Ih$&+7Xqq2N>{cV9n7Eh-7<0%Y#YM=Yq+^ zcHxI9G-jGB9Eyz{YCg-x{X=o_1AgYrxpRjmTGO{f{9Oftd*jyPMY>YtdoFVD-D(IUfG; zYcf6@eLOm992=QrINm8UU}UXE$rKHgvm-tg6r6f8x|#C6fq;iZpEv=k6eEl?-Imx# z`*$-3$@Tqf8Qs(>H;n*HHlWK5O|9IJe0rMVyw2e0=5)EHDZTf3=`APz%p&|f)tnoW zr8v^VaVS>a%%!_Ls%Ss?cPTF14xMDo(pa^Lg69!l0$8ke_74QApxGy+^TT~YT=j!N?V4jBQaM%QGqJ)_!zE` zThoGFfWt-!PB7pMP+}Zs_X34kOqgE_fdpMYcvu6QZ-GKo`Y7Z9c(t%iSe5nkq5YZq zh^Yl{)Zg-T4`J1^7|lkOzVpO{Yu7G-<$kZKv9|maO-dM;E%~5cDL1*F^3Pm4@|8ek z`?K14-CxNYe8>*!;;s?x*VaC|TsO_cu*CyiTyh%T#Q%=CUiX-S{m|8`+ux6}HdWu? zKD|6(SaGyafbe?VU))t^5~D47yE|%rYh>x?&q*!#)hzCpcju+W7A6(m$?xy4qmenw z=gB=A-P?*+)>2{Y#t-{mXM0VX`bn$kO2DwoAw17G;n^zgZ7Qbvavvcmnd(-040^2b zDKz+W;gPY=4*bCBagu*culbXmEkJ~F&t6aNwCJouxU-d6^HlS}n$psAzsz*&fx4ckP-gpfC`bX8NS2?~g;$qRjmQsL%m9v$A-^|9wTtA>`patH4Dd?b?{9DBR< z=oz(wZ2?}@5TSkTZZ?=`<+WC>Yf7j^sn_*U9Spsv={Rc}D1d#qS(feD*s z`CmjPI`HBW%S)R?2XlHs3lZxQI1~`>Uih|i(fZQN%xBN;vLsYNf%+Lc^VIwI#gc}v z(yz?);O7H+nM^#zh>UgUF|tH86h(rKbwlYaK0hDG%#kkg!_ge*B|p<2BhLT_q#$Y_ ze2q{{$SC+s-<$8NsYHa(P+{DTU$fR*C)!sU#Efcu^M-_JUHC+(5)9L}|G_Es89&9C z{|U~J*CK4uS5RqATDUN_;h;yYT}K!9dIQj zsE6Oz#7_f%kii7!x8cWTR+rj!^I1EvNs}fJY;hMN5HsrRjeY?qM}=K7=7*Th#Hfh^ zaNII#aD`o%*zMMEqPgy zdLL1K5np;jB394uxz4i6Jo`XZU`)&qTzopdKn(D25zhtd9`V{u@c41;e6K*ju$CwO zU5b%hYlSCpI@VZPHnXYg5!rq7#6_}(p1MzmfuDReop0?sbjX0l`smZR{bpN1yAp}0 zVQ6!%kib@VYpT3b7QdnEY6JB0QA^JyTyca>XlcMJ^ZGyXN{f9eO)F3ks6we=$y}~Y#OOeaaqu!>EZ`-ls-&BcE2mTcC3N_c9 zI!aJ>K8v#}yNWs!B20DFMw%dSv-nrRpA*`hy24G32|2xAHDPn4`sN`Sq`FI4S{v?T>HS zWq^U8Ru8wst!;{4BTuWbz85SC(cnN5%GbJIZ(f>oC-h48=v}!j_BcvbU4_vx6kZAiI$ zX|Ab6R2KEH+_b*g)8~)lY&f;g$kTC~Gw~pS22{nDEphBwqW(wRq2;o6}tlthx*@Pz-mR9!^vjAGaoSN$0WuU4C+zNrg~pI&_*sb74?9Pj znlgTi4zu~qJ`odlHxNap;62nFMfsW|48o_kOWaX0=X^on8GI941AjBD>#^?>_xZW$ z%@aCy>8Op{5Zn~|-8Y+asf<(K8}b71t?0>^vYe@$uw;E{f(8+pg&WQ3A0|iW`S(eS zh~23+g3@2j_*`#liayr;QCQG*`&{x4{Qi+4m4r8!_I)!Q>ho@kV~{}R1gyUl@cn?g za+`HB5q54qxk{Ffs_I=Xd$_yT=J!jx+9##%Kyj<0dw1_nH@G(7y3>oLoeNy<{ z*ni+a*tYKpy*j_inMSD(A7ebn@vGJioxCZ?Of~y8U>!9a-)I?9Iz%V`{eN6E4 zO67?+MopY!5wN&u)S#?Ynd*zq_t{n9yRw_PThT&%jLcD21AgckTxctxs!|rIe)!u+~UH z^r*Y8Y#*#@Gp2K6wb%f|72^YpZr~8pV$SVws4=aGFf($VT$=F7A+mzTtIx55`(4d# zFyn3XuC~>?k9}gZ8sCpFdh~U&d4ytpKsv(2Eiwn@;wfV5-jBUHu3%hFe zOW7P{vmkEB|9k;dE^Jy%*?VZ5-EdN9)Zx5%1d1)Y4c95_8dJZ?qu@=^QaM0_M?N;5 zgU+}4wPt!-Y=+lajPg{Dt&K3;_VwPWmfv6cxx1(L&sskG&N8*yQ?Ea7)%^93=B@a1 zBbm!34E1jp^U;56)Vn|Wp> zz8!4N_>Nf7^hSZ(w=p%xgOZm!$l=xt91^{#Y+`fEvRyjQ&tHu+uS^UWepwj;NX*K^ zFET%k(Q|M-AM~WWr@8lLU9+s$-VG{3G|jE8)3XwXCu@5fSqjK_>HovtdQL?*OWv+x zU}lP`-o&I$mo|G3?w|j&ZqAO!v?_Dfv`&~g_Eh+@O|g21ZZu9cAEN5%qPg1KyrIhd ze--;harg2cY|>hkHngINPtF#7Vn|wYCKJn!1C7L7$YHwQAsdWPB_# z3oq%|xYg4*J$=<5`N@#Pl*V^X%vCGyuohg`; zp}3j_vOIw4xKvfCjoaHY+{(Xg_ucE(8sce zUALu~TdtsOJoYh9fIiT7VbzJ793NFMRpg_K%ewZxF(I>V8Zpo3tUF8DW?cOi)U#U2 zp+?cADfnpRrMF(6|2~wt))@>2N2cN$JO5uhmH|2tvWkr8mp9heIb>*DT;-hN{6lZf zBJF-Ei$f;wS5SbHQJ-J0J#Kx3(V30-aE#pWwkHK;t%Y~g+4ESIv?neALS8UBtfSQb zQ8Wg?$j5KK>$1$kEiUM^X~J+ma3huWihWaTOlB4p2c5ojv0K3ftqFe@UT&P~^3Z1B zb*GQnv$P;IG*K{&GMM^r`{b?<90wRiD!_&21NmfCCcb)ZL~|e_I^l^D`b6opQZ`p`_oSMFvByHIfgl0WF>vWyrj? zqhjAA&5N9;oE96n!Y!`m1a2A-aoc5HQhug5&SUiu zhM_26ZfCD{`#9_H@Ri@FAD|gJd-y0X@$8oEl?TV0NcjzBBYv7Q%EtHVQg1c0b>50C zfbYnkpl#+1QaZ)nZ^R~2P>BqTNLTLXC2y~C2Jc*ig&7()vpk9oiu9;|^-mkB%iM!L zma=fp<(I>=>NQi!zWyu)>IojClYZ!up8tUTyjxcfZ{;P5m+#MXRB!(Hdg^h5s#5;c z>QnKEI|e6bb=zAw;iJ)w2XQyjn#JtjJQUp@Sm^7(`_Am!&ChbNn7VM3O4j06zVnr+ zG5j`UwR-G{mVQ5W!OkAa>QfHoG*OHFmDVibd0ID(eYu;aZR=SVJ2=7ZPL)jK#@YXF zORD3*UevrCx^~f$@>+YdnRYo(C|ME$R+`LQ-0&SYWyN0moAcIYx#e4=D@OgRbYukG z!29^&UCo2lOfIU4+-~D*lboFsPT6cvcTLLj@wJh1tP|2TNFXuw-OPRF|Hy8Xs1%@~ z>9*Q3zN05F5Inqw3JlZx+AR*Ph#0=2Y3&Z0O3Iv(jx*Ie4mIn^gP)xB=*jbHU8VR* zN8EnpmhCA%^5r_|4-OgZ8vnDcyvx+fH3Hjvl?Ih0u6i(gv5lSMsq{|gFJJC*WXjjf z7pg{|6BhP;xb#8O(&GB80MjZrHzcwcpUq0$euo3`>XDtFPe|#3!XqIb5jU%gJA`+i zIdH-0eINs>Gc2$Tsai@$iWzHgE@2Vdbxl?~bSZ5fxR6tR26;+@cN{QCo@S!Rnl3h6G@< zr!G9q7Mck(S*awiUpkY%r5Dm!xqLJ%{L>VKqis8M*h}G9WWVFF3(NsHn@u)hB-nZ#Ge=!B#YQ+_Y#TEA53*hH4Zy z;K;4{#8hhU85EKyn<{+tm~RQDAPzE&o~FML*EC)wUQdG-^{^>+{P}&WJ%a&u=9QJ~ z{tbP);}BD0mV|-`1bMDP*-$O*NEc@|1eCaB&X4nNWjWO$qG@k{(WZJ~K zN$e?RRhZPF37++*v|9{4gD^3Pp^uL4ayN}d2>z6aBCqXYzXfR#Qb^zHYkW15jg!S(0C|n-@Zkow9i#Jq8k=;tUV8?P zb|{so_^HU?Yv_%d_DGl}$`X#K`)Ta>qyC6UWwyF|T+NVd#~ie`vBMLkuR7=a1cp zcHN|yP%`wd<2$^kd6@gQuPOz&`oQ;I^Yo;9q1vnl^eMvFvbBDhIB#w3kd(Suouq5AEr=eX8Aj{N?;t!4L-O{rfr@q`+>Xe`-M2U_t)SkGzM zsUAbBc526#=UVCCA8m`C)t(icq2|N(t1XP_Ie_2;gy!nu;}P?zt82_yn`@su{9avY z^V|#$De5jK80+N9uD*w%ScM`+#Q3b!ktqwUlx8@jyK2AqzlsrxJ>{4Eprac7G?{e6 z+cPt+*3?YCSG~Ocdgp}F1IJ+Uu{0;rI4<;DOE(QWOnCRj$B)9BqCE4svqRMDvyLai z>8FOZB@SU%?0eQ7_)uUa!UK`ly6{7->SpV2acwGc%MKEkkBzfyPciRx(Va)y9qw|# zMfbDQH3Nsc_bgafFlw<$K%4q>kD#}?{M9s8pVJpR@e4U`9qqm@_*#}V{7!XMz4!cJ zZ*QJ}h^Z&P=n;c_g9h<{pI^u8myacTRZOu>^GeA?*&ry6a76MeIZrKUd1QAT0lPZ^ z+uX_a*!J!*<+;A|>-`o(A)HEy@dQe2hW^X?2j}jehUtJ=ftuwVl&IKY=mvPQ8LHv8 zx>W~={0A82z!nWE%JcQ{QAkvp7|$xyM|0=2|7-%XiTByOQ*#t&eOrC!_HEoFGuGvhHX}c2mPa7iRGWXY zB_6`%*+aZ)x5OBofj!VNeTy+ee8U*iZe%G@ciW!7J``fVs4?cv^D;X8eC;Sve*smT|Jkhy!!Pj>Zih*9^ww)--^{cBJWB+>?j8NHOnU)>7`0^0y z?e7>S&wSCiw`W~{ckMb4aiyaW$Mi$pa;#0K4jmfO`7AFf4s%MK1Lp-SWaQXjQQV_y zgioc0C9!3%{-K?Tyix+I9|bUhj(U(`0Nc}aYcC!^HpqcNP(Gk>oP2Znjdm37MrW>j!Xy6CXaY=cJk$ z)nVZ92T3Se*1f*cP6#B7|Aqbl<`71vqz_FW>06k0H$m)vXd9NpZ;YH5vZrv2Kmf8G z1+(GZczaoFUuXRFqUPgJ&rPSV_WDmr9oslHUGvLBo3UD21FlM4-Cb&824Uj0l%Y?I zT?%8VBQ=vORZ;Hp@T1e{luW^FY8JM!Sh)BvNnE07vnyLAbR>m&S8XlDk5}#u(Q=e0 zD?pok+qrJ;j2SG*Yy)_)SICSIaku@*Z>GTN8%YRRHLv;ZBU6S=eQveO-gCctRKTpT zi`yUm7x07;IaPOgdrRDfDRIlsN6y|NHTPd+QC%PlAzTqQBsG9R?O{ZUy4V8-zHEy8 zufM1#0ILLF5x@zKL|sJXVwF59x$FEr9Aa!)$G*9D$tEN{X`iXpN`)gwD*-92l1@F# z%iZ-p>o1)A|8R7c0Rx1F4NE>WiBR1Np`S>_mUr_r-TH0J@i>IaVX#EtfVw>C>84Tg zDkmpQXnBkyph-+kN%I?RJ}trKqqzHV{q{KH3h2(2ROT@tCoAgw@xeO#wh0rCE~%5t z0y!Ai`&kX&f3-}vd5KNaALp(3DsD%(uS-M6gOL;2P(eziQEQ(~gp>t@F<5JkN80iw z1C|`islw#z&b*6j^u-Ho|B4iqnJruUD%>^Ul>*(6am~FIeCEq-R2OyM(s}X4k3j)XAt#A=kH6++Q?< zxzaEuL~@)!x{V&jCntpDCphSxcCf9?&c8TKCAK>9+Msc*T{{4X%3Xm3L^#pi-Jnq) zt26ULCa=j&y1t_LWt;DIgFmjD!XZgP8cKhlIULe61T!&e4-E?sbJa{{EZ@Ost3tx! zO}d}gy*{vZXi42MCaoP5_iOYM@z!m!*uJH)VXpC>;fbH7Dp{rdRn=|N(^SjXCX`4) z$BwZnwXarl^M^N?={EwcobvC#=gzgv{-W9-QR$>#?J$+w@I2)ibnVuy*@IhMeLZ0o zen3X|Z1Ik&mx1>mR5j5n&TZ3ki~@WT*_`JSuYYOXB4I%>-0&fFeJrn4U0}^}1fP<+ z>Xa)n8PW7xdBX79xDnC;bn15;gCphjQ@z#>>DxP3GsiA1U|Lj42r&~^fHq`tEC+jgu;@7zD|?n9o4$gz-c8BDJh^&k+(sQ{@JZ=aev%!r}x$KOZ}liv1YMh!(6iaMJ$3pW48g4GvrQ+8S6vv zUYns1X%L~8|Mlw}OePj-bD3(>ZrxJOik;Mhcc)4P-@Hwmz>A8SxH*J3Xw)1@;{UoONv1 z&ihnBTGW?IWem+gCE6~CH9N*Uc`71{aE5XE1_nNlE>#R)dB3d!epyG14%42`Qix;- zIud{0?tm2KrMbZjGbch?F|wH8cbGIkpNh;9NG+Ys3o_*`BP zWzaYJa@uR3DfPb7lpJ+o3gN+%6mFd=0vJp9RXX8cx~q(M^}Mr=4&+vT=N&aK^&!(d_(D zgzWc}F}qGmTHKel>JG=|KQI3SjXS(h&~#X`=wm;Fovj|kAO1>1VWhd&R_9EUX_7S&t+;Ng*{O!<)rMvFoh-MnW+?#cVUY`Ym&pC|DQ4 z7oWn6L;|eBMI1o$FAcxFE)K zQEArSEBjxIoB1gI2V{&WAfLZ?VGurtLQ`4gW3T#0Z8q<^1iUg8;OrT68!0^=p16{b zppQwsdcS_trdR95jCJ1Dv;HMK@6_z>8 zaD`p#w>N4%3pZ+vCDST1NvdMR{@+G$W`DLQ=>-g$!Rd=2)?{q7(P<5o_WAXT6b`Zu zb>qy6@iFywZ;u6ycc}7{&3&g0quMuW(nQkidb)scgQzu}bW*0;weS5eBxzr+UD=&} z@VII6$&ogtH~6J95b$8{ra|wxZ)a`!LO!H2Q>_gB;o*0yj!oCDZIyL<1yn5qZb%w# zH$WN#v|3lEav4(D`plvblHSc(W{5fyg zvJ-`4eCGXlt=;#z_Emdp8xvLU>8}_Un04^HQ}2Ce%%Hx!N^UD=GrH_g>-OgQj)g-@ z%o1$&v*;7gl;Vi%ZuyryYP$w!`P7g0+p;8&#gVEbo6J8>cWGm58%}UbTbmR&gf200 zNZ)^~z7`JbQ4#V=2um2s6s~;JKKan_snezzFe|l$f{)A^iX4T1CD% zQ9qo5$e=7c!pF}~hnR8_h#AYA(oU2697YLJf8WhIpYYb|%v zORh{M1{j?^WcEUplc!1_gQ?@ueCr~Uor%E?JFm_;W>xz$Ka=@H_U12mgSr-~eNjy< zJc@f%UjwMP@O}DeLG3*F?2%Ade8%4} zfamT?Hx%`}l{WpF@Prt(sIwXjNF#HJp&0mAAymHLaGZqo1i5S>WyeU0zi6BPWzbAT z!#TtvJl0z}#!%N5CDncV;Nm$n-1y4B%1aV#rk)w6qr;sKAtYLv&0W7`4rMX(r5j_C}QCOm) zK=p64WlKQfF*2gkcBoyI)z!Wx(I;=-ylMN-fYg;`+g>({13TimIoe>H@cJ9qt_vomc99W$rbZgunU=tui(a&Fn~K96JnCMt%* zB~?#yV%Qvk5+uBO`q*1O3#?^ZF{Q!dZy)yJ+1XNnoZ40S>%%MUBZX5rLgG4Wr0;q<(cU-akn! zo+S49)rJ0&mEb|CD=Sa3?GtUec;?D!F?sez1qUuFf8K0)baC3KLG7|u*;ibJsUeK5(Sp2-BHs=Qb-xnLYp>3uZWOYbX^$^M;K_dJ;w=o}RQJ*tc%X zgs)S$**@;>vrl$$UHKCw5D8Y@$2mKUT<}e(uDLnTGkS2ZFAjzR(lW}Ck>ekVw z2|m2m$tZkI@uf2)VPUh^v3vIcXYRe}X8r?X(^<4IVWjNT&pnrzdG_s)cFp6lbI%{2 zQnV(DwkMpN=@S+f_NC%pH}hGR=xQbC!aC>|?l2{a>9eDw{S^qFq}zm^!53D$rQM-| zgFoP&86DMPC(a?m9yB^Mq2G4Xv>`V*t_++VY>p3cFRalS zH)L%dFW17-at24&*FJ8opbl|=sv3zMjQdjYmZip$E-&hlHQ?f@qnmX5cs>mM)7{PG zoAxKOoi@9E_3ir6$t`oau4z1Zc0Qp9+%X^R?8vb z4%W%z-nMyqJoWn*$e>b0v7ztDjvP0QR?7^B|DP{FrQY=ECzxLNke$r3pJpW)ZfP0f zn9KZ8z81&*XXabB?xb=T1lq_nn`WEPIxfa)@0VY>6OuQ(f2A7Piz7`T_3(DfQXZNV z4&eCwhq-~-246+ZXXS@A?p9QArqbZX(tGtAw6}euzyF>GZdpkGa*8CJvC(;YWtN@A zwAQb-&3b4GR^|YZOQ2iSoXO*nzN}k6*mmgY57kku;Syq0y2_zE-Soqox>?&s6F3cDbH7&5SLQ*>eV zx^-vE&1d?l?SAs)Nzd{16pSNdS2L4eL;2{j^DUw`@puAqJI8=0dZ*)6uQyxZCX93} zkPYW=>WkLyU>k1=Pj?tRw`1diGpj-#ihBvonONbly5)4>=!IvEcSADGqeTF@jJGJs zUu9qUWOcB^$;!mZ`EwRtBLc;=@oClJvXX)TB=^(5#n;{yqEgu1n_ zbqfV-u03ID-opJJT*5cJmFCY0mf>|{xBo{chZurxy#3weWRlzM-fNxtEfLjMC+=?f zpxl~coFIr_L2W^-AEecp9I7C&1V2N}unc3(6p=~zJUV>e_4PAH&8TPqDc`Tf z^h6d~UomHisLoDK{^Xk?;y;@2VEd)5N6lV!CE(fd*Tr!njY8ildl$v_7bUsG($tbPq}EFTjq=!F=8(vjqw$bQzNWlS@UI?6!@$5qT_^ze!psO?{861 z7nt7FSCQ@#ja(=tiug&fAh-=)`v*Pz3(V7YB^Lj7OI6;m^K8S58!>LP1+)@dcJ|Tm zkqW1~X{?&Z!IN4~Hg(8dMI`exJ1In%2@M4s=B$fZlo_isC zZOG0(VWX`7Oj3VF5Dw(+qhmTqV|N=|lDjz>+LVs&1D~EK(muR?A(yzUyLO)g|4n&A zsTl47*MGxmSNJx@2{sX*D$pvaD zUs*OxA!&66v&zGAW(r#zPeDT;4iywf0l`iA6NS zkr=O*vtCi#II$P*1QnLdTlF|mpY~0Y~z1x`YuV>=?gX$T!iR_ZZiS@iXc-qgV2w#8RRr>?KBH8;&F zOeUp?h8j3{`di0{O0a|*)4^x$Uc)D~G6CK8?o>07Cc~AR2`rW&C zBAS$KaWeP*^tM@*#hPkmo3|&QI=>zAZ0#sH@l5dEGYsCoXzOAQAK;~MR-IaQ+e5p$ zg8!5~*XybdJpBJ<;3rk5g2adb5r77kfMiD5iAg!!NzrxXzTvVQkX_fzaEl)H^63xu zugo($=;Gp?Ul}jv-7VgiaH(sN)UJJULlVj$(xQt`Ak>4A^upEO+Qs z**PNCFkl`ZiISybj~)Xp7b`I!RB~W4;S;ZZfSI75V+vZ#0cMF~W(SSY_bFI-koluv zjjckRQfC>(--9$Z!LEku37$0KPC@%cuK(fhCbztUmN)IuBM+#VmH@RK;X`O;_NTe? z4)UO9DpjTA=t@7{^2Ne4w2jpU9+bY3V0hVp`N3)FF} z`F_AC#c8Vd1G~;sx)zKGEzR;@YW4E9&nD|%As_?b#@%u2#>EB;v&$Zk`*l)QKqTJH zF|*mcxv#=AMmkq_RKyfc5B8c_8+Z(4&D-DKKffe3;iN{s$#8em;yC{85$X({ygq=e zMRl*`nUKwz1C7r7ku*2VukQDhs_a!8-dx4^WL5CPV-I8(1{2^;Z*Dk>AzmfKMAlG}jz6M$C~Z@qP3nR1^}bDCtxX8=a4f3*pikaJM4KP3YAB;n4Jv z-ccGe3=Sf=K~E4$hg5Dw5|Ce1Gy^H{2}F=jsHdXf7e7ONvzFT?8cHZN0vt5&sODwa zm>+NR@4vk{&}*3y0vme>xJd8~W2~47O1g%4C_fNRc{oQiQ#xHR2r!R<>?wNjeyO*{ z$rhZbpKrG2>O*5(gYCKBp+jmTJ%f^mXl8xyrf>4rEj3~bcD$$fKwgjp<8h6bB|=*5 z&E2|PBwI+`JJ>AIIJU&*O~_)E{pAee59Rk`ZjO=T2U5~F0qx(y`7{x25X&6zY%Me^T;~)aY4Mz zwEWQ*Sw=E|np+T_$=R!&K5}UV85e?kN$!oMYdS|{#Uy_6_?18J0QGbxWU;iDFAtHO z20w_;0U_`U3Ytav&>ui9JI?&T+nm6s+oD?7^xE{)x#wj8l>|OuvKNHU%sz`{ZXY*L z2+C*%hTkc$!O!v5|7{tazvBSCFRAiV4^FL^1{K9yCm*tbDH|l89Dv&AlKGly1IwSU zZk!@+A(X}T!2^el^2}97xVWdGG(hrpqY;hCy5!Qbxc1KG*>53d*7R%r6 zq+*p>5~h}Gs9?5R=d``luy11h)TA35USF9+`E-(^-vEa*ua-{lfbR|C*DjC%Xt#ZP z^K_L1B}R{Ojs;z?oY}g-^r?8V5Z|JB#6N!)&Cl4F`HHStFevW-&z*COTjzufQD1(o zUBVI_U0qVZu~ZC4*}F5K&lK=ZIj}O0pvB`Jsu%C*`=j>Dy?HA>eNlTqD$Vlsqgk-D z_`L>D#70^LPMbQ_#pB-j6X=!uL2qeEE+_mpff;lE%kqR@TwAecCHRR26&nu@H-ia9 zbM^!th14HDqtWo}q0V_Pt=RL^{(Y>~+&S8kr%4`R1jI$!zbIO+?5x$IQ(gE%InoY8B3!4nF=HUZ6G5QDr9+aIKWZb3-{ERzr@h;v!{wybowaoIOCt4sMaPE37IK;Sk3N zi!pb12^R^|GaZc&#npvxquEHduNEEK=t=F%6cIY=t_8hK^AIc9J zWG*T@e!B2<#$Z6gKm7gqOsq~yrq`6(z{A8mc>_Y#LJ%Vx0f8#Q=%suv_AfY+?1gdc z3vXVzsNw?E*z_2XU5v12U)V`oQ-5O6aCw z0U`gszb!gH0wtGsIeW{YOWmQug{dWtD4IYrr~;poPFV%+E-)o~A132OCqJ`Or-;g` zJV%H;u1vEjp;jHbhd>Y(5)eUE{!-e|^ejuwr^6#0)~{L>P@Ky^&K%Xhu$t=YDkcE^ z{l#fs^k_=J5!3%A(l%*PTTm+Z6qXJhi#*=0>rIKo!SZv4f>D+XdNIR+++bxYuQ= zy|Pwzf1T2Q3Qq?l;fN`PJpUWWMx&w^N|~ejX4Q`?og=o|;{8G^CjF`CK7>$-ge){n zqhS};Zi&MV_d@y>F50}rZ5u-l>v&FhrEjt{_F|%v&*FMT+9TmBk)Fj;S`Mbo$NNOU zzXb@R1%H>9*N`tP+c|l2lSjCGo#6kP-t+7P+7j8z`>wRK4d@LVe$TAc`d)OTq0C>@ z$Zbd-BC|HmvsDW0)VIP>rP>*05sRC9a`RF^aE8(KT)*_#FOP%4UA{|Jl%oWF@&rGi z@O8q451%(C{9Nf|TAdm<_r>ayHNSTR%nu0iSsZ;DscfD}oFVdiN`CGF(w|-|Fj{xkEOmVy-LO;r8JqO*e!sd8dH=8YgG*X%4}t zIN4_7)~#8^CJSx44c$EHk$Ftv#s@6j7C{J{Jvv)e`#G&ZeGj_3OEZhfo;pmc`I{bZ zbx2+JFt2u4iA(p#@Dp0%KhKdD^PotR_|tE*SGlRr1nd!FAp&L$oBk*-<5y0vHc+Xm zkPnREj@WvURZj+vo;uJN9v0i1>OMh1H;L}RpKylX;Dl~SNh2!@syLfnrwQ=04 z^zOte(Fg<4b@Z9~bIZVjk~xoFomaj3_&4yx<9DAwH)ql*+W?qPPvOb!Uv)o~0$J80 z$xUUwxNamUdDzJy=mC z({#G*KVoIuj7trBKRrfluley{sLU(HFS5S2)baLt0d`;uPh?uk?uyR$hRm9#gS;oy zJl}&RVgU@J5fFieXENHO1s7%>uRgTlnWT?FTggUWEkN>h>MhjIw|IjJ*t6 zIbJ8)b-+-LU_25V(V-8TRnT_~KV@_#4vm5A(~^D4QbK|Dp5Q(D3~{@8C?-G9#K)OD z(?|%afL^=NV2bdJqaQ{|6`H5vBD)cIBJ8S9!6W87nyU}kZz7MJ_EM>uW=5PDDpHQ~5$d)A0yWjlD4?AM}ZWi@+uiY#<6 zI<~eK(KXaLn*6$$(ywn{2cHyFI8Vu|lX9 zJ>Pav^3M-^!DR8iF%2d9a@;@T>TG?`Wl}^TjnWF4U8o5 z5WDehzh77LOxb{qUfqR$Hk7haiX%?+wq700O@!P;d9feD=^e}pu(O;**Em&B0CK1= zR0pv{lx4_BgrzL~S&}2BtXbRBm6BV|*m-zsMF{s1QnM`3W;4hDEF*Wr9=-+AN>vw{ z7iYhUaPu3^i>P!-EmWpPFVoGs`W|Jk>H5{5Cut;TZGX8_Mij z#(%N1S02u0GQni&z|f@M4ftC5I|_#-pJ%jxfcdj5+e0n#sZ4G7NF+rPzhscXS=qO0 z5p@kSq&6@lWQ)gAhjRZX;~svK-$JmZaA*uG&=rDLC*{&nZRZg;T@Uy&NX1iV^OMFC3gg-s!CVh+gBck-l>6S{M_L zKL-W0HY4u*&u{Oih$AH$Hg9wn|m)MC6DQ_c%cdS4D4wxQ$Ru(7rnn$uctl-oz>1X z`I2+F4FjZ`V7BrV96lPH<&p@^78LyoTlk>9P1W`BN1_D|*&4UN^G5gT`O2z1)rQrk<*>7# z5>p+p+ct9BnXQ-uorS8tXUxxBtV2@u*RdjxpvP^msGd7xtR>UHabjtB+eWz10A%+l zeCC}o8oXT7kAyZte28T}2=+vdG@LiDt!OmyQ8)oMa-_6}Nvn{7HmCnjo95J)w}@(A z^aGgDyGzFlomL78j=(^zUgm>ZkWu%r`5n2?K}bHb(?|ZAgEWuinekmXc`!6(7zv^! z?uG2Vdx9iI44I)x<@cx^7U0R*X)bBt^5uVELNp-O%9x4AIF_f&P&lKN8g(uIlyDeFwy6W5vkf2xH=e*fUr<=4@o&HVv6 z+%kLmgCE}u5R1wNRXF*hf^)L7ZEmFh@CR|1sqhte(X!f?YZuC!2{qT~*Nl2j2DUPQ zqb&6Vo)8Bb{wmoxX)|r5$O{1{$#i$nDu{=us7M%>|0z*ZRy3Ef zt~BtBJ|@vU3ZdTcwBZcfK_@37>5;SoO{Lk=rAuEYIrL!0NUom74}XH<5rZP(#48o&P!V*aaGlIWt9R$f+lnTHU!QJ7sY!YlH@1 zGWSUq$J?{Xl^5Gk_D)mEm;<*8g+MATc@LSH2DT%UZAwTIvQL|ox{quly)_->u|i`v zjfMheNarVt2w8%&>C>z~*vY+))A22U>n%DJN+R)tvi7wRUvPltOv1mA#*9T_q6SCC1B6VbQY# zC4DMxb?AlcE(QN-+YbN8-Q)!q4+}3ii;{T+9aNA_KC(@nE4s&5BVa7Os1zYDVwSW3 z!=1&}Y4c>a-3&kq*O*8b1$HaWtzs<23HVsNa1rc@Ev@9UlORd<6P8h4pMTR?_Nh`4 zOU*zZvWu}i7^Rym4r8z}j6zhAaY7S0A9$DYDZhzZuC{hBDO5OWR1j?zm6Q%IiBt<4 zyT!o*JVADG9$?^kg8IBFHDbCH!0_Hcm0fPs*Y)T$z_6|2i~zA(A?yeZ#$>!%v{A!} zF_Rx-Hwbx zR~}DI=U-Y~g0Q3sR~1jAy8iz(eq1_gU(C1C-T#pX1kC5&-C~w6i+wS|52M@_tb;>Z zk(SiMd{(`4QwhoxjdFHm5i>polWClWExW0(NKtncBjbE-ir_z#gtCU#c=6&e7zAsW zs6erE0rYnDNbTx7j{qm1PS7(sP^4NcJY3*+hf4dy0EuLvlVX8BZuf~3y`@r?7M#st zViHG46p@R4m|F7B-gIG9TX%^;e{sjTEwZFej3lVX`)c)i5W)YCeT4#vUDmZ>I6;9R zx=huQ%w`k=ZQE%l`Av>60Fdp-F+|JKT)KCVg^_EXOx*PTHE$>bd=%uB`svHN7T5dY z;${WSvX$gwU|Z^PWi1~Sn%F#)EZeFbzr5LMYPkAseSH^a=SKbmmNgvY9NMwR)VAR+ zkuQ6@oU~jqE7!tzw&_1hecwc?UrTs8D^&lfo4@hAc2hg*Ol)L0ar=C~0Rv`hJ*=rq zEvb1iHf{aE?P|dVc^k(+TE1t~+bOFanHFd*j5-~9_N*H*1zY$?>`)UEgSZl6N+N#{ z6&1qvDqIw^b8_mx#l^?RXFPox1_+M3^9bG+o2wc6-3I^XC2N4xh<##%8 z(%L%W>eVBxPD%e2_^ZA)4p9k9y32gW;gd)zWHsDx-xU@XwkeL)6%L2<=hzypjXy$i z$2m5I6t{8HCUbBKFp03(*jU?f%5`3d0?u=;7$kB(y5M!PobX6@qpmo+sq)_w-sXwk zf^TpSd-bhv?Q|by?4e6PPoRUehI+RZb#>^h>3wwmnXj*Zi|hJ`x|;8~9JmOv`yu|x z=9ezd_gzt9FY-ees;}6dh&v?rqbzggP`oVq7t-Tt;WrYv8sOd}&zkj%>1!6*L$bnwuK)gC|Zv{jt5Y10U~SxWZb{(AN5 z6}Pi2Rn=3_{zW5AZS62H1pWHKw6Yx_6R?)B)W|NZFi}&SYx{3{diuJYOYZfR!S%{e zvWRNE?DE@n9%8Ci8#(o|Pe4F2&r$|BOoiE=_3i$^Sau9V+K${9$imid&*smS`*qy0 z&d$uCd;!IktT zq%Xk|3%pX5&%yw3;gn5|;gJN58^koFr_3ZCPCb)BnS*$3RTdH)U{vRLG>9HAF`OT4-Mz|Cv=eL)yU6gnA=$Y8q0_4!2=w1O3M8wSZJ83&eS*O2WV4yAw zl^~N+UFKIW zIWxerc|#p5Tj2FPlCpk*R(2`b<>7_L+B1Q3=8pURH_*n_vt!kF#^bOnmzMhPFf%97 zj!@w0rBppX=<524mJQNnA5G0}s3u^)3f4`#&VNLxHdp={%FY(r13kteP<6vjpKcBc z(aZkZB-v;*A~(%4s=idu?8ZC)g=X*NDZ36$5?G=_YvHN+ix)rOw4|n{$|?i__ll+~ zzMyah9(+fAK^DwAu2f2_u*XH=h{wZY>DM1EWvOA04T*C5J-~_N0O5Lft$#}UipQjE zJ0@ZY2v%Yfe>C5a_v{ z;?AAxJ#3g4agi2ARncjG+t7vyvf!)Y>qoF{X59u$mp+cv4}%7HkLM2%C{`r4vy|^D z`T6>W6?t{(&|%7wC5ntS>A5r*-Se`Fo}UTK)Y#v4^6UNtXQo5c0QYFe)CUg4L-Gi$ zUxFelH;y`T!5Ntw8G-P6Fw=h4Djy5~H?(_^NL^6wjZ7G*mK>laY zm|LFpY6*9$UHkTXSd0!SywtGakg;cylc$lzc3v_xGBPkTdql}jHQZP{VV^z2CtVkl z(UOu9$KSuRv$G3}iZX!5f0mbbqZ7uwQu5Q=lYZL`cJLnSFgJ0wNQP-LDdM1~>_Xi|oZNk~W(k+yA2 zrj*K1NsG*M|E9oB!2-L#L)}SpP7tfkf;nVY}%p)dq8(^paj7pdMxX;F@2?c zPpn&F7Qo>vk3y)TsQh557|fCwfL%6(R;UM7wdI|-Ef^|VljoK}MwoGM=OW~JRlj*B zg-Q!0t@pPp-xgl>U&HP4V+6AVRjwzr>1Zpf5P|Ve#RjU#Q^ zw!OozJDi?F-i%0H>cK7zsp`UVcUe%vIMKlzTl>qF3R7VeXpYgN1F6LhxW#-vKxe>1 z0N_u2eo?SJU@@(^SG=h{QtlQmTwrV4Kg9D_KLV*T19%OpzedLV`f`raT%*S%X9Y>7 znOC;apK_StNx>fF6UZ0?N?JRlkv(ND07IP3u`h6h8M-a&FOD5MCW;S*iVdUJ&_|{f z+%#_L@a`{NU1_`#cxN&1>l+us>lgr~9wRV2p__66r zR&u3McU2Wfm)yio3l(5cndKxpTfqwBooh~9xpIKx&uDx#PPl7cz-$+qJb68{$t{~e zcbT`{hhiP+O`rqmzV)nLO??^etV;@?Nu8fqSM62j#}L_I&tEIyqx)9o+zJ$wP*ZL$ zD8bsgw^waNh-=Zcm!GqvZ#+%+ZgYGN=Sp%iR6AMrfaD?e3u*Q^_eK&znn8t3543w1 z+XKontoQHGU%%W8e|_#PX=#7YR>=n?_0jE>fC~rT&1Ed9_$W^~#~4ivn^yK>wp9f4IS93L zDKEW#7g}{e&gQpM3^;H=INwZ47D`Q_CjeW{U!p!%l$Xn|ji0u!s_N#9j9K*ah&qC> zMw08|qhX@{?A5FB&`$Ctg9jhjv!|u_WT6LeU@S$uYuQb2V!@Fd?R0#VU#zNAP}ubB zW2@9)401}m>Y{Z!*IXig5@g5ozX*Hv~&khi15lcHu9 z&#pz~uyiZvOMNT5F65J7&ipcRDI1ehh@ z${bFs9JDgyp5+D-K2d>_?%mtU>rU}qrdoV}urJfr`S;;$f0quxh=~1+ZW5d&TA#oF z^zh>I>{`w?<*Gpo3!0-6bf~RyWzB}e+O_czHq)1?I;iSjCwj8TEDckEgjT*-*0E9g zu-kPrJ|iTD!BJQF_1-64zlz|_6(_vQf*FcJgOMZ4AUD|x0&(+j-R(AU(^#*D^8)Wb zV#_3I1N6Wp%t~Rd#s?;Za7>>LN=VZfFrY6fGA71=cB;RsIjDr21}6Y|hYraAwto|3 zdb(IAgy#WO3aTnCz1e?bDpW>dqt*tan9MCl#p~Czkfk08Do?Vq9*ro85epIp>_-;S zhEctfI_gZhyyQfq`HXMZ(9y|sH z{W~ic0gu_%bst{p-1nNssvZEOfT`h7&YU_4{jirg#l_n1=7!#r)ol9u^PC1Om^W`X z?fUo@C}K?1mUc4UY0*nh?+})!{rmQ9qB^I{>&59m_{+W%DIgJjw2DrlUB12vG=|c3 z@*roI@y-w)^fGiTW=3vhA|UM>xXWZ~7ZgB!veLM}(4P{D#t|gRp4!^2C>6GB+2R7g zF0H8WZ&nU0YN}d0i6V(s)}z0svn2q~ECdR-n^trOnpJBX8Ec$oCnepSY`kZ)iTa>H z`#Dw+dZI!F4tG++6r3VM;6kV{0 zCL_MoWAnxi&Yqj>s>#|>oKq;O& z%7*3mArUU-6s!mhTD5w0-;pClU6*o?7GeH{qL)K~Tg;jV4NqqgNsr5P{p)RvYZhO) zaN%QK9#Lzwjg1|#lAGd>XyVP<&EE_N}Xt{-a_GFN=ntI zAbZKk@T6)OJvn|jul~)NsQ_A8f&@mB4d8UD9HZV~4q~^kQ@h+hbIGs+1d5B4NLYbJ zD!+DtPap4_wnRs)6z|D4vIoNh+*MC-oSUzqq48eoF#v9U;PT)PA$2wCbZ$=7&$z_! zu?MitDT*o{qX;Y5^$lnUf^D7sDN?B}9sDEE;3vPY2KkcFwJ|?l+d>1H7OaRfXVC(* zw@88{n?2;cQV4Zx8r__APj2F*qVi=TQxg36MauXdgXud6JGIW8f`HNzlh%EnVBXtv zp9c~$u&OPGmh5im(V2jOM|KW!FMGhulA_fK>{3{k#8k8*s$p*{=Y~SN+rKD!N6=n?JP44341C2Q{={M}HaOC|HIGOQVrk_+hgl=Wc z?344?+!$WR*;}z{)m;R0C>hQ@86q5LZZ@uCtwkCpN5#>$0Y|FZIOK`J<1GsC0R_Q#F5P7E9ADsDo~>Z^hX`RLnWZz}R0INcdE* z=lx4FXb+&<7lWh(R-z;4S$0d{^5X-vgSTf}!PBV(z?#wM4EZoYP?yX}?xMZm<|uGB z;0}0YtN)o*fD@D!wlyBjE%`*Sg7uhHF?aRKm3PRO6?4CTtDjz2PiW0%-Gbs_?mxr6 zBu!GWPMbQ4kuYQS?DkYx+_m9!WdVk18yt+EK=wIvxdQfTc(=*f zuzTmu_b4HKG&OfKj;vH76qn=d%k`>!Kq1vgv0GpS5vcDGh?XNw9Neqs{rL~ddMOn- zWbb*~3~=X~nn8had+sMEPk3Ew8qQlCLu>MX#3(~p2sXRP+L+g=RO{leGXdRu&PTFkb=t;T9I1J!BLwyv97e^}sVZ@~U^Y!a_1)qC71p0`2k7$l> zxIQzI{VLzwY5*38E6b$65wqM~3fV7LLZ=J8f}2LdzwBCAxNsrPt|JW8A};K2yf0xR zedc$CGbha$^MWTs`#w*N z-X{&|Xuo3f2@X~kk^`gAm8;gxREq<75VhaJjU1pZXkJO9@jMOgE@1DAzAv6Xzl@-1 z`1{**+#^-Ig|hG8XXdZSvSjVV|bL*GC)6@ ziz-0vl{ZS%u0A)qG5D32%prh%A|}-oTGi$3AEzAEDO3NdKqM3ZkwNfZG#A#ILge7y z7iVP&ATN%9QnJ#t=YRpeI0wozmxp9WT4$M?<@x#evLDJUR!1z0885izv2#SCn^~&~7WZ>O2z6D5;gkd?Q&Rj~YI8 zh-wk(8aXduubXj}sbKI=pH>;VgTMQzsX3CloSmJ;Sp@^Ql+I$5eAa!xTJvo4oTjSx zZxiq=)~~;QX21Y)1L7VQ(lm}%$qI8~&#|Wt+ivE2Uc8_s69Rhlpv#;Ob0;;`mjwF^ z14vlz`uUWb+|5-FixL!J38R?Pp#Z#~5Ii;O9G}I=wbg(D0}v1)8t>yyfgmEgz*-lz z*&5Cw(YZ9D!9vQr7mZJ8)bEatj*c?R8VGxj0#8yC6ng(2=FSb_`N+<{?arcZhK6q8 zC<%2-rv6Xege^E46jWDQcJ1ob&rI8)K;?`oZrr#Lay(v=Grt7MnYs$gL>GqB!3D?r zt&5^SX6e9V4xH|r-MgEorrl71fQrsNf>go=3bJ|Rh~Rhp1AKLAEN|h`SY)^s8!+~}>p(ORWQ^zo6&eHhoE=BObhDKdlNM9RcheTi}7z|KNc z@}t>fCab7X1ZC2&l6SE;)+Nar1d_g5TH;lxcxCNZhIYB`Xv8_=oqNNn=y;e`845_7{ z%|=_(O6O>=C+HGV$e{&DFedP>_!Z88Jku}5##7l6D$vtO`*+lOPs;PE;7)O$`JJQ# zO1ygt5X>k}NDC()`MlUBN=DbN5+C|$X)VpUze{vKA+Q|l<~f^jg870KueUOCal+)u z;W07Y#j!Yu%uI@ixPIN{-&(g7M}qbjZCeuvEMZI;;paKH$#4=cb;63oSAju6wx6Ed zx*gy;!7J#EZMTiMf0!b@4aTTl_wJ8Q`59_f%v`TZApw6tAyx&ng0={_b^h~ngxF+a z4i3{i+D?G8AKt$|(WUhW0LxsRX<3lR9f8oS*hwIQ$&`RG+gmQiD8ycnAPB9ej4}wb zZmxP?=T`Qb-)NWIzQ2kxNH4g_Misc^D6g=$&*w6rK)37K)okwEz%#{l!qfj;sA_VU z`7~mCk*p;y&pC5sNxDdO%3kU-7cAh1xbvI!#STN!8|?b2ixBE7t2-KJ4Mi`HDSy}> z>A39u*47eRQ#{^oNXGOr7qB6*Q{mF>A6?1Kj)x13=FOUwNDviXXu_mP%dn}C<;>le z3|)s!0Z!nriZi-;dcgmL>61q$(CTvQYxPOWDh^V4-eD{G{NSfRBd^%!>Cq>6?3bA~ z!=s!qemqi~b@t3TERy!p$D!fCjQ_Tn64l z@kA|8n!w&v5SGm9t^C@#^1#!o>C>hORRMC7-~dHZ0mR8=#g}i3=6_$hMDRT(paqZz zE9Uxf|2Qgo*TedXxLYb@QXG^O9SaFGci`4PiL7ZhuCSEZ(Jquv^;@%E1l)M*)`CELqV6cFELyqptn>M5HS|=Y-vyKZ6W7aOu*{eJ?i7PDTj;0-x10+u z8r^vM?oN+w|2JEjX=rQL7nPC;3F@Mo!N8|y&7rZ!fR9=DqsI)Bmow+hGa~^)ARbLK zwzO2nz{hK3NaRi|6#{ozkBWt*Uyr#`flgVlU?SEcz8aDlFQ^%e3KtNhHw4v7jCg=# zzz(ei?8dw3Y^SP!75Ib0gy8^cTy45CSw4ukc?!S^-d#dJ9)CrA=a@!GXMs(pkx56s z1U~}xhBK=gxm1R20i@80fMFzuAv9hz?mTADg+G6jhOAtF5^V=U8sr=9gIHz4QI z7~g_Il9=V->?~UZWPs1&#SU>+8TMypofG$q{q65cyi=JpBBYV*w<=iC!vesHV3doe zfB`q#p;Tq^ZF zhgAOX?q9chC(VXREPxd~kVqg~yYuYX^hC`Ki>LyCb`kECYpBmxtXY%DSc@IXZab0fALev6 z-Wjb8WTQT42lxZi3qixcMrJquujX}hJTPHu!p3Lt7;bL*=!+Do?fGI3DUXjmCwNb` zqaTr42Y1>e1oi!mPaq#S(U=%9X>Mb00kjA^FHiC$r71yCQIUftp9qC2F?jcyOINSX z7}Ba2UyJc^A7{?oyamAMRc7V~Sl}*=*gO1unNnc8oHcm7MA?Fh!B3X}##^~!MLa`s za3WE8%g7H-{XWlOITtC+da@pe8owQTX(4QcJ{If|q&MlA-e1cecBlu}3sj4732?w= ziwn-a161^y{rk%j6i7sh9^2Qy!E^z8``^-F;sV^IJOaf3Zr#ke;+$!rm@5_tXr+_6wN;7I#17^9~7xvcnqit-c)jz%~OBt z+>h(8qodBHrW~D=oR$`T`SL!BV+E2z#FZq#PT?K7}cd+NMVMh=gaJgQ@@Mkjg1xy^etPAsL zAa$1f_?lT$mF8uGD*M#%+X(8Ga+>4IA#;TgwsiT>nE$s;dt}-IFf8R(Z!j=oCwU8w zXDJz6I-!^m=WOC|7$F4OWH^p01~CYC1Y+SiOrpO6o}grX-8=4>v=rbc{+ORX#N+2$ zc`5wQ9K?FQa%#<3Y9>ss?SV(!FQ`P3tS|*(TqV-Z;>|UJ634am_ouhEoC4_jJK5Pi zfSNKRz~A40kAM5RnPhyrvt$k=p#cSJ6uKl?><-p>z7q9k+3kHHe7{7YTzDazlJ~?? z?z&(uXr*oNmd9*IMEv-%9y5U$Cuq!2MTLY?lnKDp)P#fbx=JH~<7hIl+AA}5qIhA@ z>`JjE2>{)bZ4`{BhY!6+H^5TQKU8b|z^uGQ?$`(1aJ0!Xk@X>RLW6+}@bfrCdFSBh zxCF54=-EzT#o4+yyGPWSBG53=eF=nYw95$2f!HAvn84L^U1#Aa-+&t`svW{M@aPAg1`NiFIyJDO*O>05#qJE zastvNA9OJknoRN_WeCM4@wR2lgK2k1I&&mxi+(@~28WQ$8-qcDU2>YihQ0~wpEP{< za9VJ;lax)#Dq`LmHi+ofX8V>-KGh4BB0cmc#{|r`SIViIje;#z@R%HPPCFkT6257 zoF4jYrJWtx?3Yd{wDkec&)|QimKTRBv5hoCVNpJAy90-jtJj*C|DOR`%1iLzGaLxO z?I-E!qsNU?Lbl2&SnFEiR)R+(ZradD}uqnD`QP`JbCmeou)3|B&Y!4EqJaHzKJ^!a(h8n zsg+l$E0|v5!V(hD7zyO*e$!6VC}hboukcz?PfAMt`gIRk7qwPsx!C9tC%6I3;}Dq> zHYDrTIv*YllPD)5KJZycy2euh(x*X_{V>8_EHDw!&JcAXI_ zmZAJNk8KBE2OPEl8`IE-(lVXO98IzK6~Oi7p0H;xUL-tydI064<}?&y%FVwT>kb_% zMnno^j;#V1o&l5}Xh6m7^7idp#@?Y$#X5N&F4tVKeo|LY^G z)+Ed!3G+EdamT1CrTvLg9ySZl^1f>O<1;|9ATAo!rGNnX66AWJPT_SBJFeIk295CM zl>NsBJxEOzD~~k%klhemIy0j0Y1@P}`Z>fPe6;!rgW*MM@v8NJpFxH`;IMPyE7*JK z;)9EkA0?#kx^-Oj=UE%ptzVxAWJXq7EUFru9iZJ2U7eW0sYOc@Gp4j_!-~{n!J-*l zBi8yZ#*iy;5Hml4<1eqtJlDXG$oBk>FS4G|dvyj^+TwfL2l1=mSlfwh_>o_wqR4#I z%&EV`9Sk#!1s_~_hp;syKfoRCN$f2T}!28O4kpq+%`Bd@P4g}Hf;nk zC?pIPpfl&sx8(VXECzOaxlHL!%?04Uh_wU~>4_voh*&EFL8V9H?LzU4!&HhY&AXOH z7G@D2;+N>(qv+yr*YZBH_D_%!r2=s5CE2@#9r=Ult4>`yt}Zs9Rc?+aqYSacO_?$U-^odvppcNs z78b4GS``?MQ@^In*491gdi1qsEmXa4dU4|(Bqxgj9Mxu0(rHLtYUu`y6Sk%#!hJKC zKF^R2fm5bAt6?h;+{1gDK4XT!4O&P;`7el(*a|nRbc&149{vLIfz&*N1qi&Y?4l-9 znuAul{&VhJG6@Hy`|X=^swd7!1;{p0LLEOo2VB_rz}s{!J0=nt z3G(`vIbz>llp0B^n|3M66AB}wrCAPX;5l@ug!l>g6-S4%O`-g zL9U>?zNmclap{u5=Ftn6yZC=N3jCDG0Ax6IgI}Ld8T@>|m2Iv4dVG)Vhck!t?NOP% z0cMm0pWH$xW)zF{w7&GcbpfG;4+W1Ab?SLW23d5BscB=1${90eNaaP9A+d*`C?1E5 zj33c^&xM6;Lwti2fGrWS7X)Q0^D_y^Tvyo_#fUv1H039r035cuX(z+OcQDoip(yTV z4?^R_>(5OwAh1buJo}7n=0ogo#UT{8oC#j<-hbU%)9Dq#8ag$sYu z|HUZpyHxOjjGiO{7nH9X1>B9Za&Q>*9|mC z4Yr)0brO0L7)^yCVmYsb!$Fyh$pTLzeNissNND@@RtqrSX>o?@%vU2V>3)y%DhYbd zBNTHGrI9rEB24w~-#;}Lo%QaeQ9DO0gxTU*IMGi9q(7ahgIkM|g0pe*!i7`{0KWGf z7U05$r^a3_Yvxb_XG>{?*YVgH`3x|02qR}#M*gaF$i@BmG~4VbV=r35s&XYdD4c4QnrI| zq^0C24~|JA2?hoR!aVu!+ZQifj&s2Qn>#bbZbbqbw8R@W>~jZ1A(0)BV+483nDNd3 zH;qTBC54nFbPEEBFJHbKk3>cbKccL6U|<(c9!>+^d}x$z!=8mi+ zh0-O4IwgbhjvYTPcZ6e$6kxowI`rhp%>Y<>7#IrPf&0!q6>qa(MPzmONd`O3DEK>j z-nw;vft%6~LXgQtViqf|NYUwFz5=61H&ylAY!)U1o4Xr&9Knz6fAF9;q$uPCuvA4Qzf}%xJ}K_M=-O7b&$A*uANJsmYA#QS^q~wLvhku@4 z@E}LqmXdEz`pu2+zVigd5Dh5}?Rg)P=C4XiO1*%+S<5Jp_z}3<1#XHL2uO=*gv#?- z)=Rdx`a50SLVhDqr2~I3BY=yk$#V+|&PH7t!sxHCQ|n#pg{Ek?Xc6ImU16PAh>XQs zxw0zK^z|OoakF92=h}b&VbJ@AIno9Eu>xM8!IbszG)_sc&p{D}av7S(HBZl6an@_) zUsv7{aeS$0%OUU_K{mW-S9~T%hT2<(k7y>c4c(36q9KUR#R~$kS;`qkwsAE4`M!}f zQ6L*ZZ%)(S`_mWi&>ciA!5?HZT1naw-lf|eZ#%jP5d>GlDd*>{NI0fW>Cz~}{Y75C z^Dj`8$PFK}Yv|81_fPPoh^+xQ5J^FTfPm)6c^j%M_ETzz`w?%s6AC#B0roCy7DWMP zZl=VI<2hzB?M8Y%xfS9KmJSVAT*$qEy_G>TXUq`6mL?fWP3f?S`S#SDHjD?p2j9KN zNpceH40IND>OXkn{dpAN8u9j}){LoBrkn_T6?gV*vrSYN)~i=p z_b22Gg&hgUK)|!2q2i$kEZEVo7*@QsU9+ai37XY}Evb-}ull;S$B66GuR95Ma+HtC zpqasdX$snR>HBf2?j+i$mH_L7R+IsWTwjrA8ID5yTXlVK)!~~eydDDZN$vusYZzq^ z!qXUgR@9s?*c8qkV>=^x;%H?F6_sv}G9Y(H&%cE5|1GVG!Up*$FgwUUBqWWRPuG86 z5b_6bc~ZpHtIsEnHzWoZ#AtiYa(5pAl0a8?fQNvA33c`2uTd)QF$-(x8FNMkjxil! z5ur%tEWmFuRW!`^hqmqN)p-y}K=xG+i`IV=DDXP%Ly~@l&YwfXXgPa!CyW#_Y65M6 z8B6fm+_NVG)Q@UvYunJeEy6oBf+1$*5ly-U4|m#*=z9Pst|N37@mHK*NB*)^5>iPm zPUg(qMW+=~7A9XTadbdQ7xUtJK3P?NB$B|SNq_#=<5yi5u^~LdVPSrDeBHgw*^l={ z`rq3a{=A-!T7J z{w|X?t#(vhkBxoYA_efF+SRw0l8@^C@jZ`Q^bShx6_WPuS=yoGrQD7W^CRY%@JBDG zNcRSke{2VO? z)VB4Y;ov7ufHKH^YsNBm^=%>p7}SlbCP?2IFDBHmyXwdN`_01OiMQYjqEAFDG)Imd z`}*;tX-8BE8T$71Yqy@cksq%+>!-GN8K9;0o?3>lyw5NN4?~sR3B7H_N`_2k!~Hp$)}v=3%9hdk+!m5#nME(3xB+sHG6iIN0-RVJ!BMMaH;wA z;^(<#@deJ)YP`P&PE>0Y_s%abZ`t{a7m;kXdFkA?)SiUok}k~V&dgx1hW2l%gHBUTHbAS_hn8_{%J3l zIq9gWs|y#qbZ{549+|K)Pn?*44@5d}*sz^Y^hd``Qnsb^{YlT%T09JIJuN0pQVpEg z@aD+nyAo>L-P{21+eyh#G1CWKXr$J;<&wpV8{m98a{PG0$Bz)OYS6#i=4drhSgU{h zb4kg#$&*{lAY^zk=?BiZ=D%^7on1@Xmz%tGFB!QY)}xDOoC>NpIsq?7)=fM7EM4rp ze*Lt?S4Q%v?&m*1UvEZ*Wjw6=_B)H>~(^FG_dKk)9l9el)rKF@l zm27=il7z>Whc3vr;!1-}#wRyrui5dez&j;x3;*z@XnXdWaT_;|JU^@dm%_ruk(pDh ztm+=TFzR)BUh{1Yuiv;qSlCunv^sY6nl*PzDy=teJYF~X;)M&U9h&d5wATwVuT}3x z)7ixahvNMAo>esO*(QFz{q1d-z7!c-B`)dmDp9dZ@3)`)9)Ks^@v=pnc)O~kc=J>( zB@EK>J`=o9vc&0>Qzpb9hAwYuD5a-EOKkA@ZM?Ha>mLXA4qeNx6nWb~JCx#4ngLsk zPmbEKVJH_sT3TU9PDVzGt?jC1UfU0q)q_Tk^aZp+=F0gd3(m2!Qd~P?&4b!lttQVX zar17gdGGse?c~&6Wc2!X!DHqyJ;-xJ0FQ^Pa`Ez7v`C@Vj#ICr-FxzwiQ@1OtLx2 z>LK^}_G^&>=`Eg~{k|H6x|^%`9%sAgX|fpRey+o-qV-TbO48&nb0GAC+Zrp+EpYBC zR*W+Hx*zsG^K`s+&CuL-@}#QAhZa`x^byJ!fut|PuH3x2Q=A<})tPC+jP&+TeviKM z^XcJO?@ONF&tV?9^h3MYcJn9&=@zX2_{@6|%g}-3J}sLxYNDv<0LcYa*quD_xu_`2 zbzf_?ttpKiH%=lPfhd>XRw`Q#3{}5;wLFNBU(dt2P2+Q&DpiA0bEvai*mG4iY=xH6 z7?^v6zODSaEnBt9q40u{|K~@svIf5fV^eR^A4`Ge4LBzXH0JvfOzu(S0DyOdhj?~X z^FRAK+Wg1KrGt0*8P#@%_r1f>7|3oNSa7a2WgAVji+O3(2%n3K@$_`!#C@LgqbVcV z4f0DtUO#UZ61*Ivy6blRGi|sBd@6{vt3<81qA>?8!W}?mF>FzzZfZx%^6nM7&9~m! zgf9>4c2jA8q3RHy<;DQTo`+KwySa7caEV~fSdu-AYiOFhw4IVqW11Ti`OU>$C5ZRa z)Z*UUbKqZh7PTW>2>~4!)xvzM^6ZU#wET7qm85@ zM}xZG(*8x^_gUOBqyjT3m zaE#_0x3rDLPNKM!@$YW$wA&mF47}s#Rbws9)t!}<$CAOM-BbYC!ACzDJhX|F6htB~ zRjDgedGWS~qXc;fn$nE<_8%_XczYN3wI9#q!Ym)uY!OC>(aOnb0nPuI6a0K>iQu9&W0Y@UCOZoQg+b`Z`ZyeCoHz(hyZn(IkVrZio-=`hP z=Z+j?crqo11)1VizqX+wwvYb=p}C~NR!}hVbVpIGylJ~ikz@VGjW-MPZlB*vPgt9} zlDgkUHThn(>YO3Dm6ts7`b&rGqHFWc-FELtZSi5bQFWL4pITiU{bYsi&(wD{lRRj* zO#(IZHGZe@7+26_c`vReC2od04KV-OfDIb*K)`kbjg0(2dFf#<3-gj&$OP3pd5&e? z=15beE(QV+2(tG+Y~qjQrAs;Ly;_ga?V7ji+nlM*Leh31sNmy{&#$;sQrY`(N&^K> z?=cH?khE*VUxXCT4@Us+9!a95}Ou0OnvPdiK0&+#|S^qzVh>5*wBv&;P3 zlA){T>jiClS(pHolKiQnYM)uyPp8Z!d+^=T)mqm1Xj1NGe*2WX(9W+L_*;ZWL`5Z6 z+k7=xcn{0kAoEfp(|Z>gHJ~Z(Ggvqn#;H$FrZ*RcX2BtbS`6Rs^O^*+1I&M<6M2?XW$I2JYlP$M@O7f2O8R@?20^{TnjUSfhh6 z0c&ueiT?4iYW|}QL&lw)a%QaBL-`z9||Dxuw%FUTvBx-0X3Vf<)=N$k1H-Ej;MmEoM*c+2*~Ih5*8$ zL)G;wQ}Qbm6oOK>*VcLl?>QY8r-G!hCDZO=xjN<#$9;XM4r)tJ{B-1URgT~EUghH^3=aJ0 z6!kAglY2mXa=C5Efi4}?7L51!vBkF^KSFQZ=tNg80Ba1-r*GRn_4lV&f%DNyow@H0 zEUc{Zz^3;;?ZVl!a?H3bJV`iD-nxNuYn6(t^DbPTcR@F?s|LVGPB5V6+a(7LuwGt(MwR!A$k zPOe~|0HsG+H6iLUbN;|^hVQoGW+&r!TCEp!;bZKtUvBW!ckT2}QFlMSklfq%LSvu_ zAI(5LjSNqWF~1J^>$#xA;La^CXWCKl@Sh$R4?ZjSSjhm5_%%1ioJybZ!T-Q-HR3nS ziMSdh|A`J$G7Fc0KwgL~aaS%aNpyR^BnP%t)MIPn z1<49;coPKzYs~Rw*S2#-`=!NehfV88I$OkT0C=L*-D9*h%Hk$}RJMW-&S@#6mCG!Gx%x{{8SKO-X}!QK*4rOe^o5ik{QymSyS z_a6|DQJnRO*zgqv0B@`eqAQ27fC8srkQK6O-7iNS)cWx*GjoFVUn9ncKZ6OT-}Dch z9lJQ?bXH z#z2Bke0O_?Mpxgv`4zav8gS6~&L6BVld3$<$G{4UHe94_>%Owb(zh2&|0?m@G@ zgxa80RO^otm88In@qEab6~&9!-p2X_AF z+pY(m?S02a#K!LBnw`IN$(m0L^B(hK$K@tX@0IV7^n3K&Q{Rl!{yR)(WldTZS>2}T zAEmh}b)99(oOCTyrO2!`m*S}WQVi{~-C}0{wb!`utqp%FF#Stk#+7lv?yb6(V{Y}U zoux;asWeLHo~%}N&Gj8xDlOKeQTY!4+#a#ik6=gOuRjbhwZi8pmi*QA&&dz&Zpj6M zVdODvv#VnIStuo?wUp7yCzMrGl0ekt#1qrbu4VL(@@YfBAZ+{R)49rA9kGeI$j?gb zX8#_=RAJM_i`oLW1s$VJkh!Am)pyEGc>Fkrj*7dGVQZ_(mtj)PwKXjtOo8`Z($Cv1(iPn*5g>k*ba0Xq(7D^|g76x;6 z>LvJ+y)rtF6cyZVD}&6)tm~tDz<8~XKA!aS>-rJUzAoJ_%&XX~vK&yFlrrc1o{sw# znf94ev!~;sC3C#ab7{!Mk{V}aWM#Dse>TBKsdBttP+r|~R3r(WMEx`2;SslQ`x4Qz zwf+<|b#}(Uz=><4vk5Q>)E#RnBMoTV(;eq+0t zr)Yfra$i@`ogmzXR@lc%L?;tMBuCkEUd2 zf*%w>icY35kRi(lc7F2w`TgpHBrd-@dgN4KyiMfPkaBG*0p$$~EiFG)^nhZED*~90 z@AK1EX8de!RnWKZCg$T@QQ@{i-hO}@kx%CuYPWbvGM7tmS9Elc`lt#Q1I1hMV|%vQ zl$MXC)sp8vX!!75G@nVy$_-L@zdqWv*ZS+%u3w+!n$}G9v>O4NksI(bQ`U2qatDD4 zRLx8hKQ$Z5uUEAGUV(G@@JYHGTs%(3ELgAv)*FXy^r1TKjv?}b^Ur`^*?uG&#i6QMB$Om5KfexUN@C$$6?(=-^@DK zkwbkc;KTyw>d9bj&^LbucGjBP;?99~E$kzWzwWuSXj4+|hvbXdYldd6x$!yXS%LFY z7d=(KlXiMOq&>-{z$&P?P~U`_&2N%AUcZ>lZw<>>w7%j<#}OB&EU9omJid=hs4HY6 zq`qg&^0Kr1|5HcUN6dlOOS~b4S9WgMlbBA%$|pwkjDM2?vP}<5%O9f`)L5jl_z!DK zf8ecZt9{t##wm+%|4Yly)V}(?YwW3*9?K#;*Vo>EoeqsTb;K&Yp!Cu7Id)u|TB>leC3caO|$ zNdZD~yD~p2X+@EGW()EeY(XO6rz8oT6SBM_C*!WC-SXw?c+Z&ro(sg6m))RXHoD(#Kb%bSw1+>MY-dl*_j8!_)f-=e|YR5s`z_nVoulxIZ#2tC&IZY<=!_X6#4e23WRk+f6&$f$K;)LcB=N&Snghvh#)wr=X6N{qo}zXIE4i z)OZ?^5C=jxa<@JRJ%04)-I^K$f(!_Szh~~)=}A`$;|IBCrf3KkDYKv6y5{$gaj82^ zdJXK{Qo2GVdI5Fb((d#j3?-FA}_nN<<@IHS6Y z@7VunGpIg+>(nbB)<>VKY1VXYbqO;l9wwcnA$k|8Mr~!}o1)ONe1NwU{M-aeiihrX zYfVl~g@V3Q_`Tfqpq(8OZL@904PakT6Fju@Bt64w-&}BURf(Z%OSnyCm5z_AjsyMR zsl6;=qSHn`O0*iO+!|+sOHsRjDx)LE_qkiR<8s8T>k)76-m=#|Z2o+E^Q1**{VG43 zsWCY9NIdC;_gxj?%&Uzr%3AQ%K2`6~DOA3)h+l8i+cgUgnLjLe2ycd4eEQi+g&TFV zp^JYSXlHEjSWx}i@6<%Kd-=5yZs)XAHlJPnKQBO9({m}BsaqAZYQ5TjYTq_v$+Bz3 zb1mEIP0n7SJF8&&f$ZHTy*#vsrVP33=+o3`ubrJ;>6`N-7sI5d4Z5q{qm`o3;pI10 zF6^JFvoyi|Y)>aYr0aSB#0G$*!b@?j;@-7p6_DHu%5Qo10H!A|UR(=L*cF+nrP2W@ zFrJ1>5elh3i8|7MTMzVrY)od}dBAjr7?2b$z4ZC;VezkS-52dL*`mm<;Ur;Zsd_=I z3O8EJh-m0z$Mnk_{~L1~JYUu7BMb^)(`UEGFZ2Q}t$1G6(wAQ=U=vTo#f2#TU0q#G z6W4}C>b<|pejX7GFV>Gw}fr|l%LOE88~p@CgBMg_nicm`~FJns(WXtJ*}#*S>3x4`~AYI z5?p8Xd1zmfiJJe1X6J|M=}{Q>yY*PvdRvQE-ix46phae6k&~$DP$5n}D?n3Q95IKo zoIj8{iw1U9PPvoF2X!&nOV}iM5;^$?{*`~`penj$CN`hgbZEglle05Oq*o!^(D>Jmqzr7w97d(uX79H!#jM}#BnAiRcb^?*|ms=R2l+EqW3UgQ#Q*iK?|NaaZAq49khMlERN zlh6>JJg%-fE{VVjDEk)wV@DguwSE03pc0pPf4BP@kQ#-}ZQQW#W1$2g1GNv2;mrKj z-r=9T6u$CbLeRtR(D(k^8lUGF`AyBNFB5Jq&_0rCqp9uaw%2DVXXz<4++H1;&)gGt<(0lqSY$%l)5c}w?3j4r=_miV zyZbayV#*+A0KDIMvLRhUW!|r~qOOBbPEJu+JL2tw=941sFNcE;9W)_2JN8n$6Cw}( z_MCd4ea3Q|Ah_yg-SQlVqs%=aogvxEO^%N4M&Q>?G;6B5p6quYB`q1m+vgDSpP&apg)f6Ts$gNs%(@Kk zMCMF)pL<~zk0JPhPsaxgp%wWNq7O=W%l7(Pxzvh05&G&eS-{FmGbT01Fz-{Qc~bwB z)po_l#-7?d>)f_XyX~{i<-Md7&5LSiQaCxcY#3=7!jjX2R;A)+lj|68eTDA4^0!Pq zOX_mmB7DUp@3jWcK-5L+OU`xfqxv!Z3TjLKY@YohG;z?(oP`VJ<3W;{G&bAx#%c3~ zS+)~$Jd`4@%+aDA={p}kUw~oWTmQtcSKp^-^qH6RU~lr*IjMi z?k1!`TMuE)mqZ@dRhTp#tWd@SGU?crtl_v|iKqAytWzJbb7UCd9%_VxMe z*N^L}=7e0w9q}oy?G--?MH1*wkJtk_Wp?co@9{ZwmOM(_H`ilN-Z7gbhYv-+Gct;l zQk;4(P)sQw6?yZd?(!SDNs~Y$eyf|l{4F$0?)_80s^JT_s)eM{e%(MguzGH>W!yKn z+aAitkP+^E(CA`~CLJ~+B*PjqM6CI8LW@O z*pZcqcF_56gXvn?oj6`O!*yz}{qKu@^UFzz`qy6xey(UJaO-F@5`q7ROlep+XzQSY z>>>|8$G&d2axE_XBHTfD5{3VMF+u($AQ(l52Z ziQDssSid2PmFP703%?t6i~{)U5eukE>=oyJ?s{;lPvFGej`v!;d_AEsVvU{M!Sjt2 z*W~XH$e0`Osq5lvMPX5y@6&FyW`O4W4S&HubZA}{_3m!& zC1>9TLG!g|GC^&c{mfgzA;*1?gujINkK23RC2r=T;;B4&sM6L~EM;{L!){Bh2M5xJ z)%?br)XD8Ax~-0#nxP3136+i{*I-kpGHd@Xb3d3|dYLkL6g-2NVQ_!u2s~Z)<$3J! zC*?N<+=(olUE8|lDv#g!ltL_Q*3QAL`!v6->>VYMJ>2!r>Z#isCWN=?P`?Y!}^-n^~V49DK5Y|V$RR*<{vzUDXF)Ao1_<=ZSni6dk3Ecuza#l zcM^>xcM8FiQ<{?Bk#HH5*LCvg_}Km%b}Kfz5oeE3CuCz+UyNC_hm1z*6C_E6LLxUh zJ^9zqUt*^*s?9YTs~K>2LoEDTk*$^cqFtZHoNR*yLW=72^m-T2k|o9mKW47Fw);R$ zWS#Y?bPfHX%kod(y=fTKt;;TxpOyOuykZh^yM&*s^}10^%Q_{bx>6x^#nB_n%_n=7 z`)`cu835D-kP-Pf*Vc>)xioUFr6uj^O}5-Qp`oPVpX?H}P)jLAyHCLNg6M^gc#a!U zS@VZkB0f_JzPrV0yjr1qcj;gj0=43zfENLzs2QYsiigk$%dK}5Zd;}$txHMhzWGgI zyB|)*XRF&b-^Rq6#7>UYV8aG8KNL;Tm=RGoV9zAY0JGS~50*rf4q6X5_D}A!yP{!U z?yb8Ht_8JbaYHigW<6iNJooMSIF*)7TvbAjx2F71es}1i)efz|NFcE+5>EV|;Lbu*7%I z)t`Us8a~MJ$jfoJ(;Cs$ca~N=doEqGPGQZGL_%Ds3EQ(2_F27$ztXUdYDbs7y!T;k zLe!J4zT1;p&sogci+SmDI&{0VB>&o7gRWm=X8rSY&Y`t$ukUkSGi-!sgsX|x#YdKD zkKKm^wgj&9+CM(w4@(7?VuVD-&NTN?neqD7yk_TK%=@umPaETZKs%+w&*intj~v!9 zXtq5?8ci9j!`DAU7D&YPRB`*Fb?_FwL1B=#p1HI8RIV9x6`X|u$eW{1F7%nH8Sr;nkrav z$so%P1Bi4Tnq$2zFFgNe%N_SZ4cyKfU7v0^vR{VZ(!!9iqN|sE4?SL%Rb*}av}%9A z*AA_1G*hSd3!heOy7Fz0#S5%&_(d2F^6A~e`cZU3Mrh%8H_BPhn&+#o^&PI7YBPji zmp_z=gkGcCD=#CjX?q)JZ@JTxhNPceN6pHm!)}}X)2uUt11CQByEaFw#w&$K89TtX zQ`qVwS5vhP8wFe&`88sNE_BeH7M5!D7*~1dzUwQ&zj{I7)<3Zkw)ws|GpmG>RwLly z?b?8L#y^_jV`#C;-p+1k^YqB?mvJ&Q-Dcd;X;|d&`!CKitW13HJ%2o&~>J?O?wV>kRFDI?y2Z@U{FBBr-UY?_6VDowHFd*2^IW6b6wvEh0 z8rO*X6Yo$PE--#j4_d?MByLwyh~Bf<$tkkWrHc!+^Q|quddv%dR_4+CZsDk^nyybB zbXR^g9i}sB*o{$cBRQArMm_yKL!*O1TKoC=1&&doxIcNKaO2ISL3YMXhrfr)dH>zb z)x-SgJ)lzL(mfeV2V;bYUpkn^)`6WmM*n#*@oVO*0lklxBrTcu^_Xwo>)lDYG1ptC z_(bvA2fsU(*N2>E%s`E_xs=`BJS3dHhL>x0d$%dSDZ((WUgX99!`YjFQ@wZXu?KA$Q;TqHi0tgym*w~1XVX)!cJLp{ zy5E60I`s(yLMtsRhcAN|vJJGykOOWCf%Emv;iJ;4!Jmv(ra=vctcDN3 zprGI3cxwvUu~Tb5q#B>*<$vcswYIj6VMEImXp{V+Mu-c@3v*dXxzO?Al2AqDPE=;Cn>R+22HqC(0b5Qm~M=3p%+i6!(3H{|R} zZqf>qHyNb(@A=#bnHi)vd1oG#b{s{y0=o8!`g+F;o*()(;4NA)SbRvvZA7NF1?}?- zSks^!MGR%XLxQU`9_{gv2$YXJevL=4QdwB*R*}SQhA{VEMLSs9D3&7jTP_5ylTFur za`m!Dk*Sv7+OHbR4&7drr|GK&!7C!Ea#gYzQzcYqM_2CMjU=n2B~^0`x2A3hJ4%yN&=vfdBug9LxB+5JBtK0h_IT;s$yhEugQI%VPy}Wby&*JtyjC4Rx z)5e=TPoS%#QZl6&l)PKW!vlXHsd01@3oG9lRt_QEpR=1TyNbLG-F@8$2b)Um%Xl+> zF)MO>m7DiS0j+2@5DLeW;V6!*1?eJ;f*raBF>GS{le78sh;P^1x3(7YBYGc0wM(>-mbe#Ny`-TdgE_S&ZU z<^H;X&e~2oF-aMLZnvJ!vxCAU|J*FP1?*QF1yeBb$YGcwBO4!O-`SET0mZ*31))p=89$A-|I z#~k!HH^yq-)_U|(>Cw}KD($OnO;*pvMpxZ&Is2JvP@F1%A~OI*(o!TNtMR*5Tc_M) z%k9?35-(yt16~K@l2i8lk)pZWd7W4g4#ax{{uje*E-t<>mS@$u)m}a@uli}BSW!-C zNPLPdeZa>3>DDZpeDup1l1?+}*7c4e98HTRD(t!~KAYk>QqPSbktDnjO6hp^PkNC~DZ$HcePfSGo4P zw;vR*6)QJ#Il3v!aCk#~_F>QJv@tDVj^hm{SC>-eZ2Ah(#Jl5%dV??cc!Q=`!}7ZC0cyGA#1-z!jqZg^kGxema~cKtD!3G$))2%>dIcm2O@qOcp=>cVU{)b z=vdNw_wC-{%xwwI1_To$JzF9~50`>)+9PcGd9NhddKJPi0Qw zma1;_DaOUv-!q)v_~zW2ear_+Hy8gJm9M)d-&?adGQ;$azHwEy0q7+g_H7@je*t>g z>6w2<>y^0V;v4RJj2FfGe*C4LYAq_5e4DNFLs4I3r)|~f<9$&@Kioj>FVsjXwM7Ec zp^6+ncrLzHUO)ZzdKE+HNRWq$Grs^gziqwr9>#Ci5PjbJFkODC!9vgYWAc)9Lamtq z0w%I1Y64_LU>qP91+4(fhL|{RtX^&uPH5@kMal!0+HCE3%X+r`addm-lZ;ELns$=r z*|v+Tnhf7qTW^ZT+eVcrZ|+S`o2)fwdM`96FR~ZG_ER+(i^6YTi-nk>^X$p+O23?E z`<|>6 z%B`LImv?-h1CMyt;VoV;K;-x@a^er~e)^!tb4Hk7f0TRbhY*fq)@KcOT zTY1{P#pIu{yiq$7qngmC+uUpaV&l|S|67-YO6DHBh^k%J+c>K`I5y4|R0<&`#w|`> zVws0%i#^^h3M#z=LJYW&lvE+gbF*{E6Np|TsuWgBR=_Gv> z1rtSl-$<*_kdWK3(EK~j<^jD6K^7*M6=K(8$*%KP<5jrPQ$ z?;Dmc7edVr#R0lIH)EtTMjRiXiu&FJ;fSZ-$t77d<=p+3N4KTi4msLqzgHD)F)D@6 zq1uixiIa>-Giuy?n?IOYE$73*cB!dUwd!U)lx+K zuoZnXBD?oyH14=c`=nbWJRq=c?@Q*^v!-eOxxVF{C;H8I<<^%s|0NfBB6Hp1i+(G& z2R@Lyx6AK=AD7V556s(_{B@V-cEp`^o7Ml6iBq|G&uaJc9N)jS0433sYi%5VFr9vw zbGC}@*)QXr|L;yOpsoMwukYJ?gIlM$$O0NHD@yzqIuNHt#9co9uR#XL7u^ABPS5B_BI-XKlFSt`78<(*4cqN3w!%|HW#zn5^78Ve2h zaqGKP_Pu_?$l`lNmx^XejnbJ~ldJUMYq$gA`pl7V*VmzTXpmliPfCW%KVW97hLa9j zzrNT(D|FA|YGhqxwJDx}kLc&sOx4@VNEf3T=jW0T8@s`!yuNc01&J@3QjR{~=A;8c zxrCNZg-GETx{s~0wMzyyri9#BsD}W1s2(VDKve^5D#eQ$bgkK>D>GoSPh3B3uY$EVbPQA;FmK_>w2 zOPiN(vJa;}OaElJZ&o`1p;LaSURtI>vd>n7IpB(UO=HO5^%X>fNHo3k@|e#BBiZFH z>!c=L)BlWin~FwlapIQL#I5;b(Dwueh|XMSvpz_&uUURjN=h#+A014nFy$pjRhmH5 zhej;Yp*k`?KHLlS4LCpqTflYu{AG(5A#L(=0SX6iV4q)qSx{N3=i*-G^1aML+{|Hd zjO0&l<`q25Z}&2X?Hx~#9Ms_TekdO)KgI`XD`@A&j&GvlTh8ZbbWA0I@~Ghp1k3pN zl=CmqM0Flf9}3AETrE-Kf*f*EKY?DiyEARpA<_k}$JFZiKt=~`)q5Blh8(Lhqn|dv zl*sj})7UZ&Kwzk^7%-Ns?X0`kQqNSIYm+BoD!$Ji-=RDve9p8fqRF_Sf6y&iu91I} z|AmPDgx43=v$YS_D9Sfln6f%Y3u9{9IE{%0#)@Y{bs@7K@1 z)3qflzCsv{ZrqJbncI9kFp;y(-fi4|2-5pbBD&ut|56G6oA@cDh4&Kr^b=lf7-a@z z_?H*`6@wcLTVdkxna7Y!9P}P{Ez!Wi>=`DmCv5Fu1n6XqqezfB!$G)NE)VV{dFnTkH(X62kOzu z>$3$dV)NCA);ebmQAu^DK`}NZo{U~Gw)nVy#W{0`L150`UAyPBo}c+zY!)DofU&4(D0aqKqJU7kpv92A-X)5nl^?L#Yv05f2<-@{LhC9@DO- zQYYc4VpWggPcHwVu%aYm{>}LJf?XT$-g9}LuR1We-6AWp_=Qz}=*Sg~0hdUNmi)YA zw86c;@T#3AKd#qc)Y3bII=vYRx?~?ABG3H(b^5uV^zr!$v=#-v{M*o!PM3sDuWGUs zl0?I;hI7!$?FLG4WN3G|boFY=_f!;9ArXhT4BFG-QqsSR9e4+kwJmBIs79X*8a-A+ zIgh&Zadax9rH2&Z?p*5ZaKYVtec`G`BdVy>0Fn~% zvukLsvikZ}*4w&8{D0=|g%W}PF?T`G&+Iqj8$xqem5<);yoyrDi@CLJ*-wAwAwxbI zUfI-Jyn6)#QKMS0Tz}77HPicXD$ZP9)$)ziAq^+Gdn5bPM_6`TZin6x!mCLOQ)fQ5 zQh)YCABvpE@4fV5$aH&Sr^0fcAv5xgoz|BYx<;pq!IvTboKyH>iEzLkWH6`jCX7#l z{a;Mve}=FBZixTmUw_3kW}C?~0S=Qc(FyFm*X`HYuJ((RBcWZH=%vn@Pyh6gN*Ei! zOE{i_dPmv!Vj4B&jZ_ESchc-xH zQ*;T(>;(Qt7`-%nKWyb`{LG4Ql^tLff?gzm}C7DzuVeeA#Z)v$3jR zYnV8Y1ftHw!~xC>120b37efY$euSbrguyPGoO?db;_R@&dp-+s(s`!w zh7IHCb7de(T7vL-;p_6scg&Q{Lyr@)qHXqjfFHpcHKO+yrF287UfuQVdi8_i_;FC_ zcCaW>QOm(5U3ugB2-j3G`W7A~1~*?{kj4rfkP{&0fhzm#a=Td6lcZoA$Fm}5HlXl@ za+{O)h!~ekt5s`Q$dm}cQE9pB*rDm!!8u8=kEDehgFDRzt9G^z&JGL`K{er7$Or{Y z@5`{ii-Nwd?)xV$LwtkPZGZaRcM?7tp{U`>+)qHcv5qu=7ZnvaeZc@^K z_mI>to{n!fp`4|2R&fFKfy>Yu_^#!S{`x9wqwdMfk^Bh#MfOg7rXTm9<9qI6_r#5# zdAbvaBBbVASGMn}n#lSoe$K&lpZFltJH>hQwS+Pxl6fHM?YAXwI_X+{W=^%a_H!jE zzCVH%1^I6pKC3S}@3vSSdGKehh5uV3*Ew3^ysA;Z?a>h=ru}JGo6ZT_?GyiFW$T=7 z>X69A#^MGA zq8eRdyl31=TKjgW@1`*0h_KvqnyL1C)thu=A;U4?Z?1DjUN0O{=GU3FV^k$!PyU0H zl{1ztOWb1~xrm4{CD+ZzTP6;^ajnN_UfiOw{rh(Ax&iq{W7DnsBtBE553n#cd(Zn3 zCcU!*4xAFRD3hW_Uulhc9?TSd#oPf6Lj@ksn+{&e8V@kvUD_P29)B^b@x-{ASu3tP zBVAEa==pAzGu^LLl0H!z$6LBzSqXg^&por}=g{?w949C88C-pCwl|mi7R|7X)E8fM!yU@)9vU41@UfQSK|nm^`1pe0W1@!OSaP+-v z5L&gdFRPtnwvFSb707Tn_c4EFHOw$=r1J9X6f~pK~31_4}PzV zuI@fQbFfWhDEt&l>-u*R5!WQz9DEOa-hMxKRXcmtHJ*!Wjtg^Tf;rRody{&g%{A4* z>p+<`-|bZHi%)MBN!?BrYGWx^^hsy=IM!k2k$0f$_k%cAn$DD zrg?tvGE0>+k0kM(9`_>e}+Wy zDMm4=jy7jnf0nX_h6jc*5PpIwAN%JVu$_I#*lo-hJsZ5|Up*xe@d2cgOajftn%5Go zmNox3u-fOHA}sWl&f(BJw)Ac_I+49uy(@UbrX?%RWI71({QQK{Enu6g80IB`*lC={ zqW4-iZCbtJucG&h;9`CX^E1rj*GTG33AOX*Jz*8D!A#4H;l!b4q9&@xE4c)kD89tWkt4L}4IkR-1wVW2oQLF?KPzSN>y=Jpme>)n=OvibwIVpBIfz~8 zb}?J`!Q)Qi4+=81o%tl9WPP@Gcq>%thm8nSwXZqjr0t8AM8hZSOArFBH{ z&TeyrtNSOzy96N1irCL*|Fpi}1$iGrZs-6{mRoNA;5N?%u6K@Mj9SEAYQPU+6N3a- zpU^65^czWbn&j%a=-X1pLW9?mZ_n(!*!udiAi(F{sdaA#Jt0zk+cq)R*X(#*wYF_; zZu}J2S^<-zkaQSpu-TQ%-tl{$N(1PTw-mb0+jAc>7I7ZAOk;U@hN=Wyi727R`i3?jK zoL;{3;YhYF6OmcLdewcM@K*}9wDkXax`L9AjWUfkQ{B<#{S6sY*zp&KXBGF!=BpbS zMUf6nHm9!Vq8RU=fyD*`n<*7*bDNVe4$lvI$0vEdgxk1{NqMH98sPh$T}wRv)W z6tY1%z3BpMwSIx8#zsUON4MqYM+fymFN`@VMpy5RuFkHbp{f0>i%b3v-#_tyV9sl@ ztQx!{)=ilP88**^ZeF?cp}&7PmM!Y%6TUYJGkn6n$kU*?dD=8tanN`^zjcC?A(KuPcD7Tf3LooCh6 z1I5{WDmA{2)6lJ%q0qX4@=sr5`RpP&H7`zh+I&1%Y_s_h(@ZtT+=PtR76EzmL8K29 z&@9v2DU_+lD1=89_V3*;@gaZac2 zF6~T_s9!Ob{3%$d_ZGcm1;(XeA|k&FCQO-`m_Q9xg&t`E3}>AAxX}AVo9o^(#%VHFOIGrPlj8!66zX09Tb>}x`HMrr(J>pVD-1tssHye;qNTrWJF{*5mtMcH zu+~VaMTN{y6{9Pos;j5oi;h>G+_6DU<=C-X0IBx{voJCn^}7-i=ia8Ipcby?Kk6JC zWjQasWN@v`bdIy88s)6zYt9TDpq|PKLyJPTHm{+vF%MS0-;gdeF;<|~;VK)YBO$k? zxl;0#ItP#TUFpvGC6ymVJ8~)Y5hPdvvYd8WnWoiT`oXwI&=DiewTVrq%IDByOc)yW z6zc2it#X^KL_>Z#<>NuV&({7$n|bGy)tD%~4KtH=Wi{^iDMlT2Hw3Az+ZX?n;n-BQ zpX@{q;)GCVi)QX%wq+7z{i7{%)G!aIvS?nQ!0S{iU zs~0W&_K~&SuOCG6HBiJvMIX-F5vPmDMA}HlwlP0Ouag1tku~!NaJ$^Q3#B3B_&a{O zOAdpAU}g^^c$e@-ugGb2bnF}-T-|-6YuDym4GMmrjC%PCGg=3OiZ0a~1{3cTeEt5CpcH0BB_^JRTF5V_ zMGT_X8q`c;dnKZ+UBYBJ@uqmYOKBb>9r-8y;2Sw@vt?`xR>7(BmGPsxai=~_9U2E1~wc^$A!3t_*a_5M(?o`8R zJxF6zOAJ&hO=@0cR@LcEO)2Tox_b|}BtitnTW8bRYjY*SEwsAMecmMmaXJ!@AlP2d zhkJ~%!G4^{b@BML`Z}Gx`}51XZ9cSJwb2SH$gJwMa}7K`2i?I-Z06mM-It!5_E%vH z7+?WU@TVxmf$oZ9^tIWYq496miJgLN_64{Y^n%Yk{pi3Etg-4!%R@$t=_55*b@vjxV)M}; zK2;qy8-emT-nJL!e?sV4i`FBX_uD;8FmN_^gkgkJG5RbX&(D}7XJOEtI_E}ZJPZvZ zxw*OTPnH>CyZAdB9i5QM)|$ujRyg6ai;*rC9n#QuVB9@o4DFjfB_#+A$#_KQ(2kA= z*__wU;Sg)y^w=`^)VPk#0JH44P@iQZ%mstOi`uV2pt*OG=jQ&15Lzkh=CovU%fRsD zLrfY^t}}lr1J7${Wb|Qhd~lSO4liBKERhx6;!KrH~4%Rd@#F@aESl>N< z6ekoc`bnK9I4tlV7{p}JoTCQbfrJM**&V)T5alX`nnG+i0C5fuu(?uOW5zLPyJMW@ zWy|g(BNC}OEMYEJ#k5yRLb-ga_tmwhLDs|3B&z|+iid{H{nPYx<&zRD(%f)f9 zzOmhn0X?a9xjHI!QxY!8zMODq@wMD?@5VJTq8EEMFZUI<54|^{eT&z^`-CrSW)B~h zj7S>y4e`PIh$S|v(|KKtW62ji{9-gx*H%tj4S01JOo?MOyo0ef}1Pj`O=Uo!p{ zq-&h2`F)%=KI5_a`dV}o*8zpRG^yONUn}i6xIkR3C*qE27z?P^o$_{FH8z)h9KT2z zaYppYYO?aQ%pXR6@#XZ$Ezn+VIKmq%9$Y_w;I4qPC0@;vFpL);jwih5ejZ6uXNam;=x3B z2j@CQq9rLiTgzA0z~=*2*4*#L$I=<=xGD@?-&hV-pcb0AEv*oXq{WVpw^9)T!`BKl z2ZdRBdchK;PUox@+<2Fz|7G`BJ@$ZZ?oV&dcT;85U+5Y-ibEo+$iX8OyH{?z1Z2Am;6LYNkdiD1Rq%EGn!ns&NPVi4%G9_ zutm&`OruX{GHlg9Sx=#=gyr`nOd024S!0HIy+$%e=zn3(s2K+2sSGP1JJjUd~Q?&NAe4qh_S zPEJW2WUt)j~)pf3O46Y&A0*=UYYb?>g0`AC&wH-#7#2k5GUd^Za&&uK4;YF z#_Rh?s3Ub28hB2jU>3v)%yOzBvt_zdi`lD}F>7D2i;(OOJa1W9%;A=ReFeB*k}4N3 zKCkzsJkx_bf_v{?WjVRK*ywa|UvgYrRhnVxeXGIz@wl9vbL#PGX!5Q>BdcxKa}Tqs z2)Qj{c9*G>I&a{Qx^1`_>H0@AePxd$13TIHVPN5?BV)pq9ZXBMIsblufK1FX3NpkY zFi~1oAr(oJ!;tiX4E+e&(<+xUshS@r6p!WP3;W7q!{BN7iwWN2@c3|95TUB+>LwwV zfPwGb;uQzIHINY`xO$G40l)ymfWeaM8Vwr;$4lFXZ1&!ezCbbss)7`Qdja3f^&rkS?4!OdQm3{ys<0v<5^``u;3K=(*APwEN( zqd5p&JS0|FhHWVc`rab%SYEL_C}4STu_ezDL#n3uBrpR;wDaja*zRhFZ`|c_kh0t< z>Z))8hPVD5NuJSTfuRRR1}sF3O$(7i4RI0OWr&MCU0r7mZ&5?0fxvQbV!W&oqgGgM zxkqQoarx_HHlLk`XKH|AA3lD3__pmqb+;-uIvjj&F(rW|S7~i3+durR1!(NYb5!l@ zG7+_oC|$Xd)z|?@mvOFRc#^Y(h0-)1WWbh};9}OZQ>Hv^LjE?vnDXk;>p8PQ5we^+ zh5wylQl#y9*Dyk2%IjIbpcwOArG^mkxSiT?Ll#JujG>88pXoFKuT^%GMzVZGfq2 zptBK-Vj{L+B-1mD5XSB{eT{%P?0HTi6RT#`mr_otV(9x>MUfNHPp$5yUIv+PF7xtZ zc@5ZNd$Vno4TCe1TDT%Sl6QvpPZ}#2?t9Iqzrv^|`qT%|eb}m`FMYD{7Il`OKd}7x) z5F*P7k- zKd`Z1eGlVQ0}X`}oJKr!qQv;fdlY6>N0xVxZJh_!Xnr=-!^)0#hjb3G^znya?fAaN zNr~KKoC^l4cQ@O&)~*$5x?smRBE9?R)tgDLzR{83Otyw%uKy=wtX*%B z!Eu%hjt4(ontN75BO3dHp0F)hcnvO0_af*Q$vnH#T=XcMZ0?$EG&RG;g<0d!U(DR=b@iOFI*e%?sME07&ErC|T^0(|}ODJx`lVMG;guN_l z;4v|s7JrqUdLi}UQtJDDJCbe!f8oHw)xwhfzK=Qu`1)RC-MNrn`9(-?OW~6=qtFT= z%nvCY2pr5y!nh;&hFpnv1EKqu+;B%Ug7d=R;q5Ij6V;(#)Rhgi_dH0?RST;|>!`D% ze5fU|xr|iibOfG1jNKdsN~l>kpZaIt$*KQSL>BT^_fKyz#eZ_58p?5&8RN=68>EhgdJXpFz!@`yS`)g#0VEPi9%!_ZA z-+6nH4I9k~N+OBA3D!-BVt{>yLCHo#1A|B8s>+-o?8mnC2Sirc?Pgtf=)nH@UoK4_ zBp-SI^$UO_Ww^kD4{Q_^KuAByIfaP@@PJ#Z(JcNuJ(7_r)?ly38Ed=xzI|xV0+5(T ziH$5@1SBwg3witZtHMCfhVvN%a(K9XTv))-?+e)m;%IQ9jBV;-_gLa?tEw*5w2@F- zbg2Qs3HjQ?h2xLh4;EmGQPXG{dgshApGzRR)>KwLM|Oy6BpTK+jtimsnva!cqB^cW zQbBGpvBsEUoN|QQg$yPZjkq7oGC)(XlFWz zJi7|ZFz-*|Zs<%I!^gtBbpy`q`K#54^5qJ-h5*CZ@tvISGcvAI)jtPlqfqZi2ynRj z`vtd-??^3`lwkKkF**oad#gJHB;c0gK?dTo(1NcsQl?hUbJwwF_Pi`^#Ezag_=C2q zU-sbbqleiG{DG>DP9pZyY9JrQHap18gHscmEj3(S3zn~Aje+nITZ`hb1%Ao$HR!`u z!OxFAe}F~xc>buxQ~v+kOemBu^iDOhJLe$y#6dia#k3?B2WrPGyJ#E0%^qC9n)#5x zNs;DYx_g}S?u{%bbVdDZB0i#pqXDoq|1!%ABm4Up#K z_~X2TE?A`Pv1aoQkGI?5rjhO98z9N#I-cli(^G)sAQK62nKz}rPPj=Y4}w48@Si_F z0&w~WeebG>GT>xhN;e)ImZH``| zE%?mp0V+Fm}=0hjpb^&}4-I2EI+?$W?{!nYTF;FVb z!;WXrDO`!%AxbS?-4u()b1+Wb7DK&Eu>{Sic!|5Nar-+ja$bRtiLwv(`UzWXYtFZO zJTI~7Fa)KQbD&Y^=;-FH;24&4*I>`&VeE&JQxRtU9DJo9R;b0{7^d96BH1@E4+6po z>@lj{8~yYJ?ElHuExEGeMUY#dfMDj6g)~X9p$uzt)RdJ|6@t%kZmgV7orw)J)RXXS zad|EljZ;&LD39L2ZP-@U)iyOv2aFowsn`eg@=_5U%0^~b%?-CD6Xar(BzA26MB0mm zgoW|J#mzKQC|m%dDo2jIX3wHRqY@Jpb&?$LxHuJC+YEB*7s3FsePWP9_E}ZTwuVTU zNc6+CUCS=6iDf#KUtizya%}kaPp7;qdtWTDf!&`k6?n6c6XpV2CJcdcu2O+6Z9fUr znUwhL68-gl=O^za&p4h)IA>xR4?c#G9piO{P}Gk?+-4`uFv|tNQEXif`tPuri&Y1+ z;EiM!sNt?uT%v^-nvCQE27<^F9uWi>h#MVl!=7hj3~ZsBY#+37M@Ev;DW1I2~+$X@TWNP zPAD=PW}G9?^2-WR{lIyB3vh9K1)I%-GV$S4A#g=cu#T{P!^NA>4IoyBpH6=9;?1L0 zo!F$LmPjSEZeKTS)Uh}GT6hDt%M~I*x$c7Nc+yPlwKAnDI*nrh%MP?_Mo*Z;>C*{m{++LOK`EZ9;jPIS2y&o@ycgem_?@ymz;T} zHL1Tb%e*nuq9M)D6TA5`ur7^|rTCJcTg?z%9sBLux8_YAZ!iAZ{JU)M@8?sZ5oJY_rG`D+7~O=34}_QM@8s@l)QOFc z$85;+Su|T=R+7^Rv%<&W;Vcn`X`_?KWygniFQMe(5UGpRr!HaGJ` z%svSa+C>ls=$p)XlJ>A|CV4w?txz8t@o7QvfaGbAd0x3E|n|wWU#*bsafMIQ&@747Jpj z!zK@w)3YaRKlVqLSnDKu5yS2pFT>%ou&5pDZzNO;ZuI63EUrMF8w@wNv)gl!A1m%P z!2uoqfX$SuD1u{Esek!@EO>QoHYyKIL^^?^{+Mmq!r_wUFp$GBN<^h4ioen#&+GEv-CcyLu^<>$Cs#FyZf5FoQ)g-q)_GOV*g!HnR=kt-=< zGiL6`!8}R4D5}a4>C4<(;**lfVtlG^eW-)2;`=>_vIzKlNT$_Syx`+d9$deYr8=av ztkgv^j1(a3aset%3p-OLeqaJ8q!pGR@P zpRjFkIgXkIvwBJ_x%)AhCem$rp-@#t#WNhGZgP?^-8TcN zP@+z*`c}cq2rdDf$O%XZd5e^5-a5&N3xsTeq#_VA5=A8b-CHgEB*pDhsKoim$Vj~I zA+g_j0(Z&xe)5qjMjj6$AU`+@elw5QfTpI29qY(OjD`QaL5B7D95j`muej09Lz>Vf z)Ad&`EvaD2jC34KVRN&E9ixr@XiqJ8&4kbBn8GeRB4Hq3Ht}EsNQO$Fg>A2TKv0l5 zh@6Hz$Mj6gW>O04|C0LF!3~7)ui;?{%hp1qp;MK(Kexy~siSN?+pM zk_d7ZoA4S6TyhD>(a)TI;!_ijL;(A#+iekwa8>}wiSA?aGUaO{5;U7ei>z*X zw~1S1i~D)Y>=V%;c2B@vk&~tb;Va2z2=KweB?W++gJK(V(C{{zKj@-_vemhQ>)GH@ zV3-uzYv;lIXc-O{)zzE!oxyn`aZ<;o@&qZr)K^w05mKFX9h&9~8aJ-<@G5vQVk68t zP*u+7Qdt)^P+b1$lfcw?b#+Kxq-R~PKzG8TXU&z&}y zi)0RY&q(sZJ^lATpD6|ZE9Cn91eXW9P(c5t+$JMiYc&O`L?+KSJW{RH`_#Iu z@=&>WczT&=Dg4mXD$${-0wPHQCrNn3kKQ*eu~||R%ZW+gMwI_M8cwAi-|-xuria)+ z?&wQcD!IYIf)*-BZii6H#3INYYd7;_PwolaSV%MgR&OA)TE2$m8G;o<`BKW1H_ip_ zK0>$(`9DvbDB`UqUI$cc<~0PxJ4dyV1;-ZAqQ6Bla~G zj>~|>59iRCQj3biVF+1>g-Zd!O|Y%X$4rfM;!sr(sDZn60?`^xqIjz2<)9f1s?eEw zQ4kkKl216)+lQ7{v?9R3?{~rH9Qr_<4srpPv3g^GLO=;(-S}ZN-UeZ)h=>d>uYPFJ zh!q3`VJ>5jiT6y@Og)N8v32BxJBah*PVDp%SCL_Nj37DtF?xxIoxA@104@AvWG@D{ ztDBkv%YOLi{X0HBqfd)aiG5hVozoPhWiV7u=#0bJ(Cxa%lT?xCI6Q)p?nHeCCtg8c zakp;#bcm=LR)eDKKe8L?@K(@9Ps>Dm_kmO4|H(H0QeUn}&P`imSMI6O!2Q+OOOavM ze-8PAJSlz=JrMyEFddC+*HTH!f<2rhWx>JvK0>L;!hjMpyh6jPYvGu;91X&&Yq(rW z15_?N+QV7ye-Q7hv8cEC*2noUIGk9UFOHYI=C3z@z#%~d^ikJ^;i=Gwl<>9F=V%AH*G`}85Z|l5- zTJ}&|uh{LQbXmKOrH6H+DjQFROM9`2eeM(fvINT@o+ah|lF!Gh&4cl4Na4tK!x1v^ z)CsF+v86l$NtGHZUk^!=v?WCe92pN7!o37>$HaUwbVP;-kV6VV^*+!+%vYtJ6QaAS z`4?8MqnyZ4#v<*89lOtvv1$?>2C4X3b;u{`=AQ$k$0--Z5)96G)RxZ#%+tQH5=PY zkxmAC6c4{~Iyryr2`Q4md4Uc$Lvdwlz@8e98v1b@6x1SpF&tlvmonmj!<5sX**Jm* z)RV>R&Iz*<#ZqR-+Kh@9yGwSXz+cl5q?cqI>Uh#P#5S=0T8alwB^JZKfM>y(kp_K8 z)KrhY<9OHMt|UzkcbdcaouH-@xc2RMy8falLZLz&gCP>|fbmy_n<8y=b-}10izea? z+IxJu11yK-EiID(836!{A0ki7%M&M&o{z5_$gv^_^PVgkUdj<`#33N;F42z)2A?Js zS|mc`-T{eM^u>CvH1alF~zH?p}+4}p34PadWqus+>5 z{^d(mh&cbw{3#VHv{YhMKlH7KTn0SPxs(ex6s2Zt(%YW}5u8ExP6I2;yU`k34Nz*u zIia6FC(x9TT9nSUA|?biAw>UmpTeZ{5DE_eeNOaAMvR+%hA)4_kN9+e$e!B_iWOLg zlZ0(&X1JE%sEmr2x=SV_9z!dbM>ez&y%g>pFi6F75B9iufs~AoI!ep{i4cvL+G$g| zY5`bv9om)=E*81@!&1a}?->?1Z3~tL4L5nBEe~|(VZf`{~W?~Rw znA3M(nU_wZX2j}#z*zkcsv6=1p~)rS2t~)f=nFXf zypZ0$NIEPX?4S-<@^kr48T0%)&J_|$)Di{7wopdQaJy@Wat;Be8&ZU-8!OmNi1H?# zgtZwoz}3KJY-UF5g4tH+y~XyeQ8Kw82R(DP4W`iqo6MUv;oF@cr4+Cq(4P4fM6JPA z$7BprR|kLw9C2C(UKeuB7cX8&IJt2L5RT$E9|PbHK8B^509!P*r{-m3)PDKgcGcwP z*Vp8e6NpTVh7`x9UFWiFohVMJU@5TglqkeVMPwGFbuV#2m@hg{nqo5ibRvtp3%2PJ zNQB~8AR$dr)N~QW#-dT|1C)lEeGgS{;d1}yKev@EmYm}_={~tev{tp zFJ{8~JrTMRS|&Ajog_5j|1IBcC5y<`vK){`ru2m0@Lv733NI+Mi|IVx66le&$X4TT zEx_L(W$MpT-rQ4g=G7=lh>>4EkLMP@A_vHXJRzP~ zQix5JTn+-W02Y74q@=@sLKxXi(2Ypv({K-VC$uA#5~ZUt@&a>|O~}M8C;>7S|oT8B7i|&c2HLe z)g0oL-~{Txi+u8?dlp274~$?r(kUna=CEuLpwIxv%caI|m%<3BDNPgr3GpX@2$#O| zKbqTI<^LLy6O2|oh#&v~Qp|ZmmTt;%mjYcRL1Ji#1`-RDRM+;vSr()mT;j6eQe ztNt&^hr8rAER(8f%C;WGp17_m1-<}G^CMSQfk@TZ9lvjoz+SAW$#OSdFnRN;G-yAF zUvIuv%$9?S>nMB)J&j4;^`+s7jG_z}DiSXo$9 zD@Hw607}IZooa}E3n*pEGY=La%crw5gKni}8ARAH1sxY+#fURBqKL{M`x0jDkOUQpDkVHd?SpI~KNt*B4hrQ8VGvloqa1G?=U?m@eE99_6x4=AlKu91N zIpQ8Ee*VMPS*=g&w#gyOJB!d!f3U)%$+k{MwEg}e8$doY6es2n3qMwt;6_veqy8^W ztq`C+0)&wc6cj1H10x4gf*jzdk#C-STS_x8*S`?4{$bKx70Jc5WGtC1CeFdW~ zj!GSwxi{NKBn`O4v7j21fU5+>){Wh$Runs3%x3>IDf*|<24*App`P~X-=au<6UmB8`Ka3V&9*_jIbAz|M8fdiL5`C+n0opBgY7vz zaq%y&Pg*hfFQS#BO+7*@-DsXA1un7#bF;JNb=MWi*$MsAPY%mL(*wLC3VQ#O_ifkP zqRcMMB$|Wk(I$WcB|>q$1jlpN6K;^6J_GkJO?V(e(WbXw;2^$f6pp&9-Z)G^jIP4` zr?~smCC!1_2{l9dr1pc6fG7$l#a*(UaER>$}J!h9SSTxeoY!3*-kix9hz#2;-baY)$D6L?Ch zi2wIjp{ucgSRu;doN|Pa7Fjj*0#2253lgY74jVBjxOAr*zkXRklK7ZyNp2-1yy!N% zaKOZlasJm=D7YXm6YWh%C#6b)WCY*>M^IC+tlez<^f`90sExO}QSm;Xl@og)BCuW} z_s1c?Kp|t|j}Kwt+Fk@_9a0fk@GBH)>d)!na^iibhQsC(kW{9(e?5N{#*WfY;MfjI zAulm4>nxb~-~B4>&3LBYrZm4f{Dn2$6H8bDQQvP22AJ`986 z@(7L&{xz8x3>N9sVvLg+-p)UKjq$|SFG9M`=kfMA$p1%d%UnP?gpa_2hUHOu7gb*nxHUd|B zgj{{Iia;-9`I0l3vb7L8kp|Ww*Zt&uqZwxE&j}ao??3@UH%aH`##F;gdJuz)rK7NQ3Y zWe4yx-M{+n%mG)OurzZ7`&EGnq&Xn2A9=sir;D%^V2O_<>QP%@(*N+)$E=>dGWyE1wOO(ekK*;szNB1SaA!E1M6N&b^DTXRM8sc!RTaiMu9F=NDHm^%3KE1}OBy<1rZ>H>$Dnum$7&=;UxAGmsdQgjx?RXCnv0u_cA23KKkHDG-vSdcY|C? z3hT8=VI4}2`8WNH92V+SZSrCB&-)<1Ca-U&KQ+=#m>=SIvBKmr+X@Lr>gwlWyF+aJ z6ouQCk~0i=LF!sZLvAKxbHOouuDRltkm7pHxj7EEP_51S`;M*UGE(KIyC~b*XQ0Qu zOJUdXz=V<-8BZmbd#Xk&ePw$*`)hVR|0$s0R2?MjjZcJUm{q*3W@P1eNnnJvJV*QrvP4^2Ac&B{Pj2~WD_gK z|Edgtce;2{+AD{l7reT8k0wX)W&$2PGC8o}f)v)>s!&~L2!%P?Rr%J2)qTsFAb~3_ z;zSq<@^3C4*!GF{64@6&-q`kiNj--3b2aEvWMpN%EV@qGp8P+Ylo{rrzU-iK^V!4EvIneeKw6T%$sxlUL>TvOoUY};LR z0@LpK*;d#c53#mXR#qm=3Pj(RMd?@>>yExxG%$$3v1Epjtj>l}c!L=oU7W1%4kGv! z7Z-*xVw@VB8FrPYxLHhx*xPBbu1? zkNfJ$x*_eey|wYt5fKsB`-P|?OO`AVxcKIFaDx_Y<@`$sujZ>>gq#jj+AMNf=fokBh4JXBYiHOzrKLIjL{>q6H6NQR|E@3}&?D{_#FQ)V*U9L|fw~OE* zQn_$K#(P@E%3S+D!{%k}ZEert+Iui&3+*qdoO}8CRq)o&+St4#y;gd9dKo5_N74G= z7XjiCW1JQ6uhm%Js+MbKAz;}w5jbOvQaQ5H9&jA!81j7)9$p)JcDGur$_Xrks{{RP z)A4~R!?gM&tWDH@;HgpB)7aa$m$Hf4$YMB5Ph(axXLFjHqT?(-{1%~<{2sQ?LR5nA z94|FHag1C7u#)L)LeVn@LRVhDem#Xq91s}Dg&8tp99j$KvGGvOl)b$Cy^R|;s-|8# z;eYV!A7t~l&a10Oa16w|+GDifzwYP)*G7w!p|BJ5f zAlxxNs{nA7ql3dE?96z_UbZN&lF((OXG6($%zR(<;<8J zaJsp<5yIbwaT|jGbJ91c$10ViW+ISzK_E(=r`NU#az4fl8=fcWHm=(Df_{xi-2tPIEaVCU22=v-8H%o> z?B@Snd;&8SF}7q6Bfa=fcko6vR5v#Pvl`jNa~b?>B^K8fq`Ci_5r27y_w>EHd#_xa zPHrZ|Y@Bik5%84edg*Ww5)yOp;eHV?TI1X~ zAeDG9fjuqxxuhP0dbG5wtLtRhRev)GXFb=yr zym^TwF11O+OH)yosh4n(5%7*NMxUNU=`W(N7GnP;5ivjVzQOueaWSOO?`_u1UyHAt z#GRM;?>0xk<<=|6>lUVb%_Q!JsAAD27N?&0g#0Ycb*g(eAw@yS22!b1@-r*KI`pE1 ztAUj3H1up)sc6Aqlf15pgL{Z=+46_HI_HSKR8{pMP9YZu2S>Fpf=rBJh^SM4M%~B< zp5z$Q>ZqK#SsKjyCq1@re?~bb3G0)4W1~aiwcQz3ty-mw{qdtfN%7`&Nhl&m?Ob$q zi3@G47R8cz99$kM5qIYK&F=qM~&ycQ~V~tJ{!ntQ0t_ z7N=VI;QwRny#sn~+xPKzR)jL*PD3OVl@gUwAtV}7X^2v^OVW_05sHemG!aco+B?!- zG_|9pEoracaTU+^`Fx)H{ye|_cszIW{k~q;b)Lt09LITHTP4^zuQhq~P1Z&zNK#Qz z-M|In{0(G@u)WCYdc6Gg%X|jiz;)4wea_9D>zH^D7N#52`Rt_EE|_PZus1<}6h@?n zmFuS$f0*^7m(QMU2^6yvma|^ie9W#sh41A8gtkgWs>Hr1WH430OPHMOjj2ZVCsBux zCfGyL`HLtFmhA;=38x#Xy@mSf)vJj00o@DDc-bpnhK5GU1&fjRMF17jw~r-44$}1o zZnY}pvT)p8Ewy2n;_0JD?{srGo_aRGCPFGZSo~i=9`JQrluX~l!%nmyjO_3s=~I}d z)hs-&01eyKL`Q|VaS{s_+%3d=3AMk=!-rLffz@x$3F5DPS<$sP`8@EeTT_kWQ~g?%A3q@Um}p2u5hU6rCKMntWXss1po=`06ixCD zzQ3@z_E3|3f6`L2*OL3WN!Ma$E!G6$RRuIJb}5j0r4@6*h6g%p=7N!yqGzVY zuvsq%it5Cwz*{!lICs{177Zg{WG|&Toa-nt-mImqJpvW3Q{QOe;YhY!H2Z@(J*8cvjyLO#?{P;0hW6X*0^7QoVGS)@T zz{mr<|Uft8x`b<_S!{jV={U2}gI zkjdwGIf1@O0}MQQq@x!SuhbdPdja0-nmC{^Yv;ooUwN#i*ARLyoVW zVwPTbQzFB>2gb=KpC4I@Ly6SfIXyj1Y|hou=g&b;2-niml7`61U^emda&BH;Bpz#M z$QJ6Mp&>#O%lsC1Xa{h8H6u7)*bPLL(D`W2O#cq2$`B{AKEuW;+76cW@D}^2Qj@82 z*^C<_*gA^XP|xjWCP}?d6p?k?PZl&Zh{!dZ&$yw47f-W%d4bV`2M-i%ZPP9L>o3P7 zo36uAsm5QbPP(Fj^plOhvbQJJ?z9!U#WBf;yxtEvIWm$rw^p5>dNy#x1C0p@SVltO zgoZp@b6RfY-SQ2Zbi`7y*`|*#Nv(w3cb^JDsk0V004f7&zCY^rl}s}M^cp|!K+i~a z8S0UyREtW4-d|uxc4N4mT*Fl{%DD)&gh=v^0W8kmqhl3d$$u{2MRT_|s6h~Ng&j_w z@bw?hx;adF)mLs6+;;roClEiugJbN;I}K=zULAL3d|JyeH8v>7lHZxk^Omk`?w{lW z%?~ZL%|n2rICt}gB=~KRW<1yd14)Neq()XI8yg#GAh+nLl0x?i>FOtqqp;g_gPSak zog;)AFpQK3!WugO8ga`5vh{p=ew*M2009Fq{wR;1vxA$Px2NM>SBJ^5?l-Pi^f0Lt zPdn&Pn_#F6%)~X^d#)cTaj+Knk{%3x$#zi!^vz#tsAHcV$T7-%G{^_fG598=A^U$7l>`93`{OhgRS zw8^kbB%ObA^7Df~Y|Eb=xp)dHAt5P< z^AkIP)bk!eLD8V^!!@$(2`w}NwlNYI{ea2(O`9Tc4E5lpB%_dUNg|IFq5eqmh%<^T za*70R_6S5i^2mYV1M0jrutn#2aahL4l(4g~C62(>ebR%LRqQoFGXXRcYgeMlyF!cFVhAy&tdcb z4$eGq^KuFPkd}jsyfQ4#Rwv1B$`ZQYDFm8{0PbWzpx$nD8CO9iQ_QrruDq(bvr4<6 zM!ScH#sFL(>iMtkb&V7YpVXE7h^(RD9>S65LPN5ThlkllQ}V|Uqau(EXz1t!Szdj@ z2x06j?&23)kv)}@Oq$GF?8ct1?A$_}W8ez9vEA^)$4tdEgNJXz2h#)Ns`9IoUhN$n zxf2wcz_73|wr$%IV6U>nNTkp0?@pJUu;wQch6FLe5t$nq z+23t3^>LY-Z%|+Afr}#@pQunS3(IC+J)d3f^H1@)bec&M4x`BOxOXpK zrvG1IFSj(ZBxq8Df>-Jmddp9Oo6b>5$tYOHz!=_L*iPP_o-gr<2voKB1vgP7N(2Q3krD>z z;6bZxwpiC<h1i*Ww5 zd=I4{3jeWt>(;}dgZO|V{RxUBH8##ICm-Ku^8nlbGfpi$Ov)k4^o78q^hT}v(vsF4 zIBg{U6I_B3foga}Z!nfnS9l}k*_vs*@cCSre~1>O$aX309sYoYoGKKFW$Yn*1~yJR z?vEFy?IYDI+U;UU7?Y|%cE6JPw7ms9H75@b&u}lIc*GGW8V?g&0lfsZ%dsk+9v*Ds z;^HtsBS=UAs61i^rb*0J#qcbP{`&nJIL{mf&<8bhI??VLqu}=K$B3fHu8)pm7iVXA zJXL~v@lUV!RGN9W2TDstoW_G)qA2x?yt)0uGC}Qpu9OoGeAN$rhTvUx&MjLUYhU<- zB=aL}v&2?p)odMxr@E~tcBW_O&1tKvyRlgmjEwqZ%2y}vm``MbFrvfgr2yRz&vLcA z+=M!nTR)U44|XCo-hGn&czkLq3h$Au0I^UZqbw3)eLFa!gqLKFm#jVo^k(Dy@FA@H zz9gGYq+1DA9f-DJR>IJ7azJ3k=^PJO;^;uLdbJX)0H_+c60Wp>ZlsuWg2{I$L5wiW z8uk;fx`nLsEU3ga7HF#9&-Xw7aqPS9hGg(C;(b2mOOi=>SL>LL=^%H)E>Q_yODVxX zN$QM|(Q9HP8CnPXyiXP*8hnV}iRm z4t&eta3Ix^#rIE#-4Fh}k58F(wWXp>4OrkLDTd}x&HQW2rXrl?;lqcMEVPdaQ3Jr8 zProitpb{XRBBoS{!i@?LPHbKY_zlE@h(^J%lipkrB7^A)AU%k?iI!RD8PXED1f~`n z(EQuS734deot=rciDw&m=G95EPe?!^4PH=Aq`)o$-}G>gX~0iu6gP_>o`eMTt7UFh z8NJ^MfIH^657rJ}AT7~K2sALOcM~cUz&Eii6KyC!8R`yC?Jf3%kP+je5oixM?0^Xco?li3O4B62pN?-8;|WxMOl%llxH zBJsEhF$J>8*4u8$vSpF@J>+m&4mQ6b&H&IMOAl64a!?jMetX&B@VzGSHiBa@nvD*2Bg~7ArC2ZBuuU}ONw&9RJQ#+<_3EnDn>TOXK#fHVFn%tY%H7@F#G3&Y z*7H@kk!GxXxUqu*HN0JRtpJ;3-OiKf3VHb*t=j}Ig zeqm}7DG|1x^em__Nl+ug0RcR!^>Wxd@VXc0*VosFH=u%)fXJ}`IoZzaJ9qZFi41(gets=xH%W-D)r364uOlv9mRE<8d0M-Q z|1*v)M30oCM~~{^JUfdCjZ{ODDPk5*gtilv=>!YDv((vlKa@fblEv?Ed|8-=rVvxXM&RrJ4jvF7y?Eq! zpa-(u)k;_4?I>3p%|m3RXlQ9O-#jGlKGI*9Xru~JZ(Di8Wx;44pIYuKRZp7)fC7>% zLdpV67t3Ahg82{iX&PF1Sf9GxI&ws`%#P_?6+o*=2U0H~E;6sIqU}1~RBFf6!(*i1 zl4&>3H8Z?j+@n9x@FQiBvwSZv1>ZBz1Nbo49&U;+XPq=!bN8`+O7EgFd4 z6@ZLYsKr52CO;>>LsF;{lCrbZ-{0-YPW8XqGgtrD9MtNTF1cNBtWxM_uXNr9%Hn$_{kmAA+(}17Hz}{3euZ%~ku4=Bs3u*TFfd!V9Os^!$a; zWwJ6dXhehpg(GkZT4VD%?GiKkNf~hDIafY=#P~`H>SGBW=iCut|Eane& zPDL0*sB~bwGO+qvul)+HMNwo@wIa!EX3~P#+A$EJJ!McQJl}Csn$_T0P0eRVjvOK1 z8#1uSsS8;f4^Mz)vE>obrOd^+Ju4o)+-TkTfNlB~WX~=kA(h={U!Ml#MSfY?YD+OS zhMYh&(1q~FyJ63TM)Q|PBm-}U7<_)=bkc|C4Pbr`>~VY~k92>D4MByGfHG2aZhAPh zt-TH@r7Go`?tGo`dvCT>xsSf?#~og$fm!!oF7m|UhCW2M9r|->u<|2cwB4W1@891s z53C2|sfQe{IMq9wN zWY~;h5mN5|MvQ-=iyoXt1}&KxyA;DUg=r|s2}t=IV3SEH*v&y{-AF2GKo58S+lw6o zNtlJc4OE1q01fFacsAtk9s~{~9@-ME*zogdmW1qC*oG8}tmgQSuYN*TUl6+X{{7`R zw$rR2-9+JJCruO=tUET$>kZ%^d+}?k@$U$#Qf$mUV8Sk~t*|BNWtJn>*HOQj5=kv1i>9h7MJW$=clU_phi;np*DH}W zG{7l@KM~}yrx0J0Wq|NMW5#ndSaKAf4^VufVtDGdQ1dcNA31Uh72JEe7V=G?3eqT^}AZ; z$HHf?@Z?fG0|D+63QCkATEeuBS)e~2fO!4|pP#?mqU=KRfkxF9NRFMl$&}My$N&KV zAARr-Q1$=I$LTGb|NStY=70wz9Of<^dpjJX?K^fbN-sI52h>A+x|oX4^H_4TJRmqo zpGVxy56u2rzkZukq(Ye6S9a?zxBUHpS!6FmqsA^FAKC9oiz9ZNL34Tv**T*`YMR%s zs3<0Fz~(3+_G5^c`dMh;?1is+KT~W0rn>e8fplj^_|xfwi&=agfmns88@U{$QgbWcaF73qv5}e?hT-T$MvN zulq8N$1ok6B(X`;>i?N7_#5EaNdQBL>a$*R@0TMG_(;frfD;Ln_nQebUEloRC+N=O zc<>c0R*e^hPX;CTUUhYM_o+5OKi0o33wo5GQ+N^~7RypY4%C+~DtNIVB`Ky%v9Ym# zR>oUoI(j!n$OZj%-$8H_G8?4%BB)yO5dKK};rzP1P){)0P|n z9*x;h0ihTKDnsPOo|-rQP~TsI{p$tqCV(`#cj$trASqIT|D^K^_^m{vq4;^2G(KAJ z0JiP{k3ET&CNkN)Qr_eoDqnEfP-|=_-l2A|R1mk)8yg!_hPgKGVA(V;ZWOeSvM!(< zR^TOjc$%uF#t^Y+3BdmlO-c%9U*WQ=$NUv_kN z>kF3|b3RPfDz5GAH|r2K=&`%q)@z?%+Z3dnxEFGTWBFLcvH4&DLR-YL0Y_U`p z-D5R6SbWyv1wtTE9U!`N3=TRpOf7B|gLoB!#qxKf%626`4ZFi9aFF}1bxK!W{aNy~ z?0`&yNO4N)?h9$Zqt!n>A&!H{s)=fEJlJ6j-L*(_Juok^)ZC?IiG+cu8xAo>6xZD< z6vuxZRKvsBSBR`^qBILEeG*2Z%95ld&7CK>zz3qwJEeplkCwqF{{Twi?z zYl**T{ZrP4nkMk5QfE$|{$$*rzt3%M^?(3fqJgg1(|hUhEwW8AQc{oEajZIR&Q&({ zj}HrLHurrlo2DNu$sMh9DBP&FYFlbUS4HvMYuD=3r-Do`Ksh}3fdomVshI|3>d)8Yc6 z(s~j^{^41f9(=u6`&`M+g)cKZqb8V3J$wmgD`L50>Gc~o3{bOy5|#%p0y!KK9?oHH zy~)OzitHG&&+X|~4SVxf6nBduKsOmYA1&MfU?ntWJ$WO zVELp7IbX=Q(GAG->DJPfziX%IU??j3fDo1}IU8cA)V{3WR)!_I1C+gC+y;!z2i+mf(Z9O8+fXV*9kzA{3Zx^Z4;WAc2pT!6))Qx6S zSus)Dq(Dpf`1mMy)+id|DnVWPm%y(>0ua1s zs83o)!S0d@9~Mlc;cR1d@P@z%93FDPIPz zEsLM+Qm{pRGSN={w%;+zEZ>lcUOi5yl+2(_d!wxR!jf6UQhM#$wUcnLcp^dK@ey~Y z>Lk3J$6>eOF_k^%pn=Lt2_Xr4k6jAaBYc8M5}tx*TwUiuUkTdnal6ZS=hk;TSQv1u z7gloNaQu(|&Aup9KY0KzJ`yUx=s=TAvGH6=bQx;dcx*H-JDiDmAFb|Wm;KKVk87(h z1~RuVEnh$XOCBi$obrHkWbXzf4rQZQDu5w^7^FZPO^gCY;piMAR_o-Ym;s5M6#-n==_e(5TT`h{4nTy`mh z4Ziv3^Zqt9#=$;+`}Xak!ELC2z|KaX8;7MI&TQCZh_3UlpB29vA_BDUv=(sJ<+es( zLMFlP(F81Y>H@Z@!QUSNx#R~b(3A}&SUi~l04phhX~77Lk(UZR)RIij2PJ)Fq&Tt@ zLjmz}K)f2RYT0CvPr7=r1W{Ns(3Gd);Z+3w;<6(ado(HRkUMZ?yZ8)f;Ydu_AT}kC zwZv}%8s7U=ImEzfguId%4K)6v=q`Y!hf?;WtgJWtQflg6y;Xa?Lh`$Zq__&TZ9tu9)15ZdToC`j6 z_Ry^CKyFP!zaqs;S86aUeB^eWN!ano;2i&-Z=-+rhBP`MFFv5>WRp56CB?U4>p4Jr zRTBdkZ8}Pr&dmnyPMCs>fprrcIsBebpD5Ic0Eo~TL7bUIo}3VwN8c@OZEYNy*_k%_ z;f4l@%s}x_>bIr2Z%^ssOYDe!h?9&HWc+T={CjO>bYl_Ofmd!bkV0(OrZzj}f;{it zy9Z`McRnQd*BCc9P2#fUkJiIj*6*O`c|MJTAS5;bboij-pUlF+)7+Qe z0`%9f);V|k_H7IJ6iSZC6Nm(r=nU~XTy2C#+x)JnYH$E%flL0wXH{i7xRfG2OQSCj zWX;*n%ZQ1_mFOWMIgg^Qfp!k1cs+U2QU;=99|#9_WIbY+h54`&IQE=Fq~`Acs6PMlt8{61)L{9Y4p$%5AyW*^fe2mj}fEIoZDpQ|Fe22&2#{wFA#J(5y1d7y4$DpeTx?kunlQ7<6YY(16r_wHKw zAU!~vZO02Hg9ee@6u{KQHOYY)Sz8|iOQ#$l{L0wsKE%!sra%79X$y9I#a*a~2P1OAS~(G`8ldtgM8YhZ9cK?!>VLzDzwI)?QG7X6ZMh z_@(6Je4x#DGvr+sq$`no&l@a=QIVJJf9`?sh=lV59EIzdr)?(r;v!YS%XPpk!A#Z#%vi|8wFaubiaz3_AGCEmlP zzrM?Z1Ee3Hw!|SI(g7-Mb}7=@iMW2Pu@k@d>6|#UDG2K~OJb&eb%!85w+jzofQDJI zr9xJkPoM+ZQ%N#m-qE#kPx_;n=>xE0oyNl;k{r19mK{_3-UF6@?(q)kh~1zt$mAvv z?B<<+mbrgCwPCoZ27i-udJyTFQONXJw@{tgNZTXj=o=RX`dWNM&9FmB8Fn^kw3O^= z-Tcqd#(H~H(zs(*%vHqeD;T3ujC|c~M!ME5Yqq9rlg`0yWCa z7677%+UCCxh!jon!ootHID1*kpQ&y~aLDGp=cN19qO)WZgkvJk5tZj9Q}5nsoCGpt z_gxdF*TiGM-}KFc6Mwt_7`eHpzbTjt=8Xs`*+mH%nM1ad-4Wc zdSQ0Qrazx?qgwF}GbtTWgz>S2oSp{G@q_WHn}O#Iu+@D3E$MP6SqQ`~kzOie$u7My zS15Zia}Tk95NZY@*UHNW3p3nex!pTpc{B(8gI!vepShv@*t{& zsXU5_Ic4Bv^tIcDZVqMr1yAEjca}#59MEb?P~jpiLS@0?S1P5Q-pjj-$1KkOwreT&T-|`0|Djj-Zj}ed|I=?MC@Ghks6AMXkU204%HX zWod2nd5{4Y-0V`8nHmq=Fur}u5M&izKp1dV=eXFVRLl0REB!p`$&V)H0Ii8-PH+TW zQZO&3bdr4nT}_o(4CGpB-%NJFfVhp!7mSNPCMnrVN<96qXS?&d4nZW+3>uyB`7rG- zZLo$W5)Cz|g%(7^-kMVL0OkY52f{eZ%%TVMe!JNJV<$V#j89C!eV2E+ro6DMrM5a& zg$pXOb$vA27Urvxksgam?WB4+ETxBs2gz+xg9G1td)~^@{=C(-Fjk;oH{Fxl zKH!_6g74TyaS8BLsv29KDHVd*nTVLOx&+bn8pu<$3&q|FRdR zpBj+1L3O&MbT;d7k;zNjuzq;Zgl1}@b9s5xw5I(m#tJS%t7L-pFpue_x#D_V(&h_#1x8Yjjv=r?WU59=r}U{)l}uOC2`c7l z=n9)d{@MV8DC$_mBPCQx72pH6OThq?(mluz@iq#+6-jh}pnKR8gp}W9QD@?@LFQf> z%$$9bv`$UpVF4Ja`VTfVcikB5DfaLcCu*sTknFcm;$C7Wem1{&lS z3Ts2yUWlxKH}cMCtlYxlh=jz3_3J}`Cy0-eG`0a$|EC9>2c`foPKDzH-+S|%kHmR8 zgf~)TDNdYYs2|bR!A5+{;xoV2|BD7Nw)SN{$icx;e9zc1Dh)nk!ViKMeld*4CDuv~Dd-(lp&dq%6?-t~x6Jvj!~kMM0qqA_!n2 zJSJ;a4JL-eK}n(ujfi#)o1!mdL}L3cU9#ka2bnen`PvXdqo25gy-rqk_90x1@-;EP z*v)yuO3-P-_L^sxl0C2ZoQ8oxkBmdMqHlP9mA3MG#MY{&*S}fLOGe5uX>MlI5iz4( zZsk$uzRv8_g)sFQHR;OBTs^(3tCYJA&lGGLeqx0Kix!w~#{D7iQ4=#{o*N4x_uK2U z5PnF55UF4-2Af5TwdW>lvwmSTMdR7c>+zQeJ25%-VdWlQHyvd%9)z7tcytnub{=~I zfrP9goG71wvG?0gU&n~X*wcB5g3ZCNNN)!Wqh#x|6BCHqyGzasXJBgbJO*Ww=n707 z4ok-*I?>N@vbg|pEV5^OJ)21wjA~2xTpd9oK%T!;S%wv_2 zc=$aTECBAkRNZmk&ayKiNZXO5gA)aY0%(^jH_}1+fLm3KK9B@e1bqp_45OM@E;mPP zp-@+q;GZEx1_rH!W21Y#OimUet%b#z=oKA7Jv1+G3mEz0{<3gl7V`K-{IjU;lKA*X zC0BpwCtM_07i0Utt#xw&p90GctdzJAohyQ_Fu;9=6V(539s(Z6#RLx{;gk8=#F9h! zU-(}x)eQvq_CO(>cSwOLg?Tds+p_0xJ?d}SBOpT&(-aU;6mIU0#N(|S$Olp;WGKE6 z1I-T9NKr)1|Ekz8?4YKjp*aJyLgDg5&oRcf0^^0M-d>b|*I=HxgSdxg%ZtK{lw>a= zD#D8i5=4Mysr4F^(dd{xg%kZRHWTNV4LHYtfFH#-$PEQVLlA%A&@mu`*aIoFb5G^x z<>}1ca=`Pkm>$3CbocH_4|2#6k4F0HDnmD+EiV++Gm#{`*~z$WGMN|{jW{w1!w&+n z5?P4cF9St}>srvCvO0f;RrH1;`o>BccL2s<2UTmki+b1T!pz=-sMlGGBbf^5v|Z|V zJq}ZPn55&@$kur}2woO^BDK-SjuRpXIt~z zm-CnKj+Kbs!=27Qh8|6so*$e_jh?b=8Dox?ubpLIrPNlMld~8u^8*+Jxf-#Jv}i3~ zzWfkcrL|gi=KFKH?lxX-A?7DBg%SME5Uy@{<=YymwcVOf5jxUwUP)SCJ>ibE@>6x5 zdl=KT<+AFT=KZf`b?vLgn+FBH*}2|;QIdm`Q@=8^Bqpz}yd>ts*O{mrB{6>bdV1MS zX;z=%m_1xnTvT-A%$apa{!Rr2C%g{)MR|Ef|3M5NCWz|;?s@2UdE?$XbE{2=mU9bVo2b)qT56@SKpdi@ zcx8Bwizyfa{s9G?XP)EsMk~f|DL&<~A2tb_b0816Ao}Ly9gm9xxK(3u1QNNl9H0LccpYn-@m7VWi%U9 z(hx2tmFiE-8-0CIYAoRHvmVuhf`We`)dQqv!*1u5*phUGb+hP=J9u~MXaJ5C2T%8Z zeSCf*Z8yuTq~@ngO}X*w`*WoOk%?FItxpvT#nArwIaS6|`wfTW)X$&aARc-6l0MqL zol(!HV~7-kkm(lUE#*R2Xy4oW_qpFG6>)YKS3f%l$u(EABHFa_UYLCVwwFnJpncRM3PbaHHv?%7a&6Yd-G6l)Cj@VJGdjf#RHD8%gb z$_!Bxq(4=Jq6^M6B^zhe)Be*19-olpWQOSIXqU?}GmjoWroy%o5)$I5Nl8my!HUK{X3AUC&X~8hzd;A*;>V94YhH@&rNt_oICaW! zcsA6$Dbrz23>?xjijc$XK{&(q)yw(UN{(bS2E>%7UJyhJ_T#5donar`hKecdMsVJ2 zbzt<&?)Hf&nG8g$aSY#fMG2z~^@^y<{=Ig7nLbG)vqu!rB#sq%51#T4h+2VjS5DU6 z^BxfK|M>A^D=cZ_kWE^@e-Doj=4`fN?CmY`9%tVDaX7mYxrXMc^j&O@tuW7o*p06` zbo5Z$wXZ;f@){a+yLU&OO%lA<_`EOytw&U9UJ?DH_20%87p{}`<)uP!m%#AHBIl>B zL#jC{g9mb7xa$sK+8o($pvM7av~z^oZu3y`ZE zi`)Na&;P@}o4gN{1c$hAmRY^Gwz&WMqoAtpzG_NT)b6q%(cL=Bxjl+IZcS^xjd&a1 zwtt7{jbGUqw)q2jQX8eOkktS)tPmfhoSeDnhp%pvh|d8NW{Rd=_#qF+j2tYjm{cif z!#uEKz`aX3AN>9sB?zPYaSxPc2dWeFiP9h#Q5<1+-XbWd+%M+NDt>l4D?Xkcm9k5g zZmFLWMhqpW4Fc6tD44(Xy)w-Gc>U&MOqgYCogZ6aS7qyz76#M&N_mR@B!&{$_=t3N#XOr@HVpoXpU6Wv7 z!X*3*(Cx8aVWo>=I${DAc^+0WcIpuy(x=iUCvT`=V0}hQB^Tddq_%Vy)o_%~!|mk% zww>H?DwUj#)a2wXxNI$IlG0flwyDxOdpfd2B_%^%zg~sXC(J;DTige%HHEf62^bwm7_6|ZTIe#=ya~tW0mNl zJvC+W{Pafy!OkrPQP_Cjz^mm!uU@-pQ{6X#yz$o;UylW7ea?>?$G+o*PZ|-ALYal( zk!%gP8W_aw528(mPFGh~8uQ!2gn~l{bq(R9{l7l;9xMyiuD@d-SN250uT^O4!uP(Y ziJy(4zd;)GU*N*(k~M0VjEz_0%6AM!Q9OJ02;1X*Q&-oX-_$##M#IF!^!h>uBb-Xv zC=G9dN@c@-gb6|G-tnW$bPOiGc*dN#6lR)d?HZHHx`z*3{8HcY%ydEL-e1^Znh*!>M(;;6n9 zXrZAWUnKy&;;+B1*A%N+H5@y%_inl&ExxO>sbznlRqDI=^ae(4VLD%p{o1RnllJHB zi&l*NIK?QFlAMfrSJY~Q`8X)PWq)!BH*(3W?ER^FOh=|T`uqFKc6=JdDBaU)YP&2M zmXYfb5H2t2=&)_sa;SGkraKjL=vM=yP(Jls3qBGMbA+#}H!ix?6-Ph|QVavHCS?{Q zFu#FStNwoB!Hglp!a)fgsj061+A=pQh%0NUtgNik(MWPaPVUNn@rcM;X4tH@^6|yy zT7;V0owjIERZzGMP^}5(Cp4 z+Vt^8dqo$H$C@=1YHDi8lFM*B{t^k;xT)7_rE8!{e;)Hu<7z-mbh5NzF%S-ot};g0(CxO`Sr{e^S6d z{Cg*F;@X|(D7DoExV{F3s&(cLM=rTP+29*UKE|16bhQv^6^x7(aEAS zbsP^I?UTk6f>)Z4nwjlIZ7;8+{Cb{L~X(05cGwns7!j>^GoCre$wbUO)fjOf zOLM)h5pn@UaJ_kO@w7quOv&^v=H{$OoT8_=O7BZULkM2-vKar8doeM40s;cmM6W3F zdG%VJJ-ZRK8bYybD?*462Ecqv7qmzhTMYRi4-5YZvoub;Iswk0c3HjI!c+` zJ*uy9DtU0<$7_4CyHvKqNWKKeW}V2Yy=TS-TO==D+=}e2WD-(17Wr{Dh<-(ReLdsz z=g)81S$W()@fYO!Y@l7mXu&+))u+(-8<687XeG*&#uSD@bzP9q>Hk}TnArg&I<1IxU$0wox1S2xOV&dcnKycvIoA7!8 zW`D&KJcQi=KY=NV^i`YozO2iHHXvj>&Wo0i{gF|Tku)eZP0h^Ckc&PK;XUGlA3jV! zr8qu#u#&t)7(g%5daUZfw9gy@PNDc;1ZhTo1$<#B3UAzJVO+aut;B`-(^7#*W(sqK zEo3FFdoMhE#~8p@p(A0bk&)3`Fm>r*>?j}mi@$x-!W9P3K-A;${|*HY&tbtaT82mO zDJaF9w-<9L6ttlWps-vofm2Xgvw+hRv_m-L}Ie<;b-bv1T5 zy~8Q?bp)eYT3VKl1`1p3A~vPbkr0#_S|F2LvVvbnJ$v@7&b>YjaUD3E+Z#h=om*R5 zYv>|fs}jUlNHkr4;No(Is|BM4;_QN%uaLrGYt@7vZGR;`MR65B(t=iuz+!EnuSCUv ztKL-?vg8uZVvnEEoFn4HQL{t#NoxlUtFB$W`W}iZE(Lf1ro=E|&#>V(?OxqZ<*z?x zl|(z0OR+z4N=s!tQwwbY;I{7DM-TbkmtR-bzlhhVHxVjiMapJY);-r*w7!mP!jv}- zlAm*1Naw||hsRa=G=|DFP_Kas2+7Rc3^gSBXBD z8;Nnq#e1hZ)GacJE8Q27G5D11EZoxj%Hns({QvRKq!#wRn3x!W3*fI>J33w|sN!tq z!(ICT)vk1a&|36lvyd(q^PZ{|P{|J8xFJmZ?>E`5wDQZr8`SXA28#KDGvd* zar@q`v8I%3J7H3!r6gMq?*RF|GD4Atf_m&G-uMOkiOad8APjs#jGx&A9xERd{}70+ zUEUzr7GsBE2&M!;`<(-)_j2HNV^sEQaG}t9*xkP3kHQ(zhCckiME0>6+~g!#WvsUX z^!7zJ&GjlD{5ou-&=Vna&+gAzHsxytLoh+3x+={)_0*rZRw}+Z5i+%-0~{6 zZQQHPjClWzKmY10&Qm36lr28RD8ae)o_YsaxyB;kyZUgt@0L;Ru`8{_xQRs+++XJu z6=mpOq-noD(_Y7ZL-6)?IwfBXFAPx2UfAgAs~Gn!2L)Z3!mN;P;=l4ja4FN2vijMx zXG>1)iZ`sKC7cmF>h)7wuVsj-RM>S@-bvrnb?xODlqKGTBxIVi$Yl4d&hZlJW6{;DVJ=-?zqT1le z$w?jYSq27%<(Rt>m&pUe)nDKx7-g1UaUNrkvGe^mzQ?)R2mOyXkFp(x11i4R=XVG% z@sEq+CkXh$1ve}ljT*uh9a?N@DPK}8c7t#6GvFV~*368T~c`?U9|RRXDZopT!VHw+pw0<}{pz>A(@+Rs;aD)%!~S|6IcJTM`#0bCG{ z?RT`Y>W!>?9^KANpY_KJ5G~t1d=nFqxb4r%`gG9J(%zV2PKn5Gxdep=LJ{}ogV&!W z+b213UPyAje?pL)bC_?dOti~tsZXU0+WI{j>&P=#?>w~23#gw0rYje5AeT1m*xlrN z0<|4S#Fzp^tY~p5;>qIpi3^|~pJ-(baWu!FIP@3 z<&i*XJGd&29lJ3Y<6XA8ld-LQzu%*iuNd~}tsy{(4D@KK2?*YQ;u?rtvZScgKGHh< z1IGUI>F{F#;`!s9)%wK;4+M}%r&HtBMZW;W5vUh$STf94ZTQ#GsUG$nJJ^JU)%3|V z%|GDrXhr)8YQ1Hf#qC!y`R5IoTUZ>!Wjbevh!gVaGzL=S0VE~V2mi_`E2Bl*=SR4@ zcriQc&Ye50P;By$a&l>1?|&L!<`<#i(AU@JIct*Y9gYo5W=O0iVj*#?e;)O|?oLHP zZ@^0U8r(tFaB%+>wddNkYo8aujgehIMN9W&b>}Y)whuh20q*E* z%wYUSX8SerN+QcYi+SJguRGDumJmNIA3n5(f#E*1TADSF_jYPu<#mW(-5?`sm*~zJ zXm!N(9^756$O3G5)XpC410fumT$JlM57PXbd~N|Qk7Fnu)B^y z-<7@m^qa-GlAj5ejfR#Vd)*run-CV8yNzDESK}0u@}vMRvcdye1~$~x!a^w}Fy%a} zv{Op6kN@PbZ)O`a2xlu(Dq}tMV!>}&|4SiQa2mY~caX`-g15E)EGQ_@>1`06dl)+N!TO4{ zValhO+^bsZ#jaPI*%x-|J9Pmq>QCqwWrlndw)gL743`nasw0OFQ^8?SA=iPD~+#hs>3VYD@fR^Y9Pl(Y8WsmymvnScksV}%}beNt%0Mlw8z#M z25FYrXxo15+2gi8hd0mq$wK%nFjIAAIfPNormzYfw4Y8cy^It80W1hE{mcfAZtd(0 zjTc*}>{IX7zkp3Z8+O7ICr^HWLhyB907((j6Quh)D0DT^%LR^9xqc6rY5;%mNrG3{ z4jkBoQ3XUTgFno)HJge;hLZAu1=1P0VQu{$;vB}AZZm02zKJWabK#vi2!5uwVYvsSy{v(bs-QK~Pm&`+#NLiu*IC?sm4f-vQ)zp` zchHnd;3KYdTqi>Rekf!8-$TK_`|PkLNvl(1k}@)@7s~h;0Uv%e2d-igSVegh9PAFh zXLk)ZR4Fpf@j#6?wk(lCv1&)L+cy-0BzkR`guzo;pd#n2#_7|J zm_-|}avX&TvE6a0ygd}l1!fL2hKxm-_fo~A|D=I>yjw>Di>iq^MlY&lejlj3^73*zG+Jx~ zYeI!mFb_U^UNjbAKX`h3YmrOey;RSfxka4CcBM+|aa#_dLr6-*g!PT+{dPnRk0EgG za4%6GYBRh}*aM8skR4gueF~urPXnss^XtZe-}Unzxj(fkR0pHWk;nI#uU%Qm*Q&4z zBXKqh2nc}qTq8oi?j}CnDZf`2)10nPkMlJ)HRaMem3)L(`z@Fa@JA|m@GP|5pMi_f zLF-7~EZ)(57ng7R?>1eW^I#xsSbY4x*qkjDbx+D;DL}TgU~q|&%O)Ah0#9Z#Rs`mQ z;~3oYIOP;L>|=RApsl zi;gzzMMaBnS}g`r#8<@1B&vbjz7b`{!otD_aP?+%Yh@)uJFox+7S>$&+^&K$LYrb6 zxk2~KbBrmwmNpx%1(b!+1KEXzD{w{L8UIniBryT6Od~zLLpZ~;xLIUVy2A!p)OsrQ13fKn4_YAN!;?J5PXg! z_$l0c!-^u`W#nkyM-*cN0|P?#(?ZZgc328sdig7mY$6Zz4z(hC{e^wIF1=-Y#U2|Q z8}L*2S(Z6Fj>R0E^m_7S@q8(seDhHqgP5%lVvH$Tu>eZ%WBZ_Oa7nw_0bEuom}|jE z8EDCJN2ke`FJH()VR-N^GW(EB%u-1<-TL~?o2!_@Lx4WUS&%dcMQ^LuNj`Mrj*pMG zX3fp)d3lBtw?)XSt3QO4KhGWv>2cFd`FvbMPk#se=5uf}sFJnrNmS{`iRGUKmG=BO z6;9qVN)?m>VB~`0;@iQ&tb~V#=uU(YoC*}g60l&9M*t(Kyt@S3<1Gkii0T{m)9w}h zomY>4Kqus3JT(HGF`i$(&-8x52Y7tgNc7}g64sOPgosU?oGVZRQc)n8U&O@~ILRG0 zJO4{+{kJb4FF4*u0e&ZM$4@-&7_?BsXZM^6Zznf5p(SA#{d2!#%gB7$h@7&vk2S z=QDp?9hljoTO4fD(Z}boV}81qb?K3SlH6RhB05jdh^dDy>=Z3JfWNp9GLO z+Cpz*V8HI?n3CdR2`J4#D7WDm0ZkE|+adR_N*!7R(t2>kB%FZQ+oTTMv11tpZ0538 ztX-bP9UMG7cX83VmTIN@6^z=-M(Ns}!3t4_>j7cH`G?t zOL8F55#E)INq%2Me|!5#R%A!0pF8-I;&j80#nrC6PZ_X2FN?wW*0!g*L2F-f#m3G# zy`MUNnOWJDD}qIl`>${5adB}HxFNo*gTW8KAfi*bIg4@3tW$X=*b3F09(vg;7E7lLeq%;S1E}IImLw-HZy83H68{28r6~Q8 zSk<%aS)d|(1h3(OLkV{R1EM}P#TLDoKZb_hV;~kE`nS=x#ezJTk6uQ?MSR03A%kn` zeHs_xE{dsT&R2SZ%Ny_v8&fS-!lbq=Mq@*>mEWLUideArAdVRh7Y)W>d;~MFcJpRh z3W1J%U>FGhi>ZI}x)b&n@+A4yN9^szHu9+7$3;aMxuLFz%LsUf`gjYL=>N>vrA-oi zF$8D$TL{}gZuX4L*~+%^uXXEgVFJc8L>=5bidbD;VY5>P;~-4O2F}~!LPk?_^Cgr_ zs~7h=j3=boe`{9%{h!ZIj6S0Eili7IGn%tOP^Dz2is!S^N_y9!IJhAM@nYtg8dOjh z!5E=)i}fwq3T12L*cV-JxbxiI@`S8x9y~s8QP2byU1T+syx*2#KO;=Z#+;-3kA5eU zf>mhP`cPWB8bj|6V<^Ixuisxnd?EV8yyF2?=3=;%>WoBAsceSuZIrPlGAimZlwy=6 zM~@%>fNGpVa(Q2U!b-%gFX&hQX2Gpg?0;~^O2Jyj$VkmWL;#=(jfbV)b9fBIBSTz$ z@r_tg5LItjUoXQU(!Sc(-`&Q&d$&ZenB5PsjGX9BvRTV133(VQ3I6~rJK6rf%&>A6!Noh*Sa>)CF!$QV&c=96x=L#U) z+l{=eU}-e9SEfo#_wNh z#{nJjuH5nJsVE>WpkIcn40d!lfemM(e1bfY@$uCgoSxU`l4!B9K-!>Y-0nR(v*r2s zsk-AWUj~i09Zy5kKN~-Psx9yqVcWk# z;79kMr|a!%NEsyFRPK&whu;e*-NK{Z)pSF!fGzd&|C_{U*e>Dskt+3EA|d z#=)y<{uDr6`ie3Mg48+@Wh`@#{g7W2+7j5n?_SB85rD~m2+0&Cs~Rr*X}^Lq zysUy1k|IV8iK}sK2nq`Ncy(h{HP)3^)6tWBFC=6ejCf03;9s2oC~<|44i;HcjI1LA z-TO?yZ4!kW$rOYqmu&bugE8q=)k2uwyV;cfI0P&pQL z$QkJAIUZ%Z>E*S7+_i2Y{lEMRFl)$C3Q9{i^d*$Rj`?8jYcZ@^U(pVwml)8c-9UO^ zz~hahjgc2EF|j%N>qoO@yZKp@?qbLL{fr9DFCLb)L4pD$sWX(aW;Dz6dRA1)y5WJ! z>-H=)%>1zR*lI7mTrZATZFO&xgBK=hQ}_YK$qHv8XH-Ka2lA|M#$ZH zvmhBO!?6=JDy)ca6B3T$(n@$*F3-{2o-wQ&>G6l$fYn29>P_q#c`ZHX?M*(z7MH&+ z03)fPgQ*B)CH{hRcylKka3^61jsr#0b4&*P&bZzTlw2fR3)9NjELKHTRah1l!TkAI zOK+u}c*A$5sSM+fdV(<8q8*(nURK6*Rf21z<@z*Hi_5R`FPpR-H3CFLWIhTF2#6<_ zR`PUYvj~#Hdw{>UxQr3${tyg}h=R6*A00p1ChqvVQtjV9_abpU$N=rYtlSFcYA~fm zzxMBW^6Fpvc<1ie#S}&d^GHCkow5O_KiHns;2aW}23AN|5{RCJFmWFqtyqa|Z0lU5 zcMv=VEBkg!j;dvXCXK{S^W`EOp5){4W2lfvfRjNwZz07obpESoH3#CQP$1+y0FOW< zWhhgOM1TXTA^(XXnRKQQX*c?ab1skx3)mS`P#y;bx#2G00AULnIQ=OUkY)7bMymQ* z{H#ix&T3q+i93<*p&WV<9)2QLY|kD#7>bVUTk-e;WQ2KBEeF4p2GuFWIpE;__0rZZe~%|Taz}PNN%;RLdk?st_x6wf zYlaiaUJc`znH5QPC`yz)Dnv<9M2Xa~GP7qgO4(#(q(PEROA(4hLkopc{hwF3$K!vW z|M~rUoX5G(ol$*0@Aoxc*Xw${+`Eqoa%6m)eAT%v%jSQvMBonvOi_ST73>#Pwqb8l zIWlqk<8a~P2QprO#Yt{lyJ}T6_#MtHF9Al+q+^na@>_iaK)4^c<3^6q@K}vZ0^-lZ zF3q}Z_|d9?w3?_gb%cqlKiA!7GfG`Q=DGKOo|M!SL|RzPNY6R5R7$Zu0~RG;WjI_8 zQJ~niB~28JoSdBMf4tEsz4>8S&;YOWqhns0?b*3gC#4&LpQje4r>Bpd2!j~RCx$LL zcy4@q;X7SlzyMhS4AkbVFQ;jC|Dx6Coqx_J{E*|9&1KyNaNwu0^0Re)`QCml_I+vw z>VoA`Yiv|n@3?pAwbhO#P13LGjW$_DOhTyB8I{WOLsfU4{5l#QN&SWmtC6E9W~_k? zuzG*@&lP){`m@Sg_1Z*D2ivCe`^m8Eqlv;nU)>WQEep8k7H>14mE(u=eLYHagyjPB zNXK`SS+_k`^!B`>pWanIU|F#iko;@=>1TEY_%!>Rz4w8hYCy!nqxWu@yw_RK;OAkV z+`c8(N3cZAjvZ^Et<_&FjHthQEd?4IN{1!50P7vrv<2T-xokY}8x(0{p`Klv<|8I4 zAIBW8d)6wV9;68R^4y zFuCcr^KK}c2V>m8d^UgzfaYxY@YL^nm+sMuhOwbgu$|kmZ-ZV{^lD&ovlmZ*gUH^--aa(ioeVbld)2}!3EKNyGqdyXUF+rSX+w|xUNUJo1 z;m<$O_1F2-*MJ+-2vCBaM`BJh7G7w)4?;_1$s|J4EBpT!2JmW8q z>%40w%N#V17e{?M1MjCeFjD=YwL`iMR!{8`7=*ot!BphLS-kU)0d-*C=Dz7@>4d@gFhiGMLtsw!^Zxr63xZ^ED{WNLZ*m2CU03JvXtgxv-% zdzWbcx=oulmEXzq-0_8#+Rw}|eL0UrP*Y~_i`BIss%>ZG6&|9iO6BCn*8G?>sx44Rdmp>h3 zW?bMOH2t!+!C+s+2+uoCn$%2GEgjYj@A~WBMCqxXir8Sc0vceFRX#Z;|+t5%zMF>izo1hjv<-j;QD1xPD^!tfU5#KCX}z@%QJ z@svjnoMQCr?@ib)!v@fwYTU3#Ne%8ErdRJl!{0l9AlnvaLR?*3Zi6eNOw-tQz&W7PY1%qt+Gtc4z#d}M3$^s;Va17LwFyhst;hNd?> z|FkC)ua1i|cU!jX5A)ZwgM~0~$v?Fyx^D}k3+we!8MaE?;EmU>UvH8${o2ABlqYWK zoBLE>e`Y=Sp+Fk6lZr?VJt?4zomz>_$U-xi9$49W3jGRfSCzu!Fb|uZfPfJyfe|Wd z`m4$QNBESGJD$GT=93(8)J(>mfd91HH}fsGO^$EBWkXj+xnR~^&uXu+RX{Gr(xELK z?VxmzY|yuzA*gr#7lGuIo7&0$#HfIcJ5GYH2{-_(pjm4Lut`oqc+)|GV&2fL0UhJo;`r9z0)fA2GVx6WGLm^YjjGFJ_S zK#6Q0HUEz_o5Rj;@1au^31RB|zmGY}d2g&LN}6&6G`AVut`}qXe}JxwOlFV-WNqjM z>%cn|K^p_uR@<$8XQQm;at$&jM&SMU5;F=CT!ThlEU}?<^l-*&vy74s#2Em>h5L96(n@*A6i)@ z0ruCnCIzw>rOt)F#Z9T+#bV;_gqZ8a8N_Ah(qczM#j?l!UI?1JmN-2Fl=7z!X&rR_v(- zeuSds)vN1T)!x^T%uxl{SD|1X%I^W)NF=+M=P?*EYS%z(%B5Q5*3KPl=9>Oq4(c#_ zZi&|6-iLO{Tlu}pawE>LdA8lB=TQ`8yPSLHmL3gR{>*IMH^@UTXZ{$1!EROYCWk<| z>d@eJXQ;gDk>A)xQtj6$u3B;T6Y2EKOiW+iSSlKLTz*5lAM?fe9y(ymRT?I*SfX8#F!OafsxdDdXDIY z@9TYTHq^0i2dIuRrxR8r+ZcqZ^E0Q@&E&lf+ek}S6DHKi(z)@EXSSL+PiyIcW^Iz} z?qgx0nu0e^hb4N$H|P8Ps>y#AEC1u)C)&UN(br5n;icK`kZHc(ZU1{2D81}U|NPCJ z%^rJOFkg}p%^4MC<<*GXO!%Cv7&K-~ea=u#PIqNRii@0*g61ols=N^QY|S1$>QlF_ zf?QMnX-`BNqDp&lJvQ%4#~@2=(hbj|ybx00$K2dPeA=yP0Hm}05^q+>LcGMd&JSv{ z;)keI6@_4@vJahed+)KkJ7d--mj&kjS23neF=p2b;($xev%1E{#xjICeqLC05Jo3m zu&J#`L$E!PZo}8ncJu>We|^t%_zWRzv%n8vK#~olfMe+%8H;+z)6euCVOTM6)Q$4v zQ@SNA&O#;N4%7~46djG0UcYdAz_Y;a=d2=p82K~UIQMAw?hRlwxjx4_LR>8 z4luamv+=zjhHlo%b*tNz{-zQu+1B<*NZR)!>YtChJ1CV=at|Td(Dw%|n#?ekdC*Fh zC=}MHw9(BwE?WAV^z!O#)x(sjG@n_w_$b9r$jyF+aKR^*ODIN4$v&SeJf}^KQ;V}%M<&NPZVcjgVa#s z6vDm3cl3@{GDDmN^mb-m+9-In5;{H{cSExW7%9zXBY6Yp3Zl`#!jhf%zEGD{o!va-g2R)f-)-xKyvP32}@ ztdzC|gokF2N8JKly4vp1(|SVBW}g;*V-?w%y8}t-jC0K&K6$wv*b{NMx=c-2 z5Lg+ffBt=^UK!5*8(No)N?E$^;oN@_PYi^3a+~BV)e3o9IMZWiWuYfS;ndY$*|0?N zB|6JRUw;58`SDtuJS~s z$fWC*led1@?-%E1CSSG8ClI&jgnK%r4N^ox|J}kIH2hHp3w*WEX=anlJal^ehbrBt zUtcYDuK^br>A%U$tabSN?Uvb6vLe`E5&Fop{IdqL`aV;`S-^aFu>aJI6?Ym$Y~`zy z^4HL7HX(ELniS?3n7_R3gz!FlayA8No$-4fk-g`l<%}HNMzEf7(yT``tlxEQhxM=2 zPZpF3I74}E{6U78cL>x1EQ))4!Iv+qeSKTn+uO@rNS055 zz(Bk*6He@i3*R4du~|&Cv%krvX#utAZ^Y7pB=3ffTXa1oudJ7gHVo5vavO~4Y3b^4 z)8vT%)tmgs=ibM>eyvWu?Ei>n<;bHS+DadEsPvGtXX}xDswt$ZlOfJiy@;dZI@gd5!A>E2jM}kE{j{UyPhg@k zYsL;CX9E}h1PagYRawfP9hnndnP_Tj&i9<#ultU^|IxmT{HQpnv-FdV)Q7;Q97CID z(BLG+r%9bkMJQb_Ptg9y%2uk|I(mElVwrX{r>Pi*K%t&7GF0)NFIFu!hbCYbu#UB+)yAvm2Y!3JR+H}^9&qZ}V+umDxiISKz%oSc6x6oo~O+|}{2iH*D z7pRk_#L3ll;uH<;F3brXHxuz%d}xx-tP^i(gFW#L#c}0fx`&vjE*$b=j1hrG=;Ym@WeB1AA03Ib?YqXz(ElV3C& zX=WC~7AJze3I&vhZUP^HIk2`m2=X1gS(R$sy(r@pS`8%k%{;nhW z%Z7{!|De;z^ib?TRv_nm{ijQ2^PFpAGN-&%Tm;;mS*#&uK0DKro*rVr`zMDMY`s1n zxNQE7D)&FXIUZoI-tusUGjpLSa`_o|4O_ajFF0UO$Pb=>TeiT!Rb!~-o!O>AWW0tf zg#l#S&zt8ARw6tN)|mx0kiFTDsS%i6eoYp5WEjqy7Y!ZM=LU9)fKzwa>` z2AkuD*;OAd_*d%EB6SrUZEEROW&Zs6;37(u>%Dr0a~_e-h{{6eTLaEAi#gu9En8yn z9AC*q>3me%HgU$xQb}-|!4i3%uplmvoinFBp)a}~WAVxl6C+A-Dam+qGXP_2p3r7k zAnUxsz))^JbE|%qtAl4*s7GmUsseAeAwYVMu#+uT<#wstw>KagHUopxj~>H*8>Jy+ z@G1&fOyaQ7&0Eu}yM6F;RVc{q2*gIC8Myf5mety5QY>dwipy&E0=Dj_pIh8hW8KEw z?yZKtm$ZjSxiZ{GQo#Ba)t)RXo7FEz<8!yUm0Q6$U>Z#~$gjI9SF2U{{6UW5*dmpH zShQNtt_KT&Ua;EJZ_RJ^JMc^&^n zE#fKpwHlFJhQ;3wReaaD`JidK`@;WE+=wm}^|-<-5oL8*dXYsy2>>45*CyE(pZk+L zFWmNmhuTl9xha!^t*d~66iqqScS{!!`)$NUd#w8 zz{H#itC@jY54!4D0E{^~U_cvW4GwN5S1g(`rg6@}8x`F;cC_o=bN_F&GmOpko46wE z_n4TFlG0N21DLI%`;j>RT(^S{ADVPIKPZd(d(y zK>x^|yfaPO0YxzOU6)JkUp$`a*RoZIpeX(};@Yo!7xAId6wZ>g{4&%G%F-?w)je!A zGxCLxRelEe|NZZhisaBInVnCT=cZ3=VQh4ydQ~H1qgvHFjU2zhrOLLGZQNEh%BnuM zP8CDtS{>Df?(x?g->A{Jao4^4y$-kOZ`5w*nE9Qm#C^U|;Q2wdcKut%#hp^0OgTHd z___9?M+f^x^ws{*qZ;DE4jJWr@2+6tF0%f<9qagI9U8 z+Rna_>Vu*ZSw&REu3Y)*@ws2$zH{Nti!2+2nT))=Zdt|4(xB#PmQ_r>WY^kQeg%v& z$;-ser1 zMh2_JZ33s^UTQxD2$T1U@h6t@aoo=FFg=wHmO}_Fp(Mng@Dxz6nEZ`}3$u$wROQk> z7+KRRHV-dG>ueq{efG<1pR0Ws^#0|%A2XVZ7c#=+r(uH_Zx=$87{Yf(aFt2cDRJM# z|4)3pk^2dfVX9du`;npwfAI5`4IARiwiuel5Uh{@$f&-<8sUThzEpdNV6 zkE7JMnAxk>TRJkL*C}+?x0i<>F=l(a>vd(HCk|F4oDgX%Vy9v|qHqgi9__lYs(=2( z=YKMk2k={3k{aT)JgsDH*`hD{C0N&FA$Ap!lM~`pFD)I&~YC` zXimh;!TTl>v{9KY|1$57zme36?D_mw*&^%Iyv3=$q4z$PIpyhAgyvpR`DAjsq7$0l z!%A!u4vzKh|9aww6=iik6Iir1jj85kB0iC_8izEmLBXEJ!RlOIypha*ne51S+dGK! z>rM$TO7`~rbt*cJQ>N^fISTu~_wU^^mcNjn@Zy&M4`U3wt_(mDw{(DAFDy!;imB(Q zTQ(L~%-gbgb6C2r&1fKik`=pm72a5!v)iXtUw`V$Os-E7yDr^$aR`DMi(bh327m74 z>{DE&_I|~rN(ZAUV{;bVN!g21azuw76~{k8km|P3G1@LVTa}l@jP*HrN!;6GS1PZG zbZ^`NaW*fz3`s3FHNuL}|Kv-_Y@GoW@9lDVZ4ZL`cOgOh!%P%0Lyr5zpdjvxYrmpz z<)@G2)l^cluyQoIYF1$HgW}r;#2E z7sGlq@5D=Z3j3GUKJ;;(U-xhB*M%+pUk+6A>C`XJdsdf^h2i?oqnmtf7*Z+69r^6q z{(1!q$krlCF1LYTj6I)TqYfQ95RS)+P_f8tGLW<5;^2$1lftz<)lIx=m9%h?YUg+% zGWSqY3jJaiXrqkhw14>_CLhL_=@huPC__RV*k@vP1?rk8Qr`FLccq<}L2vN!dA!hv zmw$rN_-k$-o4Z?;Q^+x=p>D*Ld*(v*#rgHA+PU;{mY_?&lxcNIZ?2(nj+Y`H_x4B^ z!aVuY7>FgFdoD^GUD2)c$=_aH_O&9YRAXXNsps@Ea8hvzjR^1{hl#lr=lopC3p&r! ztai<@4=e8wQ24#i2+3v3*5*zgd(~;iVw|5qdPEGq*X36yVxGMk-9LQbyc3~chj?5* zTg-W92icE6NL6;qr09uq_E|aa7k#dm_Q{@KoH(5ag=3tyMOnrA5_`4Wgrw4oyY=rc zu9mXEb8E@#rwjE~7x z>TgMJJQ{@cI((T=$XcG5s~+;Y^!xV{xM**0$I7>ftw(akix#6!cTY)j@Bgucm|=ks zAg$OjQEWx5Z$f80C_}nWyzr{*{`S;~HWMhYCDF<0M4onzkIJ;v;6qEMo($+)w88@p z=by%6yF*~uGecupKc(P_Ap_=z987JrBYgsflvFMYTs{0=%xIa{dw$4(gT>b^gC><; zMKV)dLBak-Z}`#ljSCHT>or9r`XU0ehoQlopo7WEtr#$Z_4+G}OWKmmjm;@e8^L)4 zia7ypMi}42PkD}I5}QsD>le-Yn?t@eY+(t7TJxa1h7P%37dVd#3Tawu{Mg!{(mm|i zyK=LQ+9HZ2?&~gSa-&6xF?{431~;9_3rql$Ac?_w2;z&*rOK}~fpSwgO{BC)WU%@L z))rHO7?)NCs~K88h>zE{P$~IYI(@ss+ds)4bf@B%%Zy6RZ2Rkk=(%rht#N<5zC$}> z))jMydQ4o5>@zPgFFZ+)D7GzQw%&G31I82dwAG^8>*9b7*nIs=?%+Gxn7`V`9bJzE zyFb`+XEfl&Qdhb@5ne>?5hP?BGv2(ty^#lD6?EZ}CC|XvN+X|};m<(kdiAUrahWXM zeDm^v{aly+<=@g(E^XR$M`^b%BEMZxr2|%cO59nVTAnZ~XSf{hKdE4_GC!YddKIqN$d9E04nj;zY5_t&>L zWULYL8i4(%XZufIzC29O**)p(nWf1^vrDI3@t&Ltfk%Qlr+6&JG(z2FeYuZC#I89J z_a{Rm*wKz~nw(JhS5C{~sNLCiqaDwQWj!kj;!q&xIQPK=#s8qL$VLK|%C={dX`=h)P5o?hos(>^;bT4cdv z5NBdsV~3gF`H%@aItijl5kkZxwM$f+0Gax^jNkZ4rToKn^UX^ zp8q!o`1W%buT7Wi6GwvozqD!G;~_Ib=~2Zxic(q}(?yS(ttlInKW*&TYw1jzxK<@$ zrQ>&I|6-_o?fP{w$dC_*1V*iAILGr~2JJg|hboXVIsrE(9T4^YpYFE(>cv~#2HpLs?V>#0^59KWllGw0QxJx2CwAwRRT${A}tYgXFJveppm z|2Z&kO84w}#Q}M5Ek(SVQDinr;7QzoO2;o*iha;K+6b<+Z{Gnga~FL_@#bpyj1I>G%!texdOSrHFW!<&#P;hiJ}IRhXQjDi%fCB?zdm1lCy_(P@cB6PyF6kj5O?+f z9rfg}I~u#kUbY`km(jj#0i$Gmji+z_0zh)~3KNJgK6AOtBBF~=Nc!2&DhR^?^~G0| zf4IO~JjO$Q{VbI`M2Y^;$&zAnT$y`Mb`Qf)+%?yho{{fT?3PR`mN9{EVl{j??)A&2*0n@xIC{^` z!hN~(@?XAsbs0n~FeoUS^mzZ!Ku;g7q=R2ieSDjpeUe~64j;bVv6V(%(X|`W)8~@S zrzgZlxnGq-X~BJJbk+>*XsCuR5GS2cQVxjwIguo%ek zIcd1QflB}G**LI7+OnkSD zdG+=wA!kI-US!!p>z@&*63$r-BygBe*66CKdQ}sH0ys@4xa)Tl6YU4S*4!b@C86dd zV8Cxd>6UvCMu*vN%Hp6DC*wf9P0UDqld=9CvRy0&h|@Vf1DF#`JYgQFwYzEX2&j1v z&(9`uyi2~YRrg$2@qR(EIIQ-RPy6<-byqgn`|)@vaau%MbD{2wBjU4+F|L0p4SjXl zO2RMbx!7}0vRRQZQFGR`K28SEr=Ee}G*VZeufKty9$k4aT+;8K^TW5c5JyqRo+4Sxfxgk!Q zIrx-^c`ymDln&7hU#!VfnGc`zt>kl=?p6WiHD? z#6~bK6011CafiPt_36_GL2e5keZr>Z+B!3CRqx6oFaWj%d5RXvbVT(uO<0DFDRV*h z&FL6))s&hPpxW38*sRht@8@@u{MQ~!cVn?;=8tLT+D+KY<*hQX8p&l{_#K%W{$ zuN*Wh`9SFAmg(R7+-YsgZ_4y@eLa>`kjUwgHr^tB?3Ocsam~HZ7)z zK^Km~`*I)n=k32)+MbfrbJ3-uN3|v2(?3fIz46hG68oC@Tb2d*yl$Cpy%b?P_LIc@ z)JA{9una6l7d)4t}FnrXCaqGS_5uS;cer@`sS5G71zd&%~RI(^ALpK5<3({ItS+$pYJ`OP%ZCYFE@j5e~-%B3cXt~SZB{=Z*rs0Y2zi*OI_`-|E7buOsp`vM(RzVpyB zg0cXHNV9ciUKQ_Lu+`1;Wy{51UN=*EFqL1xWwaZk)cCPl5>~~>I;+{_IXU08Pmx>2 zR#h@^rK#v5-;Zbe1Z9T>sM)r1Jn%gH>wMd5yQj||%|tMsCu9;6yua{nC!dgT*I8ZC zx5oEnw$urMBelK@4F&c(pYeKg!1A?sa+C8yI?++FAJ$> zQnt~CU^g*XUK2DNlb9+BZ?^J}vYsRMv%u-tlqpVIBH<4Y<}fX@_$Ck;yk0>9ich<_ zYJA|x#+T>D)A=fbyRb=_z$+CC?)b53hp8%bIXRE~`c33l zv#jwPKXJOE#eU2W>0}48#qZfm<$3~}R~*kHPl}Nl(vkv*m{Lo4i(rD77BJx3LzkMR zr?8$V49IJtp*d{U_M{IuO)3|-3M5Sa$fWaCYt+dEI3;m^+rxxHZNTzmo<#2;$Quam zA7C#*lDN``{QPtLoSnLLdyLiHKYX+^ejHTIW;hifKwlpj0kAsQLrrN=`$k%m#)z`)C>hvWLfcsysl( zaVU1;yqcCtNAu_U(!hUsLW#rEQI`JEyNjRVXiWXlbt05Uw|h2X6Wh7Nhi>ePV%fEO=~}*uP+{ z=aEZ014XtH{lfk-xGf0`?IhANHt4OU)c5wb?A3uUPJ|{*A7yN0G=`M|@f-vJdEwG( z(%!a-tCSp%`IuWRLbqiTaW#;~zSpO!xU=jxSb9M!QEIs;mjf=(C%c*^E*sJBvEB>4 ziyjpNm$kB;H*NmtPen!IG0Ha%;H@4o`D0<3%atYbo|iw1Y!VW>KDTj;7ANV`AjSzK z-8X!>BBT?(ZEPV+R%2XeqhC*LXCL^jADCz*avR64*YHu{48S(0{$sLB&adv7%1d!hX{Wgl0 zum+DvBT0pVg?ba0&+knoDl%lEE2#X+$>#y@#d?TzFUbBEIIzAxt4-wSqidxLtJOG; zFP;eZs$WU$3fpBgVfk);g*U!_)3hCTYJw?}+LdK7$oDC?!nZ+fTQ@wek?`tah=rBL zW10)`dzG;XPber|Q%P^8U+}noi}zfgSDV34JaeEgObG5{JjgrS+V;|>q1 zf;(k`OQS)Q(TQGFstNar@!V9PsGznPMz3_o=d0!FrQ4-HEWVuY91@hlj+CIFIDpAL z*7EKjaVYQE{JJTrI#XZd^$iQ-3hl!CR;G|_0`$G^pa|i1P3t_?fAz1{LFsG6qK%yT z7NciQJ%qn`N{Oz@<1>HzntuL*&032oOt!M>tN0V^ra%A|xenkJ>IKb>1f3v6)$HiF z#2pJXT!-gMC-BfkN7I553tEG7pgxiCKnR`+D&8rsvL?Ek)Hu$zRS;F zz?qVd;6+lX?y*{Nf?qoc?M0$Y)b*vGg9s`?L|8j02Me8@d#cq|Y?_J*5yiN_fZ^;F z5Ed05U(5UlxC*Rz0&rkuKpMSp;RP1q5=p_dWaNNB+Z#1)dW>v^R*WSLxwa&>*${Lm z_AgGJrN8jqI$S4-mtGZ%=nQZvvm*ctlt%D!Fyap|;+!FKb~+p4{>g z=KS;F{lEWh-S)p8%CFzBl{S??%9TgR^*OW>k^a_7g`aQ1OI3B$G+0aXK9<}fr=xGVZlPbjM zLvAj*3htw1C`II!KQ^g3^xDef`lg+t{N95HqXY$oz(Ah-i8D~G`1(|dyh&3&id{+I zwEeg=|HFsTc1i`eG5mfxiYO1CWRZoVnAVz1GZ!3R-}&uovN4TtHvw(|os+0>O=7B9 z&ju?D03c?fnCjAK(j?5l1g84QdZ_%eX`0BdN-XV2(<6Nd9$)q}!g{Cq{9JG|sW?GB zNi2$Hi^x~ZR;SR@k~Y$RJ}N2($(BTt_<85T=J5NH&oDhb#U&>(Q}kUmWvPb&zJFzW z#z=ZsVR7;9b|e|B_tH`&526ZFnFq}SM`m%5#hsk~{`;BE|L|xc?e%=?ZEZ}u@(lDx zY}2Tw5-E0?zyRPUanB<6O=0JOaB!Ax;S`^m60stTzK{OTI++Hw(#VZTZ|5zyL^*gwAzh+f}OR#g}kD*ATo+<7D! z&)mpp9qG8Ut*!5m$xRi>o1|mmkjc!Dc_j!SPYIYN2Lh@ES(p=&mj?7H9V{rcfIxES zCaD6O8^i@{m-#HnWlVl+(4CBtSuybm?(G&@J7X&*Vp69#t^Z-!36O?i8pzCg#inPP>7@2q5G1J9Y zYnwbT_F=>W8lDHk2?;y$p|_Xux(BRXxoGZR^UhGg$8S?a&X68_djdNxQN{{Q+cLg1 z-RcooIsWLGjAU6_oEl$AX##=nmp3^}L9cre_ddQjJ^3OU8MpJxtuMo6I6|*#2{UzP+7od=>RO9O)qS z{_e-Ar%A`>IP%srga8E{fywq@`Y1Emlw}w~ofkldw$DdN(;L>DDSGu|_w|}BW1M(r z>lxHW_ObqJn3|uXDwMM#AFamG{xHhuEMC?KlWkyC-E>4%g*O!5V;nbo(yH7*0`S(h zj1i9Vj=L;)eWL^phLkb#Q0HUMS$VKY3j@l&SddavT-qsu=LzV8VlxOwd(L6G?H|F5 zq;g*Iqi_T%f+00mkp;!wAZ-i*1c>a8Mw&h&1?C6zt%{cB7i^4;J+0c-RP3N7+O>77 z_5bC;`FdVYmMI~kr(%RBa3bITg`4QKpJXd9Q!K#c^-`0v=b8mll|ZLwr?2kiAd^>q zOz9`4T%5C+7&KeIfmSA$TgHEJadDU6KUL0dezxnaWJGugd36sw$0U3K@z0a+brfLD zo*_Mqu&3Xr-xncxX9H4}xY@xm%Mg$B#7zJ6|COQvn#E z9d?xPb__6S9IOa|I)V|ZvZwwQ&e}MC!`hs|!H{+=!rY6bjrG8aw=@JLri_r8iB;A!;MlK18Pf}|f&tyV%JK0p(uBLaJuR(d?$ay>_{w37Q51A1+-*Nf zr%J3y-cLZ`oL6Q~Az2I<@cRGwC?~C?krmn#C~FRVzdOs=v_tn+jZpMMoiR|d1fPC! zewH_#7d*FRjk{Y;1M8>6+Mcyep#`pAW54da-RLJB?{LuV7NzY|!a3z~*FW2}v!g7j z%yU1@Xf>zHg@!>VB^H3axwJo2f%qUtzCm_<0!XJj>+(9TdDEl=_aA`Btx#9&F=3Qt zQS7rNxh(mUJ_P^GzetaXY|%)d;VZ?HFS-!w=yM}mLqbQAz?8p{N4HOCbTC@&$z?CD zItNtto1(GcC{+GLbOKh@Q!K<~Zbb|pws7%cU9~?HAMa4NNsghuBe(}v^Vl3kglAxLrZEhb zD7|s2btGaceR%Wc2)cN@hky9k+ODr}J?pu=$7fh|21tcK<1LgM65r8I7D1IsKE2A_ z_FN8$S!i+TV9dm5(1L?!&Y1c#ktIhL}kFmQH_1;+$@IxaL&1{v8eE}vrk_!8eM-}ZeM zLxqzbkvxt&T11*adM&=t!y6t zVfLm_7;nFrrFi})e#(%XkPh4_YzeU*{&VEcF^H&A^>CcL9NtpfGcCzx!{kM%>p39i z!$gS_PH%1r;=H1w%oW1d%P5-UBIG!7AP&c|l}&e7iN*bLW0q=En0(ajMD5C_Ycqu> zU-YO?Y9^iDSR%t0()dZcSbsqRF0m3(iSQYcx}_8lkb~$aJq%!oHWiTiT|o5l7w4D? zi2NeN(U%Y)}l-@dt>v5Ke+I3SRMtT1Mq2NA1;eq2yiV%kd=6NQrzG}I(?oh3BW zR_^twW)O^FtsT={d7U!Fl1@%kaM=gD_v=i{v&w3wa4>;kf;QqgzT7Vut@7vkyMLWZ zbI>2Oqzj`|!K~RPvEb*AXP!0=h>dS<6!|Hhmc?X5^{uA(rTcSugrUFT8)7s(JL>8tQm^%H z$0(FvErB^BlBW~7> zt&d3%h6$WW-&0a-ZjyZQHy0pf0ep8$g70YQY=LlGsDZf)-dDgpgvTf)E)ZEa;Y4mL z*eVqT%&#mecysj9G4?ybn0GI6Sw5^)q3(fJ?GW4%2P&D{5Gu0c0yoxaqILXNSO&d$ zM)os}si6qn2Kpul2QN2~t2iFQonvzFO&2Z2-7zy~`iuWCElU=hgJ(kA2d$92JLhOn zkUeQZ3ekfrO6E2OLKe7%C@VOd-vEy(oB|7I{^O1ssm423QEX@IaacM*fCxdS(iM~6 zfBblw&5|4z2i&2*O6AvV`|jQC$vlL08>D-T7(Yw#Ot5k=;>os?qda_(!pQ+8T88tw zzm^OB?zZsx$^g~(5z~4>Ex0Hy44oB!ELyT; zLcs9Nl^`v>vt%ZbCj$u-oB&4biOOoeeVUU@tieg;FMyf71*#3fLtO;6WlSJA6{|8r z3Infsezx-4jGQlDkwQVvzObn&pDX`7N-qfvOXN|S^)K29WGPh+_0V1)u>X8fWRW=8 zzwma$tkj;ZWICdyFmeSzfP^x1(ffz7N*c=#6XNe21FzJn>YK^R%k+92cbK~+6v=WiA0^J zhMX3Z9}5O*n@JC)po8FPf}GnJb_C*5Sp3(86}4Gope1Vyz4q2uSl6bkd)U;0i}2sKQFnT7}|4@U7QLc97xo^px{YladNpqv~Nz=Nu_Bl!jWysR?J z99>Y;Sm9Y^P$g^59!db`$i=-3Nq`CF=5cBsW(N&UAS~L#sCMMRGt;h_!*>hf*}Z%7 zrZw;&Ex|}CWkEgYs55eNyFyeDGCK})o3ifyU2N!q#G|7-J=-ptqu0dIzQW-^4lnEx zWNBU{CM~N>ZvSkG71kpT(7eT&cn9}}I-UUHf7!jrUJ3-Ek8f);EKcLncltspJ%VP@ zD-wLAZKIG&kP3sBA%H7~e+b90!6sX&$%%&ewxg*Q;pmfIcgf8TmRwchIrhTC-lO;{acKeQHMjh0KMqFqi53 zzfeKa&l<~LmNiLXtxEt5q$bFrv5!Ml=@{218(@TYKY@a|D8a%^=+`GL!}LEyDXcTZ z+nN|@yqzz7N)98_P!TCR$)t*Fk?1reav{b45g|G=@O^P(=|y%~T;ANOK?^YwB_pBN zRbt{jt0+{2_MH7XtaQ4SD_BcA;O%Voq(IJ}oUl{06DE+@+zSdzr$*N@C;1%z2Z2+o zddI3+pP|qRA`;zy{`~vd#Y4ACV&pZwv+kwvL0);dRIbCXV6o4FBGetkBSUit7c z?Ype_G|6I5c`60i7kUrl?E)n7@Umz}Im8*#Gm${3Sl*(-uaOYJN1k%TsKyXCT6 zT^X@47t}qV>=iZ@yonRof&1tIL?AmLQr(RsT-VbWa2oVOfT1{$s^jq2O~H%=GUkv9 z{+r3JAmH_`cZdb*_fn))S-o~`HrVs_c2q)y?Bh^51jl0_?x3e;y_8z`A_(dcrl~Tw zAjKz<<#v$;c+xo#*R|DD6$M-6BC*SpV_ESq4&yMH&OvHf*rU0^SmKx@M+g<6#rHVr zw{G2vi|A0@3q^4zDp~BpyY{~WZCv&|k~pdh_0$w23Te!9I3m|bvvT ztN(cb{`23@P9umX>nh-q`7gk1Mxgp+ewL1x@8RdivUfX|oIAESO++Z3V(omGMx4^g zRJKYoD4Hnvj+18j4t9faoI#U4er%OVgO)G9A=^_j!$NIppDc0SSh`3U55RcM`!sXa z1cHlW`_&~$$r`o3<|LWPkHdSGiEbyrKN900 zANU2aL{?#ssUf@#nwUt`lLZLyp6rVAt{-9@ce%cfjM%P~vR!M`LaqEy;q8{R>d?FO zBm1f|{xGiHddA4fbxh*x&ED61WT#PmwT^YI`*h8W%-{pPx>l)ae|Yukc29NcH|Y0N z%g4{{O2)7do2eK6oOk(5ZrQ4dS0>D~*nNB9+x!m)KD<1&?A+1RU1vsoot*cX{i<{z zfZIGQapWvM)2@wv%(YkZ5h#nw|LX0yXJp{I_3Ljw@ho5Ta_I-Zk5;2T_@PUY*|p>C71o41@0bTw_|A5QF4&7g8SaAWtcZ`f{s z^{Q1|TwMdMU2D!0zI7omu*T4#LvJ}#R-oT97#byi->qlb+S<=8hZ$bn@MumH*>y`r z$+?PKPoLJGfAvkxmuyyJmbT*P(6;`IruArco3f|i5aQosP9?g*v~>oR8?LX_#{c5u z^ujc1Wz^D#@jNJpeCV?ybC(S5yvzUS(dqEn7+zHH zrq`^rngk$gfM-U7CfzL!Hg8k)>wnX_K185svPDOOdh0iAxJA6%=vjKjbK^KSLqnIf zKi)Qth@7>hf6a4A%U%pXwRM3<&Qv}4Sk>FKZKKG{&mS>iLX$f&F~@WA&XYw$qgQ{}PLbhq%-c-`K4H7E;6sila8N|(q z-SZTyt%|bLifE0BZzH}G7rzBeh%sC7so}Kch0)vajQjP`-bt@j=Esi*bg%`vndMSd zfekQq;^Fu#(NILDm)n_ZLKIl-Fl=ehX-H6{5n8dhOGSo1v=eH`el8Q=Gq%$*CVl4-ot8S`m*taCRQ7`0SgS1_*oTl17GMi_JCpW}jxc#5Zal`}~cI zzBAI7Vj&%6bLI6q!#2~LZr1q5R*d>zncQTPljyfhp8Wi1>Ft?4Es;}}n;+k*v8t&H zS{ZMdG#$8PupLPjs-Ieh!wj`w(U=upJXEGU;86Z0k2-6rqUUy_!_IY&Pok5=B|8){ z9my2x9Goqzs{8*#wBZzfT-$Q~pz-4qkEYL`dwI%UllDG-DER*RuwC6z@A*R$mpj~G z9bMfwkj=!`g2k4VFau_BfJX*4pt8P2M0UPeqbZ6_$}D-DRcE zdbfl?y4iRB_1Y9$hLoR2haT0I_E9vIN2jQ(scjC;yZ#3QA(!g@`=8gWS<@-S@yZ)Q zOP9*$%MR-%7o#s`n>KHLBTtiVY9;0K&{K(TujibNqU!9y6r8j8`+K)q_1s~&t!)Q= zgvejL+8iD};7d`_P3*3$dmP5*`{Vl>yGE|rv`LvG)K*uQ0Za3z_Lq%JOvI&|p5<_& z{gFg_R8<<^)Nb3R#D3*XP3&ejig*=$y$DMK0#2}-BnGNb-$IB8-E=YXpWca4EngrTs2~Z%bdkamWWt(W@hGI z7scWF+l*G@RKkeMY?ce*sW(4il%3AOkm-TuM7v8CVT_HT&W`7~OXLq_xvX_023`Gl;XyE5fLg;Owej#b+8**~f^N!;lxR+^ zXW8N(4$6t3GmmBBz2V++p(*ZPa?JmNiu0q9n$@B3;TpgaYT)iB=xEU<9ilbPL_I zL&Hyr9Lf7-B5#%=@DB0LQ1j$I85l&NKjYDH*T@@G*^{oj%so2Pzq|Mwg3%5Hv@$idqYI*!&k3PnzVb*9!wiX=()FPv)>pQ&!@<`Wl8cP4ZcCuckS?i zeH0y!Z?H^Inf2_M6@vlqXjnAXyus74tXd1#V|0s>9 z=qDNiwT2HjY|Z+}%|qp1js@pvBmM?yxIsmsMuqClyX)-QFQYIkpqpKjp$2_Q{>sA0 zYAS|3D6#7P%E*3lY-d}QZ(wS%R#Z=7Ic}M^G#~zRHx9-tw zlS}>T1QHRnCs>OqG+OS|3f;yv`hZg!IK7B)(e?I3od{d2rhIp*J_pvd*VfZp2P>$W z*r8EzA@wC%RWuN9Hgq{V2?Ie~(v1EEEO z@DzYu4>>bogud2(L&S8+odq8TRy4x zy`%VN=J`ls+065`Qc6lo*Tgj0SmUojnjgQBiwjdo+Aq?K|Xx?^5v$RHwP>5ARjt*?6$2`${kKW$oN$2 z5FWXYT;^PCPXB3+~(M-Ai zdc*iut;xnRPp)$I>e~(RA$@xHp2;jgmDfKyFe!&x#p%W3=k&KC4Q|-6bDRBHC|w+h z&$^XYyM~uolR=EwG=_3&Dv1cOvl(`FM#=3dsAJSz(@<)1tlsvY!_~)sy~!n`f4@lv zu)jY1Tn$Mk&9XG@>}#&7JV@ux#XyJ>y|xi#GeoHw!g<$-t;wcs<(g5?4D z=HrrS_@!d9Rui%5;XEZ@v{gZatlPDB4IEzIX#Vdkc`j{-*?_^bX9pJO>Fc*3sA&QR zZmTt1cafNY?4CORWIdu434A9u$V-n7pQ zN=nI+L9wY7<*o)l3ZlLdzU0Ii0B51~xy5CYp<#~}n>kgrMiH?%U<6Ht;`}6KztP^P z!7%_7p>cq64wx!kPU|Kc+b(ZHf;&qrZhH25_Q_yJj(?kNwSXp-^RA}*kg#0%cCM%l z{B~32X<}lHh}3~uJ?WMvk-Mc)GqjCMPHv{tqOO6uiUMu4w5h2jO<4YJ_J-)>FELlj zUQ)LLbFf=)oHS8}xwTC-)?~@A>P-1TzmH4$vDw_VRddxxHLtu{(o(9p)+$xSpfCV| z_?2USAD6%T-&m7kM&_bh=+=rVh>=2lv;vH(2mD7;-25{sR`<{)?NT-jwy;mlpSbZOAB_&3NHM|0ps-P*F{Z#m}JO=R>pPI}gyx?a7i zhQ6xDKi*MQLSOl8+oqcA5E37flDlNmnF($N>iokex-ZutA5ndyN{9c*;1lE8ph$)! zHCdf>fFLA7a>E=Pv}}4chc9=8Gr4OdrYIe5tevE_c4S~xg`E!a^;6EQHEOqVWZ+6Z zX@0_R+_;3v6+hNx`o`xJxfLZ&l+%hBHMG;}WY}9`Im6&wDoI;o(t`SmZ!_S1RHK=W z?!Kb%k7+Kk!?xAixNeT>xuic<-Bg5GdQP!-bX*hlMp5wH^aIz8m(af}4^@S3=awzb z1RnyV$6)+gohGo#pyNYJA6S*IWJWkbPv8IIlk`Gs5NbD+Ch9BKd{gAU#)BVGj?zI8 z{aVA3`M15rP!<@d-nZog)D zsmu?^_#!!qYJT_AO`9~qs_@TSwu5v+mFw1hLwPu2{P@P$s$eO+VN|zk)iHRuqnk9X zTA+FJton27AQ__}7B+5SmQ>3AXU}$vYdtIhyxEDk9+~Cxc493M$-m_v5 zp}0|5F8-<2PhbCOY-|;dvm6)Dv3hhQ zt9SbPb~$}4FtF#AHf{Xpx<)sin8uotVUK3qp++zV&O_kF3dc}i$A4}j$55jzbHukC ztBN}3Cv6&}sZfmRysL-rBOtl;POA+KznK2WGV{FUc;(evev#&jo;G-iew+Qx!$14w zr%}TGWz_E0bk|pFNbCA>tyN?DrUm)VzeO0XO-qA{fD%{8@aWJs{*!N|7izX{U4@6f z)u^2SK!wbk2TFDF-ygfa^*#2R3-I5+qN*CJOjY~!4O?P=CFKZCmYtmqs`anm=4bmW zy=Q*BIOWXKoT4F!_7D1bq6uRPsYq$lh8i2!rjIfkW$03@tgM{Y-Shh&RCB>l>JTtZ zgHtM&ht3(hCJqURHPkoUe>fzh2{2UsjnT>17k9~{?=bRiq#70$c9mCIh_1$4CX|(! z8l(FTaWfuG0g*^1#Q{pMk;;Y?AYMddJ?F&n6KBAmJ5b;6_c_kg`t*G{ut`B_S#U~j zt(vQXpF1c9EI3uoi-S#&_;r9e;bE4)4lwb@#bun^=B-axC~8%&+N^nV)nZUp3gjw- zl9yGjZ@EAp-xl;fO|P5bk=d=={5TJ?to>#8`$?O(Z1Fa1)3l#6l(caB~Vq}4ZgqIA=V<8olG-eBSajh zQWDo?&TFZzKHSVqg%wP<9apw@MmhYt@j0>QZZ`0;QmT;jWQwQnwJ>U-{eH0Q?W$Nj|PLJl)! z!D)6U5&Vyl@|nV7g#PWxQ5g$o04t+5LG*Ld_fvSCKi_kCMQLhGWTZl7V>YvABLh2g zrskdpM`G=Iu!Fy7{=#g|B1ejO;QK$ee0DQ%L#0o?eRwaGc05!iy-dfNuZz#R4J#Pz zL0yXE+}vE?UO^+AxJ_@lSzt8_k4ClgU-XnR4v}Q4S!JSl=&NoHuA#3KUaX{cY*a_# zHLaUB8m({%wr<@TdGGA{$5m#{nniiZKYY*984rk1SFT=_V1jrqR$qj|^kLENi-t6O3=X?Ev@0X)*FFZjTPqfCJNqjsra|ju?N=`&X zag>e(rLQkiSoE(LSI@iJfI|!7JOC*OT|4qxYG`;r$k^{8$@XU&C zjYb^z=+I2LPLhAaiWtAq$Lc5T35>NnJgzekDCLEeV3((0Ij|YH2^ndDjs&^q*%a)u zEHznL{M=T+e#4JtPyU>Lr6rGQh^21Nh`pT$RuBJHVRmGUroO&=oJWhz!zWEVl}NWX z=EOLn8BeZhc*`$|9F!l~6C(r!DF+ECJ)|DN@evh#YRUJ9+>Y|>^~th1jisg`|#`fb(t+`HvW2$ zu`)iZ(fv-xb{`w+c(ZlGl+{CrWHi_{vc{SrRn`nqU1BnEVpGnDLZM<%pjd%S^5>F$ zwY*-c^w8X}A_Dqjln<1%5-5ZoxR`aS% z*EPl7_K147aeW3Gx^%0Pai(F8a|g?>%l9n_I`Jt*N!?9B)AH?A{t6ns?cJAeUcWe; zmqij(l#ez0G5eE48~y3W{~yB61T5$LZTs1yP}W2wBUH$qQjzRSMJ3rPgUFJQqC|^I z31eR>l_iB_4V7eRWJyTbT9{;siV#Kb=VE5w_dSmP|9Kp9Jb%v&-S_>wzu#*)&+|I3 zMOm+xrx&|jE_Mqz^Sw@*ybpFPB{R^PzH;fw4`GyksgcyTO#-w^FY;`f@1?DHLT%D> zdZT@hbBpJhR=4}{a zHuF<^3d%+im>)lWEOjd|C5>`aOiaCJ&z`AiXf!DQ>fci;XtsK|yPw@`wy9s=z7#!O zyat+=Xz#okfV$C!RMi{ctk$<0ntD@89>sxoG){ z6;X!|H}doIQ|s8VjkZ?J1<+QoHqbXk`brwK-{;O1Gih=F>w4N~tA+NbNs<;vFt5eu zi+A+c^aQ`{_o>y3iHH(llkhPN2v&VvN~Q%nx&kqp2wWmg-`o{P&vd9`6^_Dd%V6jA z{nV7D5S}t+=Vnq-c5ZH9R8;4r>BpB;exrUEJ$m#|&Zpg1O(UcBcwvpes=M1dIEA|F z6!;K=BrIRPT=B@oi|t`8N$az!&)Dd+7Wk0;x^%^o!C0G)NOaWV#qZkouM>vHWDh+!Nx~Z1pwZ*TDNUO@Z(bKuJk4y#DAA|>{KcI~ zf4O?~Ma$3q)s)rL)muFNhN?vgGbW8js!9GxU*&w!{@8U%2CTMYF!t7-_R7x| z4-y)*=4+PN><+m#_v3*@b741G8)dTQQ~azbR)oU!I*Nbw=NL@

Q{x6u65ZOV(I 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 U1TbjUek%uo)4jclnsw zyhIm*^-DfDW;jKqfTo^AiCP&#FD@=FTX%W2n8q0djGrT^8}pc2$`EX}!RRgzuOj`| z;oN%`aS=f9Y{tpuuZ(4raK3vec1jv3l1jl?8Ci=Kj0B=e?y1xK;Y~atRBBo~+8|MN zNrmZFbw5wqE>zqVRN(h7u1^F(Im?JTU^W+LJ4)vvUgG2td9Nr=)ip=_r$znOKTFzm zUO}-%m|Xf>d(V1zI7dVT4^r0f?!y3l5sd~QK$aZIK)Fz>hqc$A6CE4nT5|!uE-zF1 zdWosITCt2`VO?iBu8B{cFWy`o8VEcA4=nf&H6t{_tD$N+!&9*3jAy zrA#Lr<%`^pMj?WaB-Iq~(k`F2^%1bLm7G3d=WA~a*u8@32@x4*$8A!{pd=*Gcygr| z{BwxVABYZ3A!`LXC7zoB^^MjXwB|OfrUE8RqJKh8Jzo@jL<=@ky)6&U7&JwmgaCiS zQ}H8r`TSN4_&(0=?gR&Kg+NjAzaZV@)IW%G-fH+^ggk5-eg2x%TflHS2;-lc4gZJAG;$Dfn3x}vBO6* ztkUwk7*6O9TuL)^_5Ri(@CGZABKhL>21<=q#@!K#ZewauN_~?0|2EE`$4N*vs)y!X& zVV`h|-T{BO?B<>M%lxVO`rD*akphGkL6S}OUZZKigYqCfaoOR%kDkCMlc+KC7p{E> z{!^4cQ}tpnX}_FdI5XHr*h<9>{8a@F=U{;6V7N7^{TpR^ll;E#(SwT(Z3T;I*P%lm z?~(#Tl?wKU1T0OdS)BDzk2298a&?$C`lXxW%QreEhmFf2oZkLWTf7Jfe=0b zvNRTd(W%&n#^934KJHP$Uz3VTzM1GyCiT2r#|3n#px7bIoFV*hnZ4uMG6}HF#XzeC z-Ra6ms(Ih4rW|K~RWJ%~(ok2+!R)1kG)3?Tc|lrJ!8oNQCwi@NRr_Br7=O{IgXG_& zLvXcZjyA-|S)u~P1}E~*1zRJc-PFcf0gq%JC`SaMaEdr^*d%vI*Enc_hd`7t8(xAz7Y@1VS8C zjYVz*hbQzqD4T*}r;l?7?Q5nOMXD_amQeZh^Y$WhqNf~I8mFm(rO{SO9WL#*&L9hoMX8%0jfLtKGt}HeV?Ynt<4us17 zB+Coz=d;}XA<|_CWWnt(tbHxwhF*%V&#kG*Ro2EgU2=@X#-NhNnhp;yBnU*03X@W1 zS5><^hPB6(qzEd^KaEU6_xIs)FhrIstSyfLAv?fno)0{(n9U$u+lWa97`8MLGK9ld zh;cfV+-Q+a^$d(-BDJ_&U-G%aVl-UZhzr~*f5)Dr?0h+vaHIP~Q zmoC#9S*9R*1c7F}8><6(&T6om=)!K5S#H`#Vr9FC1RRJRSkF)#iJB=)qkrbvGk5dx zV~>DVi9ZtRrOO}{R@^_%p9k^Hso$etkaC*oI+|j_B%1Rg zmg+DQ8A74qpCUjg@;!MM0#8ANvQ!0O3zN@DH7^mlsUfxL6so`*E64Rx{5ENc0Q|%X zdx^gtJLXG?N_Kka-PGXh_FS#^nv2q9Ft#QgoHY5|gh2g#xkG7HRWwAtgo``yy=q`7 zr5-~~7x7o?IJv^`qG^>PU$PuH9g>0n{b_2^!qF*4w@nMjV48W^U0~rR)JJq6{Vgmm zy${m_iU}pU*m2X+yfe$T;o~31mlPDg)wwEX38_9 zz>R8GvnXw4r;mn|faQ&!Ut6$a#Lr(whrpY2$Z4Ygg!0H?G989|3>;Ekp>6Akc7P#* z_DivW{vtQddO9MFJM@xnZVW^SW+6HdvY1E~g*7Jft7|G4tpX=n3*fX5ncG=5m`nh$ zG6wQl1X;pHK=umY3RUrgRz#$`EVQ&NqIVMbhv>A}b=a4z%9?LonvV}Y=tgXD(Hn~5 ziTACb*mez5It4h})L#C&lZa|0_w-r!xFyNlf_mY0YTk#hA=dJa<_bF zLy8Oo>8U9=WR_I|DQLCs^vEA%eW6HJJWBBZu^y+{(eW#uTZaFrDT_9|{Y_G^I6vs< z6!Y8+)>4&$;^@gx)*$_t^WXIKpjPn%2kSP}9L?a3vhj%n`F8feEP*vBcfv(}A-y^R zUv}z(0nA=7Btbj)vFTp&>!e|oT#KBwum23a5j*erKJXvft@roOZY+E;DPxY$ovw+t zFZAvP*f^FrFAra*eE5Z)iIL0eZl34cY+Jvh^4F5jX{Fs$@uYsdc)}~Rx5?L>F6}P( z?9u0S!RPT=)o*ss%!@F?`fE?&-c8-z0RrXJ*xcHm4cjP?as&G*!sx`$h1r{Ct-?7; zWTAo#(8SzgO8%wZCS?dNsnE(%Z!nIK4I-K0^Q#*7#zz8^R)YMgSe`x}VICbp*>ptl zi<*RGM&oSTv@pI(9WFBCZpy|}Wqfw;kJHk9TK!=Ot2^W1h-kuEIi_$0lBl)TI>uW+ z(daXA!w~&jdk1W}slO-NZ^)dgCD77 zzWF_OpS!)hHwP%fj8mH7^NU*k$!XsTX9OCwk6MQ#y4YQ*pMk)t=(+YOX^bDQ=i5ie zYo)EyvVPLii(7XC` zA_|7hOZ*kT)jPvrrqt=+kD&tel0@l5X0o+LYANg~=W_soxa9~_!~oIt`U5S`L{R*Q zZfA7+DM$!&3DU9G<|omgE5%>+s?%_#8R{i_r^2GdO7}M8?^`b3c7i^oU|dVl!`4I(2k)%iM=4H5Uw!4~GI;9h$~~f*_o7xaBGv zt&XF&8i&lVqXQQC-39lm2vT-Ay{B#3EhEJ2&9e@ypRgtwK3{iXw%dWt4_jeQMjXo> zNbv(&hQE@*1(#AEK&l^H(zCPYbm}`%ZB)0>KMS@BG$k@8=tNG?y4*+$!!{jz8^Kke zWs0QPxiPYRymiYsS5BHVpZsi5H9kyoy2``+88HHmH{qjgZk3UZ$+O?{&wKug zE%cNz9H`@B(i--ZpaHiIjX71gw*`%lG#ym7eu#TSD$kB(+uvNAFmIqf+iK9@pKO=J zS&AByvNN3SWOREz+l_t%1i|@bV1wf;st|ymbRWMZHMB)+Kr@Ph44>J8kke{N!3RS>cPX{LB$NQ0Vlg_osKy z@3KnGJTz-5nOEYJ`>=ioI8>s`LX4Wqq);SItVa~vZoNwxUIP3ZseLLzYA`_K*>t?VAt35xq|*n6yn=? z>*c?q_z@P4Zx=@lIdh!1bf4D2+j;&sA3d^a-LC6ajTdEQVWjWF{_V;ia$k}wEvUqM zXFL_PI(ELYG_F~8#AcL&oY+-Kh_p@nYN@oy)VTxoQ2~NiscU@yT@h<*dfwSaWNKsu zbKIMl^#42e=x6m- zH4WP%0&m3U1MM1v*`gZucztiQd?~0 zrb(;p>$`eAfB7;>06R7kt7~-TzV`5hY15}i5|%6OCqxQ3NxW29`|1ISGpForl(;-V zs7M=c9j%qq=d)@FS360U+7&+sx(I*8G}F0p-ptJ~(-FPl)4Omw)>@%{B>bccocYnruPHx*>1>X~ohF-(|x7D@;} zVg;!{cGC9lsxheh?U-i7jKq}f{p{7N7y_Dz87??K-;N7Oe>|8Wf@c~BlytdOo#_4Q z;I9?EHlF~1ub_67IS{c6T32ciHhV)sG-*sEa>piaRKb_s)T;0vnX?v~{P4-YwUc20 zn8zb3)praJC1VR-p#<}@5eql@Z~~|Tc%QoYp!^{OwWuxlxsj&f#v}txN}!1nQb@_o zcnES8!GIYJvYr05758P9nuZyjuuMZN6GUOw!V8+hr6{ znkSyG5W9t3kEQtS)+f-+RDou(RtqT%bBS*3A@c3AQRpp!bPCY83c|MW&6PH`)4w_s z0CXL}(P)QKk-ojqX;b@fDo;_`3s*x~ro8CV2HWYA6;P7qoUyrWdSY_xT|LL>qO2dK z)%i>IjNYl2=^b07Y?a9&2p&q({nwU`A|{-c_dr0nu>L~~<3dW!0jvLSl2Z#0HN~Ar z6G(QP;j3aACT=MDIY?p|E$XjtUw9@&Fm;YYIJ`U^>(;d!sJGlWyl$@^%oR>i2K}J| z!q>fhD$#=vrHZYV=%NL{24NE18QrUBOLqGWzx4L)^G}4^qFh`A^^K2B@OT>S%}xUZ zma(xM`pM@^V@;o)rc}D~^#y%j*j@>;s;aTiRE+~VG_d-X^qxuH+n1g3)<1@3I;~WF1)gU0T>s{?zqA3 z5CAPr^8gW!oSh#$RWFv3S&$jQQYb>%W9^1mr6h^{qU37@Ob5Aeb_qS>0rH@jP(&;^ ze`em<6(^ANja@il%TM`lp55$1vC&+_Q?N-bOo=@=lckZvEIlk6SzW8+o)ZEd3KGAk z|CAcyGOd(d)YNUArCJjrm}15f0BPJ8ZjLRoIg|)xztfBLk3J^7s~;X$03H04 z5sy7epeM5mVi#FVojTRmd6283l8o^d#4Ma?dMsD&LKme4$H;8Wnl%v_Q*>-zdGT#` zpiRWwz+?S-z-Tv>IVYzcF4a?IQ#H@E(m;ELF4|OD4v;nDz_4&Iz4EHW;(Xp=4P`N4 zh29TWN4hcq#6C*XJjQ}^g0ljQ^b)D{LphAM5M{g^qW2To9=_}(wT}u1MAn?My;Rxg z_$F?j>Q9&z4IN9#qMT_#1{TCe*bQn=5pYm=-|!WJ6ADy%f?EfMACX8f9MVFXX7Q>Q z;Tn^k5(z2^4uV1Q>FlZCLmNL2`l2`x*u2!!aaci=HH6FIXp;_+Iqu1XG@wl+Xo!p% zo>`vd=&lsp8Ox}vBWE2+B~u|%+x1C{TY*St3jd#)|rmgqI(`G!Ys<4MrB4yp!*oj2jSnO{UxM1|}?b1tk= zMEVq+kXe~E4-7d;&~n0t)rwkza4Xw-;EqDpDTJmV(z~hAcKT1>V6D(BU?qY@n1=gu zx0@^i&85COo;T<(^boSf`IO$=H(lNF!N|c~b3#CmSCGa8RG<>1LG7APKS{q32AEWb z45B$`b6nX9_>FnkXP^9yw;T();jh^C&;la0fY&hKn6c0{-0;N{x|uGfPElc+oYk9k zf*4bm<=q%W2U|%P-0ETF6Lp0f8sR^UerwmQEA%77E*$eOSiMcI*E3(XnB*+p)PF%F zy|O760-S85ILL|@}uSkA;8I6E3CC|S7@jMYHt1YP? zo)V8kIM<<{G@I^1`(Qw&1DGSuD0`!$S8dM=4LoD6^E~5-#b2T=k?4bkvhR#TpO5+_ z&puBQ6ixD1t=kF4Wl4`Nl)Gp>r7)3>7>)fSpeJAHMSLle`cx)ils#h6rD0b`0x{)G z?2+S#Iq(W*o1`UBF^gE{-aFVA3jF5Pt5ZZuj3Aia;mNhyfWh(FU(b}IV?x^q$f7C& zAC(13rwjM)(HD?jfB=Rvz|HL3d-uC7T9q05hn%42JgnIIh8oH$K(;8JryY;jJ|}n^ z-*}zhhOje*e1mjv7}GSa-4|@p7H7uoSOU=1e^YRhd)49XKMaqcG zFM`mrxwjCy@KteYEJYFZv_ph($abpD9F@8;;%o?H8ZOYf@oVCw6nrGny^9;9nxNVU zKQIP3fKz;zh#BaSF|s}BS3|%0l=|i+WgOuGYH;D#C`2^$OYa`(8L$5J*J20Q50Gg< z_9x!~3~hoH%8X#Z(W8M{6L~pe&Y8G4eba_upQg_NEF!G_1eXVJ&D`6&O`&ffO@H$Y zrk4B4lNG0?W+uf5I-S5gD|oJ+8`*RG!j18oANL^bXZQ(-617ScFwrQglF8I)DjOXY9W76>JM^ z+5m_Ns3bMxsFnqjJTh*~5n^YZX!xv=RXqCYn2}?&z3MG#aq>k~L5uK5 z-OJybcCVlJE_%UvV?gM9Q3{}IVXwbEo;D^`w5&8W!n@Kpv2W|Y{;cYuj+<{=PrgvW*IRlhKhr6HmCX`GIpj{O*FEbL5KblehS+f9~z;6E}P`0&w$w@sV;( zrm8MhXKKkCK3Sczl~PuPBg3ONrv~(ORcze$U)x)NGM+*n;YW?TJ}$zl-xA6rebqR& zuUX83x%`lES~D(uSD<}m=dtt~1foY9KP;3oPevGomxd}B!p*$4)2Fn%#U`iM(!}Ki zD4|a5 zj-z`(`>NtBk4EJII$w`DLW2uoTZ7869?~wsJ1#Qo>RKhJh zCsadd1p$48BW4-=Nn?Oy(;rjwx`|7+auF5C#}`94;s-V1 zmxNKU$dMq%-%VO7%1de(QI|0=cDGfUF5ZP0QZi&YDoq#{YDpO_rWm{{trK+S!&L7@ z*f{$J^F||A7hf7x>dI(?6bNM1uGq~G+y2n-;ydKAkpDs`{3>Nk25>c(AhD4-Rne^h zaN+%DDvv=tjo5MM*F)tJCiC|nucsX>T`fczWp{e<+q_P6vAjO$fs8Rkz&U}4&T`KD zHKqvH?dD0&+qZ}2Yrvq;TvsrH@^j_EKA6?uab%7dd6%?I!cZ5wm1XQKI3jyXfKIaX z_(g4u=dpzaXOOW@#?k4s2Cez_gY(%0y6p`$O$B0Sna6+_+c z(2o$p>^RQsIzO3_c|D=GA!d{tfA{Nh-U_>$B?BB_5%tx9i)+lU*F8(O`XzxyNf&8q7 zBRy{XL!1~WbR*d;w$odVPLLVXfiw2sAub5q2{>mrjCxqAEP*xA?T|LVBq9WNafc7@ zT!|=7C@s0Z4C+}aS=_qdaC%j*r3wat4I(4!NkggVfUs+0RBE7lV=34cM;i%PMdBhd>F+IQXmb)^a&d8USvelWki5#(Mp{M znp4(FPXDlvs;!OG3E;lg?p=fToW0lg=3bCFCZ$))WD515j5f-AVOE1xtKiU&?{5n< zM`RzL*5P;Gi81pIN4fzOKao#o(%>Lp;Cc^c*s0Oy3fzE zwrY3B-aX|6ELWNE1N0}>jnN&;P3&t{6GWvCkeP7WU;VfXU$UnCO3o-E6B-#mrNy@I zyLQE2zMn8ju#BZHX@H}o5T?av`pPg8>n^i4GVL`%TU$nLhtD6!7;q&Y9}?y_L{ch1 ztfG^Uk`rSxPN3klWWW)R-co|*aK_~bIWW*8Qy!vTq1rDe_{)hB@ez?&nO2Sl)tGYT zEHiV0&@clfot;GAH*el7zn*;l{Ix@+fl|B^HOmtUto8+uubi%{YtQ~uF%I5J*f_Y(XYetMBjY|*u)V;y}ANmCHp(>zV=vpl!a(8F(5rqAUr2M?8sWTjy-T^35 z1efnhvtlV$295VZi!Dks$T&i8xaG#4h~_CuZ|CKW&DWrG2OA&dJ@`Xiee!JQ=b1<6 zi%6S2oeN|-_2`u1fq{jUed*d^Om1Ac@)I>%HrY~aa4){QH5Ay+!ng9;V7@HPsT%i5 zqd*Un4#r&Tq9q?%vfE!+qTM*v&#JZcF5dN3K+Ac2E0}ZtF8lNap2zS{nlza`lRlGf zSx9~Rm>Qo3U(cuaRYj)+rI5>88((b5GP6)8C9CP{=IhidefazbVd^;)B@swvZuOba zn`1yHWr##fHux^nb1UcCu;1sDhUPA}rhO1Xn)fgpJ-fbFr*-c&vUF_DE?->k$B>8& zzW`|qQjk|#a_qo_@+ZgMPXH*vM{o=C?(ZyJY{u5Cd$-`Crx=~fK5~9`{nEacX zcjE?qV`*(if6++MjpM^MFX>^srA24Ck$z8&cT-yVw(nVJ=7q%8jC?L_P{-L*T5oq<|)B+d`x=G2<}xO_pu6Pbcyh#b(n zYvl%jJm>*LU3xI1vrK=87hGQ0AKFz~ z#DBy&_JbIZOVb1b7r|jTqNu#kIyE?jxD9{C0K1Mz10lY%0@Qh|G&N$sZ+F12*3jc- z!$haokF;s4R&X%uxB_~gwvNMLSN5x^pNg51KAf`!@#|Sx*~bUf#&z-87~fH#+$EFm zd;d*8dcN&x>6u7TgYZ!rvQeK0jde1dd7;MHa7PxEFBJ1AxIdMJ3)SQAl;|fS zY4lTFWF=Vv7=pfH;QaYTrN@?EXU86=F%vojZTM>Ut|oEaP5P`K;UzE-od?9ANpPQr zBkzpky}$nID-l2f=?@Kg`X%N4ruOMlqb=onZ+lP(T;67!%tFDsm&RP&ZIFY1I9~!8 z?;ku%Uor5GhQ4;6K<+LtV+>&Z6HWb_T?*n*yj8%5ZG7>OCN06E+7>H+b$yR??xYG9 zvnVVv3GzLQRgU`ei}p`|57^)22YsX2sDBrdpUjle0^r`LNoemW)WJl9|=-7IW! zX9ki_Z0Ktmvp_?16Abg|{#?o#n*&EsFn{&MZZ0qRKtedlvy|a_gz5$SPkgDx{RFWe z_Ydx)$n26b(dlCGuN6vb6_GGV6DO^-3JpcNQ{9N?btAN+nq>dd>-(oNVK zVw=sciXF33>`#-$a$klF$YBCin#C=>)-`(d0iweSN+a^!oQRAojWf?Th&&YKxzdaH zS{gHzxo3j$X1MAlZ<5$7T5W`*H&=}k*zxY9|;mZ%(h}O646Rt;e>zl7;9z7y8< z%R=tc^-}9eH8$sXHD7vA4#!s_%HoP71;q1rueJ3uUu-aYS z)5dn%?o%swbMwy(U-pq3O-j$rdn1aoN5_Lei=YWH5ncV^#j3VDi>J-~2~birgUx~H z_CZ4e(drlF&>@RNB0*DU!du^G_C*$H%YOW3PfL2RUL;Cg%H6^_d!}(mY7dlUW14}a zpngX!QN{JYndDY!9#w)BbdPZ>{ok_ZIcB{!;~?flU0@l@r2r&-8LT3EE=444O@(|N zqYE?`?J*9pCO?u$u7eocMp<3FPcNRtNl!n|!F)KTx+&RfgFv%f%ACs|fxPJKY^pES z;aha!rFKzj^Ez^?(RETn=YX}y>8=ySI$RyOlPBLZadq)HeiEpZEg?Vw0pxXRiJff0 z>j84L^wolb59fOZojkdd0{oA}d4h}&AcJp*%;_mXj`>!|7 z{M7IP@;2>Lv3F{*_v_stI|?*=yIeMSe$TWdu>JMZ+!o1eESum}fA6JU=;GAiz=kux zXjiXaAH>XcRdH(Zo@HF8K5ULg=U-~oy&Ia|r@ZbW_?785`D)J#YF2X`NAYpHSFfGt zJD< zF+AEQRfZ;kNBnng-s>rQ7QV2j?@o4rzv95Wxb9;zU!ROR$w|=#&gwk&Kx4*&hF;%) zzr=Fb0sq%?zo@2ni0`teWfZ(Azr=h-tKFGRbdTaVC!i^=R_Q*!xc&&b<%=3hkCQ(1 z#YaJIuZizvkA)zUVM_8N#B>K5F{ScXnN$5 zBxtA+gi{O)`xU;v0wg5*VWpc~5CFd5r_@c=Y5^slZ!r1=k$Z|6S;^54GDyMZqy8}k z9JpBj?zS*v|GnSW(KjZq=7DldeO~{0UQ%@mW-*MF(Aef=(h2`oDAj9DM3+!x27Gj}6`w*Z~Tj*_< z*c6=fA&nG?gT^Ve7-igfa%NuisK9RJprOqoKQyp%lYlq_!jaTAbH2k3;uhr;czKkE z9DJ&s2(JzwkWH*MJG1O&_sk#T8q1e7gp_&*VpZGhpVYDU#|IjgcXQ|8g;J8TY@5On zg}`01@b2#B80^zB9SeRrX`ZNIQMZkyA*Bkb_|4wQ@OH|Fvq_w@`2;V~kywSz)}6fj z)a>2ehglk--4RKt|8gLFsjle|4zm`cc;PBW}&0lL|u|XvZy{ zG>yxDwk|JD&r3y~CfX=hlo%8RAAYm{B9d`uR&#B_4d;eXyS8bQes}}708QMiEgiGm zhZ|DUeSUTQ9keW`srH7Bz}h-Z_3<=gL-fUInzUCET>|XGLi?vS)m5r?8)7uc*A)o7 z=VmS;I*HHGZN8gAQY6G|>jC<}tgdH@uhPhfbe#TVA;vZS!z843y85<|3gM(i%C@ zdVT4H#gtzk#nT=@K_$EdhTEoakI9lAZC`wzKl!zKjHc=ZAI_!;>HI9d=nPZ)U7Gpi z(!TVCO~OJVagOs54wJ2G!vDJXl~3bd93b>*o=|U6YA{GJDz9|baCCGc)y8!uz~1F_ zld)IRK&6<5Y$|cli~Bx%`7$6THCABq`H!x98E$c?hbWee2a#p6C zfV&Acr<$3V3H_oAf&9U5C4!>2R^D;V_vO6i5L#7Cg6CeUFt9p~f|ciqc|F@|AG=U| z4X7;`Md!q|0fku`aw2saKTe^hS9R^1HRRroo+WGNm@}vzxB|LQZ1?`et8-Eh#d_nL zObXEgWX z3PWXQU8@UA?+QXJwk;xArm!=+w84XF(}5i)uqZQ&odjM-@t89-HsvI(^$MyuajTK( zB0(w%EaFMg{5NTF@jMXSlXGciG|pv0PK%F@2)&*?3#RkCK34~5@$IE8;H`GF?sCbE zRA~H-N+`+0+~%^qtMW>Erg8_s6nJgh!b(2wLGpO~aQ1hU9a*<{d*gro|{bh!iPE-^ullMusg z^RxVh9u!3}-#C#JwqT?@rC{)-54|joBEm~suid2*=c8PD0s{T?x)I&#GNWpn z(8Wlx4cl^U*?Fgu&B*Cb$ZdQAD2V44sx)Y`ffp9}ig!W*f*|otW4e7ZxlBLdys-(N zO3Xw>V2j|+z)$0zw{mjR?7)f9yu*k;d8b4!pFU1YmzJ!fqzu0%;I;Tah`xx=%#_Fa zx7Q2?(kbLYRYb|{J+S0*f(7M|%W2hoOvD8Voa-b^6yK^ak6g6SlIN3 zSD+=h(BFfzTY&>D!oVQjx(J((b93JHZ>+oQ__28lkKHOc2_(pGnls8OQaHlPet$fEo+? zApJb_%H3tN-!H0o_~Gu|M!mKWQG$Nps4Vsu(v^tLFKvd&%kI_hXR;IIej|#9VUI?M z&jOqyhT+Fv_HMhR;cjWeXy7EKT13&mZ^H_;_Z3QjvYAv%C1T7r<834cs#TAe9jop2{xYfK;om@515msFs5kr{r#P} zkAw<k7KAn3=HW(L<1{>r2dM^W^s$sAt|7N)P%qRpM2ybnE=2+ z%my!_0#zQZUK!YkOgW6Nz@K`aydEEV$O6a|&GL!A^$~Dz$C>_;7F)()mRVcxd#Onp z)ZrpJP(l&!!K42l*4{fR%X9tyM2+!8qe)J%0UI!%{c2{`todh{HD`T)>vxi)@V?J; z-&fh!-ur6b({bb0)YZn-9We2vN(R21JTJ8KiP7IK`V@Q~B-hgn8%ExM@dCHi^av*Z z6qY{kANvm%pwE)L2bR@&J;x_PL;R2d!3RXj07YJK=@2uEbu|529oE6W57c(F&Y7JG z4m_R11c3BdyrF~P0+dlVq$O%82!m_bkal&o%ZGj&=TH7}Kvo&wK2dcHalwq~X^ihpO-c_H(!p*eIjpokiarKWcb1!u|)%z=1Aj(6ZAR zW!B5N!zGhq6NP`cSU9Apjb^E)&%0-a2tDO4FM51ynUVXqX7ZJlgJ#RcN|%QZp5f{J zs@pRf;X@ke5ujj7Rp)iB7qEBynMdM02OJ$Ir!F{6!z4B`lMdTJscM;UKie>8MCl6x zfLol`I4ZD*dR?;p0wS0}n{eRBk#0R5S8N&L8r{Oo%xn@hEiXOwWx^kSI2@P}RU1ww zj!W}CJQ~4QxD1_U<2G;i ztn<{&4w+RG9+eaFTi4>Zy-vSc&)s+?y?%!czr{W*ADCP=v%}4U<%=_NZzg)S3vL_y zuws$Trd6-QTRzJDt&jFe_<+59cHz#0`JcT^`Z6NA^k&N4DCz=)3Yknb=03}Bdo0W2 zIyiy+FQElo_c5K|Ua)T?_5|?%6CXUAz2wTueH&$3FB2M48n5DDNO;;SUo-mRSLAeu z)atxzlSa43;pt$7S6mRtlA%dAaVw}#HUx~bt%4aOOSKIFa|Y9X=Sb_#Ron?E6Isx` zc5!xx;!8Y0y1R>9l4e15E#m-5{st6}oNzovq-8FYWTw(PLW;;*{a|isky{wXt&-&% zESGwUl*+(vCqG{FOx$5bvXC)ZXS4ckzrtmmS4lXIyB7~!JJjCZ{*!G#Hr%#-yMegz z!=t`|P!TL3IbylBA>fO%@sB#rDhpVeFu*nU6RAQ0OpEUYkC`{JzNtT@j5B$k=kvG@ zhMM?3cQdPH`9!G*o+W-130IC*4Y<8MDr&b!{M^V1)q0HeygFe+(~trL(fx*i8jZ!e z7B2*68$AI-cgy!t;HnwU>frRF7#|F1JDb(A=nIWmgB1YCEawO7*m8m1LLT5grV)Lm z7HfCxMSnJXC>${#oo@Ya4|_ajU?9R$nUm&CB^*P(X~km1e+8a6gy)0NEa0~JzPdCQ z7?!RNsBvXG0Yhs$eEC#a&SRaC=ZiMObk%-fjmLHP$G4AT>9${*FB&9oNkbFM{*V;i z7+%;{_e4$Bi30w(OiHs)U0P2ZIaqAson<*Y*|Q?92tYb=Ld1J?13xOi@Jwo6`Mzt? zlhaLc8q1+vbV%KwMu%%rQRZ3Sv>QE(Kn{)6LFIWAwk%WVYF4l97n~5CCC@^Ho_f9V zX$TFiJ1lU`nhDl5+iZa`C*wy$lck<)4qLls%~sr1^a!M!7o`9u$ohbqw?5)8xFs#} z&FWw>s0d#*1zm8@jR8M?F&FDFMp-F7)pC;>TVqyaEt4a65PVa+=|~(zWg}|6QUzzh zKDA$m+dwBo9v>{C}Bg>|~4}*GiVwbucSjMK6hQd5AtQZC_10e&m7Vo*OO@;|R7v{vNp0^W@IcSk6 zpLz~5BtVU^;Jf$Qe8pNBWF}FDCMM>9LH7FZ3{S^e*IhA)t=JSfldY>&#P2itD67WO zQBQ!in4V6we&0hsM?wL(?uKP`nzuKrlkzL7NQ(E_*57TO$e!LVUAmN)iyhA;%nchJ z*oPgyM}cJ)+~_gPi4IOmIlSPdn=y3X6E*%=_=6{?Wwf?kr(9>41Tbq~ z><5AnIbqP;hl^)g<$V1sCr*COM{eBQV0Z1Pb8c*Lqi?a|qIF~|Q`Pm7t^4e*y>ZgN zUPmvY`bak5h)cbu<_FxboAL9o1uYiR1*P3=Q7sf~%ROUkN1P(RJ=u$ceXI{yqdnY& z)yN6%>(-`D0qBs(RKDU_&Y|h&o;d|I>(T%jiy}m=e{b-H!5|}G7!-lqKpSNP#fx$2 zGlbndjJMS@7N_s8NuddXz%cCkzZZv;4n3N?#)fSd*;oxpRz!`~(X23%4%ouBYslU+ zGe*s9clStHXjs-z&w=+21tLYzmKw$ga(Pf2jf(aWCWD>KE@bXGd^xltK50e|&Nttt zn@!;=p@y>Vg>fO4)QyLGcE!cio3dnziWGQInl+z#Jum1^Z~uT-M|VVf63Ap96E^Zx z^YkUbtH)Gjf4wmwK-=UfO2xy_LvWpOW5w>9Ge+%=PQuGkjDKE#+2LzFN7;sSD@vGm zORi;EVtip6Fi7QUi|ci|W3_Tg@#FU7lC=MftU1duFV{Se4gnhla{) zZ0pq4)1H0jnHxPrD`#yp!{*;K{5t5!-fb5?^7TxdHBMYb4!^K7w0w_({uAI5x~cx& z$GxAzObXnFXd-uNgX+AmvGt9C{@+cSSYo!`!vD=BpP=i3tQMjYE~cm_Qw@8&61Sxu zXfE`vLrC#|xDM#sGvg7Y>>1(tqg`dr9qpogzdJ&>4eXRLG2kniAyZFKFfI)3rI!< zs;N9>Ym&MjFHMQ*IgZ=flK`%J8qT@dNH4`+S|b_ylW^wEqF$d`KB>N98{6o^MaXYs!iQO7M_? znk#?9MHCo~(rt=$-KBj7+1jo)m$9;A&0F)q=_Rzm&~mzU-OvY&L54DBkg-6Pb9G+F z(%Nww8kpp*08o?1Dacz$z}!(v=X5bL^42?`km$nl5nGq`6 z8fE~tElfv5xq+bRe#_p!q;N8`(x8y|?oDy%*6<2=B*(`z?QDAbW$1K9J15fIOx zFsrqB6ixQ2{X2ZzqD4Dfc@=69S>}E!9|w`IR%> zwhHBzDwLl-y;Jek*bcJmF&1V^*J#-sXQQiGwI<*0|NF&YvebrxTLGhS!X|LDzvalz z(IRad72IU!UGDq0s2^s!X~1@IZr?jqQ6T6V$}o*GmvkoHe=rzY5IbmRUl+{-^U*)e zIhLd0);aUjWLPe0j64p_SvfsWUY0mNtBHluHYiX$LFHI3nRM_x#yMF_*eCaH;J1r% zc^6Jm=Hgp%1KG<;1+~4Ib?*U_7!qnwNxAu7hU{5$W}W-X+7~ZeM)}yoKgYjoP@vp+ z5c%B;KeZ?bFw__HRG*HVI$&heKey46%dbWSuqHxsn`1`)H;`Kwv%;VG3s^u#Gl=Px z+wQm})L_`h zES^OadC})X_iw>eENoTM_wCzv*|m)ef^VZcgck=0XB#Nd4hPTr(05BHgiG0kW*p6a z$=wM6K8;I1PAsY?d_btuO@5IRWvX7~WKdtS_`CZ2L0|Cyis>rW0;40|^6zh<> z?9+*pCK=@22K#iJb+vR@`~F4wXtFpDDv_YC&9Ba!Ju8>LF03D6i3{Pu4kt&Q7jpyg zA{$4-7B;2XuH7ECWT9RlOQuKe=v8(F9X*fO!j=JMmMm(S9m$1#VR}z!?((x^f~}Q- zikJY*8heQd2Slb>NAtxGI#B&v`lF-MnaqW0w zT6erPB|)`S!^K!;`tZa)$G(gsi159JMRR*q&AL0`Wg4Ff9R-s?-?SxE zEf%({zeT`wf99n9!E_Uzg$$a9Q&|L?3t7@k6hm$9v?#>3+Sn^EAr5x;e1!^$pijiAclr+^l*h!;`zc?HrHfR83&%w>DqDt%!?emX52P;^*1Dr$2m-Qo!XR$|QNI zh7K#7*RcGhchHvq)B$MVK5~*9?g%?O|1)Z_bACshBJDp*>{Ru{?1YFRdKx*DtlQPw z(y>ls$gDmaTi4C-Ulz8)dOvjOjUV z>k?LwsHRh-3+&7wvR7)s+x3-+-h-tW1}PjK(KVned@Bs|r*dXnqvg8PrmTIuqtSzY z(XC~5p4yDg%-u>oM6H3hsQZp3_Cz3UwV^kdbni(IJl_SvK&L(K6XY?hc{?kw*e5`8 z(aH+`pn#AnR~ou^^8t;P4QK183By8)-#qQ!Giql-?Mbn{j%c7LXF7SpsO*4DcA3)G z2&i28eScBjqn++kKziROZd(^`)-Af&%F}@u6wMv5Sy%j#)ARAd6<3o^cHD@49x^Y(J z<}SMo>0ywihR^Qv4hPVrRq71}8W*`jb7!=)uz<*NrBy*e8(3gkGN?7bpho9?nkB9u z8AS`gnOLj8$NiuND@^cqUzPj;0z3BkuD&(^z|y!qkos+HSlHg|?4j_Z90O%l%}>!$ zet9^bB`M+g%-nK&B|o})a3E#5l~;71a_>&s9mWFnx*n%?X(=a_7%KLS0WM?V*-7Ik zb9s>5#&I^qXRX5paX|i^F9XuG*^BBS24~Mn) z11s*s6sLz3s6k?ZQ`h>yt6?o#SiNhXWDWh-U*F2Sti=zHml@pG75-hExwj3z%$&f$ zZP;pIlM?DY1a#mBndw z7}zRk%gx-E9pdxNwi6ZD%P?`-we^dF=YYoOs`LJ2E`+!1`obH_4&u0`ro}jgT3BeN zb&c?cgVQc|>5^U>%ECv4B&DjztydlnD?b`AxpeUl1Ak*LA1OnKRaB0poyDY^_PLWn zS4Pg7JUNm?O|tkpDtGR-z>a+${1n(By;~NuWIda8{xOTJEK09dPFAgm0hKnDMsBTE zRIN7$zX0ACHG|~oIlj&Vl1it&UkR>-~c7EyEp!pni>PO2xDVpns~)Kqj>7DO)s>4BHf*cq+MtD;2btO&Dk#V&AyL3{6lANC$e!DrmqTo z^Zlkx{5U6tQI0Z0mFirEMt4-f#=uybfy!1+2q>Ue^)L11xocpcr7Ti&V^aueE-fP? zqu;ccLUzRr8In;m_Q}(y62rv2?)CZS5q&G}&aeEVck-nv;3?FMPRpim?8*i;ruu`J zzhW%1-99z`>#r^wF6?XW?@H~js%_eZ|97qU)C(M#)(O9Qp8balfT<0$nZRxE{EH|K z*O^0kaNw1_Jj{WK4_|QS1KUiv_ku>X(2T1ob*8pt+Xd2dXxOJ^#FAiB&X~*bP+q0l z%ncT)E}3SIQ@}>E)f{x8zR-RLznWQL&X(#0z>aH`rWLeCqC_4F0{1w*3HsS_lc z77{*Ve7ix$K529`7olX)DxxP8fZY`MvgpWoDY6=EnjmE;Qr+(+-kMCsCHRXVWGgP4 zrn*s=-+0bx(qcETN~Sb$bd>d*_j2bpjf|hW9Wd&9>uU}p3<=U57}wcg6^@v@GhL}{ zKFc?LaWAQ@HrbHx&-$e&qCsJ0dUKl>w|fqJyjZ`d_P*8JREtxlL@mF47S=}t?d5S_@yDuPb zoxbfC;@EY2~}h4rCr22bJ-k zt%u;v%8Y_&wB7Q8U%FLEM%l}kD(pY`RG4Mb>3-ieg!8){CYaGQ<2i%qqCQnGSA{Ps+8I)|X8n3gTaZ)VMfWLuDCV34 zQKa{=d3L^&1~2$rZzwzpwznIsSfzsOB0zve#gdMju*|loov*>Rm+(zoy zwdOM37DR5t$*Hg4&a*q%(|^&TMI{S>+bOK)9_i8`;1I@mTz_poTV9lUcadBUWpl!o z3d)edJdbpnu4tew%+05YonBU!o)u6!(S~X=3wa>R1>9sG72q94mtRE3cJAQm%JX+e zLrL3zlPW~NiYp|dJGGkhkXnXhR03ATU`wK}6FesJmbpHL0X!)tTwJ7F2{<0>Wfl zIP|3Y`V!C-S@xvfx#7UTU85gN*ZR1GR!cyh94q44eCZ z7uz$7*_I!^z1{@87A5eeM5=cq*v7-p)BVYkEii2*%_Zl>yuMy{S6s#zN=oq3;KBub zG~MRGkLC}=U12jt6FlODu+i1#=TC~5xIl}IQ02?;h?8*X>x?7UIxVyDFf>n&@O}95 zW+E>}wL7|-t6>*Lf0a9UPWX{KLxbncOF#BzD+=o(jJ)NDb7SVVz?Xg(dXEjA?Up+t zqZTc*Vqde&;D(#(lh(8p2g~!M^3kBVtutOfyi@tT|Ch=6EjZArhS=&{puSI(wVXZ% zVAncnF+>+GT-b0|I~FGQkIgVnXcupOz+SP7H*z&{V%cIZ%N=q_13##Q;31^5yg zbXjd(_$u#qvs$uC;;NCp$f=o~O+)f8WUPWK_f(GW9vL z7y_F{nzg4t`cS^`OoJ&AN75umNAaNsfE#J~8NPibzDFshv`3Blk#6U&;%ocE_e9}U zX58z>EtU~xWPwK%EH6wClNdSsK1v1sy zXYpHO)TU^?8+X25cHt&GWyQDw~LBT?kfM3Z!5!g0MiHkZFJCW3h4FTy24QpH$(uL z9QnS`uKY#qip8Az>j;%az~f(EUAy~p`{>|1y=JHEY+LXk)bHg$DEzYRdCk&u9XM^|p3ay_;e@xJEsZ79D8~8ASZFtn`NA533$%S_8@UPIdFf z(Rjv7rhj2vxrc!lL({W9rc`Cj)YE)EOzYUCcZN-QsOAfNh;x$D2`| zXw8%zIG%`e2KgV!WEMf!-mbh{qR@;du{GZ@|mgI_OI)ir0llw4SNeF(6nhW+ALu+Ym1LEY14R4dST zBW}c7w4#)pe^fPe#NqTmX}zmxtH>~Ie8zm0y9WGPkhr!*8F$fyhPJUypvKThBe~+? zY^F(b!+pzpUS1Q6HceK{I&KaF<5jO=-cXoOS}`!PtUu*4I+(AFt0bE*y!(kl8?A3P z3}Nq#*A;~nD(!}(1M8iSwsyH0JD-zP^U(Zo)G& zzp&p{tr|`O7)tM4v-G7dlafZGcB4akI;P)!d#p)sns(CPkJzzf#p^fXk8-0IR_=D* zdiv`bA)IYlHp{0}B%-Y8c`FX)Pr94i$9H99^g(D$x-gJD=jFuy-=g>^I6GpbgO(<~ zYWJ@-xkq%Kw@3fgz2}TEl_fAYc`1L=qE4P4lE3!QqZws23cerWImPB9l(ioEp3|pK z-~9T(or9Yhv_nE*e|>j7uB@zQ35QcEu2yCUZUGY%95=w_qw0in(-zI4E7f-1JCf}P z*~UGYU~u-S%Tn4f0+m99x*KD_+13p_vTe%qzO>;}DC9FCy?eNre(f0Gz1AoNZlk~+ zMc#4+tON@kO1wwJxnW)JWHRMw&*}4X#C$)LYV}5E=2&>Ng%2)J8;M|^)oueHU?+X9!-V^ zK%xfvUW)!u8j$V$5K*|Hd|i?mjmCtOW*p=IZI6Y`065;G^N=N4)&S)J;}mIN#2BYE z!CUZlc0$UeA6BU9RM#WNLHad$U5x>ZI{a6~ft={UP~0yvETi?9EG1e-uV=sCxpSxU zk~c5%4*MT9b{44kwP-=>;AxUPfa8YptV*!}l5zOLqDsga+N_}+##((UhxIN?-YmE= zC)F&lnSYoq`zE0geDjLjZQS_rS*OW=Z>o9|_06mEtE^(`olPkJlqV9S$vgggqc|N& z4|UV-r53%uaS0CTHl|D)18SIFAuY5&6JZz5swPVLaODYy6RlX{2 z@Mu)WBcnb1ZtiiRCR%a>!NU#>zxZ3ruCIG{lQJJ=SfU|0=Ql6jbJ*gpzXt?p7f2~% z5lf`{*gYjj@3rc6z3LLhVk~2FS)x=I)OreY$8rarT*Ih6_VHYOay{p72&lF41&yw- z2_mR}T1AV@TIshQJ!*%}R7-qFBCP^9DwXVA3u}n;`9=8^A*wjAL}k~1EB;x#dNoG8 z`FR{7x2psTcpg#cg-*jt_d*!`q5o0zkTxYWRq@z)}#?iV`c!!BNgou-8? z?4smpqb{%MB2zf7`%oBtjI13};~inLj$UxPHk+k)^7Om)O8sl}V}uvvG9kQFZX4E`a-e+QEGiBku3B(@gv`pO48daHFGH8@cRKY>ai-K!WwV1ii^eGm zf45J?)>r9dKk#6l?@osG@tb1Y_uom-0oF*3mziNxmfG9Z#Rc=R;9fJW@YLdV-E6<6 z(?1}r&!90(c#Q*EfNKqWxzfIal3&iD4K98C+m!Hy-_d^MLV9jBd-kL2B~kyh!h6Xq z6hr@cbkpep*IfGw-9c!V>|Wv$-=ustbAV91f5N+)XhPar-$vHd&(O(H_pJ$q;DeqeE1I+@oW@}B7(^0t9l7YYR_}Y+jNI4*i%a5DZ&y`LT0Wx?u5%YQ?SQ=W%J=rT zceQdpUv3!04;+DgtIL2Av|$>=BNcyK)Di@+JmL6Bp-fk}_qLfdwU}7O7pJ${xhX0# za`gQ3pOKbI0eG~@Ko&ulO2@kGaZQa$6^|GUyurh)=3olB#3c(6EC-BE{=DSa>seW! zyp3^AGNg9p_T^xF|4aFWMXj3*cOMcU(WL}gO7q5oB0d0{4$uu5^2k%Sn@w)f;uCOK zpk*AH*wt$64|UV|Cyuxq2Vc7pIXiuUJcgkv`Q!e9SEJv2ImIIw2wAlpCGDwK7+>yT zw%&!XZ?AktU0`;3{t}Owp6(S(PU2Yr)hB{bxCicG|MJ4=&k8Mvjj0nz5jahwdC7c7 zFEUtgwi_>ef6B46xT`&D7L6?T{5^>pAciPAl{c+6!gJ<|tn!A@tiOxGnbDmo_^j30 z6Ov47cYm5^pJEItN$r*mp-PHqspSS}i3{`j}QUcq|cSHB$bgQ$Q27ddk z$NaoY$`|n4W`IOO_n*Hg>CVr-MWLncl0UfbKRK?V;r~KHMs2<}WzwXxh@JaQ^H{a^ zbW3{bDsY<4kZv^CZ`H+pNcz2^f-HEV4{s)2_xb$?Jw&Z%6>AHCA@8}z?nldiyr0%? z)j{u#yNY)_X*ErxW?t|N+Eam9V(JLo!~pbk#}R(*Mqap3d6NS#9xiyz+^H9K?68!F zzyHg$F{Yn>`en$4`xh%`Z`&5La!Yz2&IG-yBWS6@Lc+T8Y>F1VN@}yp76*N8S$}ZY1>zMXz z%AUqWF1fuMxAnLvZl8Lg25F}&x3={S+fDS8yOY_?n1*Gu#&t6N&bdz(8*iP7^zxHm zvFEGmRNa=N-@ZzAKX2zJYi+~ZSNShMEAr+a*{5ftD)W<-rmAVJgoFe7n{QDwzG0Sj zQxGS2LhOtzF#Qz(=)i#k_Nn{YSpAVfMl!cmFM8Yj<-yDaBUbNTl>ylGHtD`wta4mGiwry#j`1-v1*Z+OvG}{q!&^WW73+j&^Qd7BiRZD8A+!wwYE{gWg4p z5@Y~u-sPc)AuFw`I4NL*(LGDzww{?@EeEVSDHnW9Zq3v55hy8>8HoMBWi>Po*IZDZ z7SI_Z3nKov6AvngU&C3rnCW90w}ZCPmXoVxAXqI8$eOdXsrL4YyD2LfhSXYjPo1=` z-I!>jKBSiWNOFOk`UDW`e^Qlfq<${%|EoqCgdgjpkD$?u>_iE<1v04F%|7Q}r;VxH z!Xu|RyyRorqzvV;)~1QAVX*AGEG|CYpwb+z@g6i9**?v>UjnX^Q5JJkBWH`oOZrri zP#7vj7MSeIQgmbP0p0Jsk7-_{unU?VE%0)v=IHCb#6pR%v3K)+A?%Kb+#2z#_%obq z?T@0VoMzp?E`qig#*zc}0$t5&w^f@Yj11S}S=M#`jG^D%$^Vo0gu(Kqus8A0z`)3y zX-W@jpupA?UjSHFOX&@IlXc0fsRrFJl_c@I`9YraKXSIcVX-gns{;*jVT`~_;%|)J>tRypxDxB@ zMnDdgB$;`$!@v_WwTG)?r%t6*g&PB^a{^7;oaY2aw3niWVyIZkJ0710eh~0PHSE)L zTv6M{JgBdRlgKcH`e!-c`Vj*1b{0BKJ^8;6K=!+u)rs2)hfa=YkrVC;f&qLLK2AoN zY~8@AjX((bNivAgFiK=Ou*7a=^=g~8Xc2?4E)=k+=a2&3DvHNcWzrlUqKk^kUfM%- z_U+}3`2oEU1e}0$D8iB%*1b^VyP4It+$Ux!Er@=d!P4tTYIaFN)fe-)Dklmeog9rv7~6PRAqPR*OL=G>Yn z8WHQ5*0PP6H>{Nnkza0puO1wArdJNBabFt@1_DZuIg`#2l#+=hp@FX!PM==no4Vo} z;G0Iwh2e|SeM}Sgh3`oU58VrBB}OSCOEG!1!-Kh;h<#Z_?$g@kegCjWCkRym=YPvz zz#1SnR%n2!wPN7b)A^(N%bN9NJ(+dRZpMYHoAST^nwbv;tz~{ez(vehboUjenTybq zg^i49zv5X!`_iyd99d`ZleA5NDqy1dsYlXU6nU@7jb>sYjpSv40?huPH#AABX*!f2 zV_XRY?uNgJGyfPmGNa+6*uCz<1LXs%l%y#LcXnZx_ugIGE;L17QPLtMC8ZUM2~>v( z${HTBg~@$u=M8cuUqY+5+w)Rv8>grFj0LCb0xxTrd>E#if-)&3A<@DCP; zv^)CvN8M>+c}T!}EdfcT3N|jDhD_+nG|ORN{|_2N@sO1sk_BV(y0VuxRpbaG8x+dB z40oe@#+dsfSebL<$(93XzeI<^2Vose_5NmM<84MPwrRK=*cGU#2=E(HF;l>wwfJ7^ zG{J0SvCMX<7Xv@HDp}riZ_<`C({@FFIrq*YYU3qtQ$ngrCNh*V6GUF;`)GEjsN8DF?`<5kby*L$;vIb6t|wLSij#{h4KPS?+Ot~c|^|;eX%$ zrNuB1MkbK6tg97VgS>`i)i@rjVuq6r4R7tAe~#s&oDefhprF(rBpioAlR$M2XUOoR zm~LS|HvNlC&8Ka}M@sXl>vff$PJ5D!@~U%V*!K3b91jR5tyx^|)4-{<1OYr0EF~`2 zYj-q)@4ge#xmb@h6!wL;{h0%{Zr^^N`)MhuWsjcp;?7Dq7nAn?{@WdAhH$Fmq>`g> zawt5$kMdis)hpblOBr#b-S%4VShMXYrURv_p-7t=t=bpf`Va5s%=FmSUwm=Wr|#0K z0 zsEA)xOJg2(5hx>?Ou>t-tGTtBb@;UoQMcar!o^FR0N$%B8X7~hTPw0-#*Cp-?GX0l zi2UaX%hNEIigaD-asl_538#M-00el}Saq~YCY7Q;{#Y|>;h!SsK-Z+;Y;=A7J6=~# zGDcST`dvAlQrd0N^Qk?WHK3))^{H#Ol=nK7&?j~a|MjmqEw-OyyG;y9w3y}Wxgg!+ zt?LXo&}nIySPG@=Txx2nPXiNM9ClU8$&MFm3sKi1*O+){$>!CE^Q3HdJkjt9t752~ zsD9dIwW`j;j4<7|v4P2oA1Nfl7vBF&jLA34%9@@@t}Jb*lOTTua>oqoI&t6f+{D(; z`poiPvj)Ftm`JxEN?Yf!S|0na&q{Q_MQp3#_hdDZLY72E5Wl)vM0P!fUIf?Y@bh+o zaH+i;3d!IC6KJTXkd0yfTpMOU?Em?A`^2sXy9lTxrUi(55 zGhCO}8b)Tj)2zJH@9#^a&`A&zUbxM?`1@j+)&Xg8tfLUZSTu zqp%-cH0aW(O-yl+yAA0zqR-7dawC!pOYYm~_;M5zf=iM?@vy9V^tkHN!0Q{f>HaJh zIRjQVl~N*$f(m#_&P5)Wc;vc6%bT4UXCUQi%i4_bEfU!iqkSjZe~HT)W&P$WO`V>@ zS&(hKoQotm=dgY(Suvfl{4j(AYKChtzjXk|a8KIC910>W_s;4OXRo21Vv+1X8DVh> zLT>7aLYiY2(lnm4*4P=$O$M+kV-!urij^xnh5eXzh$>ATBYCsB@pPQx>2|7K8F%BT z7wPJ?RzP8mTJLLP@1lY~x^ZdzTeWFpPyE(F;kfqa-s(E}V3IG&Egy8Zj;n1ZX!(c1 z9^stGG%^{!=$*rA=KU$v2qrHEGTJr#(DaNZp7~guFyWHgc@UK~&HCBTjhZ&yO^L$I z`LbX*Dt0i1z*D!KsQVgnptjW-z&?`xcn^t)!N>Sq1YE6GVIZRAigFB7s+&^7-wL`j zJeX`{1k&vK^b`4KP$AQv=kSLso^7fkaOGu#_)46{CGtz)u8PUc9+|&<8Z9mUynXvW zU%zyjNZ_Vw-$3?t`2TW*?U)W|#G;iA#Rv+zhW%tE9+*mHVN*hFvw9rQ$Eisg6F`XX zt!r<;DEI^tnjbP4cJ_22$aX<)hEmwd+WMN$xk;kD(y29sdW`ngJG5B@2bjyh8_qX%VFH0V?)R?JRpOn3J?CzrybOQ0+QiM{^J;9WB9Pa& zKE2-ucbLeiw?>_rLr&v_&2n)r1OO0pPQGrr)JRzn zPs5*{SZgCR{Gdrq*E5!hEe&Mnuw`kCOCv0p!UB0U+VmJs;9- z2(*%I>WPd)od#Z4wF?DQ)uLs~5XXM44v22X^VNr9ia(t+H<^0N8IaWQdslN zi|jZvmj${pCbF`zx#2T;=euZ;^;zIHkx!w!!S$7~r+AAz=lAt#@qa)eqRMFlM_HMZ zB5f2M)2^FKUe81_Go2MNO0ii>`-okv(2)Jq84YaZZ&)QAg9L|&FFQ>*?*S2sUIdY>0dAxef zhYyU5|M1iwTY(kjy+WUAALX&S@#qEpq!|9@BO7zw={j-KgjLbumg_UPq{Vw0rW|&S2WrWRj)_xXgur; z|J^i%VThUqbm35VE4h1^qcC?J5>&@KIEQ)ErVb@o*#WYNS4nlpamz4)GTI?(-5}UNLL z!)}Agtwk#AM7y1K=Fk7yIXZR?t7YpLPG7A zpbt32bI_`%fP~^j7MPLVv#izlaA&3K znNCC_QZ^m=-FH9Ba*XSz#(g-9KXLLYuS6$lA6Dmhdx|u*<>|-sUjR4@S<0%GDmKFO z06ls15$@bT_OGF$2|9JVeVDf^<#Y}Mrd^`40f=RS8_njJcN7bXg={-zjMU1qAE`-z zW09}~E|H#ImhExh+t|2MgjpJkM>hk;!Ab%m_@EjBLc8@5yQ}(XI;qA7ON|*MHZkC| zw_LWZoTe;gMJNk|qq9EI9k>*rS~ATGdm0Q783_%3a3Gbr1P`CJJ(<&l7f4H}T}8+z zC?s25LT0(wGjSMws}n|bg5-BI!cclJCW{(@+mKFArL8oAcB@*j9nL`e5*IQWBjj8?4p zgm`$FGI6SP9Sg`n(V_wi@fY2n>SUJn2XWEFOzozG9e>{EoZB4hF!9u&7mk@GJ5-iV z)A9wMAiV*sOYbapsOahqe))#@=t9*m$rWJVPWufVBVAXf2wlX}1DWi4$M`nLOoTq_ z=t^$R^VPU3Y`N8+K|$M;z_AFF8x+eh9a?Sn~svNfYJ4cRZ^ipz3ypvlGCIcs6u zS>tqzVU-{+aCxJTg3HcAukMx4tIEjcYC-&<%I(6_vO{o#-QTmvPw{fSk*)WQO-wX+o7p=NiKGx8`A zSxmkxI(!n> z_$PeJX=EJKx_{az4x4sx;57eP=*=t+GYGW@K;N7_({ zow=MykXvEBMtMgFbc9ot#WEQCDK)o`rr8(zNMWG8ljskIa^$;!&XXE$_%vVo@9BzI zSy8JhONI}WAvA}kp=-lRd)i=_DzV;$j%dG614dWlKSay)T`+yvu^e*CC)B3VkWs8Pk5Dmb|O;>YCbpeIA$ybbjB!VgPM<q&shByLHN!E&MG}w zuN`e-eI{#tp{Hb`-i;OEfawEqa~LN-o34j{Jni$vtS?y2nyVg`8EKKGvV3HRmTRrG zA`f`L+!o|lNtdgiL#i}_g=kRs4BLHmP(%<)$s9Sj)0k={8SIInWQS7hws!DQwWBEP zUlISKPFS0qoXml)@(B}hk&~0+zPwK-?eGTTVgj>v<;sgDy=B26U`Lhjw1P6bVZ#D}IeQy!sD$W;w)q_R!6 zu9NaNk;j>>i6Z<`Cl{?7HH*}4x|=80va5kp^5kgeUYp%rQL#=Pq@g`x;`BJvj>zCO!UT(6c@+PXfKeO}6jhM*aNAtAe^ ziBk2Ao0vSm3@kor^CYIvHe{vK;U9=_5WeKqG|<^)7*%PXi`MO-!flDb{vFxY8F88R zac2D%_rVpK5$4T`(GrG@J-)P$XSbFue|dJf>TjIRRH_|4+RHZZ!sIo)CU(F=+UQ*p zztk#d?b_|csA8$I&@4=h9f=(GBiW7;iwl~(cWZ^noiNladkwGZ#$|8i8fnSEt?y@* z!{M|Ls#=1YT(4$Xv;AFJV>yc~r80^x2X974fUEV6t$o2qNm*YLg^KjHU|`e>Myue! zFLdF=YI2Mm_wv|QPDhn=c&_54iOJ1ca;qS8Pdsls)_OV<2 zf`b9Gt?3Q?fmGXYUfPbBLfjP8EnF_*Kv#zOczo8h~SHj)N~ucBS~y0wE}0 zTx$6R!_?QlQ-cq1xuP+`nZ$9?-%OY=p$i-VH62o@@`$w-=IpE^@_{8sP zRWzlDT_D%zo>zBsTc!#O;)iErM>l%Grq}t;7)UU8{FC27*cY=`8WxuOQWqmJ&-~%_ zzJIs?_wE%I&Ob|pbNgS+#)X9ST*mFfYq5Gz#IQv4ubm?Zenr=0c*~|CXO-X}+Q;&f z2G%z1^2@2sg3SfI>N9uC|G^dBaq_4rqKzgKbmB7P`3CbmEM-(zVfdSGGyCAxyUfgJ z=Xdhge=b^@S#ZSr7B#wl(WJ?fchO==joN(4i*f18Orp=S9Jli6wR?O(74IDy-DdI0 z+;5NEm=_{%GC7x}SIf>}dr*qO$J$|_$yd}gJL#sWH!qWf@3Jt(dgsuE_tp+K8gPx@ zzk~l#H6e*jQ-^*(y>D1Ou=yo49qmFcOtx-lIZrYfAO;=EtX6U9%hOdyFq z&QKTnG#Yze6jF^^g^IYYPy(aIY7JpT9XSWe%A*W;sF+sGiE~j(yLfK={`K{0d)?^X ztU(1%@0TH^$kdESYfpyCl0M+x{rmi>zwv-~13E*#1@|B}-v$J9zq>UH2)EOHLlfLd zX_3`qeu5Gu!R~7 zS{b-adx=k-Dp*loaHM(Sjc6E#wl09TfPefSr&1w~e~&2--ac03MR_x3WK`WK;|X$g zqNY5g!b8Obp(LYpq7UifRn5`oTNC%$tACK|`-9 zs~C~zi0{65c5QV0tNwH_Zk-s?t~PsCmgHX(SxSRP>;nLW+z1Wz*RA_dz(=@$sNf`i%L?s}Zs(yA2i{LDS^pCOg9*#te;)tt=IQr@m73+{LfLld&s*%^1dHZHk z{=LA$;+)-4C0X=$-N@Iy~3a&d?zU|U#*neI~{P3 z`lCQ&axT7Xi8zqixPVA6MkVPe@g1f3+Th?QoCIApJ7=seM4BLf-lz4_@j;t5#qak)LqQZNo|(MO?ZGx%CgXW^vM50`Bupe z=wE!#1LdpEagku zbN05E$ohihRV~AdAX^R5?L4>c>&2dBFBc7RaBxG1irz5@4HwfZWQna1WPucDnXH7U zj6ms%t4bCFVeIUjQrSk)!Qie;LvYQr{dAC>T_$t0XbM{q zz^K`slmgaT5hf8kEv_q8oQ$$tr-{w zzWtTs_n#rTDW}jI)xTWhK7F9-Sjp>w?_uOvyOT}aU13Fm z-ADxb;>C-T6VA*gFSgx4M<_}$b_i#4a!LbJ^W|nOA25P^o5qcUPZnmu;&O8OoD9cY z-quCtV+RhH+j1@mXM~BNc6N5RCxEY0aLN%)5pVnU3PUA`=V)bNdPFp!_MsBJ*^jFcX7^Zg9+#u7h_GP8IHSATcpl#eya9NrS`ye1L6Lp(`~{ zBUKE>HbPw`nvUJ%O+He_pej6dWW%drmPQkMh84Gn9`5AyIMM&e@mT&yE@@PnUh$ro z5voWK@YvjD(ci~jmt^fda&x-%r`?t^Ns--+Ks-3pnruLdccJ86Uir*{Pspa3% zSQ)@}4jVe&k0T|)DE!vJ@K8Cj0{k&V>v!7D`Xh2K^HntAUOg|x;0cK1mX^ZKk zu`{`ALwZfS-zhXjmR0QF9@-b0#^>dEh~Fz+7)V;>>tWan;Q2aKPaD>s`v(z+yt+4o z<1(CMiQBQ_P*70N$yQyu#Cr9{BMIIDH%MWRI$|xB)WGnzE~7_>a}O%Ln&BpOvLKL& z(zdE*2dT|1Y>9rYF(owaUmdpFjWvlNtbxJ7!6+#7pSN25#K*nLwM9t9V*(+Sg! zQ?EuEwW0$isKa>Lt4(C$s?Y>~*R*Olc^xAZ>0K!p8uhO1x`_|O>J#L54J-3pN%rJ` z?Ck8phs&>L5DkV?ipokI$`Hi>U%;ZGu&^19o{FJ71#+}22)7%O{^DcF{647>1e0hP z16Avb8*{mCDDDPo{K=Nd=*1t+as@F^S1i)p+kq>o^pbVC{y6utp{Z?*_S(` zvVWtMaDl4R!CI#L)98F47i_YJ(y%&qs6mshcYe$Axg-_4)KGmqO283lNn7{ob##5& z(m)6U17&oqaRAZrluv^d$LVmT=p@BW15cG^7s&T7TRS@!NXXLUGo-odlkPi*l*gdB zHTFIP)#Oq4`O#cM?FIU|$RzK)gbS1o5XR5>tmwe`6c8&@Td*9NIB;C$NCEUAdp_U^ z6sBaIPQ-oMxY5*xLN-!OF2x7JdA&Q{4BGb(LM6(h!L)G=*Jorv_Me zeVi;K0RFgIO4*l@F(aUdy!bkV#aed?^8mIDNO%g@;V`J9zdR`}6Tj2zM?AN*`b zr{@bdKwj~i{NuvP|3szGT%lB5K0vKutr_ik0i`35b7HG+*v_*I2g25Qe zlkKBwF4YvcqM${U6CswO`l}(~d+4Gzr2n{0I)U)TC6^!-RhI@lw^0<+E3+CwrdTeE zYUGQMNw-Cz+OX~4+I?JfBe8r;^n}=v3|}{MCX{(ohQ1$UFQF6$L#P0^qQTgZe!`80 z)u`Lnep((0sDKk$%VA0l3t41?yliLee1h)U+d53Rp%6@3!#*CV(_^QT>rtjH?2ua{ z?y5}F=5}wU+;0f__m{N8Vz(gOkKjTYxN%zQ0+u}g?3}!u95={8ve#u$pzRnebA21G zYy*j(b(7msSo%L-w~;c5DnLt{X>I{i?Jy`Ge>)dcj-chrLWH_4TeR3zTs8j9CjP$S zrK(&QBzvhh3>15pDV6DTM#P0viBs5a1ISWWqH2@6>&ulXb8{xN0Gd{gCld^d8NF9X z51%)oAfP8WofTtRo3bktSc}`w`9W*1tJJJIX$o;;{7To#AKy09Y<}KmML8a}ND0u? z#>SaisEAeKr*-SmEP!W58^hDcp?h8tpT38Jav%-KP)72%y=iY4!cfX*Q4jGPl|h;Ta$C?#>K8e)Z8`9 zgEUSR51&ztj$P*ru11nb26bCzY6NP#8E14A@QsW-DmP?o*xCC{I?H^Oo{762f& zD#?&HnpYH79j3}AXDirXoYv@3dfvD6BU<4n9szMh3^0*5r_|WqpQ(a21{)cZcB^GF zsG%HzG1)Vh=q3gZ*!#-O4`RSCuu|Lm_*DlIcY|NHJ`Q~rLicd>VOhRS;r;vb&Xz*O zxramISIVGZfC%>A){5tS^BbG^0}@Rab6G>`tXAF3vdW8dUHL)+$K~Ws&dj6?&>^>l zA*EuN4=V9O5s!Oa%J`SpXF4K01L$944wB;MpMTtOGH7S}M z({$%W<^NApC~&y5DJl1c z`Q)ht6vChJTrhenL76%gEZm`Gt>Z0TC1yl5XwiEQ{n`lO%J89I{%~#|0S+EOF%B1( z$&wHZtMQ+uO_#odDlKvdyEM^#ZY+8IaAbndPJpxM>+VGNK2>iH%5aFOO(RFCYm}YB z!#`%@zK|br$h$4f^lTXFa?BqTaO%(fpf^Tj-qkZ5F;uLjBJPuJB@neoF za=i838tQ%o0N)8!r(>0?C4CQCgkf-cfN2sVA1>yIG5Q4z&=weCjwDe05}91e_G#tR zA+wrGuL)nfv#c0+Anbi|2FBFMKgZ-n(|YE!J46xiUU8myBI9B};#QqHxyr!G(J_5f z^z8lal9JxQt!%($VPbJ{-Bl_x9-t#{9ZL0Fx3E*kjzM5XTuZRcMps|>r;t7n`xA59ZX`))9Q5*LNQe8-T{OzE-uYEry z!l)-;|0h#Ks1RdqKmOT7gHCvE(GkEa!4g))w-^m$E$Ck9HZ#All4S$3OP z0=sw9bAU>L70};;M2*CKi+Ud5zj))}M+F66`uqFyuo~Ztf~T~DYXAc|oH#c8+r>3M zrPq_+H8aE`UZV6-4r-``PFwp}rJ|xPr~YX_-PaiyQu`>Qm&G`nJYGxysq`3gRK0m7 zw1*+r$S?dGM{E(&A)8CR3W*WvQm9WRbq#?8O2ynlHZasYMoKaDDJf<|S5`#>3)lv- z2w7ps=xei<`q$u}TgJuER1utT)L}|Y9s73^gR^H>n{y9aqZ(2#iNBVn=Orbx&bQbR zYSpGqHi&j-L@8=1B~8+5MCg5=nbqInMM0%CB9NUVmH4~6Mf8pxgVeoI0>mzOG9Cu) zxyzS_@z`3oZF~5^l#UyQ%7d3RYutdO&2t27P(pAhRS2={{m7eM1pT&Sj(vYM|HO&g zyB6L(Hzmc&+m4pVjk>W1AF?@0{sHOf>4BA1o$fYd$@RL0f3IMUiZ0u*E0_Kx>du|< z+L5{R;xT%c)KM<1t^v)E7F8U zfRkOlc5URb;cF{%t(c&H19|pk))OXgj0@yx1%~63Q*J{oGTg5>>v#`)czOzJ#8PNC z572nOnCTFJM!c#yWy+Mar1O_9J=v9U1u@qCyn=0g%1wrck9p~cf#yI?n%29?LX-x9 zhR;>O6_S#$XMv^sf#EriOG{((X0VMef~2Bm0#w+d>`0wi+NLHbhj~d_2Ar=md~m=4 z5foUVpsz{af2`YkPP5+JcomeClmv(}dz#;L;W+fl=9i;>F9SzzO^?H^=v2LpT|3O} zCu0ci^RI}bta{1%^^-4k^ChQ*5f=Ez9~T_{Sk3hZ5tJlUB5umni8E*JB_J@w7Me*K z6VItxvu1V%`^tP~G2#d)VbCH=!~^jAxjY*$%gshaFNWE4^zr8>AGH5!O*1nyAyX1z zQjA!YhW1@ZKoI#wer)W3hKBhXa7|v@$2eS*sTRY31C06ad;=bS7e(si3+bjr&ePV{{4Xm{y0Me{S1-Q23rXu2^8>0 zrQN2W2sEc>e(U(@O6e0!^?z^wyJC}AvDNYAVGqnGz|p9ivH+HSpnIkjXnJ5QS#La@ z|D5s^>c!ipVakS43>c?8-)VBsj&Lh`P7*$><|}`9Z|FGSVea+V87*hbD0a#4KB%wA z%0!`Zw5e;&H`sqg=9Sqe7b>^@9}_xmP(?KmhG%3^i#1pMeg5GBFi)0$sF>g&gBmZ- zn>SDMS#Ig1w%W2t-k$a9%`7)(=hYf^gB%QwIZVRhQ=dD1`a4}wCYGY`^J3C&-aK~x zz~;N;ld06zy3Txv?E;%w2F)pAmb>oVbr$xBDLSQQd+UyNCrAnMBvFN;+fD9Q;$RT7 zc=2LQo3tH|6Q&l5+K)C_?OGreX)DRk__oBh=@%oG-P;crioaUF_o-y@bI37+1Nr1C z3&BnPNsO#*Fb6fXB@GXwl>rNkKpey;~ZLEfBzqpy$M*>_1f+KsHM9>-OUQ2+eC9V6&x_dvQQKUWKuw|oWUFt zG*O1$c2*`>ppZDAg2+swh@yy1lC#XtL#QCAq=Fg<{6Fi#_CDv`yZ?3Qy3V=YZ3fTt z`+dLnuxMrjsDCF< zkS>ZZ-|<9+#*x)(6j^%uQY`WT%0%`i!uz7QBA3Lk&hwPDIh>>z-D8ASTB)#U( zcs(+q<45{p9Gr+QL%|7Y-iJQN`%fRZK_(g^FEPvlILr`g$^B4X662WCg_@HRDVzmI6FwAv5C(CbXD;+R)D8n@NBDj6(-<;zsHxeGcjKO~^8;sP ztw&o8X~`DfkbiUgHJF1r3Y&sxrDRF0DYwa9wL2{>bl0w3igaz;uF1Z*6wp#pgC1X` z{vlRY+7PNoCo6Zx0^2SGL@eU2>ktc|(On~SL1!5!PK^laeCNw|qgwa)n!-Wg3dgO8 zKNBoyHhjfoa+!F%Un1ZvYs7O^mUN&^WqImPIRQB2Aus!et|MHXRXc)QLqj@0-IEUqyYV9{>YEWifd0cBBF_vMif3V*5S1K267kjpW)NwWI4& z-@`TPL0G}NM(c;ok5H9zXq@<6Dqx>f4Md!lJ5oN85DNsb8ysKx-9xKI_yLeCfr4Cu zNq+XwDA=>HmG5I}*1p?I!jUDtV&O$Qv+WlWd)4_d(%ZIeTNQa(72zw}JUs!{sZl?6 z$T@TF9P=c1^6$6l>D5lzLjl$W#7Od_-7btYB(hSMNWX0yLiZ0?e*``eMQS>XdJ(UQ zoRmXhvWjM`{43|9?8|QNpgLuPRjsmyUIRZZ7a(bEM8unJZf>xFlmLJss2H4)-;ion zhXk8yuEQ^zvIhvBJDP|avY-WmhJ>v`NNq;-9zF{EWbp4mw-hxa4wY#2)78#+GfHy6uRdIiL971 zQJNhq`!(Y>%pTGI1;B2C!vg@52czPZ*I%FKW3k0C20A#8Tf=@?%uvS8Mf#*L%+&Hj zp93#Cxw|I;ph$-&3r&UpU9%^Mn?_4D$jaj@sDb%7D~gW>REtR*O#6eRzfRzbc({9)c(1`L&`VSsL!ohbZ8U2cm zJfN18?Et1Csu*=wRMI^zW+hml+>`f&P#zUETu~WYF(i<>NN++@L@F(tQSY}0iE@E4 ztmYL`Ibm6z>4Z7$hNg}YS*mbYf0#&&_-#hD3Nk%h<9OXQD$|VL&rduJRwE@-bjg1S zq<{HGL1TWN0k_=d3qy|tRSKBB!cZ-wq8FdbIEhE}Oni95)YOzHx0eP^L&1*zRo_y3 zV=y;J+Bd2{n^7&s{LGEA{NTr@uzDJ;;i`HIUI!hPsadj}JFU7g9<%6LE*6~qeDBmO znb(<^-45SK+aw*Os8ob&(I`?6+*<{lWju;QfgT79623^HYm?KxpY)WFy=15_w?+Y4 zGzcm|*<3JzefH48EUmhllhwy?W((BM@~!A+&z?C0Gx=TqMIP}yi31xwy?K{e91R8N zf%DEx^I7}xY{IY~mCeoK)BUb>b>Rb%y%Kmqje!iC+g z?!N9ol+}2t;c=<8`b1fp;yZEl^5x5AbGmf~Q79(-?I!zkEA);<2w_S{Z^T$q9GPRU z68{+(Qb=DaD_eJts#rr8oj8<}41Y8Ylwm7?o`NSi!X_ulf(}x}f|!dk?tpooKx~#H zy!Jnl)ckUeKez585^XgR5Zx-cVUVQqnHKrbq_00Qi_TR97(s_B2FO92e(kA9OHa47 z8g97oV$qHs#Wjw$xLYP%@~h~rb~hv>q^Wi8mw(o|j?A0=*o3v4{bPLi@pM#sQ2$Kx zN$UT>zzxbPijFFUkdahX1~#~HwE9_@EF8Lf^P)lSuVqOi7=>PtEyT>(<&2R|U_$o!Rw0 zF|n~;Fve@Bu(bsdaP$3#7Z$H!3J|Af->cX0vM={G`;((0Y?T+pREKgsLNACaLKNcu z>+NiEo|-=e=b-DiZY2TGo05@7(*gp|i8NAE{qgD4zRbyJlCrOtjO!Xkv#c^i3lI4c zUA{~C5EAa6!J3g{S;vM)UmOlG6aUM^taVFU1|3i8I#3$|h~#}#E?Scn`y`4rh7Z+* zoQv5D@2%=h`JqMwS%`XYOfWi-)d}Z0MC^O-ZVOx(sghHUXAnNsS~2s7?)49X$Y-YvhA}NG90HxcE#5I^ z5@4jpO62zTO-!u)|CLy|8FMi$mf9AkrCywzNo{ia|MTp;BD`@d*pH>@Z39bGWNBfn z2wLy$#5FQ5p~Wm0e65U{s2J$}aQ4;9XK7eH0_%JQGE2WYyspXtoZG~#Vgft@vE1bU zp#ER(MiS7k8TQ~i@Q~FZtu8F`SaJ7#jqy1}{jH9UI|ejFij`-jiXYm!yv}Rh-bO*I zNjn6S0akC!&nN9v6N{9sWPwY|CT*^f=0P^m&)rR!5(8hcH`o68QQ7qkM;)?o;{XG;!|ZO-T<>yd3wpQ z$au?5j(!T9CQO53GrR7=29gr?HJxMt!bGjHvmz?MI+2WpIPnHU3XQ$bojZ4BK({Cr zBX}28a3v>^)AWXSLeZhW=urknZwknTcql(7#kRuZKOUEc|%04;NdeP#=`KAjF zY{h@`NLja)+dQ-PtSU+c&Jq_)5SlKvmS~f?2Ut1p6M&6u&Jl}aZEcb_K3GIMv*)f) zhK#_OSw{uWbnaLQRBPMNLk?on&wRZtf4*nI`0Xx2-;PcE@|d{<1pyFaKigurSJbQ?urA-DIgE zss-k}?WEs2|HlABrMI-GpB&mXy)DfHy_a_Li0N=il%Y zwP8hjip1%ccLTsi#@m-5N{b=JL9bw-yl?AtGPQD$21pRz9H|(@g2V``485omXzhX_ zZG%D=Q@wIaF{g8-wzjZ3>8TP@PZEH-Cvnh<}anSR=5uZ069#H{h?*`!YJBLkUB2&8zFZ#(%|% z=d(P};>St0MPoy(?D=g!7&Myvkc`I4PD!?Nx*eRSZr|RuuVLPx&AJ-T>U+!jN6tcjHh@^uQt@4Ghq&gXg|clc!8Mf}tXHb@&NNv^2FLR|YgQl~eM0eMDI-lDFTH@qAi8t2 zR|R#lk3pI!f2fIy7pp@YJ1Mom`dLSBMJtbm@j{0j=nmR`q<~>Q#m%jPd=t2ALGM0& ziZIPdqHL6tKRvO-*RS@L>$TLO*lJaL6!lV2Xfb|9plf60-jr)!FSJ7?fhs0$r4~S_ zVS2e;yE#4R^tKXCh98s|R?ChvQs`#$ZeWIhA1%8Z;rHK9@Tu$7C;E?HmtEo11 z*<4$#nIY|~Kr^8Vyt?CMqhA@%!IOo9j*WEugwnkoCceR&CV2Rq=uHN232#SQ=ht^L zh7PKVwKdtl&~nZNs23IZ(u(`zv^^}``$lOg8riuf)&U1JWPsW-th&I#Sd|xa>nYs@ zP-8Wv+%Zm@M97%zbp||tG0}eV8(uU`?S(Q=8=t}}tcDG%ODLt5Q&2HK^1~1B zz-|f5JbA3#wN=on)z$H#i}qJIyz&lpq(U@th!oh~?62p+|0SL{zWZkxb4lydAbG04 zmzw;DaEtg0J$v-Xle~wJExw#YDFyqwcl)s@6E2wzV zvx+{Hn``)5hkyzI96nU^f1i#0M`Z`xKRP}8Al1KQsgxMZeUoM47b=CYHFJofsg&lni$2aobW6D}^@W%K6^M zVXe*KjLFG|8Q#=)ZO5J@U8{RS{?VOH9JHn3IWC(aVYxm?Wzr;?5ri86M_qfd^PxpU z30&`Bxbo`G;ZAAuXZk0+u?$li05N&RG!sQj-g*K8LoMBkESdwL6XR zbjGw-4$a#|XkRvlMN)NW>Yd-EIC1buvy{GKn{5qfif94u7I*mcbx7rYY) z0P3u*=+O+;XdnP|-Nt;?;L7wy)IxMcoHs_@Hxo*kT!&X)r2y4uB-{e49AoIIv{edK zh6LB={$fMW(U9u+yhQ^DOt!OT#d7$nFE`Y?OnCe5Kbs1^&-|0T;sn~KGFQSYioHQr z<3Cp)#YkltHz5pvLSF5KPsMT&e;Brf7T%#p3l4FNNB?Z}B2buFRAK`n>rq`x7#hbO z2le_C^}rSl7Aud;m?V=p9*Kr0fczYc4RpXgTwIFNtX?s6xdnGZgTq(=Bp_1L@aVmJ zCo760#+5QsTS$mfgL<{?ks<>FsghA7N8{h;$WNX`jtdU?eCP!sOyWq>wD-3f!%^zn z-sWM2q|VY$i1(&q^vH}J_n%)kg-FFG7ikoeWIA;L*>fat`F{S64Xc3yR>Rq@*f6J-RK3hzH6a!q}t3&Jqtyn;uv} zH27ik&=DL6&CKM9Acqchom3{bGjl}ot;}vXNU~J&N<3Jqu^b6+thp!CNqK5glnIxS z|1Jb6**a=)0@5NjB*O<|#N>H|;Z;CUzTm9%a0*g>ehFfegtj&;ESVhDV`{NmRKl0S zQOE_|hYid6dAQ4e$zp%~M~}aKQv0kOrLW0rC`g$))F1Vs5Rp*{-_x&DF|Y24K7zY- z)q3Hm^~<$t8I2rm##kt;HaYQY8AVIxsHrU!gLTvp=5r}$w3vY^)5+1XDr5SY^XD~U zku%ZtD_17Iy0h8ZPsIedbjd@WCo%Oj5=P4tey-9Jm0=%Pb|cfa-1{;lM4J2FaFv*& z3IDPg^`qH5jGJ5!uGmN86dW>XR$1}bkZ-}4!rl};Lj*M@jlJ(L?mh&}P!v_7`%Nv^hp(&p4fwm=+mG55Xu+xyy) z1aq9Za&!R>57ZQ>n#wY#i=jcSr^2x?$#B$}*>1XDwHF}L*5lr9vW}gLc#cIjDx_pl zpO)5R|Epz{H@*N(nTy>pNuF30F@Mehw@uH@|M~XusT2kJz`(onYtHmMTKo3HQ9_?V zeZ(9EnU;WkrfbJXSzKKsU>ieiR3dW;Mbjd?EY$2q~pQM zC157TY75;2!c})K-=IA0Fy=tqq$Mnr%N8yiWt8%c3?)^N5xImy5kKl%2O|#M!fZx( zJ!!~(O^0CxtPEptKbPS?cdp0v0X0#fnS<6j1x`GBeNBj^3qVlW`x-8`{wN5 zwC{?|g_9SA-+Ga$Iy{pEbNi0%ctc93tbekn-y2?%@l6K`KC5@`2Cl{?mQ3 zJ;EPW9=(v-KwKAp49uV#1^1+Qd!5>Tmr4K-R8*=bVMFQmNr^4irc->2=taeqmX^75 zdmC?WZ>A9%piz(VFpB^Xdmw+EG``lli|>LS$LhEAKj|MR=W#JAfY>yT7f+bQbx~sA z$eU7ha*71X&cLB3t?Tc$)!z`v*@4h+3QL*~~C8w8ycUwT}I6Jh+@Xfe~MPLHXJ}SbE2S3Ti5vYya2j z@jw5~h%U2dvM=gwtqSlFuLkPR_Wt$YM)FXg^LF(>UA);G#NvKzjvJ67)430qT_SvO zJWC>LJrYA0P)Y0rX!J*{_vO{hni2q3bw%F828SNpoVtCRdr7FO zWafD;aCAVXSUP^uDLZ4&9*uBGSPee&Xo6AgOfGNVY^}s2H|gT@(cw*;W!ZOXW(?DQ zRqbkvNE*kI9=uY#p(B;k4hrIjD|7Z=+;_!q{_Hzav0|d*pPw_;{#(vdT1G}Op<9Oe z37EqJefPTm{0QK~P7jAfx4W1cQB44RP(fCf-6rW_$M3)YJ}J>bCuz~85{_L3@^O|@ z&5AE-w)&g!@FgcI+nX~38t?4f;MS5r9WK&>Mo2*F4p9A7ge%w13{Q`_Gj8VDj*dn9 zD%Vi|XnC?XQ5Zst7=fJ3E^vJ=oxV$^63`3(Hwh?RV{-9#=${q&%2@hvnh~DZ2J$tL zv~h)v!O+<$yt;e*Z^v)*h`yJb9dn!ruT6RIrK4#q#{>OaHZ2lyJ-d%%TvffI_bb;;B4Wt)BDXNS)*wuq z=lEwXJPLJ+2W!fEYOf3ZkUev43G#UHVsDYR7@~rh_A$mH-~%ZqXcoh5v&4>p!V9yC z>3R3C$UvXY_djE9(Rz)`i;I7_yzk<^idiSGuj!HZ_R`*rH-$ODh?J+`$o^MOhNDYD z*c3f|?N|5mjHe{6x6e5onuGxu8bSWxHXiZF7ZV_Zu*G-8+M^K z_fARhonPfw&onksos^{fj2^Y2m5rc}BB#4Tmu35LXpc*leQX8zP~@iLuqB-xAdb2? z`um!Q9B}dOojZ@DixR+`ocvLI=~EMzh&?3{CzhDZjQSS3Qax*>rzIY77qK?n?pjfK z;n&B%*A};h(u0of2+cZwGrN5FH9n$>q!01zw{wE+y)f3>|v@V>^m}S@KY1jtLdee{8vH z?xhlfv)8?AM_``Vvr#U-sQJ-6j<28@p3_YV1i`4lD9pl!OkLcdHVozhM6g~ZF@uJm zdVF#AqUf5>dZxO>?yGb?yryF+zh8B|x-EKF$zdT@zdve}Fk$kV!v`N+b@KlPLM08s z`qHNjYpt*Q`-?rz2MwtmK*ue5vEwp zq7ncTI3IPG-qEG*fb*uyjb?%kw>K8Gh7^~pX)HM5TEE^G&dPWidM+I;v7ln=DIs{E z718oGV76v5VAkqOpOm!Lz0{lzbc@Z4zO(`(>Cvjw-fws-<)evOl;wvXVhI48g3Of6P?NOU$WyOK1Np~)< zi}%E#PXkE`1rIOFl)Z%>$@GoXKQi{*O_Y{)Pkc%0c32X0DIc~^+?JKYtPl%^eeoWx zFUPgDvr5}TB;fL*aJdQG5KfC_UuDvtt0vEnNb3<*)FTk~I z8ZKrwFAg9~V1dZ=6Im!6qESU?|D9-rGy`310pDaV1DMrmeKW)LvCBN8q(jnruwi$9 zehDI5#_PrGOwm9HPwbsl!(Lf5Kl?0mzAIAdbK|w^D?0i=YpuWjlc1shT$kG{=-v&W zcZG=fqJ>MAIDCvDqd-m*F%4(YeG?p;b! zjm-%jvZi?AP^wtiyVm7rZ}(8ZH*IaE>5n_^)x6u~&3@(G#s2~8+3q?UIiBv$40`wk z-;`3n`#)8xq=pVCN}P&Bx}$pumm>L}JaV^xbg;ueJVh+7ymw@>*hn=ch2O+G2mp~K_&$VCp z#b{g+%_&IQZH$?>_KSeJheylnr>?K5CMAiaMMPh_C<1`8WKrSu|ceD@n+YyGfdpP_F;8A z6|`6;p)m}zk5zuXYL&R-z~IO89yGvo1N6=sI&wMPgt>y}%IO zYhUU{+gBc%M3_@!0SAzxqwUI@b!$)uPsyj<(c7JWnm5pB+56mcJ=0AF{bp18MNd%T zdCOLyTD(aG9bVdH$ZHq6aW;qwa+OxGXg(KIEi{G*VH``b+#$uPYqxG?38n0(CcK3n znGq`IIP9t>P-ds!a`?7%U-paGjlpq%)TEI1EyW-GA*2=)v+Z_kBLeDHrDX=X#0JzI zJ#&4Z%YgNE!g#nvy={dd1FJJqJ(U=e99JnR4yf4JtTq!pAh^h~m0|Zxk6N2M;{qQ} zaqk~%{V40`;D=L>tqbhTCkosj1$_cyYgKAs-B@A7)YeD4b)rM-Sy|yg8L3e$6Kf1Z z=bRlx!2*R=!hx7oLo-}6{ZspkH)4e(D--Sc}t>u{HN%CAtlC`I`7HoWo~6Cd?m zVoxzg>$A>8g(DKM_)86`rL(Ln>%Ill1}y4zYV5~-_O{1TW4(lN++cap$hS;e>zto{ zx*_M1{}-d2VjDU(*uCr5B6Nh`(`#R~`ucBQe$f5d7u;W%dSUyQ-O7H$@Oz4*p)duUPBl}iQVGfDsO;$i2UC2kv{YIuua!!i(UV#1pB^GQO;^b)*^`7VBE zA3|Ib52*~dQhRE?)cOO&bk5StFTVJOtrm5Z-?EOT2=IeErskE&N$U6q%esJF$;L3N z$iM{9Z9!>TRqd(LuSKs1KUYkq5x>=?@@)B#J|Z)Rng<3p_@zF5Xo($&9K<4OEQhRH zm$9S);4AX}=7n;v6?^0QYm*OyGkurrQBuC&Gkfm> zx3WU!Noq)?E`-J4Xk&A@OXd0U1s5))m>ycAO%c?&tvwzVyKhMG>D#A$aYy&oZdrXi z#*Z5p%q#*UlZ#ij76Un{VA}~9bs6x$5$k|f|Il|nTfG+@xld~!mzFk(@ZtnVf|SQ7uW#)X zoP~~*^cA~RIxOa%?u8GsM=3izeq5f_CNcwR6{uH%cd+N;;hy7h^iWgak>z*um)AUZ z9}ECY-7q|-i!2pr9I3#)zVS268_6(5jBg-;9$$_o548fIcKi>mkU*47U)Enoj7C-#Wrn;5OPvNOwM=Ykoa&mH# z&&tYzR)#YJ-M)(oH6Jx<)UbQMc9#3M&>^to6E&NAuerU)!dh|+S~M@%IZbSHPORQU z$#^)HV@+}4l2t@WCdql=qWz(vFCw9Ei&_AmR4f;5dxRKw5l3m4$Mc+=)|sm$aakwi zfeFOkgpUGKsY%AL)_LwXu5%75{*nOj`7Q9?lsF^`DNYw#GJjDq&sTN{PR`D<$p_fo zeeg9?Q}6uJz2-dgI8u6R=e9w&Sv9j#mOG3^i;mS-?k#BpB#MA5)#E{6ddjR7tasXf z%|6u2+uLdC)Z~PO1S`|$M79%d2DIw3?jpH9img+=7xwb|B-W5m8$(*-BCV2=>K|Hl zoV<7i0tog5YR1HM5?2g}q6hswb_Gzbw6E6D!J)J5K zTUuILyXhv-;@4NVy5Ex>Qttwg@Fw2NDt`C=KvwnP#~|TJwQFg_$x={1-O|u1D#xiz z&O&31`?35boWLvp8?jLg3DO>yPdkzD*^y))*( zP~f!kkTM>4F~AW?ky^^h&8?>`x9}Tt5iLdR28o#&mVFllz|qxpOzO&6Cjj3ZV(oI# zgD^BXccnV@M&*w#nXjcLE-&*u-_hdw&dQH@*XfX&G^gqscI2Dq4TkeYXG(X}M{uI= z9ITx$0#?L<`H6x1cWwV8p0S*`F$)4~H#BixFklAX;Z;0Ff^Fx{l_!t|JX|@;RZp6Z zorA(Q+H2omJ`!V(X-*Gx>Ku7k(-A1JlPfzy>gGWt?y}PcEwztME-uXHQcgaoo!)j> z)i>g~0*vA|QS4?mB2-VCp1NEfK^Z14i-$M7y2meMY#w!S6{{Y~VAxR%CKS6G=H<(c zQ+x`VQB;+_n<}l*Sq0YQM+sn%H?{Ac5FaW)}-yYya1Qjm< ztu?b;Ek9vy*f3*1Nj+}Q9%ou^*(iwah4$N4a|bUkFLnB)6-86U8$>rRLx$t$oxL@9 z=@9XrxD}EsSFCgKnEQLpoP+!TX;d3$*{!$jtg6WV*}3w%X@aLUrYVG;D&~e>^eolR zI}Z9;9$6Atf(bk9`FD{NC1scd^+p<|7^1--82RpZyc_b;Zd*z&1hQ&PX5R+BLBm&_l>hC5iL1lQ#^MS?z|X&V~1{$YzhdYl2BMv!zR8dwI$M}y8w2woJEAClui-@7hQN!%f z(79&Ym)1#l|KtK}d&5XSp|7Ai_FUi_^tC>mMB2oWYUh&Tji<6#_TJ3&2*8&c?<#IF zXRti|Rl|89P=Fp<%bFZfw+05if*n_zu)W7G{_fcF4_Cw`?%cxv62Ac&)G$HK9=)H z{Z`RLi0xCSUI;}y^3Y3s}?*3Z?H8QQHK4ez9_hg0VN!2GHiY@?4 zsTn4WKpjAYnOt2jFL%`;pz5GU?1C|kxJUqWz8)oBCrb}+>2z|Dt)5^tTMx?Q>-@LB z#VHb;C(7&3u&f)$xSDGZ1Xy>yZ=jr6!h22Gw*O9M;z{qv8xLCyKLEqJ=BJMJTZl3P zM`v--St;zwm|=(3%mV4!=8*stTUD3?>L=w#wzfQ3cZRPd$}ix7h%=y+b5GaIxg>!w z$Qh@p4DXx)R^vaLi_(9j_o})Y$`Kju8W#>QLCh+cvpW0wx`Kxb-0khRT0g$pR#1+b z0J#ayn4uk*5Nk9pu(kclcR9)k`3q3#%AyGEGAbvD^8skNPspQUJ<^)D#yn$+st5UC zVRM=Gj@Q7I-VP%lw#xqeg@+F{$diGq80?UvyuQyg1jWYpJ2gQh4MkstTcDHf!-pUA zs2^UNZSvu~4DtoVus0eK$`pGP(@hN#|4JFT(tA8%CJ5fFSkZuhNDGH;R<~1kG1)UU zC8bED#;2cqwHx_Y14BGkToyERszEJK#W>KLGy@ZBVphR7F$|rguocoXALWo=VvEOT zh{D)PxxX&D zlcQY5;bDUAp^O2s%5?Ye-8|x z_~YPbNAie#47onBl8gUx{}Au&eo&eJ3KJUX{xldEmTEZ*D4+%V#$pB_8b?MnY6 z9!5z5vJM@4tRrUlG-=7zX}k42oL|cRK4QAGnqcd4KR-w9Ml&58GGlSTqpPi?n&YwugBDwVGLnk_zMT(Cq@yBxJZ>m2?bk@x`ORHY0=A;^G;-ERn352p%uHN)gk}%TLQmQ ztt{}ALU9$5q_AwXA*k!BKjLeqe|_IUeX;ByaQg9i`9I;cpP{B=4*V^QVcB8R zZkU)o6BNAOI`E(->--}#%xYIXMA7;g&@9r%UfxMQf|cuKWs_5VKd6<_fuK6FyZn@C z@cu!fMs~G+IexFZVe7*MzQC*5>e+DH#36e#j1*oCQgaW$jhqP>V=We<+9Pim!yYRp~!O;ah>8JIOM5cK|I)}o+nv3 z44HD;fN-Gj+@15BdAp)SgDcAw2ViEP)r$sGdcy>Ohzdf&E)Sf7TE?&E$?8qOaibf| zmt`RY2H-Bs(f(&zat0V5m93w>IhTi>xM6;#tvWCYtC>C)BSJ0M2PO_TS7m_Js;vxe zvksq0oee#OW(1`poPb1&8NdELy7Sp2yeu?)($$lwmYy5YVYaQ_7d&M4)1uRXJMEbk zfSop@9=D98j5D#zVXy(MYyrXVZN^|wUR!o}Vcz@8mhIDzA=b*%TpW`52mhGG32H;9 zDSf*DY#DSeJfK-M}t6siYBw$MBoJ-yV`?z9w$ zlq2Z%43RG|Rui)Y35x9BEICm(b_BF=+Z;tMbKnAN>onk5UfJNkj)MRBZ?>!-&{#DoU?iD+AFI30X>I=ubvEjh)@| z5B*O3Dq#o+jL;=Uj(I>`vd&|}*H665nHrEXqEJwp=d;%4(}23tvtzR7@0?r(%cDYS zTY`iz&p7HZn;fqykW;xhh>##%9l*7qPY~~jq%W|ZWI86Dgo7|jJ|U321SY7g@nkH8Sy}?G12d22Q1Ux6_`BY z9Z&~p=ca{KUSEO2+KvimViIR3L*Id-L~mJJc*VztTWky|e4Z1-j-^fnO$XXj^T<1Y z(mX=5_RaeK`_q|Ol&-2_P>xT$I1|Nd%%Vh;+Tm7 z0JlQh=okuSLP^6@E!u7VzU#Ad-ng+NC8_&~36h{^a?fSvTQl%KBmQ6i$?0z2HTEq* zy=x&Z8G{Z`iZYR`(v7Y>h5OMaluH^)StBN9R!wdv*8!)sq$-s3Aa~CD?C&Gkj56g)Z z>z=S1nC(kIuV&O}@$ps9!2}C=6ySNzwUQOOIwKt!U?cPe9vqo~bcPM@fIyyOLnxLC zUOpRbz7D8ssHs*Z%gm8ea7@Ww!?L6#JD_PjT-kIAQl`2Kckw3WhLQ*8=A9P{iXSunNSp+Tl05{eQ&f~|QoUqxm0J^A} zB~A`5SVh-=^MHhp=!mRDLYBQYO&}G~y#kl$c=L)GpNYpjM#(2yc?EdO$`- zd`w@fjp)9_e|sz@o*(|k<5UV)nQ+Kn44InLNqnk`HGz+#5p~I?ujVtWiTo)eVi8Vw zdZ(o#Lh26#RDL@mrU~5X*UT`E<_e(fTnvR-Pj*&tY~^w&u?2sb$#=!l;%Na1b5BlC zjjItmGBF=oeUqm3iX%e*ght1`&jg#P%ywvGQ}w2#;ZV=60mC!T^s~COU*DSwujlOtj z5=VlCg6=(EIyk7M3;!K5);NZ!Jjwx9C;N&tLuA^G`J#YHOdC+qXc?{yQiXhQtmRk< z*=Kdg`4|9FX_ZmED;FKCuki-IU8?GyBcy#I@?DU21N>M1>d~EB_|D>mnDn3VB|W_n z`g?uDi0pv)RjZz**&UB}ZUJu;<3Jz>I4b>l{$n)`rHB@PCTP@RUuJRI(xK^*W;+NJ zlBLyQo?8rm|IOvgmq&Ll`U(#!`3+<9UQFI*74>%UX=I0si{A{Nw+nVMuc17X=Q&LrOPRhqs1-Wa>V^%Gehv#xD)Y)(>3eHI1kAW zx|N+F?`Uh2xHrke?>mf}9Z;_J9|zv8grz1LIUG9rB-BN2!%{qpz$Ah;FI_#2YA0>d zH5Lygb-h3j_)D4@XE)TPB7(jS^Xr+Hy2=J2^G2li>X5%#=-n7WKeEtnwi<$y-vsni z9VmN<4MX3gl1PUytIYwFypurQ0hBGUaFogd%mQn&pjq?bQ%GrT+&fpD8c4`X4Fv>J z3==&;Yp1kOlkvO@m*0oMy$skyz2v8KkeH_@IR7 z3Y15v(CZ3xj_JV2yK5EM2ToidHot&-=C1O~%-K1lsv?3BujWUhp^IQNqrX-@&gegv zM2;s}DB+I9Pm|h?s;Z6Iv7>^4bskf@7_dGqED;XG-%ybV@h`fwhb51cBE$5DE$COhQ`2Lkbe?XAA1lxtu038d-Tfg!`+!HV=5rC91VkLIJFiO zY&<3Ff$POjN`m147vY`uQTe$xhVOg-|7PRXrbSmCUOPVF>>lFy)Ws((B?k0ixX{G- z`0pc{#?9nbjRSMwgrX|h3OFG=3aN>z1R74gyI#>;8;$Egao*iXm^ zSquZl&hjgeO>3h+aX1O-hf$~BN=Qr;2Ctl9l*5umHGpVbYpx_3EsP2VOv59BeT#-nljKqi*L-HEoZ?P#u;-S>b+#-CgOdEK-B0oK5q6(AHXJC4hD z!cB{0i>TATCX=GeN;O>C#)g8) z%D+}wd)d*IRG zCV$mu7Sx);3hIGHiw-VO1sByBDF|-uE<4%>#nQIfaGUe_X%eH}zLe!AtFQkR zIyJy-eB|+Tt<|B}IJ$#C3WE?{&0~`tqf{qTrmQD4sWJFJE=pfq>HUs0H~4O)@6bqs zqf91T;Iq-ng`$hY>bYbH(3J0fBw|`{uJcV5$3Te7d99+NCwEeNEE;Was4xco{$-y^ z?RFP92wSkikKZq-`S%x^1^>3e|7926FOiFgGp!eeyf~te1c^F zWJ=;eF$6U=n@x=JS6=+rm7pIYn~szy-ggK~kO(E_wm`J}aIL;&b+X$NuOzXFSzKaH zqa$)616E4RFmqmP94C;-ArTjcgKy79=@mx~ia$k?O&}2HCQ~Y01JF4h(afS5x?yp( z$bOnTY7rCb4?xc{2Vd}GtuF&6T#t$tpCgU)S@dg}zfyBkL3Xj#v;YRHxh=1Vb0K3T zUrgOKqJk!zG(;B5JXPqk>@*$&EzJQz!?jztF8uEKtl@DRyBaFL@EoFx@J45sQbiUMS(?U!=uzr z3tW#K8H2LcLhAz1l`*KM{wcif@~p)W>9(9EP1;8AXm7Ut2!>f`o41R{52UCfhkLxc zLkV}lM{oq(d?lU_+6Rs&o^W0I-YgV!3cfHVl%j+1%xN`m3<_?`E%mh)l;6753l@xR zLva*ne_=s^V3Hoadt;b)waZxOdE`^0fRB!8=YzSgEl;PR?ssRaJ=AEiCAeOJY39r| zV`6^J{0JzXf%~GfT^g&!mK|*Kr|q1qO=gWYI<6i2rpQ&T!NXkQZA_NdHJU3CC`1c` zK`01F#x08%hhZm0f0GUJ}s@k*ALNv}x1)1N;pJcNP@8i(Mjv4<23c@7&fOPpGQ1ez!nPeeE+Ub-R!hJV?i7?S627wClyJ${o|4mz>YFd?8nquz-Jy&Y z7XH8o0(md_Kb#sJZPBx;qQR58OH>mr7ovuwgaQNkAggBWYlLJ2r;dUBep|wPmepclv6c#*vAZp`7pv)1Vdm=wTkder{Jb|X0rB9h#({23PLK~)a}nUeb-<(p`u@(!fOq5+ZP zP|Mhs6N}}8#AQ9!M_Xy)M0GsekpaFZO@_8;dc$kpbx+m*1{ki(w;i9HR&$ap+Xk z0*FIzx#RI`B(FCc9g2)mow;m6L+M46MC+fr-&ro?LKHE!5QT%G0(|h$7+yDMuA}y` zHf~kX?D+N9dlA4Ze&ah_yV`8;7!@^WgYXJTjXL1MtO{O-4m`c>lTwrR7r~De4X4#@p@ghHP`SRM8Z}&17PJbyJoA>34ss_t6XkItc4o$B7BHUr$hZ(dZnXp&UnAc4jNy3)C#UTK=8Y`hW_|Er zeiv?K9#y9!A%}A@2PzKlIf7n%2hanbLNzw=K%6ixt_}!=Ektbk z8m5xQA;R|H&!tm6abg^$kM=RVbGdm?14F4TJev1yY&;&+5#4y4lOv$d>#+h{GHTyL zbM&T2W{w0+?m$v)?d4zaTj|u63)$`;*4CaPp^#+QL$QUQz)X6iXw{7ua)Qx9d0Tt8 zv>7T4n6uArBFuDU)xVzLkrr*=-h%0e&J;Hc;EaT zi`=&y#<*QD`EE?BH*<&Ynf&4Sk?X$-@sG9H@v-gk*yC%~wI8s4y6g0}`n)uKu2*ba z$+b`Ie|B%tw%gbL?Dp#)b^Wp*g_Jzod_geFQ-=<^YE`_`fv7Ph1yH#Ny-&h<26KsoG?feV^}JW@0OB;*hEgN~#%Zlw zVqpRsvDhc*1Opo-QFzS#gY~D1>r0E-mki`yy~5?wsLlK&9W(lm*ZdFiy8#jhSMJ1H zLAgdGQD5J5bIE4N6cH;7h9J{0mhXb+&_F2gvVY25BV|%DMM_S6yJFOc&x+Kci54NC zX|lRz?;>XXjjG-N>{~ zX>p+&Y+syF`f6J6Kc!4u0C1N7FdfMqaLK|Gvx~Xm%)%!TRg~(8T{JD4zMx85a4Um! z(5D2T=NzLxy)+ao;FDSkB+dkZ=xa06Dr~Y28r4f`XqeF#$5TE=wz$+Oig`l;b4Y7D}JcpQTxI> zv(2N#lDv>dT6kbbgL_8fu?UUfV-0ydBr&s+>Q0A=Vo!$&41z8Ly9nKFayOSRW!WQR zC@wuP-Fi6pHMKl)#7GP@K8G6;3+OiWcXy_QQh#w6?spJ5k#&fF*!eLb7bcj-@>V6AqI9hh1j~CZ6Vd~=_4;ovmdz1eI; zv}~Vf7j8a(C37~}fdeW_`hXKC9K^EZywEGS3CzW83HOi~U@6UkHPK=tN6)W+$qTA3 zKJ1lVbfA()R#Hiur<1co3R__CloKalC6HP5&AAQv!)sre!_nqnL}}H3|TN>1v4pputwXC zMmH17RE-@lynA00m%^jgSq8)Jm&Zp9PZnzhU`i7|?gaItcGGDs3km@Bg*WZC6cOh| zxd#2z#>?2nO?l>qlwZB9jQ@exPl#bPcGmz3;TUR>9BKoLNa|W@^Fux@e-D%O5$zNE zB;#(d68KXUNc7*LR;6Y=h!nMpVun!=UDc1%7M0v5)6*#u*1W1S35aEn?v^}3p>8dy zUFKQISVg}w1Zw#GNV0q!b%(@c^btv?PoIwT1hko%e$VCnoOV!^l+~SkpuiW39 zNRvWl-2t-}7&G-oF|S1z9weChJ$AsS-f2%xvW&29Hi?uTl=$JI!LPT;f5A}R2Y3+#nkp6c(3dw~ zH&mPR_SDW$`;wXt`Bq3A0hd7rx2-$8eTLX(u}YF4+HXM^b~~;-dnUEPLNK)+mM9oz z>_tbilejssep%gbuVqW7c=LcMW;CA@dskd4;ZBQs1cFNS)yWq38fQYsE3{&;eRxvi z6sstIK}uU^KWE{DZ&R-L_w)>ehhJyydV;MnQj9RynWnbVe=>UX=o7_MCDT^YyY~OD z@qnUY2d$B|Q~A6xaRH}O*<5aNUAp|z#K7&elgIeQ&A%CZBbay6HEHk%ug#}TkY6Y* z7(+^}(Tv5(KXV}ZPc33nUqM;wZPm(Pasg39iuj0hQ?U*UpT1Qbc#au{e9$HE)Oc4% z4ctini40X@?+2s-tjnn$>VP<~VrYmSu6D%9317x3kmT$M^K!<8H!S#+`gOpjkgm4~ zI>zFS&FK_x3=K1GRA?$A_b&~9z#U|%2N)!?Afm_2os*x>#`w8UcrYmJ$&aBR=EoF>!>lnh1HwVX?c#JwME-_$ z{fZ1VGu?F@5%@EaYlY>b*s*%rdHL0+|37SH^-<55yYOvQ!B|tN3f6|{ zKhG{niRq>zLJ5%9))9=Utp3}L7Rw9<6^^rE)@@7Ptb|uH5k9pjs^FRVLz)yPT~0iS zljV}eiZCJilje!aRmMjnS_mI#+-$?6wnQH7`xMVfw9G$E^2M*_?Z@7ad%8GaERTwmu9qkpg{t>BiVgS~6NNEgi9u7`gHZnSd4s{?g@GHir5W%tU(}BqH)7>N zK#k@EUy-TFbgLKUIO0L%0vauc9IL0B^1QYeRX&A}YmmhLIzMA)^T|ClrCKPKaz0NihExPktc9_|N2cQxd{?xiAb}oUV3XArJ?HT#ixd8 z;Z+k)SNi{ZzGz)SfmlSjt_L(Txnsc_t&i^i>;*^jUHRlJ#!?3};;&?`zb9F&GfIo8_3 z#z1i_cvr+vS5NCdpt_QuGju0nrdA13>DbL~VMrOdWdBsEFemzJDLxfS2z|U0*a~ut zfR1|8?$BNWSs4r^2S7GfG&HfpF8F^BW`kD$JD6#bO^d2>GD|`hc|0GRpK%Om)~8KM zP@R=I9z#ZzhV(tGCKR+t9Ur@E;WG@Im_rrwF9aFT3EYgxe!N{IxbyS(pYZ80u_s`$ z5qc+A&V>*rouS|oC#Np-%)0NQhOr8C{{GtosrP>I>2Emncdo8*KXwT-Fd>&XK*3S) zf)U)9MHfz0;p_I*7hV430zA=$K%|d6*(6PRoMqxo<3)~ZOGl^e3i>E@ca~=7lY$h- zvS>-d3cX-+sN5=K0!nj`2-vYVj*hKWm|^=Yij*`(&=Y{tFG$U@jEBfR-U!})`Cw@|-GTSQ6xE459*22ILX z4N4(Oz46MK)RJs5ctuDT?4oUbG$|IF{+XyWsIMIOxTK>tl2YE6yJXj_gON4Os`cJk zoSAd`m!``3fSWp(d7(%p)N6%V%a@9r1p!0tmvEr`eTE<_3hUEM5kw~uw;HfOkso>% z6@;E9143@JZzVvjIu4m`ND};N9 z)nbI1s!XN|B4LRE46%O0_#d6bV3$>p2KFQ;DGlWgAkM4UkvHGI5=o~jDglcQV^|I( za**g(wB~ueGcIh)uDiWJo=1YfcoI@^5&hLl-}EsYdgaW#ff6snC(fU53xKR1so08xRzBgtxHcsW|(aVT)gr9qSLc&oU z0|<#Lgr=S}ENl&a6OaBy;4?2VA2rmtH@Cj3Kc(Ul<6kGBnyVs)sn&}z3!P@wHf|6# zgfu-`Qh^xuR9<$8u-AiaoH?%^8Lu!LL%gbnkApL`JS@lX! z;>00K`b-B^HP0KW5250xiq*KqxUmTpU2NFIR&*Mol+&I`$BK6PX2{Sxr{Tel+tI9b z4+Oiaf=DxK5#m5~PhjxP*>PyJx9#=CPajylWC%#3{SqbyOI8m9HmByggg)&;qYzZ# z$vsdvyZFW@{NCcA%2~U~$%XEO3JBm*! zS%!KdZn)S|@?Cgz|INtNeWqrXF@P!1*=xYhrH6uKYz{R^yP;7r80<=CJuaShShU(9Kkr$N>CeHQZtbY z7XI`-;gpEn7k3v_el#p3*$>gMwVSkzwXwckTK#^V-38R9C_Cb6R|hA(zz2OlxO+f2(Ey z@<#1{734z;Hjgh|rklyv(qu{n30CqxFaB)jWe0I7AGUln@k(ovbQLlksjCS&LYJv) z{vCaHBNhed7CZr#EJ^ve(&pogca;eZmUo3d&ouZnzi|i~d=)r5S3S2xm1qtX zdYy@NU2H{J8yj>EBnm5@Tu>&@#k~kE(zxRt`2kY=FbH_f-$XVuqK2-U!*Q)yuJ&c8ag zp#J~s*c$2sfw?C^JP8bGN<=kS5Bc-BqOE$Bl?{`rTt)hTH%Di3$mw4|w;@<51kt<% zCBOal8?+%Wt7nQek)dPg9djL>1JVMMg3Uhr;|^l7mL0boD} z=tBjv9;kbG!{fy|uXHT2i<`OstjjG?jcx_i=D5-(yds04py!*782;(+nD!Yry0AV$ z7CU-JJ)mg1G-k%&pPAbW)@Cv$(Q|cTp!GB7%d|&Ns){IQ(P;ClX}b&Pe4J)A2K3Z1t`g0SxRHAWGpEps#!30 zlO?1q5sE?@iIg!WL`fTi>?$deEG6B~>&u+;``!Qh{@xC&rJ`WBLaKdwz0Qf!UgU)GqZFn-~p2Vd3kWe!VqB>6BS$g6IHgPf~+ zwlB}|ep03cdZ`_C4Y5SNP}apSyeGfGhaelId6ejFZ&zAebkbrGqD}OIap5Fc2tFqt z6+_h@h34cy`ho8q`2dg;T~8I8P=bV*eOCE1FDcJ0^T=c`SW5*W4p5DNHKDD!Mg4{dlIu)`( z*g6NKY~OPJ!u4ryEfTXDTv1MLj5r8$y7aeG$6AqR1l)d3Mr^;51<07Y4NR5}YNWrR>MVYIGrTks! z7@OoA&h1|BL#i;>(;ZQ$t$4 zY1Q%GUAuK_L6{SF#H-N%rV~dZc-^d3yqPej!bWo(I1cK9Q>+G6?r;uYFIyd@Etn0n zqqU`GqYLVL)_LBs*QAK6(?y{MIuVtJ)oCKo>2@KyVdYTw#`YKba7UzYex~D$SW8oj za;E6YlRDKm#I0nCDbk4VE+~6Kde)m<4CrnPQsld9X@dpds^S!4K-$3q`LS;no*Oya zFgKR3qihHoE`0KXRKAb}VvuWZK{AiSmeIjNOIxw>nS^c~xSNC!kTG{(VcWFAAV#GU ziuvv$2#j|v6OLeaCyyGKhpW;#PFj>aE-melI z+~E6=T%3h8qq1UqF%uAH^TLYyP7jl)Iy>T8CFv+>uw8%=Z2wQM-KFh9=R1Z$cyt0z zmr5wmtJv8}wwMfFO08j5LBltH{F*ON3NK)z2}twv!&xs7nhHyYNOJLz=ns5=u`K1> z{_*Sy_@ZPN>b=uPd@EdGHG57MHEh&)oR@UI^*Z#%D{kugE7ZkzU= z&(&vl>u_zhVtCN^ZFrHIw&=>FHJb;A%)2mlYMU8$U>Cm9uSC7?V>Ri|m1?#-A{*CK z6xNFFg&x7^GeC+}hn5AA1I@cm8>8i2H(x*K0vRIuVaDM-6NbE(x`)M^@=_A>s3&VZx#EXgbjAE z#+{5Ol`^^LL?LYFq>?uSvdU1sMr-bhvvYQ(BpM@;a(b3cv?#lHdlp12JJ-_UhbJyC z>PqE`-Rf+cjLLD-L&677{dCs%$`kTDz|>*rTlMVs=KIFCcgfweZcMdL$qOduFx#3{ z<S#g zYQWL{$3A)9u_)zSVC6w9dwEBsdxk(T0Xh?nyqwP@qJu7wvdng|$7sud3w>UTTa8Qo zPS{$!>dY@3l>BNN~*qif)zlDWnaz~xSp(#>3E-;KDIr-cvRr<+7I z&>tsq4BWvH9X@D#A6Kb$%)78K`0LADhx6bTQZKM5bl2eUF84{EDR{D^p75BX^9P6^ zxe3jK%sv_qf0Cm)3m-^ zZ2A5oGzjr#$$1ZoGtWBP!>A;+KY9_ag2f3AZ+0ShWWF*)8h5}N{6-rIP}yv|O69}p zP3(e(VEN4d=IcMp*#-w4{6F#oc0G8h_(+i~Vl5HJ)-H=|uFVxpsKOpbM_QD{XQ0R) z_4$hXKi(Bf%H2ICq_FLMW*`f4cKczvw?A}jY)|vHa~o<14c#dl527BAi-6_DX;q=g zBBIb~y;B&4|C@*Kux3Qg`P_{D%_6Eqb%v&;@is`cBz01(xeY(i&L#YW*CIDFm*h?I z-PMefsRvh)`gq^Ig-uN(9cKQ6pqxV4+iAk@Keq}jk>wRGb zo!-Bj)n#@6V2J0YMNZ>~-9j~X=r;&u8qLwo%h}-2>Lr&xbNo{<22ys#OcaS-0!GZ- zWL@-lL7=sJ0m|ytd%WY2IroclgVtHp@Crfgq90$*!PKn7A-lnumOBX~ z4}{Z4M{V<7w`r;Ec;43LrGu`KZMERf=%fw;>tr6kDLATDdD7GN7Q*2!wc}IiZ021* zHUhC=)SXvMA4AiM`F5`1`|=8`S%P#7fIr+L;IC(Pk2W!2!W_o))NHr_kdmB8oRJSJ zcn#Pz$lYP-)%QC#V9nX0;+#Fv5I=;)KE(9MEMR1-3x7q2pWc6_=sZI}LZn;20K4f; z3pVfdm-VI)ce$xzk8CYr8k6a^9&flLMc5HOr25iwLoB3R093iMNl}cs~ zA@v~uK0=uJ2kKhl!KA+c=p-5xA!WnbwO?AfcC9B2UfO8!)#`N2KAaJGEl+=K|EN$V zW-<#9`S$-)#qM}eOpnNdQ&F-Xv98HBVdIlOD1160eaeYO3pp;ANjY;7P$N^Y?bqq+(hK1&2-kZ+5 zmIX_B{hPk(P~pv|5$Ebn{d8z|pxLqT_Nh`-HPc!ox?Q%Jl)mNk{=R*XC~9huv(o(7 zm4SCU4D-|_6u?KrB*~A4H{0Gk+mmooy%|e*_A8x;(P3F~HA%J*i=HL-HHfEP)$Me?J0V@^Gs<{zf~ z>~p!MphTcezG>6a)VBZ(oCQMB3U2JARQhZ6I%VlDVyTH0)S5JmbNb`s^5Ad))KReo z1M!gB;#tI&fUWalt5vNEE<1G21t?9v@-pFsAzTVdf3c^hIFouRxz*_Y$@|>%q4kKZ zwfX;a$>A*6bE9cgI>pY^+8$;Z+4}dl^;{&6$N|0* zs!=%^cQ60v4llCu@tP_en4v=3P>BE`psX zt}h|KiIt8W2+ckQRaTdUw&D+TA~DZWWHqWhuTupC-S2kqIsG>mz=eMU-=XWB9D;gE z%B2k*bjTQIeFuJhiyA1MqGvC3qVq~Yi8d2V+xtB{?ZbX5JgqdN{0Zi3surK4_D7O5 z04jotLhXrq8{}>I?7T>lb7qkSj`c^8?(MZ_&1g4=Hj?V)~Ugz7u1;*#MJz?T%a z!RrhidsF5c;iB)vS$ejIB_lBlihNB(YNCpWz4r=Ko1hW;>J5}hfPn)hvh^i`QUhuT zELF+>R$@mc9+031%m_|8nxDNsK0elgp2uVKgK=`M${}6&o+Sf6M~@ajUXO zKLh(@%Z;{5v?V*3)sm4d;j)+Q?jk%oE@TDS%`=@~Au761slPnjsVX=~S7yqr|rV?M{=J!o=>d1{ZEl>hilR zf}wOlDO&INS=)3R3uVA03^IB5`YOl1G2I|#lxQN_dC||WV%(REzcuD1ii;5i+$1Y- z3RO{VqFJ>amQ=wIl?i69u}jSBrwOkU%O!^hY5lLO6zULrQhx}CEQk6o1CjqK(<;4c zY9AlK9{1=9IMYtii4?JLCBUh&Mp8jhkqu;+6_F(`U#_1&gatW!?K=I5eGMmv8;}At zS-)pe<_VT)a*{vXb{Dz@H>rD%nN}n}hp@s`Pf|w=amFNF(i|2ffA7|fjAXqL5Fj_(LoyE>GJNPkxlO9-q0ceIuU% z&7s(7xdxv+2+%CGoM*23B(rFPAutP0CtS8? zTSr`dw6Wlv;qlcVj^7q@_Yj6zt4z;?DF85uC$zPXUf*&zAxTsu`8|Uh)p1=j@=WX5 z?wz@--@uZbcXfWvAMAc?r8x$+1+zFXymbUx|*#R3pg47!{wwwyG@ zU{W%pB0eQg8P)P$gKo?2h%h7hB`a#=db%U>VEt_|BCqM32PiH zew%SaTg@ol&B{%U(gWfZQG z++>4)mq(A!FTei#D)?+xM60>i>P_}p^k~@p708n*#GF~CtWx@`P9t}>p54DQ_}fU; ze#E(&_3Ayke5k^Z&(Uj8%#_028b;{5ZfdnDJ~CMyP}SU0#XSE zvPK>I&wU1*pB5>NHjzZ(@ib}x@5`FlK*J7&3)s)^y=LrIw)GY9k(t*|p%q$ckBNzu zW!dWpP=l${+Z(n{jkwBGY$vs^z#|Fmq?>>MV@z7i!?aMs^wVB7UmT4s9i)z&Vd@mK zg4na=cpju|b>2OXKOw{gkWLh63OM(ohc-dh6^B~Uv_h=32JbgM43mO!M{msamw82y zb?@3gFJ5fr3*1;e?ESr?ub23|z^*8r(5Xo_#GU?dLx7KyIhw)%@E4s%g&7S$mJKEo z-HsVTqDZzzw_R;$qdlr?UoNVWPyZ*Kh=BZh(hs~qmWj~(=mV#d`dcEIW{(PK!EoXa zB{nurz~iWEUv(>k^QKmET|2eGP*bH0-UJ)drge(`%&_}gMqVTq*%gJ*^J@n;Gggf# zRH5EvIlMN$E1I7?`8vzd5O|yFPHnJcUzB6qvGRNapZIovAF5Cd(x5P;0vrf~m!#hQ z6Q2Q1DWEwJ*=D!C3L762a^b>--!o*%!>>bL8}`LOyv6{wjq3@s{e7%5?pJ*WQ0sXu z7;Tz1Y?#k(*iHZ+eOP3&Bz;)z=YGTTHgpPq6nWe%9+RxwFM9gyO&})1X|I4$ zj~C%MMCTl_!YE@PuGnjz?8OnWIcZvmGh=kQdLP4@3C5fiKQ*FY>FrjA+?C5m1$vq? z-lN+z4e+zLwfTC1*M_V&vp;`PbLBr_f1{LletPfRwChoaXp$zlSq+|W^NSTl@vA0d zS3AA)@$VPrpStYvS8+YmF~TN{0D~-W-Q3)GJ-bUGQ3|GJ?6th!i|6hK=h=r14eD1z zMV0g`6on6;7UUHiiMcZ)KYBcicS6%1KAjzKJFg^R@ALCpY@h#SA211_E<&=|=SDvt z8M)Q9X8M6?I_jKQq)SJTQ319$M`<^E_G}gBfWcp_TUK`DQJX8VHGgt{Zbzk|1(T7` zB`C}gp}QuaQ4nNVa{UQk$wV!uQ5$^mQK`}J)_-zHG9M~~~f3lD$L zV_o;m@Tb=;6Yre-ahP`1s;bv0gs3U6sUU0DFG~I#z29=iAJZb?RgRibcbn%yx4@{L zj4J3qeodY-@)rrd@N;j{pzwiv^So%g2{_G)l=>Vw7hrny_kp<{cgD|dHqSo%>U3_6 z`>UwLrw>Y}tk=7WGLM%tr2X*+hYJP_PjfwQGy3THwtQZIse*z6@fxX;#cvhjDdK2V(m_$gxOy!n3xa)Ow-#oX|nstO~#C}(ADB33gBl;=5)R0;LD?o zx>rPWmAA{%#5Uh=z5M9f(IK_kj(1z|VVplsUpd&qZ@f5lozWc$VyAn_36z$X;m+-c zWjqErY4A4hMU}6v!>3VADSNhuE*`Edg9K$#Ofk z*RbKM7xfNt(CuRu*!Y%a4R$^JbUucf+I;~^crAPQ`HN?7PO5kNY^Ljrmyg~ip#Sh5 zY|V0Ut6(^xg`1*Hf^aliNgxK=!1Q~D?6ElW9p^k4$P$h_`jnO&LjH1# z%jrOrT-UB{gLbbPK~ekgv*UB){KY`W39j|!=d4U{W-MurDWORYL%uY0c{j!imVjpIN5nJ#9dkZ_&kyz=wgD1PKN)7b-#=e7$hyVOBdtAfp3(eL%Y(W4UWeu+l=PUerrDIASiXX7 zT=En{%|s?p9FGps)vZ>Sepqy^huOoDr54YhCa-(?Va;5=qZZN$5#Y`2rDfIs1kKl` zGc~Oew&?GoFAGZOTPd{qv3ZSk+&P$4AJ6nm3b;4<{z0yaxcSI}&HTP_sd@WxogjTL{2nMdyBZZi?_h#}2I z@-q?KLZ{H;vLjUotiqAEa{=}!q6YY?;bJe>Fvt=|yD#lfnuK=*s|*zo(6QQp!#~40 zY?v<^gzaE2x!P_Za0Q~S)n)o=DQ6X~&~Z&;Ou6qa=5fwct#YmumA+<87R0CS{Z%s) zCI;sjsN_Vx|LD-z11kGlxy@vMQVw0$0@@GpOys@@93f`Aw2~qoN*=|eU@yX8$(7t3^e4|IUY^lKmULir^|F<>YQKa z&P?C-XsPAv-hyOl zN0!$sK^&Qi+yAOB+J7xhAQxWNjKcAm-;RWPsuJGf<*lCpKq9&iCU&_~N_^|94x4#x z%?3<P_F^X;*Iw@*k>!pbZ2U`m=hjI$_W74S_ z{R8(=W;Xxw%k582Wg4(MY+9(b=aq8!x{JZE82Vn2HJAnzHHk;fmN*g&o~tb`-(~;VS49Uzj=68zD{-| z23&$TVqyg`D40Qs-NP%1ljBzX>9}TR2yD-N>JwzU(7E$(S7r~n@Ch^qtIOb#Bj48O zL1zn|_82nXx-)+Hes4@an7;yga5lagEiX@I5J}DprC|rTAYn3%Nm$}BfDGDTVDhIkyg`N zAU|ac6gE<4c-IQP zV+`M2U>hu9JMiQRIzi0iey+QkEg#jbE<;aXc98EI4aTwj#7PK(w__EH(UBfVEeyz; zIfRIaD}{-b@L$sV22?N{Xyw)q(x)X%#ybhNGdWkgnxYXV^eb@v2M&qr4dX;i2viR^pNK?^b*flHnd+^PC?a*I7J z7(fzW2dA;Ad=L3UY&|%GWCcGHxg|gbz@By85vVQNxzjhXzN)b?8y1Mtwtvf(3Va?PkPyM5BoY32;?r`no= zfuqe`t37{*yO>T7tzP?9YuhP4_ewoer$%h>w1`<2lUwxMeed4l$07(JN6;L027h*= z_#U0CX-9X9+{U!E<=p)zl0MyCuztFHe`%a|yofsbxNXqL^b?2U(=ud1e(Tn)M&I{) zpz!N;KReR)j~8ov*Kb@C=sR!LDu%Su{m}z_zGC;2o@-de!HkcQ$QrYvi((hYCvLM0N3DW1d%gLeATTCY@-jrASbxh4n#aXuJsED0#BBEi@&5qh*~AKX z852}LY+sQzr=9R9{N0PwoyYvttQZGZve1JN|+$H&^=}NqcSQ?%y?Agl$IK zoMmg@@gDa#G>T7QHxN3+r4Qa{lP(;+d#T;_nv-cGnMTWldH9+9@2%vu1MvW+#CC3z zmG9fJ=`Msv*;>g1X=!Lwto4Y?G5G^67_86d^1?(eNq{BBO<(kn z((A1?5d(|XyVaahpN~=58u!>!ff7qa9=11|0YD|C0CBXQ$8!c8`&diqH!-irr+*Pb z8&KO?;d!|D`wd^cH{kB_>djXjeLM`4A>vw4Lh}bC8j|ENqLsaQ7zZ}heb&gnX_oRz z+tj`f#8!saZCo#W8exLiQ)`&GjgJDy1!gU~Jbysv)Nls}xFIk(QNqp3xw6`9f%mai zL#|tRO}W_0({7QyTxO{$mLI9TdBk(CrO}y19+U6A_{ecvK#wMmht7qE$w*ZK8#D=w zB9YZKld={>#PslxTlNIime%r%nZ#?$0y?2FUCq6BT;^PZ5&rR>#if)G+b5tJud`=l9c;kI48=+h+)WgqEw&SugqZVs5dn@pBHgKO< zAKC)Unn4#%hPHN?=wD{UJvXO#=d?mbGTinWSFgoxf%b+_rHPef&)HS-K*pCRJ1ZVIZ~Eu4#l3_7B4nYLv(mlcq%jErnblOduSL(j6gVV>e?Xb=U!I{ z!fe7KhL2tReP&<<34ovgVqX!=UvkzU3W$n3XXjgC_o}uw0Tv5#E;pe|{nnQ@Vh7Dj zS9h-g1J2jjwj=x~H%a9VpASC5YO&{7^R8xxbGgohT51T%QU>}XBG>otyZ@(;Gw$zY z;-o!P`Yzni74-^_v=)FR${fQS7eKOYwZD)QcvI?L%HE$RF55ttB3bF_x^hrcgk-eZ0 z4XU9gRzwc83G7<$W_U;8C;VCpK^+XZeD_5DUs6KLCA5M=xIXv~U`ACJ%(2vwZXFvzP`t7S2c z{>$IIx&0_&-JbjPA9aU8!%Pr+1pcGVW{a0DZG~-%#@cIGpkcO|;meGE`Q7|Ho1n0n zCkFn~;sN(|b%|b36e21x6_13|P2M!UZ5sHr{`niR@$3J%8gnMIJoZ6xg_~BI8hl)2 z{3H&BOwvIh=o2YEl5ShZjsKiLNx#v&U^D^0lgHD0b)SD!z50=o53UB}wY4HFy6$>b z_j%iWF}r?~zKU(}gD+O;dis}`QtGwujwTKJoZ~H96QKW8%CS#M*01lKc=%}I?kU?W zY})(Ri}7aCv^=tuH>@3~0`cPF;yx)cWX3V%62JpXQoIeqPAJfuY3*z40!w+nj{;A3 z_-bfp1`Z+Pj)vX1o4K_@liBW-UvC`d*%7*j{1;eap!I8#P}As*gcTz-j99ruD)*eN zTpsb{+>Hcren8RcWo|2*2P%2>QLsk724_n}2Qw<_q;!<9J58*(%NZ0q)z;XbTsQ`@ zBT&Vx+jazh$&ji!SaQH9r~IDXbUcBdnFb@gDsAm?<2C+%H-GBP`d%-N-&B_&@!1SY zIC(NbiWxR=;K19*R);C5t|W5iGOQvb|mx^v8bp`jdJk6m)I{ zclxgJe9&Ume><7W|2^=Orw8a1zonee1;)&XDH;`I{Y|AtFSaJd_^xbdnOSh>o52f$ zM4I9~rhpiI|Ds!R{T?~p*B|#@(_&dfxx;3A&8jj)8GxVD#0n6zvTdOQwNC7WZB(LN zI|WCS-Z;QH=;!A%Ao0@|za;~Y?c>F2&n;Elp=(LMRu9>K!or_pC0C(*kC9cGE-EjH znJ7aS>Hv)Q)RCw&lDr9u`%NapFso^JQ**?-b*?4hj_dK*fepZ3A~ zx+SzZ3iQy6Mrxgjkx|MKn&3eGqPXH;4?lPjM>yXjGjI0fXB`BmqN8^rR17*UDXUnWAd*#RtPn z)>g>Bzq}|1$1j?uCRUUdBT$0gKBP5t=yAK$V2 zXui9kg}G40$*n_dWr(6td>*^URA?QiUpY82PcwF{_=4+F(>dHWJdm+>y#@}x9I5g1 zOVx#}UOo4m`7;i%5COg4LLr3{TSXEZ$gN4NYF znar4sgK@W<;kQf2ZeilnymRODAlC=B`4>KQ^q4cgG~~pK>tIGz%N9Xr*S507;j8}r zg{|}Y53c=_`!xgLX=!;g+xJSB%9Bcm)iI7V9;J7S`oKDCdC@CSx2k2OgwxNv&1J!aaRN69omD@O z$Yk2^`hiFJ`U=P6yPX?#Ci|#~q8Gk8tVoJ2EVp=K*5{vn*0p0if1b3CjlM@} ztWpy?$jJTPC_fc@CvSaGgH*)+FqQ~r#Z)Vf?#(xGXu z-tj?3Hi7Z}kIw5U|qqtTlB-;&>9IziP z0$s7yA46j}*~3&+((yi{V8uZv;>mpCIcX#BX>MeErup>D6Jr<$j+A8@gKjvGV<;M1 zxP}Gge)oraw@{`!>^2d(c$I0T52<_)F?nMXSN6~{q~F@Q(7>;QZ^_ep^vw&HyfMMC zxe`m39+MuitLWEV*g?E7YPiHt6&UM!;cUI`5cC<*Xyr?v2Orp71Xjh=mQSUPKkj6Z zY-aO(<4F0QfY-~gm@AqJYkV5)ms{@Iq>lL5h2Hs0pmRCyABK`&yrV_-vPnV1A$6ZP zcyx-pFeSQ>?Q59-<=;cY=6lG^q9^!j2Q)o-tp@%;*=VC5KJE4x03BNS$tRKLCST?S zS9Jioa)RwE_RFC;4RMRGD0^L~b?QorQbf1xF}HM+Xv$ENf1Q&{3nyQRKeh<$2W<6w zwdMTIBksQd%S?BOoMv-qPJR0i8iyr}L5vc8cXfAZ;$UA~&vw1#gM`CYs5J&gkB64g zQ14^pNU!K<^5XtEelLcj290zN9x%&F3$JIN)4Q0*t4U=V zcAC#{n;9nj56D0)07!m|Fo(e*Pz47w*N+iF@|21`8J;X^iNv!`^(W<@SviR;;Zron z;n&{fQrDvu5GU1^04TVd(qU%9EL>2yzLzou_+k z-w*r(jYZTST2`hRn(l#vZlojCTF@Zt_k9LPR+++^6+41VR$ii(t&uvHv>tc>qn!c1 zS{cHxiHn@tI(SZcH&2T_>8JyppncDI)N}Sd zgO7JR{9&dD3PqPu{IUz)avzat#^#`wQ>7=X@#Q{?RtN?JnXFg zMSwcu7i-b9Y4DZVarP^(Uu$wBck-&N-#kl7`u_I&wF_htfKk|om!*2)y4hyG&O8#^ z%BB0U#lC;@HFJAR?sX=A7%mE~0W%}6Vsqx`RHNp(%%bRt^;b^*rW7COWVxU+ep75W zZ5Z2fs@`IM;yvUoQ7AN)Grq-{BJnxg09Fd=L-_ci)iQt8b$hXV0C#10W#YsJOZmPC*H?Yd_yxkXJ53NiUnJ zMmE|WzP`BK@FQlmA9C$l;HZxV#FtcxS_8mOBDRpF(>pr^M4v6Edp+-RYcp+~2@vUV z_XcKh$6x+k2Q5A{FDCQkhy79=Vive_LkCN~LDy;Dv*(yQ3*;On%#EJG`Sr_!nw`V{ zHAS(>aK9B-!Ahwk!6JRt+7YwlKLX0H9dE3R#79antMUgpA={*!-In?EIcqVpGBub& zKeYvao+*Bdb?ki;4)!k(&BEtb(R}sG=7zo{zflMkjy!77QrIv`3reW?9SJ1_*nt0e zBYU`E@(nW29y!~!jbAAvi8>N&h3(Xo%7bu@BO%5 z=tLPe^z*B*{S$a@E40`cr1cB?s`Z``3UUFZE;DnWPMEcVl18fccG1;G_U3)00V;^w zDl3(D)EIfQko^XVz1tJRS1pV;K1ekl1lq_D5wEChBxYG@S}xaw?ZXS+v0LN3W!6Om zlM6c&L%a(d(Ti07m+-;R@>h^|&B%#eX3?K@RkjxoM9%p1&p`}DVk)2WIb zMd~lKi;1uB{kJt{W$NVMJmMfTH!$l~lLybtbm$jp%a}4Fe|f#`L>Kk?DpEXKZ#Mzn z<)?r_p3H}Je{!og`kZkLdqoitG-c#;H#OYq!e)jrTncjt23o0sq~||;aN|F=eYn{> zj_>xpa^Xi;_bY2SLWPR}F>xr3PcHBWlJA7C`}7f|OVcf1STNhOv$H3bwjAL}zjEmA zh6(itM29WE#J~{9EotqsVVxKk3ub&vI(gQQ7sB7QU5VsmPZ2>ZP%O=wlY3~PRO?e)C@A|*P zO7k#YwEQ3GrrYVONpP6lq{7}_Bp_0|S#u&=z8 z#c*vc3jX+X0X#x2;)YG0{{5Uov34tpj}G?(G}aOeS&#u$EbOmSMfeb&4PX@ zAf2I&fm@kHe`D}@FARuYf@Iq;yJTT4(4lJEe^Q<&>$Usu@~_u98LYB}!g@sTz+c%i z4pBs^q)L#zAlJaNGi(@0UG@xX0c?JTXjT+muj>S$=)WQy*GK^@>=fvnbFki;UPwR~ zSD+RXFyTILQ$QphAOGjm8CQiLUsE(iTbwo-;ABw#m*-c@PVbrt!y|tX5HcIRfi_QB zJc)ZxG4mn-m0R&MXK=V6>k32938(_zPQl#ExV_!}!>!*zynuBS0^dQZIwXH@c_$Um z-y@ppQQu^FzlqNteyfR!Kc-CbM5OlDLR^x##48xV*!;UhH=LJetPaf)kHV=pyh`%^ z)2LGxpBd1<|Colw4a+V}ZoKxN-!}cBSM~O5zg*#CGJWT+wg3F5**^vxY`$woCA<7e zx0h#Ln^gBe#?Ikw_J03Ebn^0w)2e*B*rfH?tNW{1cRW(LVwDL=CX+uf+kD~i8c%i%Bho;c_C!X7s_dwAd7x;d-l*56wcdWB|vZ*F|`Pf7z9JZ!=0J}s_+1S4a9 zb}ad6&q|%Tb&*Fj!@6$lW&nK#LfQn#khx31PlaeBb^Tt>5K>w=o%*mr59#f&45YVA$eZgz(PxSL3&@Gaa5azmY&`L*-hhD>^UJE$lXSg9h%oo ziSHZizGjjZh#gfZ*x7i7j(8xJ=T}(m%(vdChO#Y0e8$(FxR{)qanyyTfbiELpwca~ z=Gqmluy0!7QXS1yfipS>{IKGm=#iy+mIoDm+y=xuw8xthD|#IyM7mtq)IPYwrHZL( zX@r_V(oi!NQKn&63*0OxDBEgDC3hZZh?{ay=b6@bLH3TN&me^Qm(RRDDtPqUMP3H4 zFIW+3lo&}h2Wx7OHx9%4F4gs2007W>npf)8Diy-GcxrbGHVr=2S3*TzVi@lqg3&k1 zM>!_9KG0%qsTHYVaGpkVOFzmfig#K4ZsFXmrLY6iup!vaT%{$D2_i8x@pcmj?->C!O6}vvqKpIL z+4B8%!>jSTm`3o#KqndlirBY*)EmE=GKEamScl)%lZ}=T3!G-pV{?ucXx+%wvHK_Z1+&A%4S2nVO-jI z17Ct!rEE6%w0guyxDHOq zQ(8n-SD?cs18166L~R{_2AtmLxU-cX%@-NSSTJR&Sui2AhK+&Q#o$<>2FRnTw3l9 z2^B(Lmw+Dy;|;2A*N+9#WncLl-nqPVlBq=8wEPT@2qlYYLOnv?p>T2c^>ZFz63wCPg;^cG*9r3-n z$7^i7J-lwug;8RnYVQ+lG#+=%J=2oEIV_zVE(}V zhL;nxt(o5#^Zkbot7Gz`bJ_CTXvG=VO6LuBD;1vU!YrL0!Bx=0tQ@mi6%1i>RZ207 z(-La@udlGtt#GKV?H(T=gS0Mm+QD<4ymx4Pf9nSY^Pe#tW4JuY)jR-Gl@#a)szY+a zW5?qK$X^*@Zyx~l0&huE%7T=uQPqvJOsq!XG%r9KWK4Zk4veI9@3g4cO&um#L4Gk1 z`JTNlOp@oFS-{dV8#}xGypMmEmT^86NFKl5m?11K=Nm(u&EAtI$IIo9MLn`=LRV4F zp!Cx61Xaw-+oUz)DjZ_t#%p=F^Tx8Yy}+BsN+p$>xUOM;rSk zFJ5A?;KDFxeqT@oKTa4)S40_21tn&|aM%q%A(V&0Jjh^ssJM864EZDwBR&!?**8?4 zt95If>c6g*!r!jXc=2Mj^R#J~#e!eF++f$5%r5;G+>D#uO{u_vccZ_yG5Cbus6X%e z4oD#OvBhcO&xn7U6DvGSBZu5dl<)LwZ_ly&8R_|Qc`pE zTI0tNBJa=YDn*{O(`Z49$(4JV%V_N_=@aiF8TK;NoorsqFso*0c(@-<)hI9jhsWzf ztx-)(QkJSyr#NO3K@ThcvQ{JCzcqXl%u+h3lZ7WJ8W@9|Y&H6QgHsKL$j?}XmhEU+ zviWmUJ16rG;yxnR|9zlp=|I6v0sxJf9O?BU?>oPQ-K@K@Kh<*6#6zQvvsxfHL}7GV zseF(FK%rX(_h~hB+&IrfFH%#F25U%tMVGDHwlFszOTokSwKpbu>8P2Cf*e zrS_pssFH*TDFG)}&3- zV&}#U8*ZCv@fg==aFNGVZ7W2L#!q+X{P{2E1buq}h?1;#L@w&n z=ck;Gc4wwdn|88rYr=i*;5zN~yn$Z@yLjVjwswixvSkY;{~p*Z8VKM4nE?RT#7HD0 zNob&?zjfwJ?J(kbXF39rH)R}#H-^@QP~Md1*ORu!yXCD2#PLs`!&QJkol(=Y;;cgy zdje+|F?r=4ljM{+eCMH+IXS9EnN(#7p^|WD6IaUuw03gDRV`WCbF1P(UJI9{BZ8`e zaY^K2vca;XK$rD=aLU;Ro{!pVLJ6-t-ErHZspi#e_wneDEoQRdm#s=rvf**ut!fk5 zlbof?g1xUCC~01#T>QVLxZ&I_UJ16!zsfs@pE|jmDbCBFOrA9pogPb&uXR~HuJz|? zjnRx(4l&s62gVH9vEz2#_?Va&mLg9jK403hYtJ5+{OiYx&kga~iJpxeG(L}qjvpUp ztTLl|?axT|Wp3dNQozFLH-C0}yUpl58>bfX3B@gSIDcDBk?7uxXL3Y0=d4Vb=HgOz ze-oC?*&FdmuGr~-HCE~Wy-nriDwL3!G*Xd5lAA_6WU+(cz;$>bLREo?A8Mw_Dgh_+ zD&;vM2Ftaysy@{^kV5fw**fP!LV~sBt8+uD*W}u0Ar&0ale148Iy4ORK;`8I!-0z$ z`jov~Qzm7Y%z0UwaB}gx`sargaSFVR*Ys$_w)mO#W=@|j8e{d(cI;lZY88;nM*Nyt z2eh9dhCC?nR_PG1B=nm>gD%bs#Dm-D)C%{r)o8aOZj$x}{JX2w_`z4KF}R4M2_?F9 zgzej74RMk8!1^_TyFd4M_$%50M>VJo6og8qk9&9S{8}x`)C)t=?W)5M>rG*u1~(%Fz$v?} z_p23X{qV6X*DJ|7$9~kf#m8@4HJ$D;rn&lJt-~TzKmtOjKd(NqQH@Iel?+$U_^L+R?V?y z=qNQKkei}boJh`wLHkm919Ln!CHARCGc_l1Q5y;*jo~4_tOmsaIQaibF^uLVZu@tN zx#d0i?OHj~<0UoHuq?`%d82w6ug!H)6XqUof|+#RdDmwzz1_&*_cio1;1gUWKn+a< zn^+lqM&Ws$jVW>R5bxpZvriqm* zEMi;@PRVDQLx4FPyDS`Ktaa}%9y$Jdnsi>iJUqpt-TvQx8$}gQLXw7= zpbMjLx_QDczP_J`U_%mN)Fw+r?v-8wJ8xz3E72s*@_3^uj669Yxc!EAS*dLEvb|M$tYCb=rgCVQ1l;(^ z=CcOPK4uqk;D8Oq6b|GjR@6kK1z!_l0xP~vh zlYn?J&}K3}mk?kBde5=}?-qNi7@Yc2{fNxRFB$S^E`y|MqItEbrsSye_g(o3z`*8p zrJbbMXV2%=g{58$jesE@Y@Lmhx-^Nh$`T?YEC5#Kti&(4x3bR=xt<|&8btaBF7s~< z4`E*u4LeVeIA-2z1YW2>hXF>(exOV23z)tfwQzuG0Gd#uRMW!bAE~W|Nd%`M!A+LA z8utz2r{0e|EYD#Gu>+gk=@E5f23-&Hh<$u;!ldt;vPErZbD&NPDBhN|jOJS!3ts57 z$j+8SXl?9F{U}Q`!N3CL)0Fl*fm4{Y`<}k7>6P4I5ztJd*%R=snFVc&KQoJ4A7I06 z++HbpKBLCRooIl{8!x_T-C#}pB=d?ssi~>Eu;!H?Uz z18!l_U&`d3=az% zMd~0bxU-Dy?P2LH)+HnVK|``UDRsn%=lY>XSqloUuAIFF9KVh;LH2q$S~hRK*TatP z1#&-Er}c_66Bi6H_*kF4Ti`_7X!L|;L})}c*7>+3B6`<;Uw-I^P%6y=QXVo1mg}wz z&$bSBER5cc;WQ%dizQ{FKf?c&&zN&~9`~sg-k)^+TB1eez<J28vjs&WLCl6128nCmks~AZ*W0$uIFtG2d&C#|iLnKJM?fTA3}>x6InV8M zjV|B@S)W||hi$}?C6&bqYa8>-$X8`EpsFivysw@=|cAJn=__(->}yOho{FV7D4gNcfI$Z#JM>L@SRn zEW@oS@s^O+kKQCrke}=Q0i+4SUwLwJT$9NK^8w&Kj*HA@R9%dRgYKk^LpagH-Q6R( z=QI|nFadN?;ik&46;c9_H|>mUJau1v*)qCIn^P##L&Cx~ngsM*G?r5XIK_Xo96<9g z+8HkLx2Q?A?$AVAe(H3cwOu1~c8QE(U;%@(^K;J%ru_(4lEJAir)QV>HNU}EK*Ud< zx&o(!?%a82>o#G2NhxoG-d=)~v=#vTTV8Z`%ic~ZRxCuAfuux|8bUHN^X`-$+Cyk$ zKn&21^ZR*uZLBWdJ$cb`8xFe}4rRr*swjMS@r8MWMY(r{(3Ye{4)#dUyk!$ zvUoB213S+6aJ(<%K?kRk6 zaepzm=?U0!k7GH(%W&`Fd%FD`X2F;2Q0TC=PqH91yO}`T3eMtaiATqnHU%p4 z`4`t}-Yb}|1+#P|xwL7QM1>^CGAh+3JAQOq+Bs2AwMIZ64-GOA2cT7|eXFvv?s*Mg ztONYoipRTl3FzGG6r+6?P7g27|8XCfO*dwpuEC67GT-$O`ZPa&9clLoh7$7eC6xdM zl4$T>Xv(!d%e2eXG?5{`q1Jxl71f6%s#IZ6MkbcC#PZwp4yDfcks~g1XL&8~>6vGI z2>`17Nw`kvYHAekq z7-V%MRm6p6Bx{&8_hGi6Afvmlw}Q;?Y~I{1mVa_ZG0229AR_|BUSjv_EbpG5!+qd{ z=rE(Yuk84j86!8HN1`=xWG$5tKTF{o%d*zoTT~k)1*jN5FIj>zVITokY*FrGDsBz3 zhz9;t{6bo|qjp8Zn^SpnC9KeJ`AgUau$@z^;yO)2LaJ>T?ilQ}I&3<<4T(bI6eO~H z4<0<|!8B~G321~MI~`SmqZ^1&3x0EI%ZnwPuqBSO-vGe7-#h!U-T-p5bX`lb4YxOx zuLnRi&BeYtMv;U`z2E5v$YeJKqRo}QfYXt?P?g}Hb|b$6iy0l+I5Paa^iWjYA>B#)c(DldIGxuu8MD`*SR;s>}aU>|}FwcwV->C78iXjzIz=|a!I`&z== z=NzYUtfA$y$*FD1W+zr}KU7k`b7vx3g*ukKjt6f`?$McXHT39VyfU81QE^8_0H_ww z0!xS6DWp)xbm`i7E7?=BRnRH7JAYKs+DonGW8~nj|H-t&qa^8%q5PM3>lRv<|U_4{-A+_cRPg?()5Hj$3YjM1sJ&J2sr&9jWT6u$eWeemby9_ z2#-yI?kFN!VN2w(V%ai;t}BV_Sn&_aa+p2i=r~TWT5G72dmzP+B`CX$pQp(|3XW4- zj)JNv__7#j`s+?1%!V}BBF1YrtB2vb*Xg-1O8dFA?isie&S&t5SUvC&);kGj5LH^y zmxfO}>qM4j=P!K0NG#(7*^k?4762LL zKmX;E@W&lWwBW`*=?`FM7(L=352|S8{EdPYPT&r1V6k9RV#z6Pq&$)6;*56YxJWR% zExOd_qkRyRg9~TXoW`}Ir*fm|t&hhcWwA(wlIn0+>E*0^C8UP`f~unxHN&|D%m(ooAo~zNz z#583X{#)7+#U-|9?W&A~?bdAkgZ#{iCzsP@lt}L%%F;N_!{5_n z=i$xRSQ3gBaOq(KD;n$~IdQ>5wuLb*(H0^RtR|aRaY_@$^RB*Y7clYXYkBFa`IP}M zD4?Vs!EBCbC(WJ{Xm#}cjpI}Vg%y~-$B2(U! z-STZ7OXQU|(>qjiR*DwwddfdpGK02F+DW&}DX;~eVL_Wq*djWFx}oUgI}d~(uvZI= z*v^%*Eb2$jL}MxxO?LS3v@_9#iQPGm!5=s7_hd|A{okfv-6{7B@no>+GpWH5}~3f;#EVYPfAiUhK(>GAZJa*{;s zDtx{s{%-sF73}hGv=7k}al++1-O2mS!c`3|$7g0{2B(-FqiR)Tm&=L{6&1nX4>V}c zskO9Yi?B#k74q+cCs1nQA;>rbsOD|y2*e_n@Q$2G$rhZFT(x7zj;sa$)>uSUtLA_6 zC-1V7o3N}>g9p_u0`_=iF`wk4WJQVCA>c!UZ4HvFMjN+hWuw+ge@lWrkPaOxoSwv) zVl#L|*rvmW%|xA;GNlFP{Av&B<>g$XnwgsHAq(7cF1U;$$>^z3{5#{lt|FN(NPG0S zega9<+~!;eWi~uc7ALK+AtH@RnWr-j5|!d?yOpy{I*_(ZPXAi*B&S{k?4w~pxHSkn zxO{ol7@VnO;jFCzbcf=J0;NRf{dR5a{YB}8MLLiB_5=>60fFcBY+Ko@ZQ=yN1J5~P z{b$}>hA7#%`;VZ+6S(CV=+TcKxa3sQFqok11{*;sLZ0c7We5F>sy=eU>B|2{Bm;Un zg|z*{eH9Fs?x4YcsFjjTCbf*h$T}?_`6le2E8=0at~P{?0yUC7r!Wz1K-beiJI>kP z>Ua7$&M_LD{Tc{rC!cL>@dn=Xpgp(Ex+8UwZz@++^gU-K}%a^_VI>GBGBi+h3I~!2gO0c%R}L8VVRCJ1PBPnT;1J6j5RO83MLkqo_!p zfnB=%@yo|bgU&b;&?x`JNNR@p{lgNoQ?-e(1NobH=E6atlvj>=3tM)tNBSlOh&ajw zER_U7UIzgfqy$B_9@y-+(cY!G4n}iJJXY|2NQo^giOtpOVUZ(`e14ngY79>b--zqB zu=7S>sVLTif2u%6RZNnXVcw17wo>+~%tccHSo3PjxLCgp8*-3?r)m!@Pib^NVN^NL z(S9yJ7Q?3uU`P21WaHWTD)VveHSs~%aOU#de(`sQO`3G~=<344LWNtpSn`)53RQz$ zn6trfsgaE2=$wVVi)K=HM%1Zt&Z@({{QE?7CgscUnn9j5c_)_+X%x!=a#}a02as1H z!y7xmU$`({yAeJSD>e;2-Q=)$nU|1t@#s{F(1{8Ur}e_)>KCnY<)w$b`?_;}cr56J zvcrXeMKJ`bNL3=x?idv4pO+;I^{1GilqqIR)Y>eE=0FLDE=>$85Q;zCKDqSp`ohAC zQZvf^H>HK29Yxn0teqhwWojESfYkw9|C}*7f`%oWd=NOc#0A6z{3eD&eFnC}1UXdp z1z^Hi3yQtz6j%=FAqQvu;Lr+2(dTsxNSmkvNE0RSj^=!#vf}VEIl4$GYhGgs$ewBx z`BTgEogpkvNuvNDG?~%5vp*8FHBxGErUT)SEyfT|g4c!V_rfG&gjl`!Buet)40rP8 z7g=s9rsSPM#knY}km}Bfzae}ca?XNojFFu*#1HW*GT3~ z+WZHbSien<$#xs2`)NbGo_?z0sY8J4IRc{eU<+u&NM6DGcDe9q4>4O3hdJx^C*9=C z%*7zn8&&fvhNRh3X-1kEm{t3>>#=9}Ka5T4QMgh*R6?0SX@Vod>d=@Mv(@?lbKsU# z)^Lr|7`F{{Jatf>qjK5cc^G!KVj#nrMHtZvIXabj=YaX=Qq$9AbUl{kd)oh?44@nu zu@ZjzB{E@{ieA+)(59{|9O4DGB=Q1j+X8An72P3DlyDziG$5m-EY?21|7rLlV>HvKS+izAlPbQtL&vgw@5=tyo~A+8-itgMAm`Dsu<%BfwyO7o5^gvXrwGXT7s+09?% zaTk;6nTsgRL+p;ZYWkxR8K;E0^=owgoM{XG6wXYGWmF~*LPrVrqITwEPqNDW7ooC5 zk6d^bDHJ#JgHQGcud37TJ0E#-i3`o>@AbH^eckYJ#xd22ibq?erKppU20ykm6djU! z1mV3>r+#7JAAkO-hl!qFu#>Z~mjb#@{e5wxIY|6q%~*iEh~uu|9J{vKMqJ&$b?esd z4^Lw~$rYM0V@Bt})eOB(&1NDc+Mo=sA#d0G=Rd!5D<2*Ci?c8dTK8LOcyx-eB{__S z8}jN{_DPeKt4DrEva`}UA66R6RTI$ai~3c{Zb5O?_=6_MolW#Mdx!Rx1_fQX*7YrI zu;6U=FFv=WvY7XHyj(|aE-YL{Hr-XVW=l=WxFieUeB5JB={C@Cc3wufgPf-nmCy|( zT)TEH`&*wI35kiLer?oOYZSRLwd-dE0!PkdsY@Ego^-BKZ}IW5iCCAMyf!J!AvTQG zAXhAW2B~3S0Y*M1L3`EesUz?~8;N%cr295-ilZ)Vo9T6MbZdFPOKpgCgfqSC(b z{q`Y#6k5RyideQCCsUnYd;H`MYAd%fpgBl~KI()(NtCnq58Ji;`U}HXjw)su1_1X; z4POR{yT1Lvy#=t+vuDpxeo7Sm*lla%23SheMJ~u$O7NK?lOc8dD-*ef7pBc=)M^tz zYWIV!hPpku(Wh_3Y0lVK3VX%|;r2>Ml^tW_|niWmERew&L4tU+Qfhoo=Tu3VLyLO!QwS z|6aBdnKEkax3jf%4y&{H#B9{22NkU3NVMgN8h|v*-UGvaa*`2G>3)R4a8_l9NE#lg zo_%4Nt2x;k7`V!}JUWL4p9*K+-_DPZ(3yt1rbTNm+5X21|Jjv(J5Vu-<=X3H>M$Nk zZS%~ZblpT>SM787hkw-CX_5pAvld;XF7+pFln^n^fFKb`Z34)MuPq$e*VngCY(<~N zYoV=cXBu}1A%-ADt9&cn4%5gI>b4}KOk!wTt)1}rnf;)rHZohbY*~bzCIRT|ybovb zIeWmMHmX_OQ}-N=qA}ku!apOY1|LyZWeJg&v3N5Rd_f8HIH;;Z2Yi=!#pD8QKu^e$=6Zi3K zhI%O#msCsYYblRb^6GX2B0r&*m7o+EZ>rl?>$ymYN&if~U5XEkj4n}uWsPcbAF{FF zVHF=t^-RSqh^X6v;?Jq!v_md_5Xk*XU%M%eG6VZgz>mzONW{J>BQ0H8$gWkxR*zW2qn5+xPE;YpFm0sLYT2Z%03=D0i8;& zu%*NPbtK61XI{6oV1bQPEnc9|&6+L7+)~J_JqzGnWhGvydkF9$+8gg%E&@Q04<<8P ztF^0_p|af4Z~+a=+_q@2xaYb$ekoGFr^CpnL7E1nXE|)=FW1+8d37T@nFA zyMdS6C$_@JXXx3qHzCsPr421YRk$L3v09bOb;H>`gb4AVB%6(ppztcatw1t?aypIU zTsOD&U9QfQRt``XtNa44&@q_dW^sG7Y>{cME$#NKWFgAhA#6-SR=w8ZK$#R`z|Ft%@bC!OI(d>i$Q{aXj$D@nMpi3* zD;j(zaWEwYtMv}PiL`I~Z)`c!t$bB&jUG5pwkpD_aCL3Zp9 zNU_#}6FCh)9ndJNTYeH$Q#Kyc4$Wj&i(FA!?QYqL!9c9iT-&s1)1v*08rQ2=uRWOB z_>;50)9f!UyN4(iVE;{EKGkeBVVq6b+g;kIVfCQ4d0h77GWW8#>DBcYQrBm7E0`0W zln{6*q44fxr;v&9lRS1&@2SSuL|>zKhLuFAB+lO}lH6Su0s$W*fGTHZ zQohZdKY#tMUAwLinZIw^! zF`(Fl#eiEhMnS zCzN;@%ybBS_0?FKXy%!_z~Jcy1hzu0ZQW&qMb7F%>p4s=HP_?zp4pq8mwEd17soq! zFS@cg=F}^fPb0_HuV23iYx>uG>HWiZ_xDVj zKfr*hvt5(#C34Jaz!8C}$DBVS?7_=kUfo9CPCtETLeectRH?z<3by@%RgG+VqKipI z1v!ipM$*<>G35(LIFxu23xPw@XwdvyxrW1)z#ow;*q-BW+HO-QqqfpuN>T)aTps*6 z97p4*oLQtDQPecsLUBn|s9IlPxzax(o~&E3Vny>>mu=pNG6>A0B;&B({yKFlILL+* z-dtV!q>-eT8FO1EZt9ggX>e^aJ0*eS+yWAC8x2yaiEPmLKpXD~8qzXa;8LwDZ)tVK zbTp)FDrPb2UH)ZMDVB6zr%s>Fm>D{B$5M+B9=}IQ8b=tuRAf{Pn;dAt=X%d59x|UO zPAwFKq9{HZYpe-ja&i3ZR;o83^0?gD zy<*~b|8fD2PM-_;#1uQIkTmEM*^#nb>sd1OOJpz8)!Ai8dI*S)Vpu+GB+GBVJ(rRH z{Qg{b_YrcK1JqE7Nf#9%b55ywz@VKGo$oD&$Pv(WbYmPshWDnz*VtKJY5=mgo1d`C z_|KwEUtpIg^jp0&$+kmiMMID8=9U)CmzpOVbhKQE8kGi9?$UF;1WCb%(#$IWM!jPx69DO91thgkpR82Vd*e*4V*3gdsF&=&zlVFS51#y%u!8o?6PLCFqmMlDYD0cp_GvOgPH0;-qj2fD&eYv2h;0FK-4OrAJ-RzQB zyMR092aF=b#dbdtj8Kb!`)iC=@7+pGJ%97$oOIE#$PssRYd zHMv~-oo5Gks$*_wGOfdm+d-cK?~Syc@P_3yIW1x*(xbu-O7M z_yto@k@rHVKsBmQokIg~+N<<5foxGPZ!{#0ql)w9mpua@Qq)hLar}JKvQU~~twU(^ zL0p(ICg;1>@7FKXTmgVypHr6b^n8hba4siZ*m?B^y8TRPm!*8%$^}lFwaUmzA zB(DvLMMwp$v&^VOpP~R`Tz<(VEo^K@TN$h?VWiG3>+|D=XGZIY6P?Awt@M+v{8et%4y?zi09Q%5V` zW{MZjm&wN#k1IbP+T%WN-c2ogv_xbLP7kf7l|^h|C*W9qTjN1nJ6+E>cHqUQAvE+I z&$Qb&eE084ES?J&rXEVEAFKPs;$|qX2M6W58Tmd&oVl+@6<>*&$QwdUFV!6(PTW=mH>JX3f$A~(#0xdZ7f;<`dakzKVrDubvT6L*a zE@UNlWpWlFCj#t8wF0EeW239_K`0NN?s+P0$X?aES-?hHLNo_YbWM$>_Y@2WTkw9h z*aNKZQtEchCpXP{TRMdEMf0?7@7~OAf$=F#sM<+8Y`rxKNV3e8@{_o!P-4IO>TFi0 z6K;`hTG{fJx)7vPtdayY`0|q_S2GB9Kne<)($78>87W|3?wmQpHn*K(Vao=Ymb0b& zia2i!voa|byY)K5kWm-J66mXsZ@m!tJYruc10mVnWE_h~oIl^%+gyYR&Dog46~Ucr zzwq@mK3A69oVzbRDS9WRWK{aL#V>6Y;cJSIiHW+M(v ztY7JQj|Bu#@%uF`(V(Tvr$d7%%ds1a%c^Zuha^~S8_r$l+TMG1>aY4q3C0bb8#m7U zX`CI_A)_fAZXvN+EpCprU__u@%topPBpu1H4vyicND$BD7vjFidK>4_i`QziWI%Y&1Ino}a1?kLVdU9^Ll2aB&g$Y)$+A7N1zZ1c<|uCn&w$Bk?MzO z+Xa`YVL91@S3iMum0H-}Wc3RvL_Z%Iz#+IlOd`I@D|uxdVHMrZCF5#5 z(TeGpvmjFHPUl-6rMVQ65wb4cdj76RH|~N{({1Bv!|r5s{}xojR6Ps#Ga=7Tmn*Q$vmRD1lizMn}aJ z4e8hK8VxxYHEZngc8s9A8a?ik{MY;Ye>-wyQt{OUXzdB;{!+P~%8Q;Ao02jfu(U(C z-ED0*Xu;^k!+%!!&K=;iPv!;-wt&MoGxeg3^+`hJh4cp2hKa z!wFO751-nR20x`}dCY3)=I?TrtpH^;N?gW_V}~>5&+k}PR3FK(mbU5$DeW}RMJ`}G zq`>bc+~tDrV}?rI*}D0wQm?6rR|B`t+hm1>){EtHsu-4~2pHBhPR$QAaX?X!k{X== z)=hB6c^lRb4rtcGMf!5XgTdQ(Kb<*#N$8d8*;`2TMT(+Sq0ZBM$9DF3wiV=T#)Q}{ zd27mAG93e?k?_r{ZL1p=*B`<+T=&}es^*&Q7#Y+sHxCou3)uneaU{hUXz{E<-_A{& zUfh!xw7WRQ<4*e4`?lJl>VSQKre8@sC;9nt=dC(&rDS%vRF1Tv8T5=OQ8S4q-38I?0Ub zeaYz2E(2$8f!GLr3;}tvb9TF~fLZWPbD5se1QrqG5l+{AKJI2?1 zbMj!>i7PjLKDDRJWh>2S!l6%2%maQub@Jrxqsxz_eO;PDVrmcV3^+A?`O`ODxBYI` z>LBwLRplASd}5l7Il7OeYag}XMP!$j-MXdhDR6MPXZ>{k;QJ}<3_-0K25B5Fc!Sd@ zTDwRW44?$ul;f9A&vzY$C(Nw*0IdP9pTbiRXaL8B(Mxn*nJi?rdOD(CBMMb#s)mJ# zdTVwQ`nu3nB9YOHJp&RK{KuXSiFGwAB3Vk@CfB5c@+p&&x-2?q3+T7|rIvvV>nc-o z-$2MfE=!M|M$UcwyG7Hlzkaa6iq&!X$4ZQoYEX?SAm1L+%41#5DJ|&ihf|A*^saG` z<@nP_E$#QMIg$21Z|@wXKA)vw=Pq69m{&HubfA3@fmL~)@t{4x;PtgW6{zp4`dJX5 zfA%kl5ZTI)9%5R*B`)0tnBAJ6AJ+9(mu&XKh?)ClBp+Emvd_ znxj0kG{1%0CL7>#=Hwn<|Ind}Vdyn`=9x^)BSssyZQG{i2zuA-%kE4$E?u~Aa#FxQ zKMbQfwE&SCfPDg`S7B^=i&~ef#kfwT-IBN&#rgccPxJZ$v+^h>zUs1UJW0AH0fnRW zrTOCx&wjkJckf;amDp3ZX~$iV5Lq?>Xzk^lfgq&>*dy53X&^4i9nbV)g!k51&=TLf z<-rU%bt?Tq_3G6%$>;iLPFC~FFNImy9x3Cs(z0D=SS@W4Q7K`1U${HfKBKtwYOd#} zk&Xb&;(E}aOyfef{+_~CZ&Zp@MksUZ)~}!9W^r~l7~p@uQJRC0{_8EZi!tfTXRk*W zjrjQC=_2>~e_PE5?1!z(M{V3|-o5^uCe}u#2P7R%oeR>R zgy-%0;h*0NhgU!8NUj=5S34-_uY!4bN0T}~Kya7FW;hGhGsmDPJeG@T0>nT^poaAl z;Z)U&I>=q+>L7#Gv@z9OG7zVuxPA0I(Co1vFZzu=&SU!>Ar=J0n{u>B1Jh)!h$Sei z=VG7XpyJ)FJB&F$rhs03H>-Gr%b!+gdv674j=a{VaCm6zSD;s1L+mwekSeQdp1FZ4 zY~H+i&|x=4wYkltk?toONOOaQW;r}u73-HawhAYOXA{GdC^Z|}3M*rn4#ROTRF!^3 zMwk1*b&>%9^_JKjzuS@k1vJCB&R@KG+Jh+X7?6kamPrY)_O*vd>1thE#gA9n&=zdA zFt$|pLjWF;Et`>0{M}im194z|ajU}4D^kLtSYmuRj6~B1rSx-ei;66<7Lyzg_W?%z zB#y*T^6tM!B9himLJgidBfh{L+9N=Y;WSkClv00Qc0_A%2YYt zj@n?ADnU5yc?#(oH*TDuX@P;;m%Q1m{aO9C(gjkd;1J00WpU_7_g2#hi8%@#@7VOf zMQ1$jubvr0#_C? zgVMZA4@Xos^_d8diHD|8rwWCq;^ziBW_ttLq0}&QAT0?mP*+8BJ(komlvnYH0S}5v zvK0!+p|OPf9eVgzZ-8iWNW8kiYAC1?C3lzmO4g(j$!!J zS7QM*EQ;cKl&n8?2nb8eGs=Ys*uqka<2+N1B!1&E0c1S_a8W4@nWazP(-)tfk0Pk> z24uc0h7*+3k|-pR;@NI)Y3+8GQTI0_79(^=@k0 z9Qe71r?)t}MSw2zEiIDK<#q^}6J9WQ(bg~2W6%|g*#J7z0lv16m6pXsrRRC2F3f3R zYMh4$|9ZWA5$Cy~wJA0A-_TsvQBOpprxTv;Ux$~oVa1BrnRh`r)jiV4udyJD?B@vh z1v8EvWhEp{^yZ5*j;9=5LyxN7jPceQpy{~muG6F$4=-LdB5;qM*eYK)|GTR^v48+c z-A84|=14Suw`cq@Np5xHy;0dP>g<=|+WVLm)M{`ff0fx$-}LtX;4M;?Mgu6(Dy`7kSm#W0g;VYFZ|Q z$-*Yq6+zxWSVChG?#$Kmd%N$f`7#01{de<*m1p9`8EuhxU!Hj#RQNIdmtiK z%Faf42k=zJ%VAcQc(*679=$se5H5k&MBitOE=p#on!5Papl%$zE{qIStBCk#`K58= zv9@&^+GHGx6l;@x5tC5t*y9HTauZPNGO+nrI>=90d0WH8TcmG#)w<>%UFb;Vp>ZwT zgeh+8?us5MMj`FD3o%6cE71wjNtqufCU~6RXGLazWc5N>?r94 zz;zG|G03^bFPTpkt#wS-1f>YMv`|0-wHEB{Qq5nun@3KBHnLx5)x%>Xv?qtdKlJuo zupnz~-}-BrSW+*!++2A!>~(g+06>gH_B@^a3&Vr1e0_Y|7X(2G`g5%YXwoytbUZ*l zhk{Q7PUHhUi?CfzUf%-4X0Y#nvi{TKJLnrBtRZSCi#fGvLzUqwJlD}@5<$bYJE8kT z(RpN{(L-1T2W36QQ`Brd)LuRxDDJc9iOLo*S&-3QMpV!IkBR zj$P^)YAgWd5?6~U6qUJl6BuChh|Wp~-3U)f65hLZ-CK)$@_uS0)0iLIZ@6%e#y(x- zd2r(RB`$pqhCt{F(Eu7@cHQc*qH!As}{v@}rpu#7Hxj9iW$9+dIv9xI7+$fag;U*(eMyK$_ql`A0?;58B=U#s)p| zo!5(>Pb7*ARWASuj}|Sik=4qryA1Q`q^;gpFk7uI~O#!&_+ zY(O)EF7I5kdXx8Lv({Si(U6ShM#BQW|1fUn^h*}e3&9mP~@o1L}l&@YO{2p>5d=v5u5bP;ISC%GN1aPEi0FkQbi zuehuqt(>YpSXxg&!o-o5SJblxhS_>&WH4)Lbol|u0r~n`Lx2ll8O^kC^qmVjeUH#FLvYZ0y8%DVS9xFk`fqWZ5PT}@HDlK!li}>J9 z`svZd_Ad;hXqI(3=q^Hdj(uVeTT8h^M!P)d%S3(0q@Jp zPpGo>ePVcYLW{+~y4RWg)I{Hp24g=jO%NkR{$9$FettmH{9WzVw{o1IfhFASPX^EO zmeHP861d`mis4Xx4U?QlZT&1Aa7JQ9)$D4?Ghz#y@FE=07WVyYd;5R60Q)s5fqwzf z;VW3PyV5^c_7}y26(V08D0TUEXuh_0%Nk0p6eo(x30*8aJcJWcx2h=&WHASi`OC%$xg%j}m;12(q zIkT=cOV&i6Fq#n;5Em-b!?uAO961qSk40!#3a74|^>(p%*i)uFHn%%4stxaTAEh2~ zKITb8WMm}m8}qpteqX+keE=#MNi6b>&6ShLeBt#I4{qjE9)W za*Uc32xR4aw}yW?_b<=U&8rP@0XGu`k0jU_&KOQZ3hBH1uP=&C7mtjlMPnXH?6M^H zlcTv|dhHg9N!Wp>v@knl?@Hfg6*6QY##Pmx#+jFwnrSFxzh~f= zyC#p0qk2H%tcol(MT#}C1A}``hhrqtf*@I4JCK?_eYGa`f4#vTQ2KyCUfwZdKEdPA z>wVxsE%mbdNbpk{pbxjzd^r}yP@qMCl1YHnBB8=2f3BSuqOrD3VJ3W;*YN|I4>J6I z2I|ftl|p#a0K{)5|pogMK$SE<$%OOZIE_s1g+;oeYZd)$hLCImmY zF|kLP9%^id!Ly7Kok2`TSP6{4m#<%6x$E)tj+I=`fQ;!Mfys)JyqJ;iXSG|CU=wqb znKw3LKSPi% ztihGOOkcGADiWW%Ml$UPf~em6FN93x0*EjS8>0{KsU;mLQwn6S!_8mWy7o=-Z%P* z>XrfMOgmEI7`5{AgKU_}&vxmlj`& zD`5vHW;~oi@MsVGFAYYBC-fm5b3NcqfLm%ZL%BSFE%jSsN%4eihjSlpi8c?bJZ~?( zV+WgH){lf8uf~|4A@I!822x&|F5gVt#2UpCV`;&^!f&V}QX1=}fZJ^N?soeJW9IIJB??eMTyrYkS31}?LFo4eG1 zY0F_t40jCYy8*8a5@Ai-BGB{P+6N36I8gnG+~u_c&r3X$=`rlBH?YPHMpuaS){?|K z@u^)Gzd;ftrOYQD31lN;xE3u2lLnT}G*8dYwtSc7l@2_&8;eS5al}(0QalqPrD}=s z@^mT(xjb-6YJgOznbD>?C7gU_GDaDE9)P+?^->OpfGRrZ)Nsu-*exG8Z7}|u7Y;n& zwFsNn-@(GBiM-FAkP<5u>kUgQWpWLWF45zGjb<^}P=MprRlE&EO9*bK+;OwGb1F-zOn>&z}7QH@DUPALo6Q?_?{ErT|ZE_)}Y4 zzIoG*dB!yvbx=dpHm}~n53(BlP`0$nAVcQ=RkhVLYHEmr@EO{6nGh{^tzcXK_INR= zF4H;`bAV}X%_IE*)B&eQk*grw{th8!7i(X2%r6h6auR`t*Dg0C$OzdGlORvYA=6n#6-}pho1S9ysrH8mbT@cIw`A6Gq}f6o5y_c= zeIfDB z9+FuYbb%K`7AafZ&3g6f{as(%lm*WC#p0J9joMxL&*%MmLW!z$$*hsyX z5VMe~V`^41tMrG@on~P{i9ghIu2J>Zo!7qU|DDBG6?WtfsPNN_cFDaa9%+?X5S!Qb z#I&alf7JI|oEo0=YT?z*S2`DV?bS15>viq*!M@UJJ@SQ;UZH6!IF^fe3JA-UtCgcS zzB0PbNQ)j%c}z5x<{unYIXFS28b3e5K{6D{AqF4g3wa~Rs2I6uEkuDZMfm#|Z&Q9s zEmD#J;Da5lGpo#DH-aQHkh+$&4?MX>i+>j^7d%b~SwEtHI zyL3Q?K~71?HshI#&=*w&N{y0tKzjlex#!(&$owcNaJS#7RdW5-p})u6Aj%OLrLf;Z zotG#$%UlH7t^|J3P@C!QH=SvSNn3*jFR+hm$SK4jzj<^n`Te?{3KS`puxwRxKo$SN zy?k7}=V7BhIoJA%uOT{=Rix4f)xEEY5rQ0&L~^uj0bKj_AOF1E)xMsM*EmW2=gl?z3NES+xzuQ!d4 zx*mt|I1u72~LtrfKh5@CBDdnH2Kuo zByF=(5J_#SAoDizzzi@XrNKBworSjPK)I}}%?!_7qaa~z>FRkzQaP%afkN6?fAn_s zVp!MelaQ=Qd6+g}QP=vKF~Q=vL5Xe2^q>@xgd{l@yBs{#2PCk)^=D~F1BS1(%E5$loOrc&5GVAnK?ZI*(@@92neifnD&nZQ8lQ7yn0JxD4xADvEFHF z`3m&3-~MU+$+_JBx_?(JUEtPW>K!d}GgXlXFEV@sUDTz#hIC_TW8)}2a*@0sUu;Tz zHMujeXRYR=g22CJ+Nt7r?%bEXt&K=Z?2+JuD@b#1>#0kYoKaa!I;15YUxa22WnUYs z4jnE%am(IoQyQWbJW+*cUCBXaPZynN&uYF_EhWMt*xu2ra5v%m$J)!`X$!>7%K{75 zegP}g5fLWMo-D}CQXdn!SeOAN5iFmL7HIBBH?G(6PjtvYKF-EBGPLhSV!g?NmNXl+ zz$RQh+4gL~aYSlN$A@H!{^SqtS63rYF%YKKPrBtqoy)C1(V3PiAahE!92b${%^g^> z8aX0i_)zamW@?=Ji|7|J_&GK!y3mO#+t($_*b5O44NA19Kvu7VhM)2XseCy7Qf^l} z2YdTzYzmtUf`AsaM*`R=v9l|Ke-7r>6TDD9&)d3w{ro>CvsX}*x%x}(VnBc5yP{#8 zx47&uBC06DrvB|)DDQLOe!MVZV#a=GPA#T95Zn@z`z z@qhl^w6YPByVHiMJ~4t0lS92*RWHx1&nM&J54D$1ai;^pZto;%MpkHBYQYykKtO0|QJnx%=Bg-)Gr z=iYMKyJN?9QuLsRlSLQ}xV-L?s0vNzA$9d0)QsuSuQLx2fMI(>-cVqbPa4}4{&sQx z+k?nO;)2--xhv>#|8ov^17jl*ylC}Dh*Kanbqq*eYX${zvj2#0ePo6BZ%7^>C7E=cIA2cWd4*4;}p7i60 zmkCPAyooJ=1%doVXPSkDPmd)DL{mt{j-X;EkH0 z4WsEvM#!ohzs`DJc^@$yXu(8ek@C?KMQGHi_e-gbDCM+wiHl}p03}-a(KL&^XV3Pw zi2N*M^Qm1aiuo_6(Mv4^$&kqf1iCB))~-R4l74l>7vA>Bze;D0BPLZt)0!&zIDrem zW{>1l^L?fE%XVMxBPYovlQ-Vm8IzSIRv6fQ$ryPiSWtbDfzS*HCD{u&(Hi{Dog$VY z>cx-qAGtK|9O`Qn-T--=+Cq+d)D+KU49 zrobxHnaCHvK3~^W1UE>;37YD#1BS|?LUK8N`TTMI-Ep2h0T%>K#~5g87R!+98u-7f zd!lzRX0cMsV#X%MCVI&is1Ems9+dPl|6ee>fpnHP>jZ4sq64QvV{X1Z%vJj(%QGSd@3LslRQ1`HxLct%_CTA z9|i(G@SyPl4^x+qK6)q^#{2ur>|4joPd*N`c=6UPV@l?ZcTb)omfywv7V#92LPvBp zc*r7(b68)jiVqJBy~zNax2jdxSO85tG2q#RUWh0%oepjl{kA6y zGuIe4NmdhxU!aSw2;-5OW@b~}Eywu$Tj)Luk9&9WSuVDx0xa0XkI);WRUf?fmCL+= z0|!QwTE77B%0i9u<`C?VP}G`=Q9%-^``~-HLj598>YyB1I}p)L=m(1T8VhL7%AQZa ztkbp#RK)Y{ejL-lVBqxpw~8s1I$dJqYv%Z&5Dc95mao+^3w+mV1#!x0yl+5sMB#2f zJ%-5d(z&&Mx>K6WFglL0b0^Ixp3qQyH^c`euZr@hVT>3qW@bRXUB=(abFICcKRcgH zshNPz1&z9lAc#6Nayh>@J7}^b1t!;$0Xf6$*p7y9p|0`wXoHn2A%GQT3k$!28ora7 z8#Zd>jI13(l}?!*TtH-`+e`k$de;GC02)?I&&jVcA?JWot(w)#gjdH?wd~rpq;954 zm3I^|NH&oZZQ8fL6t|`z+?^ zM(}?5huRrOE6mUBVBq4Wj7^RHlh$-h8$(b-3ZK)so$J~Q^5oWK;zE4B|!unbMu&s1h~ zSmJ=}g(sBA3c$??t_*E;s^zZaa?wR307&Bcl2_0xIL#S)X% z2Bqdfh-FG^m}n#>gK7s_wD(g<85q2iJ+)(6A)}~ai~g-j3BQ!XcMzTuS@ZCyTNI}^{qDyw9}$#r)JkCyZp-q=rjt*)<4e4KV=pH ze?2iDHYEY2q4rcI+JF}q2i(Gz>%jjWj@1Q-BZ&b^!Ebob<7YqPWtwg=7%R=FPz)yB z0k3{I+GEwKRjN@S4;+KGsRKhGZ2L*C|LI=EU5oMdW=C*S;Jt_T*k5q@IFRIJT$_?R zUd=oaPsw@u^l8_wQ|Sd|&;T?7s6H6!h19fIf@VKI&62pN{0sF2qjb>6Y*RER>;MP>&seQ_1k(QM|Kv#WP-4k+b_2NZ|kT_gD$kUNKahl?PF-MLGm zA;TdS$`>GNN}~yoC@-4+oFsy_VA;>^k>gqdwq)@Z)B#c3$Gq?qbWIDPy6K&$aSuOK zLiQ5VDDSbY;fL^_JX>jl`9&3+C@U3- z)zm*|pTZv@4%kuXlZXLGuZ(jFb-;Rvlich*Ts~mHP2L~a;Z8LekijW6#g;`+H2GB6 z2o9Z^L-e^h(b#;v=i~L7)L$7qJwaA}_}Gw5^zbmL zhSUb}eHfpd_qPk@6ec_(z-cv=ct|hR@QHW$2Uo4V!)B)z7TnJylc%y_*$a(6n%t6J2-PqD%8(@9lNq^LV^~ZUqIBzR9xJRZ$VmKE) zFJ7)CZ0YeuvWRl_Ac`?JUnpKWIqi}05jYK?!hSY5tr;5=*~Z;4rp9(Lp2#gZvyaC@ zr;gv#Wlr9M*|KpZq1b`ooZ4Q=aMI%4w95tLMxZx5TnV87Ri@;^Un|G2`+XucxIF=xziha(xxB|(i_}k-X zkR`ONO=s=ZW6&GUIqE2#OL?l$M@HBg7FU-il4N1|_d{fz0B2?gBh@W|mCss`2jBHf zewaMmeHuNnxWtPvU9jnY8nRg@7EPrAMln1fuF;BfUn66Wo3_?S60slNg)M>%IjBP0 z&H0DZU48kaX(*Jag3*+KcOy(2V63%uwQ@W%gW>J<(Wa4HkDNJp0f~w!{89yl2#2iD zw6U&wGMGZ$g{v*5fD!~TBJ{`+xkCvr69!CuW=T{;D8mVlP{X(*+b{{$@_~t-|KGFJ z@Q>K@aP=-8%U|?QZVf})pFAS*MZ-oN?x|7{KzBZ*vzI46JbQvU*Vi1|rAsS78(Eae zyrinr>ezXI&f&b`Od{<<2`AFU^AAy+);7-_f{nza$Cw)o8-01%0^T5UMyXpeq*%U#_?V^@yxT%#4QDfXczb~kYQz0Md)0iw@!Dqe2k5i|*fLv%7 zNI;Uv5r7%%AOl!e>rs_}guGf$tqG_WWIfpmg+5Xmr7@W+G$=@>IE0R<`?rZaJS%Ra z=z|n8n0i=W^?q6s4Ss4Hil660%*bv?{hq0+1Qdj{92gy;>b9IviQ(q^gLQcXc6!2_ z3DDvlZ}TdePFC6!Sh>9mHIW_{RhD`<`et#@1@D4p5DsN@W5P-8Iny_3y$1`~aTqy% zcTCCSRy1;Ltv_00!I!*@88B}{6PD!8hO$+Jy3#i%ViFn{-}dEX=pdek)@Yio)bXh` z3uO8OA%Y96G}<8{?vExo|{l6I_=B&<>rnvP^PBvo3&Ao z#g8*#Lk)4`4^*g&^h_yZYB#YeHzP1>2%Eio;{;h>$xT^W@}|DNT90OjfT%Uz5h)iY z9o0|EJEwR)a&LcMe(c+qwX~FyqH6unu&^`t-%_`77T=w^3#RHri>P>aM5aLl7Hy8C z2qJoBS}FK_1h@SRZE#U(o_DKrt=;4wME3+lRbHTCV?DCK^5oB^Nu(;6ngoLTFo~(E zda>;h`hWo&V}2f=*a7l2CF3K5jp>=@Q(Eyq4K?0$WH5q0yZRxWj5>5l;EQAg8_KEi zj`erhq2^|<+qiKrnKK};;{EOKb?zZit<}O--};{4SMTRHND=;`p_0%@s#xLu3n!A7`SEwnsI+ z9Ni-{k!#~!lHNe;XkPjGE__N71%gRxR~5cc|56oh)!Q3TqS9nHI#AE>+*>S>w6ZrHMdenI783Jb{7EC5%<|!eam(L7uTN+m zWhy3jYqkj9k)b|1>!F2QP#Dj?v|h|Zyxv4?m#rNx6WTn{$qOL~7!T9$rg#-Um3)e6 zKblO~-uk03t!uxIOe-A>zNts0?nFoN@DSa{;UOfX7M8rRSsmVegrlSPpPrHyCsr-P-HRNb`XauV$_H?oFq-;+w0+~! z2SJaCAX~+BKJ)s<0EuTReZ6~JiRG+ggGL{LWU$HnrwmsDdmWZ(6{U47Oa!2h&U$Mm zNu?o41Ho=Xx)**=%Xj4NQ{6vUpNe5%Gy#Dh8w}6Sz)#7R>l!=W2gO&6!4l@m;GWH1 zv1lq|Cfca&$xVBN+F?}3p2(AqF@>_x&UZBCJBniQubR^EB1J$?Kpin>GRMK&We26fzz-meowioSs&w?cgL)~t7*v|T01bX2nryhT+5Re z$2s_SqbOcc61XWd>o&0kg%|1<>!H+2r-5ra>Mz9`>`7- znPfhMO!`J_Mb(TjwD10Nxzx)HEkA#sC!=K)3T&YfAa7wKC1J9y!K;!ygkD~5B~mu+ zfUPnmkful|e3$X_;;aM-Fe$k*7^vgz2wgg=y)5xDnCE&n__@J9u#+G>v6wK^{o`v7 z3C`1@u5MvfNtA0jw4y%;LZ}$FTc1L_M0$)QN(|9;cwiNUurqR_l#WU-@uEQUXlZFF zY?AyD6Kr-NDc`6rPcwOEX7GU zd=oig-{_oDqMZbW7S%#dkJ`9S9&H$N7!WcAGb+(GCwM-tIcQtgB+(r%}+b)&kP2&<Ey>?2-3f^mG|9!yF^nr5GDhR$0q#7^kjNpLZgddZBkriR5j z?J=_kh&XakH5odxwk#FDhzOtX5a3Y_1Lnp4=pXI>jy-m*E7l=K#kjwr z{XDLkP)U(d#NCB3XCg2lN})hU1?1GYg289R0e~QV3`xyv<}40l+~A&7hhsw~1WQv9 zB!~erwj2W&L&DZ`A=~AG+H^0qFV4LTQuE9J*;Lj6f@U9%tdV9v^_@ZEKJsaBhhFa}k||nj7NE%4b>j@nk4>ZDWY2OP zq#mJ8??Ai10TYZ4C^Xz>Amft_U#XaFr2mnSmba1(;aE*`^EX zNraKx#cQ-!vk{?B1X9*>df*<(B$zRA2O5dZffd^iP=U<9)H@Dg46KmOZb3&;S^a_~ z2*TqYPI)WBi;3b|spLKYy2O794$srpYwbLEUghQ-U?<-T!u zRN7F4Paw+4o0KbY?GoxV-4FR6Es+U+%X{mQX(-15u z&Qz&XZeNucuIHi*!DiXQ6R0!o0K%ks=>-Mh0i7*ej7IrJcdCRDz*u=esD zj6|DpnD}Zkanq)YyxK)jE9ZqXlvR6IRGoAqKS3rAfH)`4QixE#j`wE&%rwMAH~w_CEgNk&)HI@oj~8GL zl6=?XrTLzSJ3$W@HoYZ;Ds4nVn4`^{)<)c4X150p90*?}T>^S*6RIm2M@0X!(SL{6 zT7&g|F&>E9j~omwdXW~jIt=e1khM_83o=YqJw?DZz2kDkr2AtJy=xB#_)n^>+=LLH z9OyK6qL%Wp2mvvYFCU>33rGDiCG*@=?>9M7HronPGjETH&7Fqf zL%mK=s@NLZNl_rRVh&1c>(6KPqGV5i&8Ll>h+T#$i3nQn5MIpZmddOOK;}=wSZ#Ca zThXU0m;C4I-LEMG2>a056t^bMxAMBWun7ff3PpkKt~rkk_25DxUfIN!Rca~F0Rzfh ztsikuYzGA3*-D@CvYp{lG!>gOQx*YtD(K;z@56`t-;w8wa=avd>$-QX=zp37AQ`x$ z&E)f#n}w7VHNgBO*bjDvR4epr4_txYNSV{$vh{(l+7id7+&G3WwHrjqhBy1Y;L$& z6X3*&7-PSqXXS`*%hz?D9BisSdIjaml@T290E~%2+8#}wV+iU8>LVEa7~*nTa%AJB zjWv#4O{yShA~irwb)+kzRTAG{?p|Qh&+2LyqSF@h%1zp7t5%3F1qCbHnhLNW)dGdh zh+Q9?bx;`At_yN6+TWwSzv5ddsFF%N9!f^(-|T{d)9ECMPn4T`0A@P@M$A%3jG#W8 z-217OJdUcgL}RUphD+{=;M_v>H2pK-lU>VqV0NE1q5l81t{YS_4U8o2!Zu7C-jylMfr#`LQCQxJA^bvG(*n&jaH8 z`dPGU)k@g@jN?%@r6ncuUYWb_e$iG|PqYNaZ^`HEij4h!iw?-mE+V~rz+saqEuE_L zNRC+W;s*&Tz#ft4xlRctUw=r%oDS!S+`B=;q$bKvG_TphTk{)mrP-cn^JTQzN<7 zu&ym{hFqboKgyayuZ@Hl9PMe<8914Dp8LHd?qLvoYs(Y12WFdcYz)N+52-P9JP_yZ zd;4tmCzVLQUrb85{}CBW zm1*;UKSvQ_|7hE|0h97=5R{58D{>)K4gd4cKRd3gTaGjAb7ZM&yT09FiYP5DuioGw z4ZtSzDu(`Q(D#oB+X8J%paO!vh~jLL-^;xR0z(!(JJpxf+9VVv<%)rJ$rkgfQ%12u zr7qX^gH5u(#jozV9IU8wwQD0nhcvjvC+2+iNF?}gt9B_=LpZLvIzG*C znO4BPGu~kLGK|!**}VFRug|sCS~UBWwtf-|qY7<;8v)S*5|z{nY1pTXIj`FYZUbe? zCFFnyp0C>WBqg+T(}g)oao*G05m!?g7u5|V_pz1X{e&TA?EIgWt#?qq`VM151A8NNRb1rX#HD#A^83}3ze@rvKP~} zTQ_M>Y2y{>QspMCv3nnhF$%DoLBriDfZ|76Bbjrhj~vL$MD4Zy(QEqEAADpe;m9-th^{JHVff$!&bb{?+;u;ISuk1Gl8aGvUla z0l&Ix$=Av9l53RO5i+O}X*U%>pZnbX6+LZfLQ%eF){Sv{;wKS%>N!q=-Y&?4luqDA zA;=xXm6v}#axR2=Z zp)Igu66vbBtuTlhz@oMbGd52Z!$jm`1XjSFE#1VF@G5+4rV*S93+?p+oQ+o(O_8md zn-esh&1-Soqt2Ys*x(|k*TTZW@%UdEW*ahp=d;MF$1hl%VE!LjJ`-|ePb|K_I5mJ4 z()ZDl58c=Zc>UO!G7A2x+uQp;n+nGoHP*R4r7u2ckWxq z1}QA2vV+qeuLE1jDM^g$+O=yHUX6G0`p)yXs%s4Xu{m(6VFOFpx9njl=BY}6_{ZKDtmw&9?=WwRk zy3FuT&Rr-rTJo;fF>NF;NCaj-uWM~=t;e(ws7O6=NGHJ^*1f&bF206K;7fbs(sk{P zHJ2r@NAth_S#bil)yoEX?aP`&yMU%O~-i)9H$zM&Q{>1l+A);J}3E+V8@l0aPh zSoTN?+}kN@W99H6F;Q(^516-pqt{14ukqy&Ws|bzCb|SN&S7Y}!FkA^Pn&YziB5?$ z8j^UXPuYzK{!GcuNf$tsrcyC~FN?_Y;wB?U)%scdtMsyZ9S0D;)z1Q4tF7XFi*vYe zK)Y*Is!rG*zkb%0r;Af|x|Xeoh=@=j&dgZi9{6*Gt6o&i1DSgSb+i33X9w*JsZ-Ws zinOIE*TwXa94#%HDlv4h)~cHs@=?bogdY&2Kn?4mR?d@;9gjFvIuF{RmM;x;I;FU~ z{kn?qEIDne0D_J8;t{RxB?O9o0(*x6z>YYpd?%GyDBAz3DqzdQ;#rb7fRIU>z?+6& z<_!G2GNuJn#Dm`TxZLKar0z|f1NYjTihSpbsS;R6<0>xc3G?^6j#J`|?fy3UC z$V7XXy}yv+wsJu)bRPQURzVtthpjlV-s0G!;nDg2ZF^;O|FUg}^%{Jx%e5O@QTs$mN9AT=LvMa5Ja zw(RQ;yx|=^uvldHg$qx^@YI+-C@3hZm32p1ny6BQDR|62(Hfez#HE;I*E&^3*=05N z(S?8wuSlm_XD&l>p@vO~V%Ynm+MaCgvXe{r#vdC=6clkz_w3GFFC#1Fh1cjts zx5HydiXpsnZIiRjK09Ue!DU{yG0kVbzHA*+HYLol!pY8z=h0g3p&b?KbARGn^4f_z z*<}*WAPEM}Rh)0db-z1$74{Z-4@*_dFg~M@yM|+aF0fmcURGjr(k3=;F3ahH5l~!G zD=+a{hP5d#>%IQ2`$)@~9)HdMBYN~)tQ(5RX>cF+@)Mv(36tfR_*=k{XT39oHz&c= z`U~!Vz~vE;v$bAtDd!MGR1opCnsPDdK1MLjlhPSDRK&MCw`!FPT3XPdLx+A?k_u+t zl%H6uctU9KtMGdCUgo2lZwNh)jZk>D$FjIqR~RF-$8wfI>S#X^5YFH>_s`XloA_9g zeI(M4ihjY#){q~7E&9Q{d%xwk3M*NbV1xd=L~OC(xK#RId&6h#2*&;$^kKhXKJ}%4{^`xXRfQ-$ zJ>K5IvxR_ac>C?8{(22+CYCSB$Dg7P{8pwcKwpy0!?J0+nCh;nU9~XIMO#OBL0Zew zw(`|hmhm--Ov7pQ8iriRXAOpUwOjX|^DXDf9hohh1OLi)=ch;qLtCMUs~=p_(zTes zL!VQs2fSjux3=+W#y;|z$rd!R)s83nD#5pCW7PXn-&j-0k!1*lMM7fg^M(I7q`uki z<+~k;wR)06<`^9MYoI zlhHl=*l#qM5;;bXOYS*fY1)O(H>mzMQL<~bkG&e3YZsku`)xrNIUqaO|qHRd}t z?FR_Lju=1%O#8L3Kxb9~*<{qcOM`V7#Z)vq zCX-Um6Pl`>YrT>K_h_s!20Pqan^-fD3yjCrr5UctNB-FaLuL+$ltkj${5ua}4X*x5 z>WbQ|eD-a4d3yT73bi>PKu&E zIuBzgyxG)Y^8?Ugf_(2A>f7|Um&YBcx?0m(0wqqGfp5lJ)`P2^YqB_ozmUxTD*I*H zKJN#f2j9AsR@-$ydf1JU<--<~;)nApu9+`Np64K#(9I6}&9~V{MGZ?|y5DWZ|N8uF zm{xjsv0AyDg}TGE*AeMwEx2e_7GKhT14|yf3sHF$xiXRBxr3BY(!GrZ-pGmHt2@TO z!0z7mfbrhv?w3V%Eo9KWiuv0)Q2qtXz*j+13NZhz`>4N*79X_lP>?fX+=;A!j%p0& z0LFgXw(X4tOc_=|emLiRtPbuE%PnYZ&mFq^^gQ*e%Rr>OM-kNLP?bkaPP@(_wd??vqZj6`z|CM|tj7tHm@Z*O>I=`f^T*Bif9hu+={^$>#;n%;C zB8nUO1Y`mgB=Xd>G|;W&`8gGxGFXV1{GiqVzyV4+Jzw`4L4OPI(87#{I5bFBEdB_4 z=3RAsy7lpsvNgr?p2g2``5yCV2o(r1UZV;khE?Be9?~!B)5392em`>DamtI+%lziJ zyKkVA0Kj8m&99>uer;5>l8a%%5ZGD<;XH+AwuFzhtiG}UYvLd>0P1nr@#cj*$ZFy{ zkjsz4a)+g23ujQ1aarAJN^1UDkFT58y4<3)pwIt4BEaswabL+QGtF3bLcJqA^qdL1 z{{OZypTAm~*eYym(*AS6ccQX}CJGinXEuz*ojs#Y@n)Gxs@TQC=N2oS4ipsMtZwmf zeydLLj-?)@Rfpdw8Che5F~^Du!-^VCMKR;K;m$b|26*1_E_(d*nB(gKMGbw%##7P? z&X&xaD)#Q(C(yvRwyrg62a|nS29T?AoAfwLW!hgyTtG75?J3}ON^u!GHR|qvq}jLM_OdB?{`3Fsy>c3uem|+Z zu-gYcM&ta1>flarsLkf(+1K=$8|R6N(ic}g{b_7`>rd28h;|61=Xjt{ikaXt7PiC; zK|>O#rdgE~J3}dbWMPUFpLz-ifNY?E5FP>8HV`>j(<%oj5Sms!GxHE*6ADNLAR~$p zdNpw}6Yy;bwDFdvjAr-nJ+xP>!8>+$GW}%}!PJ9L=mAiP0O9az$&w{iue?fw8z<>3 zwUonu%9;A(j}k|bd5m-7fe-?=wj#h`D{nioZ)@d*uhpm?{qf@GOh+snqZtUP3Zl=p zqtN=}Ud+prj=Y>AXx8GvYy82)<0ibls`tXR;~@K2h8n1Ih0(WDdk!KS-!gW|v0;Bs zWL)XSF!BPcU|utJX9+5kSa$UNDL>{1Kwr2?mPg9G`ExC#OUL)+br1c`x5cObr)1;P z8Ff-w$8cGvG1>Y*ID7ZFp6~zv|7B)2jGdhiBj>Y_a@uA?&Q#dw<@h*X#LwJno0v?RLN2 zMc~oHXs2hG|J~0N>ly6N$K-QM!zw5C$^_Q0>~#QdOT)C9&=jRe0gn*NIw5>hY3@l;neLA8wzn)l&eF8rGI)uO=cG zalm^$m?4yN+#T2q?zetNPpTN0;)dix@*;iKc0emp7^OfQFOC4xvj zcl5N1#J;Ds%W2;9>(pksl1x3uM3r|N{@^tut#Y*h5}{#=>z3(9?4YLwo@g_Ar%ytx z^AMs5ddlE>1utJF6nt~@oBwGx!fkUl_fJ@!eW)DvkXiJ_1&irtA0+thr^u<@HtuMb z+cS#=CBA7%>STLO4cS~jev)koIVc}>%nVGfP@qiST?G4O(~((zHVIp z^Ak4)_m1s!yeQ(EJ5kX>jsBC=2!&TDAhggG&Paxb3<2m@%51LjR_*j~do*eRJ)D9J zA6BMML}Tp%YK=!R$6~#(`VW^mYumbpBW-PObjzHW=o(^@Q`;UOWqP*734kQ@QaR^*hNODre8Qx}O?5_ymR@Gjdt z8Yg}R*pWXYRQDhJ)V80bE|BqCx7`I)(%KO&%=6V{6svd{c}oE}X!OeoDIt6m@fLEw zkM%5>Gh=A>q{U|U@<-X0eEjjpTHYxt2L*QXiDrClP90K@4RGj_#?5P<)G_|goTINE zZhjEqtM~1I{~?XgI*tqh)+nepN&Q+grE)K&dO~t=Vi2f=MBdSq*z9?_j^a_PO>BZE z6z=tljEeR9yEL^ys^6Uy(vVScL@bc*W$K#V_HMhIZY=0CqeYSZv$P92pDoEtkdHM} zd95%^fv==-k|82<9nCF~ss85;BSg?I+jcElcHAmz5g80IK#oe5NqXm9UQ}J2gB^dDT)vTZZ0h4wt5F(`*fSPc4_2R+uH10{>xDByzlS?f)-#sjhyw>6L3 zsnBhKv={<*Z`)#sFJ+9>ARNr*7Fe?U`@c?j{u90woJF=tKw+dv<}DpXuLPKVW(wOp zJNK-4VPEZu3%{h+gxuW>gL36k$4bA=HV2J@HT|3(nC+9DDxI-~z3pwJwOUh;Ene{fBGy zJsOoNuXEp2N3yV?767=+A}KQ;QeNywnoGx)sl%E(pV9Fn%v80 z%5fijq9z*%>k9t_h>IM3A2vBOo(Y;-m{69SU;PSLYWoQ%M$m?+5ITML5*wi9SfPm^ z;F@jps#@g7PKVlyZcF<@<0^tc4s5)0ZT%B;@#3aq$ocsAq3lhzMjCYg@#FTEGWgQI zGAu|xi#(UnMPzdtJmgVX%* zEe#FFZ=-wB{ev5e7nkxa1VpIqU*5~Q1XJ`EA#Qd7;UlLeKI*Zw^~24E5y!6b^jXcC zy!P{cB6(%a4tQureZ8FeT8j0CmDie-Kx7NTlx~oQDMxmm$Voe(!U^-=*fZ6y@}8-X zEEphqS&x}m^5v4jffOOhE1EU;*^N3tOnmm`JuCl*jLVD&JNCaF>R_M$ zyR$_;5^yPRVpczV9KgNDP$&Iknur3&r}WC{a-wd8xNJvX4XmwAO^CKoq68aIQ7nqxJ?H+o&0>z5$jqGNSKX2&dAP>jdrA2!glRaw%WQ zI^8AO+RQ!3lH{2(UXdIgOjjN)g<(QV^loys>CvOd+;$+Xn5tp?I|AhkVrPlVWjo|! zLYszeL%(KsFBepR?~XbzdogVRAi@eTq;W+TBg{-&-P|IhtrIH$_Tt84w-W4q6Fin6 zSzH4wIA&KKk(UyGcT}8C2rsmmrREEbfij5@XanGe(A~IEjDu>@8lSa@u(SWusjgh? zHSwx@N7@WjlLLL!CK1bpXw&^M$KkXrM;Q!}Afk_sZnu$4z+TjLd;$a}U%Slu^^puS z2V+takeOH5@?XC}e&ccPl_`~+9Ob603nDcfqSU2;P9F$hfskD(1li5hUUMxd5?zT|*XRT^ ztEAqA)=5jjklq>0mJ#L9CGiXGR30TtU%42~Vj*r3;o#_uq^8m^`Or1EDzhT55Q#-N zHw9i5hiIGGi_}q?TUI(8UP*(BXegP<*-e6$OD^cp-J$NmhCu`19SJUX zK)B{=wjnYdyhPMzv`@}FY>{9u>I&^NK|LqKRbV&SwhIC-0eKUJuq)FS$+QMxA?6SS z$!Ssx-PNtCW2T*y*DxYy!9$il#I3#L%!jD{+K#p(KMkkGxZk@E5@f=Qeh<@vvV3C@ zKqA%`LLC>qeij!p?lglnK=PU`fCkXcZMvYp=Try?K2hnP%3&*84Wv>eC!NDu2wlzO zATrPxZRAAmrVwEm@f*OKUIuD4I>`MlXtB06d~eT5B&wR_CusfUz1;cFPBq$th_iWU zuk;}l5xVb)d?l;Oc}XtNRD}R>0X2#f(o7QzHdK-?6Nxe(-q?{uF5fz0KUd`blPAGs z`F#{k>KMqD9pL5BHljVEd^XmUt5#j5QnUu4k!}jLqo#tjEHlin(bAl*xY=oUDCk@( z=ZSFJ9VVRkjrX2W->gPIa3O{K=d1tQ-9Sp7qAJU$)X0Kw28D{& zCK_(rcF7~gRSwUa!pjud%WtbLGI0hX@@f70+Y1068le*7M0^8v8nL+W zFl`S;j2&fFqOC;I$+LrIOT)$|T`jyyqogyEwJEKaOn`b`wxJo3bB;WD2^glR$}8~K ziPJ`R7I3S3lq;&;-mDNh`KU*$WzzfhSz?j13Rq1%q|6&}fhm@R9=$&@>_$s2`ck}&>Oqj?1RmosPPdi_N>^`uvOP|mmPW{{ ztoRPutOMk&ak7x35%299_jm7ekIfQ1R^Pfp%urh_UYsoqn<(ZbeGQwsv0Bl)_g39W zombSS^p-{jBuu3D&^BH1S=m-2khA+?Jz41 z&fCm)norWO!~&fJXFuT7&@XbMOwVSmGdyj~+A|FUYjROlw$T}%K9f@GSgG53AD^a{ zsuaxMdooSq>~ijrdnf`%R8@YO+~;B5<6(Bw!yL}SK`GRXT@0>&F=eG5h>DXR+3xwZ z&mTSRna$l1Q_E7fLg1=~TL)-XRGKrv=S1JFxe?mWbmPX2C_jZ)V4*i9#LFnZH>j(9 z@Aif>=_F;hADW_&&}`P!iag7u&VQVFWH{kUnIgc?_yJp;s7cd!6~WvTw;HK$8&flz zVZx?v7(aTys73p@lS9ACjVeiMRw=!VEoPdMgcR;Ab90GM*>;UWccxp{4PT%tHaU;b z>AuN{kA)_RkY^xOggi}x+D7}hHe(jnaxPAfKKr;Cxm(SdtT6PFXrQd2f{p7h9*GEhOz4-@+%ifUcS& zA|VM6MO$Ufk{;id`pi(7ZRy}*Y~HB0EI!X9X*uIifJFSk&Wr2kYx87QX- z@bi{}u0)bh;r``a#n9@s))7nAEH6Z=QWtm_Dh8>G08zBU2xZM;JI7*F3arK?nYd4d z2~>^9`zAK-r@@dUm;zY}6QfUQVsU87>^=F`6`LGLk2s-zEP=d7W!jOiZ+sM8>Gae} zDX1IExL@~B2S`CDc{ATtiX3G)B#l!B@=U0}knP5MFYkF0-b)6Z8p5Otjg?Gav(-~8 zoqRu%4cE%^@-%^?yCyk4@I3#U;R3dTJ)}vb8{(90mv|9Vyb?T)k|nYRI@#_v2dU3L z<@zJ0`jw&?068e!1B`u}`TV^=9l8({eP6jn_RdASWntF7BC<4Y;p>g6Z*#O>iLw=` zreQ;CZV>g3$|rdvsj~ew9v?1Hc9|q<>`xPLx=|bxM}~9Off-6}IMS&;^ZZ*d_z)zm zp(@}D8*0-+k1FZjhgiHJA5+K&!4+EV1ZQu2AZrnVWK%#gdb~lb1=oQVK9Ft(G|D?T!dyo4|?b=`6 zK62Kqz~sPF=3xyEZ?_*7*dwF!$6wCtvF*VIt8x3beq6K3awku()ZB~(@$Y?dqw2!g z>r>jhzwDFfKKJE=XOF&f{5KJ9>43YlT@21~l!Ydi^wy>)-d>|c(s0H79h$6g@>~tB zwO4o-^9BMglg!Wce?2Fo){X&&b2|tssF;Fi8szJ)drLy7=li3_3FnMo*;@Lo%RA4v z=t-h5y9~gnb+&?Gv;cF5ulo^);jbQTJMI+oXaHTf-Yp`GbHp$8MToPL#{QHZ@wRi# z*h%inv2++fK0;B&gf$)~H!jOJZD$jd8g?;^o4+d+n6()7w6`m zurfNoQ)zl$MJDo2`a5;EFodfZ^w|yQUVp;!0e4YT;kV^)y0%}B*t69c>y^YL;fwC~ z7PR$B@AcLf51_8b$=n_CNgX9)MRF>5*zWZi{_%cB#&n+Q&xC}Th#v(ZYdx&mPKGKG zJaw~pzhH8RpB+`q{q*$TxLWmnr;K@&zxY!VfIw|jh|G=IPaUCjpwYA)zSW=f9q(lK zV5oU?!eMWRTAs1be*y{9=4kvkE>o7fmK3=XBZmr}*8}JOka?YX_*Vm)|Kou(+&xQO z5S1w@JhKXy>g}JvzR; z{(afPOYRlPOHKASSY7jrCj*BMXQ3AolL^arY=AuJTl%UW460Vt5jI?z&$GPDNK>F% zA6`11-etWfq3C_tGe&=Jcqg~qb0X0>c~a*24z+U3Sq~9Im>v=@O&~Q z#L6k(GJn=(d%Rp(S&$e6Tk&wU+3mG(DoHcl-%4DTyJ4ei%a+p$EVkduD+^)kh~_F$ zPR3s?Mc}HMUK&H7ju+nFQ7)*sZDbMWzhlz%lGn|M0;DkQ;NiuA5o;ex7XK+E6ss^Z z^$w^KMpCu`L*xg8Oi zi*_bPR^)XX44+K!?q9XZ0${j-8l*qf{G6qzeCjUEk))lNrzzBHB*S)=LQTLVgCs@f z8L&&>X2XzZ3JXS7J>n*y3OF&<4@M=6S21=@QBJRvjBk6RC)gMp>$UfRu*BPo^M*3P zkQusd(57}wE(d(I6W9&{+fGWTN>G+P0jfG@81P0pfzY?wRaUSzuKFZADQu|#rExa zWm>N&wGbz_qgC--95txANAk27+wtpM3dkYENosgF9T$+K;)G|dGB>;Sog2xhkOa)Q zcd@B;BI+F}kGRF7gC_*?wX}v)(<+cms}qin=Rek`%pMK3uhoAVhbHd9rpY`3Rrlx8 zt5SGbZS680=zPC+VQc@KrU$lcnepQDH!1R8{zs>u!;&hUv%~lD;SX=!BRpLd4MFhI zMA=RJ{H4I91k}(v3n@o)U&8WxQ$$l8et{FjARo>k5NvZx3ipjB@F+Q0Ml7(at~iMy zLQ_kD2wM0kYJm5xt+j9j0p=QR%?l5H@t3wQnoX^Ii$W6%nmp_kLnT8H-i z@Q)S%x$a})3nLvch@7snC2Jf3rU=^CaDZ~X`$rXYwKg3o{wsSxAjpSQYJ*VEy#?7j z*wo1l0xIe(RS{LBz)T7&8|K926b`!WJa3-+fr9=|o-u$=zNC=d!;!A6O-(|%^Y=Ngeip6kJdWyPt zYBlcD>t5Kx&?#qJ?wx&~@-sDTy~q300$^dZ4!c?ZRU`P{r23Vlz}d;Elf~oEj11Qw z92(TxbR}o@u*9-fxIX${y?S*>t`|$Hl_7mzFiP@}@m?FrPAS!9DWFr{Q^j3_ZJpga z_CT?FqM)HqKV^g3@4O?;EHJ>!Rr;QI*@n%>E>mLC88Jlw34=3j7238LoDl|e)?J%* z4GoeSE%J#lg%;~u-_!05(7$&YRV-L7O--Lcl?5ET!XyhO^PSC~)F2rHUS5^!hDOkt zMAVoH-E?b9=?|jZ^BP$U$4Uyy(G~NN*;$hBuW8iV8mQmAXU{vK?cuS(Hhgw})O^rG zc1KxJFUW?SwL45$nBEKaNTchoC1_4AlURr!c5X_j zT=nU|x>y9BjQnq|qzkylhp=HNMXNQ10Z{N@$oy(m;;D1yFBjGFNy#*$9hGGRipt$G zB4GGd>%MN7k;wS2YmXmaaCQq_rwP>25;~lV3+)$nOm%D$c>v-K9hVF#G+-m-UkZ-z zzyCgI=9=~)AU%U3^*?l>OFWWP(0*wamqczxq*VWN7E3d`4>{V|rRUzi^E!LlZn7TNg z{oPPzl1~USQWYbLRg!vySc)^Sf1?S!D!+sSP%z8;L{ZeoXG%q*=sEiYv1gx+hEfU`$Q&Yqc8kRm#U@strg8+jHd|NWF z${e{wAvC4MmkI!Y0vSs&v9u2x%RpYi<3LW=Uhn3nPm*VL*~$m*%+j{v;N*oK9ywIH zV;A{Ba!lVruj~P%cK_KQ>zV@u3;!2P&kCqIzE+b{a&EQ`?Qef{eYcMcj|KxG9zk3u z44&MknuyRa%VqR3*Nh9Fg4@*ft@OPFIP#!ovLIj22iQgLMqklo+_EVl1x-?(z3%VB z0SV&HrFDw|dev%2#wcp}e(&*qFK?gVUe2~9ii!_I`+XZxhMdyXx5oXF6W zmN77KGEAdKz;N1+fJj(iEVtVjPCxbm1H%DI;(}G7z~ro}(1JCdsR${CmBd&OnJ!N2 zGJUZ)E)vYiW?#4s9z6Ks<>+?~Czp7Zu9-g(ZBF4izqa##uexT9U*CV3r1jgH^fa&E zaB1quAnVqjwjTAhSj?o>Rlb58(9|c3P$&7kK)!l0F|p&+VjvWBkmj_OeVlee{95|F zX%E_2<@&B&yY^WoQrq#pRu6Ey5#9Z00$PKH4biymS(Vt8l7uQ`qX|4|YLcHFh2NcpG&n`5 zm5hfAoRWQTYe8amE_pdt>e8aic~C7BRFWK;q{S=|C9eHp;vZD|`*{`x zii*m}*aLFO#)g5^S{j|PiCOIa{TjoX)924y(tY%IxDkzt)x1ZKeO!hVi`?=fr*T8@ zhm@hizx274{9XmloMFu$DGv?zcWNXRytu!^C-0KGAy_s^Qzo!dc;u5CecYcF`yD)@s-C})w_Q?UE+9<7XfQ%uA3kItExBYPfS9gvjvZmg z2zH{erCjnX$sZ%l7I!Fv%kZ~!lR%f4M~Xk!T(l9c8f)H$3_hxK$=P)cofrAWClrQV zlq($KO$~ohH7m3ITDxP1tlPF z$MDvz4^OlFe$87csu37rvP$~>8=DhO-|F;nQE4MK%t<}5i%X-6hEA|xaS5lww9of{ zo;jn{7<8y#p4}3?9cEpcX!2kVaZdOsnfv!chdQB~`o>3#OG&_|JM28pl!|t#QzUPK zq3bXyrd`#lD;jup*yx*lK3cAufUu(|HJ^l+$ji#}^$DTa4Ogt6?*7=KB9-qaLu%5R z*}J^$Jb*6-8QBdEDjhyH*UKlD6%@7_IKCQuXm>}dTL!U{p8m&;DhG6C&e zQc~xsvmuyNYQ11%P1>^}Bm$1e9=Fa~xVAXHtVuz3l%KZXa<`a;p1U_QF}v`agd30w z%fJ6VpUEOX$>fI(&Us!R_Di?tUmC-_x=W!76akK0#Gp}oeoeBh@&_cw?=qm^y;yO9 zRwaDdA(ZY{6M&G@+FM9M$asCLwMTeW_YIk5Uc&fcn@z16epFCzVK1VtFg?chTB6|8 z7GxZJHX9M0@D3eAniW!u4!aoa+CB0?;`;@WJN1Nw6SN=qV%Pj>$%WI?5_|J_v}zVE zLDeIy<$1(`z}#cN$JIwssnzj)uQGXasMdJl)_9aV+Cn{s_4L4X#yoVAsS z6e?$k9*5%2(~l!ZoJCkF%IsU#+EUyE0k;J}z97lms66l8Ws9F|rQxLy*_jodTacG{ z;f@_?MbjI6u$Gomk!ZS6ofCPT1HMPL^^_08A%-s`?R*q7?8$U~JfHPM<}pFgTzW() z9_bCr6dol@=k;8;T3Tz$pRWH8m~KlN6$NDw*X>#q?U>7YVWe`^XEktK6iG`yMN@7twY%S(p0C|oWd^? zua=Hc04>=e6<0ZHEzXm9QK<=KsqM&1(yS_Ha+*tvM_&U3pxZP>b=7Vvp=kaaG#Nly zQdKa$^N2g(#MS~bK@osMX^@QjUT1;9{f4kz?16@5Ci;z`Dm?P->33xI!rYE*f<*jL zm^kEkkbbPFjq4U1W0(Ynz-Kp}TCKWu%Z~}M1Kq;HdgF?i0n}3(a7MQC<4-?ntvnzQ zlum$vP1p)0Ebz3%V_u1GHih^+D@dUbe*ric#I>ti+-|~&r{1x#oZ}AMW)$JQk+A;+ zt1EZEH>geBTk~&nAS6~qE+qM)lqq235`H1oGYZ#kM}=S5+!0mGqKt*Z-RxRYRY+8- zMvKEOL6|mhm{^;RDCxz9ClivJ!6>)OM&sVWMBL#a7}U~OqZ&aEp9vjX;=@8WsC z0XLob5o@w3vCYgP;3Q?m`fkskh4z1I>5{;S(Ggm|fKi)qUoRe(c!JM#86C3;;}hAw zbv^O6x$>TBU*PZ-yqsAOjpn81)z>68%Kh?5%a%`uo=E;;^o`lwrR)M0zpAj@XGzfv z42Rl`KXxE#=1*-N<_sL2@gidC+*j?^MhoinP+mlSU!Lf}zG>t!Rt}dXx)3L@*sc~I zyAKR^&X9`wpH}KkAH^vWFv>iE4Q;6wp?29i1aMv!70b$otgHJ5@R351Mnwt=LUQ85 z+aEwID3qo}E`a|b0{iUdoMkSYPY7q%$m>fbC<(6Zw*1)g@_@!mOnBThMzg4+0DqI^ z*D2l{Abwp)NN(>;7?5N_U2Yu^&|^$j{o?Tit&FR5@stTZyP+_?Ho_u18Dit8oV#_a z=hVNrQ^o=TeiNIjW>d!l`=~1hQpw#FS3C*$?_7_@8WdcxAn}EJYrBXe6lHrzuo5Nk zoMfkLV#%Gpj0RlG2bLiE3%{J#qqM+cCXJJ7s`>EIl-!}+4QX$Kl&@?QJ;jzM%%R{j2SS1e==Y|T->51+z}>V4hOc#o#*7VRya^y^S!_MP4ak-%zPH%a*(Cv z$X#FkxGJIbQ`?@VE5H$+_K+BvNj{}8uKqPW2HNybJ50C%SSpl+T8`?alSLKtbkItz zvOdc17rieD6B5BWE}tD<>an)xypUzFlsXa!%YJ}6qLtDLy?pIe!@}wxXtt(hY)H>4 zzDb$Ke=GAWxh5Mhic-9{6f7cOmMDSu@>66MH3lWl!v5Z~HSt5L*PrFH8|YOy7lpsD zPAnbiC6yNu!kwSiMZb6#sQ85npBgZEl3E?o$SS|V)P*9uS3Q;ji-6R~A`$2hK-~Qs zUcYmTmu1u3-uK3m0RIrVe4?whU$uQm3o#kAgb7!Bc`Z4XA)sUCU)1cN=K+yt7d*bX zheQLG_}Y6O8Z&C&&j;s*QtGeD3)K||oGpxU!M&BkepodO@psxPKb(p@{ktIZzT-M*=lwq-3{P-S|#%a7$mhF!5UsPw{qrK zocc`k2Woz!Oa5&#OI@!%^c!jsv*v7%e|gfODZl#)aj4tEr;{x&lRmrjE-0f&)zog| ztfK|auV2lR<|o#O;PB)}u?E|&7?Nh3j@xAq_EL|+$??S0c5O4iDN4+>;e3FNwa_T3 z&k@u#LZ9fau3;gP&)0Ft4!?Tu<+NnikCt1$t5UrIg-nl$j zk35(f?{KwZsnp-8E2-2tX#yHF)aL9#1HtDW<#Jg11TgOp@*y0ta+V(bj8!k3d6nZVfQVu{+%VxR= z&{h^(np$DR={lIMO#PU8w?&z8?#2TCDAh4Zh2bbchbl8j)+3EJFbdckExf*Iv)nXN zo0tY_<}38~8dzNm^(b z-Er4NFJ@>4j-LUc`DerAbjVR_O0U^7FKQYqaLCp!KBakMJqbu^=;6S$aFH%2bI<^a zG{Tphy3d3Lu$S^i{o% zua}Bfjv;rJ#J3kF9~QzF*TMli5XEQs5>NRn?Rjb#GxC6r@*it{4b$ z0yc>vW)WX>Ig7aF)yZUy4GG29V3uW3T;I~qEy0GLHY}D5jSqvRkiXo_EY-`K9s_=| z_UStH?5eoFTgt2`sW|yf?-hg1JG?HWQK1CC*06YUyRoCt7(``GP`f&L^5kPjr!z6Q z9Y&?O5|U>5O^<;mc2BlAoMX{?Vw5)fxySWk&T_#He}-V1-b<7!$3$b9Tj#hE==ko9 zBPMx9466wCX$&!-_#;VX*JYZ99IC!=WrJG))k&LiNA~q8dp)19V=&Yh35ldSx$)ws z%Mkkn09*sQ)bZWeu{`4tYI^-nsi$?rh_g^PTtc<;0ulaxcqeC<`ybX{`uZ+Z;8htI z!W%-DsE(G_f+ArRI}%b)OG}RGM$V>f#vb0S=AF5LbJM!a1UwbVu30i-3$lds4=1FD zLUHD3-V3g-8>0}q+YnFJ=!$vyeeK910@lBO=Y0_uq$nl>w9QqGNm8M?L|r1Hbe)l) zSQ0_k3tyU=o0Xl-%BGNZ(R%@zWn8rP9ENJ3a^wlmPHtW-}g$#P+h1HSHFJE%NY-9_bv!;Z)` zT8Ly#Yq8%rNcTG+VE*W$C*<)>#X+rebG6!VM zBt_wrKw)Fxo#dcOB>L;&k+*(v{bAnO`S!h_G#SLd8R5ELPnbNLjfzd$2o!me>k4J2 zlDR(Q~iq~AICD#ozmHD1p*Rp+%?*HGkQeb|(WkBP}v z>P^U-jQp&d#piLM@AQo+o2bZYBhfR5&1vMzdlib0b>bBuW5k-nyCl<7?Pf!ZIEVf% z?|zQPLS~HE^$qj^6W9&i6!~&$uUzlrvs0c2Kkk&ks~`&0(DR|N?qX4O&Cf?o%T|Ta zyUt_Cw-uI+;u2e|H!9bSe2n{O+z*f^Pj-2yOBR_;Z$K1;nlc(vFsikLh@_c^tWv+f zAN_2(XUIBAaUS^$;-pq;NkorAmtNrrJ}`E7RY%wntWZYt%0|+AsQE!6y|6O>2F*5=%SN+8#jl;z+5- z!RTsHwbn=y0d&i`hc$jX3CU&DDXLxocC<#Ayn5Il%_cv7+t9@0?YG~SN<*&0s&BwZ zoEjJY%(Wpd_;s$Wi=mvgGfcQx5gR#2>-*CoRg|3UK%ersnOboj9(t?}P&Ca;Q%x9}PR0_=l_B%JJ;$WfYjE z_kC4ZxdPAf@Ot!5o%+K~OPQk$9@=mv^G^TuhLgc^8`h-T(n^&z;_g3R;a-{n zpBV@jFR+BI5VX-|7VU>y4ji}^h%2e?i8YXM`XA)A0zv#@jo0gbT9g1+GDkUor3ALr z0h&|L+11j*W_^rL_Irvweyn|@T zIU6Wzd@j%Ggi40UzbWhG)qoy+(vtj*6PM)c3G%cu-b7c>R!yik+Q&?CBE7ii>U4{U)ig9vQ~i2?D-F*U#zU^`7SG45B&(6FDp_RKWHvQrUT5F z_7AA^#jzXIjuIDBIPPCu_*~essu5bR`Yd6qA|E5qS9hyw;)9>7KLP02Upyx;mJs)` z{*`)KMJ=2M9@qvK79ZI(f&IN%kB!>lO2F_j(B3dME!UqnDZh`(JMr=H>CGzim<&%I zAe&z$rzowIVJY)SiDWl-oa^$D;l{>i_u}Z3?Nr^eexN&C?ahZK{D9LygCkK^h-@WS z>|=~}d|6R)tg(#VX6!_eP&G%e=xhGS>9+@Y!A`H$3HMk{Wu zprH=qR?NH|<<16#{gUD)R9^a4CMQk^5~oV`P$Uz`366(qicl!ulu} zS41{iYG!#E9f2&5-`qbHY)CbBk5J8f4Q8l<89Ze%|!r@zgemBpK!OtrXC#bg~1^)HQlS-d) zu5ib`XXnp}0=p-}Wj4IEx)+N0)2~V@_8`~%aSGafmG{zT`kLG%M`Qx9aYvHO4U-qh zWQP+VQ9o+fb&B|wydSrz%Bz4c&@sFD0J3}Q-!jFQjx-1T-enZF2S7jS`C6qjrTGMVOGe&^E2@JSswvJK^lb$Y0+ zOosz@E)smDhe*XKn`oC7hRRwIfR?L#ghSOPZwrvVr8dMEAxdl*Y*9G?2X(cm`>)Q| zKfkGP%lGm2VRai;Dt?L(LbDSZ2qhgjxYRV<@Fi}DJQ4Y>B@EQEb$#D97$%!(3>zRt zpudDI1hH>jeC$$~b5m-NlMeF{v*n3-sk^JXZ1S2=BUDE^pWP8$whZ+Mh6&1vm=^838 z0UIn$lOl@sedc;aR5+NXb+JI4b8?Q_eL0apWL`Z!cM|{3P_juEi;Eo&AW=immqduk zxO?|omtir-367$;;e+Lo!;Oe@fW{jK0592(?je7+`UaN8O{~R*PE}` zs!f|g>PLCBDiAcw3;Jb6VSb{Z(oe9S8O^YuFQ@I!ud367c{wK za#{t65E!BaAn>Y$^T&mLP}=G%5_Glu2VuZ0m(L8n4s$wZpa~X!CSNaH@E)RTumLHR zaKt~)(BzK1%{4YnHf1H>AWjC$2#j(DNZ0-36dJ_CNm~ui!~aJOD7uvtwC4>EFuS{M zn6&YbjY;AET%LdRpXZu2;QYiteD}s?MjkX?$x9pssdZsfdq<^7Uy>5A%pmz4@_O=h z4?)!WI~c>cZXh>8s@l&wOxTA)+kbtHd`fbyu#I5dT2kvmkxeg7Rc$Q8IhiaX%(F@l zF*mp;Q==WF{?@dCMybFUFwCii&O*MOU3J9{^1Y4D?$8>N9!e1-1%sL=T`_Et(E^%U zeEdZv*{}hfQAp?ob6Bqfr`pg>NcvBsM_QyJvEoClPWU%NcmH{OOMRUWF+A_zY_eA= zUK&iU$qSKco)oJ?WCwqdB*2a$N-F%y@6<33_l)IFaJ$PPmP$jaBH^dV=+~mJW@xSs z6}x~s9$#HwpO6Mvdhv{}XcZPn2?qEc<59Ydn`0-M&p z5!<&?la?B$L0T%7NWd@%CXK6}4{Hey>TwbI(32Qy$%qUc^PA^{2Hb{fOH5RHdRg3U z->S#$?i4omIzMLd`Qz=+FKEzn*yGe;O^$6CF{*O=L+!%8$oiwh<4tZJbGB}}yy>ky zR^x1s9kDy?`{c=pn>D{%kg_+eb(Lz>-|7DKps#+Of6M&Qxnr{j_nCIFp!wiCcN+UX zTw(TwxzFPHy&9Y57B22{XK=`Ihu5oLxZ2-m5xpf$^V;w80ceM620PN z_{@b1ZI7oqujE|pl@I8G)Ojlqey|LoAy8((uxwhO>V9Y?y8RhobFitu1!3>rz49m;+#&qy zVF6Zb-4&vXwN1Qtg{nBi$Hx7&HJ8mFWAafFxnqeQkz|PIQv9L7?TDK4SDBwc_pMc< zS!S_?+7$RP$qJsux9$M6+Sm`U*xx5_YvQ?_{A@Ib zU3*?|KNuM~eoe3EKbMx=DbtQekb~oMVoTiKyoTE!h9vJ7ua?*=Z5G7PZW zk^MqMM1+X3H0O)$BeM2x->`oDRJUIIOslV(ekk)+xhA{Q2^VE|RH5fK*Q6FS&|tFZLjv}c9v zehjx;mah?U^3;dXnak27&z;<4Epp}?Vkzrs7W@z`p>i*X*U;Z6X*l6;okt&D}E^JP} z#zkwnH`i|5z=u$- zKl09^UX3*Gn>53kK{9?*(Ek1Rc2+1FI_*4c+%5c8rrGIEM}SF6N(*9>QSEz3g8`5p z6cUmw7cYQz$>WR{u!`Zz>NRU}h@H`;d40>Q7z_0IJ!zjXX%fk>WV;2v7%n74SubUpU&$kfh`T@4|I6Futo4{NImd3zxkA*P>b7D2O=izMxy?DO@Vfr` zbyOcV%jayr^Lj5X{mL&sy9sW3E>c&qASdJ5!mdOkoLKDKQl`(EJ=>aKNLaGhlMH$P z{r3a8$lBb))e43MZu7yrTFgV*;2Ukem@$fD@yIPQWgZd2tb6yp@DmpwyT#qEwZ_}K z4G!X)CpiC79x@O*OXLwIBHlzu&~_v~GBy_P#bKXGqeB`o<96=YTvS{v z!*9I_+FvmMgeVhB`WOzMRlk1U*Q-~LVLSE0+jrD4bn4qT1c+`XV*`>4^lG$b(V|64 z9Z(4SVqzxpqBz+k*De*k`)_vVPPn0iC61Svq-k?`ZDM5xgExa9#D}^9Dj?cu`t<2r zd51$jthwSS_?uI{WEGcHZvY}X>-N?=jZB6z~>4L@bq?kaR@EnkEu zE*S<)bA<^~wwrwGw)=`^lGpStJuxRbe>6eX>W{mJJlQ^<)ALTD_gA~t_Q?+%o~7eU zpTX+G2|qMl_cOht9y6+!wlCY6)>|FK`=yd0kzb~GrKb9h#N4AJQGlnrpX|`Sef!XG z6LZX3uU$Jc3$Y4Lz%5$7V~Db9nfvVjPEzF=zPz0Dr|Ay6$65LJe@!^@CP$sYrR-}! zq05{K*{javHP@?CXRQe}n#|!8g%r63H6J+e*Zn^YPA~Hd3ibyE8hsK|=N#8YdAb70 zemZO(%s1rkHCLSGlp72I@$lZRFdnlOEgC2DXU^CRx7`KPX3ZMJz(e)x6kpoH=n~&8 zdCQhZsUNQHpC5UrWSB~(h{(wNUxqLKN=7`i(o`JjO)n=U?ZVww6K&`guJ6R(xKE#8 z;7JXg<>%*1LDwPr#VA@C9>_`e<_&7*Af}l$b7m6Q*-@`Dnwr$%k!%Go#?z=_u_fM+*$Y{1JG5u`m^$h25aH822tE!f+{OL@m z8mAw9u=Gyu7)Qtb9FD80sR#Hj3cN&ghW{>;#t4%EH*bz3H}5-kY&7ELO)`YBFzonr z*%x2TIo@-$$b1S}eya);Y6WxOVPLbXJb;a~SAM`Gp`o;#nuLH!j!{Uot)t;Ok;wLVKRj>~lI`gJx)+K(U{< zv**nLD?eQVY49N=nE(3&Z!mPQEw5`0bL~0utiBxW=$NxSl*8bI2jrfhpf)z6M+Y4~ zJj%w#Ce(G}#GU7}Dy9F0{!;Tq_l-wEfn>F}HzSL)P!KBu($dXxbUX^Bh3V!J%W2pMPz96dcJLN1M-KR@if z_u`W%$|9dc4Ay41_svp&%UzP|5fl`p<(bw0N=@A{Zv1%pkI6+q!)@HIZcM3h|82&M z*&iHij9S153V_gtTN~ClBvhw?AhgW-?mL^ogI8|bzTGwbWF-_?1AVA<`S2c#rzQWR z1+cNQ`nY~hcD81Bot+IQ!zq#DIP%XHik$n#en#3J+RN2RSw*cZ)eDCw@m*G2nN3@_{z0CHhgIrL%`SIO~o-Byn4@Av| z%#&4`eDE$jZa*wrVp(5W$HTr(%@vHb@8;f0gN7<=6vqNVRa;q0%{KH1;K2a}Xvi*Z zP2*&J<(oGp%b&?Z@L?GtE4iNA>fi0wty?OFV!5|&+}NV+@W*epUlZ5t_^pFmx7ICB z4CjrHKKt_Ejv2WX>+5pYl}DhHS+q!3)6x#UeCc-d=+VIF=-%B67DaFK_1$P92g)Ec z85=i-vUAwV(()IU;$mMj&AFw)Y0(d-zm+Mw$}FygihLzgD=VPFLE5q=Ki4R7qV)75pWuslfBip%-BxE>g!J%_X zN`_mcE2?_!n^Z*v!E%5o!PfAT?yU&w%%cAHKwl%0e$k|fCH4I1p+i@z?R^tQiA3h+ zDfjOioSxLHTUVp{vaO(LZr5F#(CzK*O)P07gMx$gFY3tXB~Az*1zp-ApsHa)I}VI? z)EZxezdS8H8&nLH|lF<7Qkd%*p{c(V1Ci)wdt}_`0h|SW=M2p7j=7A7Mj6WH1ceQI%@PqGwN6N->=e#V)d~ zp7f8WzojzVPbyRE3*D(mDgQGR4E6)6E}egw+Mj|sYGMe#loW5?Yy&*v?Ol`4%k|}6 zQ5QFT+3OJ16CN)Z-J3;%Y!17dzlbDh!h7L%@Z05=0UT4_IvJb&*RL0c`B$hY+OfX8 zC^G!@S+yVU7ZiW`?%VhC7fp3_9`E1~K*wV;6TqC}b<{WC{7CGiD6tti^271WBDY07 zao^jJo>sR(gR6H>uV6jPx++sU)!AS|85+pf=VI$heD~c!d6WJ9_Y_8u)?cY?Si15I zb3m?G(zGS*;iqriuixp`aYv3G&6->Ga&CTXS#d02Rrk*`{CctP!PszeV69&A@5`)* z3ZeVwDO>0B>V*%eouDFrak6r)8IUx113T5+wsYro)TYLRk6Rf-psNqU;5WA;13KV-_O8@F!<^Ne|$mZRp)3zfS7qST;>h;fq2 zO7}f_^j^~0`bhF$bY5{udGZ#Lhwmd#j)(T2+d_^xedox(&l&tqlX5fLN;`76vG?-| z`K15`L`j1e2;7#ImiD}G@wTm7*O~BOsQ$3Vq(?rFeBs0iTi`Re`s&B<|JasV*ANvw zqSfwAn?5^w?AY1E z3#K=-sZxVuULFnMk`DCQ8xTPL4S*H333LAh$!0dm?k>n?_b-#K-ih| zgSA6{%D)(PF611KEjcLBnkp@?XSKb)#UU_r>4;V)A<2>HdDBSN>U9R1{7&(MnzzHN zA!GS$s32%qPd|EPa7w5{p`M&`4d8NE-4ai)M?E6bf`9$Bnlv@4ZuMe-Zh2KSqG^9( zAl$>_Y+RhIjn6-J1D!c{@7W9jFwciBl`h%mO4ilpn_rx2M-Q?{P=P8vvkOoqd;0oNY-P=2J#;_7DH^%thQLdnMiQ>KfvsDYZia4z86pb zgNdFm!-QIQqZg$x0%G~@#-US3c5vLYpFHU^y_gN%0kyndoo-=b5lz_2$16Mwdx2ye z1JyU@oUK0>N*Fw6X;`a|e%S}0!JWBA)~44?y0O@pvyYBDIy<&4{m81dWk7%la|Xq9^nA8*(WB6~u4ZPnZvn3d5pC#Aw)$i}?gf)7mHCjl+@A30*p{cW+Jvf*T5e5V@3j0?uAGXr2M z`_Ut7z7`!!GhhUu6N!Rg7FDiX zIXgFZjF(sJJ5{T8>)A6hJryL3FsE15x9=p}V!IztnO*%Q;cDyE&zG)T_idf*$B%8s zkKcat=FO`#%?Sw!H*P>r_3Vz_F|TMe1_V>}lhv6I zY=oZ$=o4M;ynbMo{|3-^FmJ!q^z#Na_lJd9anEPXojYdy`0=xEr=$cr^=Owh+%K8R zQ}bxFVS(k{n94Jj6L6xInuC^Ky>_j+Ut&v+f)aq6+u38Zy?=VgU%Y4q41VFl1$^~_ z;J@Oo^ElMghki`=H;j$OZ`dUy68M7c1|3FNp&bEWQW1|1U$h=IY6^H_1^!xE5MO@1 z47q8P?0mScv|~I+UYz6P$zMQh0H%!Koi0B$d3ITSuZ)k`IN;|OLUF?DLxS_?bzQRf zcpDm86i`$0h`k?2R&n}#`_7%C2Mkz2fSP)*e%m@V&UznZ5-)0DD15rjgb5AmujI~- z8r77LPn7#uriBiJdo&mgCMTJVQ;)?LJn5=-!Q zootnL z7e!YO+Oy{y^)-}oCaqaSLgEdurqZEA;+36D`LxD683n}|jvjd^wyYEch#DtnNddl>~ty{KS0+%Weiu}EsscEwnr$66(v3bCi z)|)Txp(B7R-cm8BHr+0?90Na@^5HLE>wS@UmMyCUd^FR^X#}sV`h%8^E-o)NINBZ@ zjp=L~ZWxb1FNw*?*`9}QpXf`y_rsh@6K0T3uW@n{5{5A!v5zBdXJ^OFQ|RZms%F&Y zCW1+u)~!d9?i6SzOgM1)@+h8C;O^aDb2~m;dFFmFEJU#@-VE7@>upRva=%hSk^}(M z`v4P9aJG<=N$%3JVY~I+@vMNpC0Sz=pSl6ELM#v!+Me#j;|$Ph9^44_E7Py{d;N8- zKCga5m$AENZj{xeqRX4r+tZcK{rsa}&e7fXG3ArD+rkdMvrjhjX}ESl2M+Yw1Jye8 z$=im6UZ*=63aJA3@8qpFd%&|1>{+~l`KxY$^9`B)PCX9XzCAJj z#fx)PD**wS8{E;FKYGOl(c9q*P&4oj+H~l!$yl|7LLo3cbfR`8gHufp;g)Hx$ytfL zZw_Sn$#=)o_A+|%x?S_)GEZpmEOgKtzO4hGaUGa3anVo54@0u%#iF3hS~=-;)7+Iy=YQSggAtSuz;?sxV%EUpYne4XaViXz9a2o zIBHw!dj|Xqt*jLFi8il2V-+aV(i(cWsZ#!;$p?`RgGK>r@$m_BXfd1WE0W!GHam0} z&DlgpF!WJ17>BkbL42+{zG-?Vd5-15{%_O!|Ac{7dDC7weam`lSi!58E?pXby?y~+ z;EuCqWpBu7hx7=hf{A$Tryg+1<`*2 z-Qqyhep<1j8_W_16in1|RM&df9zNVh2F}mu=rtDT(TLX(VSz?ek0F&OrHuUQt3PJO zzZlklVIYQ!u3}!%x^JX@*YxRGSNuwk#5`L)w^iG=IR`Q;cd!S5n;7z@6rLDjHd?{* z)vFW6&_F>LnyBMe9pZlicV4ANKr)}<%{wG!qAN6OIQ(|oJ$<8(W0cRg9rfn6+1l=- zmsFE{=+FrMD7A{Arqq)$d5faK0DNvezOD+4L@7NF&={$X9{G)y;!c5M$pf=kwWR=o z!}~p-e}^na)zp<-v2NXm^x)5)%>#9d^X^=uU$bV-0(MZ>Mo;#|&mGVm^itb*Vb|e5 znWyW0Z%GC2uE8nzP^8Qxtw-<)XrM)Kh4!N?Xu#24go_vpZiX8j0H_LSfj_CaVz~KrTp%fz>(A{K4sAA3AMA0p6O*|ATiClw8QkKig;O!sv-Wqa>uRZi_*7c>A}H z5NS8AT|0S-8K@l6fcI<3w{6+d!?BQ202Du(kAY@el?=G+M_ToW^uT{ap>n6 z&=$E_OTHqQimYKkqDtTGWz1wv!~}F-%+nt`M&%?MI@t4&_(N!yM=w}#9L9Ibd`>&& znKwc)Cj2ilJf&a@l?-bUXp=TLR5v7yCs=bHMiF!AsP3SBFGK+JATx7nW(Q)szH+;E z8&2O{crnR7>{%*0<{f4vD)|dTN7JhRSKk2Yy8$=?j&?8a_IPvxubwmY;K2h?POvq- zpZ)nUo@^y!v+o~#zh=##^0t(FG=gtO0Dn_(VrP9LRPUDZjr^x#!1cNNc7~%6xRUbN z4X!2KWct>`8K!Mzsp0JWe0g#r8W)BbW;guh>tTgu2A%A!Ta&1AsjRv|JCZV>QT}|u z#pgT!YC}JL$n&08n0^x2cX^$DfJ`easl1aRb(r_-`&~t%KD{7 z76^cAO`OX| zMohpVg-P^!nNM3!Tet^b<^{eDPkaDL7ZeaMpm*=yZ_cpVsJtgn=ENr?3@WhTvlAY%D~7 z1K%6IB-^SeX^kh_7><~3>siiOTj2Na-N5|!moH!1@^uFJplXt9y~;MSi#{`-pd_kf zNQ2e=`LwNK?=<%4bLrNt`W_Q6UAf|~j(`3+mT>=<)dU7fLIf)`%?Q?3BnVG9@TPcM znwP>A-~@KV(NmY}^}#luRGY~c=N^Pw6jpgQw?(;OKhq}Vp?KB7;d5Ay23CX&x2W~4 z+qQ;;B?yG8z5Q0b1`VvKbIXwp8buOgz~oMK_VehgWR7e1*&8ehw1U{ornQyvylGY_ z5px1kQzxi9Yu)<%?qQXHHg$OVzP?+l2%CX}*RPMJ9%@Zw;{*~LY|6DN){`cMWM|I` zyBBki_MhJ*`5U_IwQ=`Gf|k%}UA=K*-r$hi1fEZ#@)At1)pSaD_s6fE7nksLXoo`!&p%^Okem8TLqFz8{`li7k*0T@{(R6f znF~c&Fb!>Hc$EieJhdPKD0)OImkUMrj{)~^SlajK3;IMtDi4&e!ZaxvbrdjEp%E3x z(4j-Y)dBT4rOh!~t{GGIi`4mvS%^^*S|=``d?9hYzzK6g4#J|)E;q)ttwgpn!A!uvFw54 zm-W}3W>TpFGA|5jhy@xiKL8@RUe;^!kWd*MdTnmWoasfxKNcyNjKCiZFg+p_SlgisC{0Y zswJ;1V{u9=B2^UOsR|7<0&=mtD>kCxj0qXjVDFaGe~e*1#Y8TyzzNZ3<}3>AA#9IYvxk7?yy6)Wg7}=)i zNUmG=IY$!gO2_V>BT4N*QZ7HSfjW{LSHdDkQuPJ@CPmGwQ47**5KAbY1r*k+clqhl zL)3J&|N0)Z(9`)2=f8EbPPb4DXJ=keZ6k(NXnM>1x39%D(P{R$C;6&9Zl&Rf< zG}nlXP2*jz*^J>qo`1B^;s0aryQ88!x9&}Hqc@4=-ZUE}i6eGUs(^qgilYcNL=Z%! zi8Q5+)FJUECQ(oa5b2^6K>+~)=_W>yjv!6SsB{JxrAit2?K4AelJCn3D>1&X2 zJFxIvi(~rPsT(K{QVK)bqD03-y&M;UZCnezfdpcN>lvQ@7B0NR2iV7~Kkm)>H7VJg zz8kg$E)Zat;*i(~2JsJ9I#!+N8AX+QbZHZ5u|s`C*@!I|0v@BJ z+N`f6D|?*?Lxj!0`L!3)_@O8n4<`C~vv5jEedcAy;(!9%q-q>;#Lzq zaD04m2ox6xRs{|VX9Wjv>ksw>sSwPSR`>k-56xkq5k|td?Opw$!A2h(3p`gOe#;~z z4sKj>As!W0?TmxSTM%ZGi$?fCE*ksQ&jkW^);6gIyE~U*ku55z> z?(|@RQm66MkTIaTM4UM_)P2aLk^tCE@cn@@WP&g|6tT!-2eu&i>I!UM<#{D#WpSYX zQft+8e+hafNV%H03<;UtYZVj~i39Sth)P}qm!?ZHUgwLEXAvT@X;TCYDIT>Dsu~4M zAhl{0*IpfDVq99?miK?i?&ZO!uY>zW*z;aHsEvSQXfbFTKwAVx0>=|OnIK^TO&|j` zWx_9Oxx4ng$%|~h2iN?Kx!-BMom!yjAz#w?*_ZEpzRhsOFK-v?U0wFw-fw<;(g2j$7i4+lyK!7skcshL*?xKXP2~NV0xp0O_*R0$#rKQu0_$` zTCpK2Q5d2`ZvEsMaPqC6RG27#_^$4Tf$@KMsU42kQ-OxHMCxY%h@djwlS0q*WXaV{ zsXl29XQ0{O1cfdN`O%r>huV=rs7rew+MiQ>zSH^PtIr}}*QvsQe+-W1rgo5HW!sTK z+_kZ{g3L0p-3$WiJp{EksmljfJ`r*X_ z|D917mHCnPc3kd9=O5xVzT@iu>5}=7Xh1PVL<<93uNbX?_@-^TsJssX5rsW?5B^F- z+yky;o&uAJ%&rixQO!htg1Hwc>JejBIRdP?}SU21JfP89wra{8Jlc ziHod;7=+3Q+0oST$-i!{op<(glWtohVf|G6S<0L_o$+8Obh~lK!-Pr@r+#{ys<-m? zt&a=}p4!k9s?5Gj-XMmM8_W}Tykwizt4Ni^Sf};#_jNfMh<3u>&0@{AqnOnPJU0HR z;)m~o6~;s_Z(`87FFw7IjfHqe>q{$rAR7;V#AXrjquH(+VDD|VaRn6 z&Ye89!V6HE-<2(-dz%CG7jq9oVz_NmN3NlUgc9wgo(RzQjxJ-NATVFdhUR zhwxd%osd82m#(K5h!PXLM}Q|nI6&O+0AQozb5dhcV@5)9&yefr?l-ndj$`hjW4&1b zg{`FdLldzuJ0YefX|6XIMpISPaR7c}7t#n}s0N6@px_H{|D7x8ctYf%8p{h@uwA-s z`pD9V5A|@RG=<>OWf;FgB`9b-Qu`->IVhQ3#j!Qel|bY9?SobeE`E6b=p}63iv=J3 z@YRRsA7V>;x9wmYpJ>txWF@?J?m^QqZ(#I8IL>#!y^zD9!}ZpGykE+9 zuS%%m*wcSwDm#kWqS9s_R|Z=YOdw|d793_%*)=%B){4sqcDms`cqb@JP_r*llemab z4N*5rt()eZ+#uXq%ku(HZO(oWYtn$W{#ysuIyIzMbsYe{vid_=&%+Ie`(jJMUPT}0 z+}9Xd;E$82Ix<#p!O$2=@_@Z49%Dj`bw&{j@0GiE{m0dCH~_Vzd6O^CX>@+K+_nOBGs>v&X!k5WawdZK zBTqhAbFwRx)%=*)xugq$)D(|BnYxTY63wo8{5PKCoUDKENBOZ<1wiDIGpJ~fx*z%B zt1n=N(Dj^jNDE(rnxA2)jhT`7gBK{0fBVJf_$zEk{8gL1{^cFNbSAdI{ogc{UWbar zfwe;_A}ST&OZg&UGsKt3cYqd2Tr9ZSV66zR3nz@!8c{f6WD{G+T>bMO(7VF+_s(EY z8A`VM>)bu7KSWprlaE-E4F3+sg*9Re^)~1|b*_~PFSlc92m@wD{N|D!Sg_}(>fp9Y zv}>s$7zVguQgt%a*kvJJ9;wyse(UQw<>VK)R#M9a#@drAyh`7_7J104Lz3c$)8eZG ziiIIQ)lpH})(P5p>>Fx#6?b~FHug`&es2=M4)H2oQZo%k78P5o6+)x>=Ga=fo%a$+$&9MWk{dW?J z0KA|Jqd2(ecC3jTLlU)gC^XMO;F$+cNDvr~uH#{{-pHuT-Os+cq!C5o%C5Wk14{HO zC3Gq(cCWbnJ)$Li>($5?TO^dIlNo=`Y)QbG>h)a9eh=Py)IB#26)l7&desO#-+uG! zI2BZHk8WJ;TPT0ug2w37$$?a4MO~*vtvosL`jxP=w`5bn6P1sh_tT{DZ{B`y5Q)GE z`a7u9q)tta*Q$_fpY6xB@3dgC4SD~4M4ToDK%IAb`nv>;=2Bz-+e4xDt zPzg1#Vb*-LN~Hu3Vj9&ytO~n{DBGC2^&u!AJwk0i@GgQ{wm?r(s!@O)MW+sNvm7;2 zOydEu1_^$ui^?fu$Gk6CTV#)W(1{3~Vfq0t8330X`B8uG+@5IMM}S=?LUKnH8+Ql2 zqE}}Oajda3VJz^X&@?#?K(oJg30v|Pr%=kf!%e5KrC5A|@Eqc^|a zsv8Pc-Nq%i$2`fg-f{cBpe3_C$clu?JzkwRezGCG@%jp%&DU#^Htrxf7D~dK&$KKk z4V2S_D6E+lZH(D|s7L+waNVvus>Ewa-8i0f^U!)J=8pv}fTt1h;{G_1V3;xSoM0XB ze0DP4=TJJYW^QPhIB#)?2hA6i(QkgrL2t$KwIGX z;rsYoSR37h#sRf={_!S$4vsxc0M+WVnsnQ6R*;@wEHG*G#dV+p;hD$1SFm=(7$5=& zwY5C)Ybo=trQ?A5s0|-N#6jI~;iDxMC&euk~HM zB6E2RWiuy4heIY$C;baepTG~F+H9x*t|MULs9jB9@kL^iS@k(#91#~pLm810+w!2} zg5|Js{N;X(&hMie#5Gt)#`~KlYtU?t_=URE)`_AMM19v`bG4*Q{8Tj-seq@DuM}I} z;fqaF%ZpzNBb#BEAkEDMD2CO?pNKt=R?j>8(;F&;gwL5WXlk zC&k}8tA%V7TvX~MJV8Q>=#?M*R>nP|CTX_&h~D>B$pPtr;?#wJqP)JojO|`%dclR| zl$Du~-uuB1|LGr{kd{1K)#X>*7PpqAR~u|^oW5Z0S!8Tk?$)nCHOEdu(xR&pdJr!d z??ZlbQxVRO$VJ|(h4I{LY#FW{gHRYj6LmQ3!}2<=X9T{=_1DU5sy?g{nU>h4B1 zNKONDzo@r;O`z7np<}5AU>YTU_uX6td3oyX{qno{u?DuVG3d-jHh{mBxmd9O#)`Rf z^UAnxp&eL3SvxB$w1+kv^YLMS@SiUt)YqUF8)tLDeSJh=b2ipBVVpCKWQf)ZyiVQY zC<5PhV$8QE^*5r_bb_~i7U`q(?r`;-n#+Idxjr)B(fgNd{&id3j8=a4+izaH0ue_P zBLo!V&USL((vs_MGejW+;$L)T?BIxUbB4%s?BL*E;omY4kg@9Z3esREN8LTMY*_xn zoxu^EensX!w15Zou_;F{KL=ikeSrwpVh=s&-FoA#X$f;1|>EwCo+yFhCom; zIIG8sg%S?_jJ2u9H>&!(t;ZE2a#`lRHn?=H|IVc&z{VB(ekjWM;QT|x_9TA4e8d{* z1&$#$9Zui+k9oQu3$q3MLk9K`_S1j&+4+aZ4bzLV?d=YMn)C`8cs5GqQb$!>h3K1_mQlXHX3Sdm`tb%?sI!Bi2*KdAt#bGrY= zyur+H*gBBl4B4Z_#-zmN(Q9Rl;kMmry>BlzyasW)*ocUqZn|MY999J5gBdpx9ImjM zT{JP!GF)4=SKb3%)!d=8&0mwpqt;(-^-)uCm)6Ufo!8H2+N6^@1_=Dr5Ra8Tu>Rwf z9uwKA4ZZoQX)^HAK!$IL(2MOZn)}-tuHOK9h0KOVZ+)L^!_Ouh(*Q5&m~MK7GAC?ulM*_-B`QT;#3gT8ih@vwry%VR0T;gWXqf ze|^fts7*Dqg>|THJiFiK$mqd^bI&5LLF^`QH>V2gH8*4oi;WyFdtyzxp~rI>1E*4& zlA`C zPihVQ`j=fMsRqcZ8HHE*wuo;LtufXJBj8;ecnqBSA0J)^=ET6W#Li-JaPaLjLZ;6| z?18m796LGq4!+M=*z9NzthmqAJjrPT^ z7Av?;1{3;JKOL>8lM?2#yEsT#;8X%~k-Ik9j%W|Thnl8(POSP-7)*C2B^n*Wu)cS{ z9TViwcee(vYOHa&<01Uujzgqa#-19|B&wbietJ0J_ zbaQvR-Wp(i*{1aLRaON0ih=Cv1URYL)ShmBrTRYE(P4R{z_f5+6x=;oy*3oe32$Xi zyWbn)95e00P^lHyj!sbx$_XnDi}1Liy;@r+~#CEgb0mv1qjKmW%wd-qRih zZa32r^q+1N?@){9?GA3X<-W>1{>(H*KWDT(SXfVn^l#@b<1r4V4n`25%o`fM*NYL{ zcY%3!q3gG|_JR`EJ!Shv38SIgl7QJ5P(I116|6_egAENYqU31D3?cd33w53gBg#7B8MO>1d(<2OZd`;xDgniEbYtgWE!Xi%jk;T{0nL9~AEqXAwd z<^`Oki{Nsck=3YT*k|0P1TXF3@x90|xr3PMuxnMQBS#o7l$HM**cCWq(p4Ckl^M_9 z{DvT+UvR)>-cAaKG7K@l6fqKqfm9gqBJvm{RLp%qyYVo`hGX5=IZdRAVsw}zaD@yl9UV>iH=2ZV& z6}FOampM0~dYA~+J<_!x>|w6^l!t=3)Xc^|Zel zF+xMwSZXLo+p4z{>g>oBI3i%_)>z-Ycm}`=;9Z0;aYXA=qZ(QkH-4*S5Kacmo^->JvBw_>4E7ZpMQK^jbYCI%UYPfX4rtSW&7a zO1_K|cG(G0lbW~|WHqS%kbgY0MYmVw$oZm-t}{mfjfQAjRA=U=>q z)m3UoCB}5M4Y@j1d_Hd|GaO<}m9OJ74W&bYX9j7oJ*(~FUZC5eT8BNh-=x0Fk>nhk zhO=_kldd9Q4?wlB?QWqC7C7vL6Du{II!nE;0Eg@|)^};tI%#5^kWW*(9*e1p#Y8W{ z*4KGx_hvQ!xlj3+55KyM-%{kZHO_OfUbFbVp{%_A+|D`+GY^pL&;mRdZg;_l`!2GB zKrQnCpHksA-qk(nV(b#bau0Y?Tf3YeS(Fu-Y!l_tmZR%ZaG-gef3E6q?WoZr+Ko%x zC()lp^Ck?EO@HuF?YkFb+Iee}Tx>^DqR-gzlH04Yg4mjKs}6C8Lp;a2aND`kc@y?j z+=2q{pqIt0w=~{3U(6~Vjj(g(ymlnzL)yzgyvtzsxU>*KR;85uB~FO z6>a)V4DmX!)@*%2%ju8aeVe&2_5hM3g&IKPNLNjih3MR}ad&k5UvLUd_eY{`nA&)H zyi9rgybx8BztZcR1#U@_b*h24+X@_bfZ|K$?;LyGh@S_HV+AW>&m{!kFylBuurksC zzVP)|-uw0&JR_jwr`<)sErdYtIpZb3T!_E`BZU>iA4GgOJNOd83@0vukA|Dj?d?TL z&RevZ?+Wuf4nqjbf5t>;2O}?ZN03C2uI$fzx4>;N{?_FhyrTqhN7MUG11#-BtEoA zZSa!lWR`7inZLqVJsjwAC4|q`GV?PM>(G3Md8WEf>|K&m2{@xDd)?|@*Kse!M_+|R zov=HxiCL4^SYN1z*XEA*0r)~(hRW_bd`3YNUJ&hjPpxFYF}Q8)&{wFEtD~Y(teR)6 zlDAkTFIXjazjHLdj34LI;N;F?y#G#1M%^oMjxg3!FSOkFn($D`MV2VJ!VWR3%X4<- zU>Si74ZgC==~s>4Vil?#1EHeGsVyTa>T*P33*8h`s)m9za znl#}W_V%{^cL*hJ)iu}YZ8P=`9E!}c31d&Xkahr?g#GHRYql*mill*3C`4^~s)b>9 zc6ov{k_cy3LLI_8wWr@S+mEquQ4BrjsLnG80Xb)R zx9wSd;DNkgg)rh+QYwpv7(Hl6+HQ42P7PJREa%Vxo5Tbe9E_Ii?;aex(TvdJq~LY=@J?-H zk4UBNA_gZDDhzVAXZaMsnO>McEcWntl8${tuk(st@Qmg%d&C&11)@)!1h0Dala zXWzU>;~yX|TZ(oi>QP4>egDvwPG;LAZ{otu&Iz$g>bV;4|L|2nT9ZIRj?xv!fHZNo z&PSo)o7CDw4n+`l%OSdNxIquD=+(F%BfMO1NcFwBXY%~VPl8TaESP#LjL@pwiqfq*| z*2G-R+k@$$WS+J{Jbe_Jd5ILsqBK$kO^cyYJJ0=;;4M_`*+{cHD3>i$?hxA@s-g?J zCJ81>pkWsDz9E;sub1(7KcH(`q1Nz5N}0;8DcEoLE4ONSp+TSJ*1R@#$Vy!J-i@2@ z8A<~(GbpIrfKnu&Z1EZ-!pQiH;&w6KhdEZgy-Nsr;{Ve-5!M%QefQe&a#LA6q3v0) z18{2i11$83h3wK5yUaWgjuly?4%^m6*f%4xONF=#lRPRCcT_%Hs|ylPnIOtX))O5_ zYZE-`*coxI8$p&*4fHO$zF*-}f#e`A4OlsiNhakBBtd-7kt|`}gu;m;RT&{uz*=jv za+fBhUMTD3>=*RJ2`y73$)x6uH}Rca$5D0;)Qa}pQ6m=)>XyV^VF+RLbne-oq?d}~ z2Qr(8;d_z=$lq=yqzt|i@CQbnuM)qZ*Lis{ig0Mq$m&%!N6i|6NWO{?6|q{6R4}YT zxR~=lqr{tLU7B1}ON&+>voE==GMu5A_A}A zgB3mV@^&F>i~F3@)Id%Gg1tEfif~?VXYgx~ro34OCqjbL6cOQBjVTzT=|uhYv$qJ` zQ%jQzF3pJp@G9)0Un*zbnOrPg1q^s-w48mUBgDaH8v7b9%(1UzuIeJH9p$krKzjaQ zr1k@(0LWNLF^wwi)J|t&lys=^`7nBdFjdQ+0lF!kRosveK2M1&6Z&fBE~2E^rn5j- z8Flp_SyOyu-9kFEAH#2AEx*f^Kn$KMCdb==2ZM$a3?MlIY$!&1%d4+Y%T7EgNc0?9 zCvN}fQz0c=JkKX6 zkgjB+upG57w!sFp4m`{f&r;D9-dVMS@jk*4g$6d8oT5xYiE}od65CO`lT;ve;{yaQ{ysOV1wM|#>iV?9i?got=Nh>{%pGCFA51tmm~i!km)x$IKC zH3af5*O#37KzJMX6HY)H)XK`LbePLEF>mTB-jou$2{0q^jsTThK_~o2-b>}S+vSc% zC*|TdLh8L1V;YGZ(*<0IRV`X02&Q3X!in8-vs#_$H;n~k2q8CeAxPH{qB1!PH$R(G z8m?h%mos#Q1U4aPeh|PCJHQ5ef|zZTv|m@YPl?)s12 z8g1cd$cZr4pk*7=Cio+)hBTD&OIfY(wofoo1H&%w9Z8*vgw!0HrXLz%)p$-=FbqQu ztJIhp)ge{?bK=fd0dC-=;PcL?N-tAF-H}A}_-uahPm&`=O-iA-Lej*%VflDBZ&OM$ z67kIOzARF=L4mn|kYFT#67DZQzft=0x9>S2-s*y(y96ClmyS@2)+IeA9t|mo4`>i- z?Y}j}_Ew2aug+}#=QU}TAcS~OGPF?XymnTeJ?TzI+7${(P9QW}V$MXvb7xI)CqJTd zy|H68A|+BjQcJ7H(t;O9dXE0ZW~A~>wwm}8C|j1A4-w;x>Ig}tSTGzod53l_W+m)= zG;kJcmLy_1j-Qs4oBudO6H}4kBt9Mf7H67w)x@VOX*Y<76rKvu7W^1~AO?fdyCJiL zZNBuHpXlDsHej{m+|?7Op!^+g>65!eZr#V{w>R{9qucmuJpo{VN_b#8b|o2Yi#y7^Qejs2!Pp!G496fv<9%pEA(Kb5%n9r9#I#P59S6Ddqqo#*($zrl4gljL|DvQZ zZ}n`Jb^1MCo~FO8t}Dj)DPVOy`W(U=VtchU1dfCsqS7Pq>(OZT9JkSruaRhQCtY~< z)Ck)OrFUZYCf`n0C(A;VNvfK}nu@^|x>UWePF!4trT6p9}&HZcb=XJ5IAG4LGc0&!L+8B+X?$2^k@UwtMS)$Y4@LM^rdC(GwLuLpD0_n?ki{hzP$>O7 z2z;k;G%|t&Ct-3k$LmM%BEWOlMN-2Fd6Q$FO*EMVJ8lT1yP-O8CU_8H&KhoF8H1Wj z%8}ru;Roc8(ZT>?MBang2Ec^lqfgHb>i3aNg_IMBWC8WoeJP$RB%X~=-#2Ye5KHI*~|G@tF#sL3GKc)IOJo!cI;cw72x0TKq7+zX3`;w zYEl7ifG9fb$|moj3eUJI(CL;`Ua)~G&eVHka@GHuw z%1Kl;qBB*W?5*_>?U$`Y8N@!lNxW3ZcG>Qh9mHw$p-&*fk;r=}dvY}Aq@8RaDUBeE ztvhxOcii`6axU+XF$>wZ^u1?q3Qs;!%=Z7yTmCOske-GLs^KcnyxtOq$~Z_UFLwtB ztU=$P4x^zCjVXPJi!sK-k0t3u8aY1RM$#)!?Z!bZrulc^d(uca{qzy){WN(hz!L`AB@9$ zqe(;bqh|H_n&NM43;csnavbEIu&G@=V5|7)0(WdQ(yEctx_S*|!l4Gwv7b?Qz6Han z_komFML_Og6dpIs!4S2nA>+Ib35>}Y;}N2JqVk?VvalG)eiB=`hHNzCw-(mr&a1kr z59}1YGp7roikD10LTQFb5GFX28abk$uTXyxuMh}PD&bF>`P0dQ{}%l5=8907oI#!fR8ayE?jDlQyGJeIee<7k1 zPB9>Q9a5x=B+f6a#{V78($P7A(@EZ(qi#TXqG%WfB}s$}@ivFQO9?b4P&>gyT0znw z)kk#SFJseiX1joE`qB_*hcabNh|y8ApcQBm6=Xrct?I<6pfoBokVL+a0xMeknOBV7 zvE*p`uTgVnA#w*OudYW?-U!-K2~Htu2jSh2M8_9PXK5)lpSgifj5q^Lk@fTfkd_Eh zx^9ZS5Uo05{4zLR`tXafPV)2L9W0eRfxP@+U)K z!5{BdO-9$A0Ibp{AL$uJ5Cr$bSJ!JU53h!|qoI)$n^O}F*x#{E4AGBwv!{(q9_jOrVyOTK}UJDzKSW;?q1SRfJ$9nA%O8 z7#IS_{G}G1q)49cBM!*#0PoDr%P1RCLQUZVr6v${&?9^diudpqR^orhkl$Ipu~tQN zdt2><6DCMz1hJV8yl)6mHNYdy0lhp5d3&f+jXnhd)Jo9}_xczv=m-yuhV;?-Hu{c$ zwHzWH6+i()AgFZTYw@X~JfO*y7Z2je;rJED=K#ez@%-m+pTZj|oPO~Y^?*@|z1%K4 zf~w>PZ>84!`|s?Jtatv){l#V6FC)!BCq#@mx>RVZhH-)~I4N$G9I=0+5QKJM`hD(^;y-eImmi-9^*{)Of}qu6mP@E#Q-BIBo}dXF5$l&m%$kSio+F zXwn_P0IDz1nMNbTp7@r(bMemm{}5XkK{%Z{Qw6Q7G%iCC5`8TS7!53>d^Yp~77_qu zss)JvHI2a>zK0Gvg;{WRRx}ofK0H7P6S8jsmZm~Hy3JnM19XKNRHzd$p7{iJR)W)4 zJ=Y2ABOP}No)#Os?*$2oDt`n`(_p!U=WhJXhoJn2hp;LMsYBDL2Mb7v6qQox?3Z5{ zxxacy=T8YmDCisk~vn!%DsWnY*0t5*-TwM_!v7Z8~Ee{oh=b`V(Cgj zTfoTkDD;u?kT6z2fjegFCwq8T>wLgvQG;zJv1o`j-(rJ#0#rz)E7EsxsxGVclX%|v z_%Z!Yi|v1Wbp4anm%n-O&Ob~UHfom@mn}*RGnAvw zE$_(S^HW*QA+Ne`C6*yZ4nm52MOBo}if-wDefHA$^jlO=)E>&B9v5XExdy7IxqUtfK9%ClDCNSc&3@0^6-D9j3DMcAH#xFq&4@6P? zC@X0+5m*QN)_?4PMA96Lx}}QNhmf)cJ$?GrK1L!1R?`ng${YhK z17*#2He;p_()9TfTQ&m>-75{k&itjaByH5D{grBA<;C$sAq3DeK!KJ$dfy8TGWHe{cQMDr92rpH#$#V# za>ch=;p%EA-D0}hBS8282%TjCv$mDdE_kN%3ygk0s4Av(hw2`#@a&h7y{=+nFyv*l z2CHFsb;(kTkjqet?f@8Bh?Ah#-o1j0upk8^$4kOBG?4xj!*s~mHD^-<$K;?%(*naf zg%5uIQVy(}666BR68@5n|LlY=tVt9}_|2K)zVu+?kx<%CKoK7y;Yr58V#sq_(0;-? z!a80-7PihP({T-}d+}|<3|WlBD}zsxH7oKf2~n0qHMZ=XRUwxU0k*>~m!j^2$wxu< zF|_8V{0?DcBA8ME84exoXfiJXSE3&-#2j%TlOv(#+6rN((ls$5$>W$VJr;>Wk7bp1 z5CqUe*3Wf!fkjWo{jWcC=M(T9O5n`Hkts+qp@~qH$DRs72&fDaoE)|Yz3u`&7s&fd zTfO^*( zm4~VA*VU~)zMF0wkyQ!?%R(4!HOgDgfLlVdp?8XY4gl^}#^VNb9x-=U0~>i4#Bk7j zV{ls-5~%awY?zQEL>r!9z2Uu$NQ>$Oe0bP_F7}U5eelQPL_#`T83vCa2R!Q-%nGLa zqfv+GmySVnuwhIo{maxQ zqYE(gelVWeAecv~o<9PA8OZIu>QeyW&|Q1;^Zz*ZK2^ZO)y5RqN*E>@SwNy0nB?Ni zK=H*A51fn(@CGR+rr!HnH)ks&>L|e-qa7yb*So@=z+E|qR{^8M+;W*;pAj~L&_<}T zChgA&5B$6naO$HNeM~pJ-Z*y)(C<>Ze{`FzKb*FnBqh-xjfO&r5o$iCi^JTSDrj2b z0YEN53ZaA{y6(w{kVX_z3nmA&ENFuC?4`a-0QGF#z`cO)Lksl@dR_S8F!sL?h!b(c0aQUPBKF>B(o z$1sPg9l5ar=n~i?ECe zD9vPXX;KZYffgChla}2m%ekvDW1ugu-eb%IgHa)yI1p9xmnLnF!M@*I)Tz6H3RVZ_ zE?DLVs>dLXO{4Ok?%_XtQ>^93HVAOf>cik*QsZAfp5K1T*5b8SRDb*OFJGO|e~2j> zv-{X^>rmh9-Z|%**+<2qQsm74;O_0?B&9x^53eh_>mj5)tB;E0|G&6%=KTM~rOonx zbmv|hl~+`3r?HOxXwvD+O@q7=1w+t(mo}*ngWsyZJx)_V!^g`J6anT^>-1O@?aE+=()^cP{F_P_FuMcx`hJ--YOCUA2i^iQ1B> z`|h5TXeB8`EEj~_PO>I9w*ip%Xl9j2(>B0Lnr6Fp7> z05I?pzChetzj;sk5z6}Z(1MDw}WYEl^WNQdoVGxDE$f-~JcJx_=N4M9YCItSU z1p-;irp(k1r#a(g%-yV2~442@%lrT0F5xfRWd^Q88%;1eG7u6#?M)b z3h4}5X27w&cv6yMUyfb4A#kC&kW1xH>;c{tj1@sTqico|<^Y{ITI)(YkA^4Ly;Ump6rS!@TN@L}dmOW6>#zdaJuWz@*E? zd&#EH1mhz*99kjd7|l5afK{2RLhqJm1hNMNxnf#VF+o-{-{aj2|Gh_=iFIMgrsE?# zJY`dy+zhOpFN4@nBZs)ig4K@j?F1d6KosaX+C#d>{do?QC-%iU-lv;zfe->ZzY7Jy zw;b3GhqBL{CKiKC&k!o6k%${JKsa1tk>rNVV6c++y#4v z5~?hU^|y`l)S;Mm65xg(^kL0m!;KGdbKFL9hTUrr!zLqi4nao+Gr3lfZe7pWWRf4L z6RwW=C%cf`=F&e0dxXo&81HUu5JThCT}C1D$uOXyr!VGWz!e!IBC3VkHf8n>jEbKx zhYpT9YA=t1?Q#RrFY^g_LmreH=BOtMPXOj=nkP7(Kt8F{4q){@e9$AH}CG$PYF|lVL+hpykrddNZpX9FFN6|Kh3r& z2rHusU4im9dbwhuZov;wUzbC=O=iojQRDQBUncqk@=DlfoEG0xFuCkvT89$|J8i=a zb{fxeqpwaq$7!);?;qf1I9N~?0{Y`;7xRL!5AiY)$waJX{dGD;mninZuR;6dAZ3s^`WsmJpQ=`lUA!wX<30GOPbV|?zXq7; z3f565{9iAt7u??gG+*7Vo7_zi3EY9(qmlIgw7PemeR&AXm2quezEcN*% zzTG>euN*vTP}~^+ZzmG+RLp*e#mloAPiul@(2i{VgL!u~VVsTt^ZwGdjvIms?Q38V zc8PoiO}2wdrR$6fvsq<2_L&0%ldGyi3nCWgvBl;A|~bW;1!ez z0kWI|3Agna)K&uiq#Q1pQHVfC7DX{22JKi=EdWdlGf)3{5W-<#i$e;l7$(Z0M&F_h zQVz`>83-qez^|gP3P777_=lFjOt1t2K;$hjK5VJ7y(zp|>i7g|3#!0jinyT9NIH(k z4A;ovVZqv%qP-yl)L~i6%1A>*n_Ug*{JwGEmI1Ixo+CUWxgkVy;?R;JMBWLbJ>oJ9 zlx3fuUOG4b%fNxbt|~czEAt`3o#>{hIrTO0iQ=h=@~KD!fXrk>Xd&pV8?8yt)x9!{ z=Wg`t=Cc3^avf-qJ8VH|y|7GSEe5YoaZoxA9?zyQI|KbH13FWKIxYx82T=EtVoD&` zov05N=zG3AD`|=qa{-&sR~T|lj)qSuqu5#8XEl!pQfBc*43Z%4G771OS_0B2r150{ z%6o*`k-sFAauCF7qc1zT+yPH`N{&0;JkpN}j|>#?9u4<4_%hH$%f@8)Ai6q~fy==_ zWpU*YzQB96UwW#MnjS_T2t*z9A07a;>nC><@yh|V-x&`BR$>OuT~|$fL!TAN3UEq7 zRh0e14#0NlLQI++@V0YbL2(FzxBv*JqN3h$ z>9FR7B?OhPVnXd83@px7%>NmZwMP1CpX_f$iF>^U$V#Mpgh;^=qxj^^OCBMk7@$!e z%w)tn*@$;Whtu;y85tn6IbcYVguNR_$_+Hp5O~lI7@diq)vz|ER4A7*WaAyOZo@rz zW+%ff;M!EMy^8_K?#EYb8V-Q3t;j zjL$lrC!w%ZV8Q#oJgMgf#&o}SN;46|3?Sz>N5*2w&Gn#QE~k$Rf`rszusG$8{rn$cociqS zB6|=$I?(P`j?PNqUhAq{iC<-mDT3jkO)0tb8L^uD(Y^=Rv<hJ8li(6~NYq$+~kV&jt=4R|udY zCB>4E(xX_KP77>IDF^^{)`EF7sDz$_HVOtb-4rRXHr$27Q_C3ts2S6KFB84L3~bny z)PfHcngoc+4XM{c`oZ9Uooe*Qed8_ewt;BLaH(%gz=vKZ=Bssyi5;E6{d>D-%=?`F! z1{fb=-8D4M^Ym~X=?e`u@LEh_rI$j zJReYgo-*@kxMn#Wa#mzhri%(SMQkX9RejFYKxEs*1w5bzd)eIbG~z0_3y2Br54p() zz!RI%J8>r*Q|v_oEYF8Ggp{vj0*cKj;30rChs&Fn!|xbbvnt%TeJaGgc~X7VKu38w zI7|)|9TMM@+alBwz9$^MrI#hRJm~TlW<~T@o0okkstj!%7z4^O@IZ2MBe@}>lXpxB z@}^k#M-=7dTj6H70#_&|kSmcx*z@3IH)sf+V^!f2H4^8JgXfJ@u3e&*u#{li%rz)= z?wZta?%7gQ+_E-$z+T8XH-Wf7fizj$#cfQ!^U;d3i=;1*HkD4vU2at^e z4W5c>Kc&5FB*gv7hEQLiQflz3wl9MYr|^kk0U$7tB6kOv3+9yTC6F%Po5OSAZ;;0hc{2reskTg6KyLV=i`b+>uDt z<2O*`qO!^|+rb{Ae`8Q_rzZq_y$VMu1iVG2B3m0BZuNjK@=GHuG{;toBBj)+~ zIg*~f&(XG{PUcd*&g=bfU9#lEVNu!kC_R9x4jc2&ZmLU%IczeexjZvl#q-`kG zrG$y{a7M7kDsTZ!rE>-=X_oK;*Mj)^5gpJX+NqRt#I4sK;{P_D5{R`@bjxQ1`sB_0 zMTPtmMLuYPxQoGVO#7eSUTg{%xtzZMAUpxHFT`khIi?uDRgVaI`Q1LG43}U!&2X?N zq@y{i45Gy(gE~Se_2@bF>vKA47>oS)+9;(_)72?F815MXW>oJ+#8-s`Nk^>;M`!(! z?0cUNuwQ_n+5CEvtSaUMq<7;9QqWFlAX3CqfYGJiwTq<AmE5ttsABc)t1lBvEj0bOG zwTEwUT6-BkL<}4qW%M<07(|!xTeF|zKCBGb;PBa}>aVtq!tP*vW z54FBBId}-l;1OC@WCHkk^z5gzascBRv5N_cABHg?Gcbylu0ZN;Bk~D_+JHlLhiwo7 zpuwST;2cw?J2`AOrO31gu~OkCH9Z1^vOAmac^uY<66l=5)cDbb%t~w`S_(R-q5|4m zi?&=M${ieFIc0s}=tBx0FY~UhIy8=C8uBm8?zW@V#Sg%)8cLDRWBTAp4rk>dsaFO( zNjg(np(+aVB+eW?o2gi!3|mD&7;(txI>;vi7*IMP`0jP`crIEn$=x3ot3A{)GjJOz z3QxSEtzrGj!C)?)KV2+@%}0sP>^7Xe;n!) zS}Vb7u#?EnI)t~6sv+Gzu>Jgx-Iizanf4f#MyY5a9SOAg$$7`8pEbCIl$@Yrb^6$PXZkxC{_N1HN+NveE6M!A4Qzu>*uA% zWG#&i5ZM%EP6i}pc+e05oT{@O^de%YuLC=BtwVJ* z!hQ-lluq>coSMZ$;Y>$oJ@YC5B5T6r5Cu7?ycUtf_HYMSypw~IpYdo9|z&cU|^0FYClrEG!}>e^ryL`o{4qJk_2PYVOvW4FTfu78Wh4Gv@r( zM`oSs-A|i6!|RUC>`7+Uho@KR+H*p5gy1E%9&u51ye-$(F5X};80!|kx`39;kh^Kb zOp{k%pTKS&nGs>CtDkm3Uf)r;M!1`h46rW zGO7mUWzK?>+?jjqn7@HB6;FtGj$V;7#B+d2nH9^hr}fvG+Fv~E>Ay;gpFJ1PX7+Tz zqYblXB-W+<|H}ni;s4y~?m>aL&4>2U>$T%Ve+HIrf#~wESObFll3*nn_yJYF8RL&R z_Y0;s!0WhMi0n~?B*R`Vj>#Af7_T0^XSH?AEat4dJ~VA~cK<|WG0<|$#rI=C9vD?t zsvphbGN$x?*RfCyu~?$MQ$}K5(1WvwP`u3f_Kc~)9IuPhR;uDd*yj+Wjg~dH>n)n? zkXxXY>E~XjbT-*+15m45>1Zu1W zN>Ef|#Y^*m;RMgps#GCB}&2 zh}|`|$j0d;fd1AFB&QG=0Fm-`=if#eD(Nw}mnaS}hQy^3HZ_1#1{9TYGkpNc#P=j7 z?sQiLC2=VDnS-UeyyGM;0WtCw+8tN~G%^4b@(?EMJ@sxo|ml4Q4&f9>#7RvP6 z%frJFO941BN7_kn9soF5)Wc}oF{$AOaGq5QmvUKT(9v|dJw;Lvzq_pe{W2}!HzRR$ z7ldmD(5Kf1l&S>vELmjl*~lOCQILbg9`&*v$#J!r;30o^9qtLFH9EBZiYhw`bDo5~ zYk-f5o(agvoPa0Xs~KQ!CI`D}u(yHL!bQ>-1THaLR7Ccx|9v_C^E>jHzg^z5DKv}P z5IKi3aw=m2Aos8fjsP(L7&BE~+|E?`%57J-q7R2$Oc2HmmpVCI8t@OrQ zbA{bv^z#8oYy>5@t<1)rs`p)0F&zMr$^ab>pvv7r=_3J(bV=N}%LX+!Y#>_Cp9A|^++MBV*`Hwdg zfwSWa1J}-mWJy0d5QPaSjcygQ*;CeY|qgS2E=`l%XV`2S>`+<43pP@$>k{c!% zoX~1-F>~0A94tP(*V}oTca8#U$Zb75V z5So`Gz{)bJo%x*9)lZj0-JP~zQK|2i4L6B@Ck@7A!)s6CaZjV!6iWFf8AnDWW#wsMq)T5gojxL@5lXzh%kn0grM1Gg zC{q!HEGZB`>)N52_l2|6ue*LhYHF(RS;KI&VW)zlxaEW@KjSuvh5kzdq{+7zUZ#V4FoGZk=u09y%LSzmp57rQ~-p=Yt>iJrdvP9xM9F)$|z{WeNFt7>i{7e&7gI}&sxNDOp2 z8%zG#j{C#+j#}&y#pOo}M#$BHCF_E-LD6Eed=FL)ZTvq=)j~C!esXg!fo7nzNWoe=tTZB3tlt9Ep-Oq&M6WbE@EgHq5O#o`u7T{qi^KPf~ zqfjXCO5FmqVdGuTznEcVQvDo81U60omiQK*GEC zf?U}n7{TJuS=?Cbv{mY<1E8ORWK9fJbu+6&_f8$7m<(kN`xFz>&LmJBT8M?vKnr0I zA5&`NsiITeoH_sMr5ORJ>I5^0l2!@#M_lFLk|g`KB5LeF;MVYLgJL2QDkcXZvm7%S zRcdO)7WU*tf_+H~NPRc3tE+H4?FO5vOANuOP8bw7WYlT{9wQ1R9R=!$w3^x4Zr#6M zgc{s2IZSE^G%>|YpAEJ!?exhu00_3hpZLvvYHBBl{=-* zKX}dB=3DEBPRHKNFTJ96=c}vtzQ6JIih4(P*qvU!S)HL*$6`?ucTyw&?NCp`OBB5a-kU%9TD*< zQR7mO<1oPR z0*djdEx$=rQbnSFXHa*n?-xRw$iWnU~FMw zA#vu}*J7BwdG|YXnVCXMA@K|;T91OP8;I{Pn9YOHN@if*xRhEQ@nz_P^EY?yTxvuk z-Y$hw!p=8D?@SKu0D7!PP7BV?TO`H&?%cU4vkrFs{Kdi&7C`Gslj(C zccYLa>ej7wu*)@%t&sAl+2&}vk7RMx#`=n6<>md*c^Q+ElJaC0ZlY?hO+6W)`-S{3 zCCBy%ORKoNjNY_{otB-wy}NCC^CtZ^ZQgv9YNve63{OViC~?0fU*DgX3q7@16o~XF<7cPvBiCG01Eth&H>W?F1AtE!OPo)H&elnnU6!Vk(5Oz~57anq3 zUQ;a`03CIPFeTD)fAN8(jZG;6U0)PhHlqTnS*wg8*5JhjB4{E76RLmvWQ=?d0h`Fg zL_T*oYzOc{3*g_>ursS?tLcAz^^eIbgjQIw^W&vCk1u zl~Y5M4=Z~GjDp0-D50$mfPV8{3_%kUC_AAb0Y=XH=o{>pjOW(WINwHSjfjs9Lk4DJ z`4qb*ww@W1c-+_+0!OyFy8AU-`YA-FnuiitW(apjpUu)7I3~ggAnBvH3Q<9D5l~iEHUaWmA%%Eg@th7uQ-e+i z9?Ne0Vzl&av2~dG;M^if?Noyesx7*12nYKqEfE(N2dVAxy|TXU?xNjFO@0)yQ{&D) zV`Ghk*(?U*w>`DL7){W`+G&Lvp0GwvPy+%xGmFzd*5$F;>S)L5AZnbZdjI7{C`Vy` zn9U+D45?YWZSRL>nzR-%(TSMkH`=MG5d>ux_qKJ$g$>QaY018u3k7(BkEk#I!vAaR z`eNED8Wk@BRMV@AvPV z^PM;`2dCz}T$ReBNt{ntrk8nQdx+*J&<|$fLn=YxX6hKf5EcqHdP6U24lrx&ghj4I z%=w|oG)Wi-#@+dIyeSf2^QGKhGE-z8&~rxauh?WVX>~f14;Y0Rg=0_MW$Ay;(>@RS zix-K3E`&-M*YEzZ56VVIY7<*+SE@r>%X?QhSRm|m7Jo4c6;`R)Ep4AYv;0{VIe6W& zao_tA5P|1_W$_~MWd?O>o`^s4ywFLhsotX-_a%;`mFeYMgZC`X&?1wUpkQpxReJq% z@Ee?A6yr>u5&yjzK{ZI=9hV=rwIPAJ|3ti`&2@(WwHOm2-vE({I| zc6&O@KzI~?N8~pWe?F~{M)1|g6}7_FIr{q-7hYj{6J9&vh3?gOGbX;)DSKf4en%=c+&&hO zj*gB77Z)eMKf8<-83+WZL!sVpWvJ$GND0xy{1CoK?kS7K@P;m5z4{&8u)W#Y4sE|} z`o!z=NDZtcWMBs@D+B8doe&G@tssG*_= zOLMdCwiqW3Q6>rshw&am6}dB`14K4Nyx;CGK%R`XdiA6llL!AdEx*8WTMt*cErVwv z6{^(=Y(7Z!RT&H!c*6*c=N0rmIXOAf^*M-Sw~&bN;EdZ-h}Cv=FWbK+D)Yu+gneQoF(Orjg8clltWgll{v>e$QuNgml@DJwriInFRv53 zFDps)H@ln=p_sonwI-hBSTPex2++J7**{-yrqVCR!w*Ldr8jD(ia}$u;;&32Y zg3=hVlT>#^O^f0fOyX}%c5iPMEEdXrX~JOQm%$bMe)|m-bu50P`sS7s5dUM*RZZVL z*Hm;de#7;3`AZKGcE$c#dH$oezO08>kN3WPEc&?W;=k_}9r{7R3q`MMUORU{fBZlG CNCB__ From ab52d8b8bbf38036dbf8b37ff57aa6e73b1f4f56 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Thu, 1 Sep 2022 22:03:56 -0400 Subject: [PATCH 49/54] Add ResetAfterMeasureSimplification transpiler pass (#8330) * Add ResetAfterMeasureSimplification transpiler pass This commit adds a new transpiler pass to simplify resets after a measurement. This pass when run will replace any reset after a measurement with a conditional X gate. This is because the reset operation on IBM backends is implemented by performing a conditional x gate after a reset. So doing this simplification will improve the fidelity of the circuit because we're removing a duplicate measurement which was implicit in the reset. This pass is based on the marz library: https://github.com/Qiskit-Partners/marz which did the same thing but at the QuantumCircuit level. One note is that this pass is basically specific to IBM backends so it's not added to the preset pass managers. Ideally we'd be able to have the IBM backends run this as part of the init stage or something to do the logical transformation early in the compilation. But right now there is no mechanism to do this (see #8329), so for now having the pass and letting users specify it in the pass manager directly is the best option. After #8329 is implemented we can look at adding this pass to that hook interface in the ibm provider's backends directly so that they can leverage this optimization whenever they're the compilation target. * Fix lint * Tweak wording on release note * Remove stray debug draw() call Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/transpiler/passes/__init__.py | 2 + .../passes/optimization/__init__.py | 1 + .../reset_after_measure_simplification.py | 46 ++++++ ...-simplification-pass-82377d80dd0081fd.yaml | 10 ++ ...test_reset_after_measure_simplification.py | 140 ++++++++++++++++++ 5 files changed, 199 insertions(+) create mode 100644 qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py create mode 100644 releasenotes/notes/add-reset-simplification-pass-82377d80dd0081fd.yaml create mode 100644 test/python/transpiler/test_reset_after_measure_simplification.py diff --git a/qiskit/transpiler/passes/__init__.py b/qiskit/transpiler/passes/__init__.py index 733a72c1a006..8a08566c4a65 100644 --- a/qiskit/transpiler/passes/__init__.py +++ b/qiskit/transpiler/passes/__init__.py @@ -85,6 +85,7 @@ HoareOptimizer TemplateOptimization EchoRZXWeylDecomposition + ResetAfterMeasureSimplification OptimizeCliffords Calibration @@ -222,6 +223,7 @@ from .optimization import InverseCancellation from .optimization import EchoRZXWeylDecomposition from .optimization import CollectLinearFunctions +from .optimization import ResetAfterMeasureSimplification from .optimization import OptimizeCliffords # circuit analysis diff --git a/qiskit/transpiler/passes/optimization/__init__.py b/qiskit/transpiler/passes/optimization/__init__.py index 48888639f027..5678de1031ec 100644 --- a/qiskit/transpiler/passes/optimization/__init__.py +++ b/qiskit/transpiler/passes/optimization/__init__.py @@ -32,4 +32,5 @@ from .collect_1q_runs import Collect1qRuns from .echo_rzx_weyl_decomposition import EchoRZXWeylDecomposition from .collect_linear_functions import CollectLinearFunctions +from .reset_after_measure_simplification import ResetAfterMeasureSimplification from .optimize_cliffords import OptimizeCliffords diff --git a/qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py b/qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py new file mode 100644 index 000000000000..22f1f87e2d79 --- /dev/null +++ b/qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py @@ -0,0 +1,46 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2017, 2021. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Replace resets after measure with a conditional XGate.""" + +from qiskit.transpiler.basepasses import TransformationPass +from qiskit.circuit.library.standard_gates.x import XGate +from qiskit.circuit.reset import Reset +from qiskit.circuit.measure import Measure +from qiskit.dagcircuit.dagcircuit import DAGCircuit +from qiskit.dagcircuit.dagnode import DAGOpNode + + +class ResetAfterMeasureSimplification(TransformationPass): + """This pass replaces reset after measure with a conditional X gate. + + This optimization is suitable for use on IBM Quantum systems where the + reset operation is performed by a measurement followed by a conditional + x-gate. It might not be desireable on other backends if reset is implemented + differently. + """ + + def run(self, dag): + """Run the pass on a dag.""" + for node in dag.op_nodes(Measure): + succ = next(dag.quantum_successors(node)) + if isinstance(succ, DAGOpNode) and isinstance(succ.op, Reset): + new_x = XGate() + new_x.condition = (node.cargs[0], 1) + new_dag = DAGCircuit() + new_dag.add_qubits(node.qargs) + new_dag.add_clbits(node.cargs) + new_dag.apply_operation_back(node.op, node.qargs, node.cargs) + new_dag.apply_operation_back(new_x, node.qargs) + dag.remove_op_node(succ) + dag.substitute_node_with_dag(node, new_dag) + return dag diff --git a/releasenotes/notes/add-reset-simplification-pass-82377d80dd0081fd.yaml b/releasenotes/notes/add-reset-simplification-pass-82377d80dd0081fd.yaml new file mode 100644 index 000000000000..6722958653f9 --- /dev/null +++ b/releasenotes/notes/add-reset-simplification-pass-82377d80dd0081fd.yaml @@ -0,0 +1,10 @@ +--- +features: + - | + Added a new transpiler pass, :class:`~ResetAfterMeasureSimplification`, + which is used to replace a :class:`~.Reset` operation after a + :class:`~.Measure` with a conditional :class:`~.XGate`. This pass can + be used on backends where a :class:`~.Reset` operation is performed by + doing a measurement and then a conditional X gate so that this will + remove the duplicate implicit :class:`~.Measure` from the :class:`~.Reset` + operation. diff --git a/test/python/transpiler/test_reset_after_measure_simplification.py b/test/python/transpiler/test_reset_after_measure_simplification.py new file mode 100644 index 000000000000..86b810299011 --- /dev/null +++ b/test/python/transpiler/test_reset_after_measure_simplification.py @@ -0,0 +1,140 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test the ResetAfterMeasureSimplification pass""" + +from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister +from qiskit.circuit.classicalregister import Clbit +from qiskit.transpiler.passes.optimization import ResetAfterMeasureSimplification +from qiskit.test import QiskitTestCase + + +class TestResetAfterMeasureSimplificationt(QiskitTestCase): + """Test ResetAfterMeasureSimplification transpiler pass.""" + + def test_simple(self): + """Test simple""" + qc = QuantumCircuit(1, 1) + qc.measure(0, 0) + qc.reset(0) + + new_qc = ResetAfterMeasureSimplification()(qc) + + ans_qc = QuantumCircuit(1, 1) + ans_qc.measure(0, 0) + ans_qc.x(0).c_if(ans_qc.clbits[0], 1) + self.assertEqual(new_qc, ans_qc) + + def test_simple_null(self): + """Test simple no change in circuit""" + qc = QuantumCircuit(1, 1) + qc.measure(0, 0) + qc.x(0) + qc.reset(0) + new_qc = ResetAfterMeasureSimplification()(qc) + + self.assertEqual(new_qc, qc) + + def test_simple_multi_reg(self): + """Test simple, multiple registers""" + cr1 = ClassicalRegister(1, "c1") + cr2 = ClassicalRegister(1, "c2") + qr = QuantumRegister(1, "q") + qc = QuantumCircuit(qr, cr1, cr2) + qc.measure(0, 1) + qc.reset(0) + + new_qc = ResetAfterMeasureSimplification()(qc) + + ans_qc = QuantumCircuit(qr, cr1, cr2) + ans_qc.measure(0, 1) + ans_qc.x(0).c_if(cr2[0], 1) + + self.assertEqual(new_qc, ans_qc) + + def test_simple_multi_reg_null(self): + """Test simple, multiple registers, null change""" + cr1 = ClassicalRegister(1, "c1") + cr2 = ClassicalRegister(1, "c2") + qr = QuantumRegister(2, "q") + qc = QuantumCircuit(qr, cr1, cr2) + qc.measure(0, 1) + qc.reset(1) # reset not on same qubit as meas + + new_qc = ResetAfterMeasureSimplification()(qc) + self.assertEqual(new_qc, qc) + + def test_simple_multi_resets(self): + """Only first reset is collapsed""" + qc = QuantumCircuit(1, 2) + qc.measure(0, 0) + qc.reset(0) + qc.reset(0) + + new_qc = ResetAfterMeasureSimplification()(qc) + + ans_qc = QuantumCircuit(1, 2) + ans_qc.measure(0, 0) + ans_qc.x(0).c_if(ans_qc.clbits[0], 1) + ans_qc.reset(0) + self.assertEqual(new_qc, ans_qc) + + def test_simple_multi_resets_with_resets_before_measure(self): + """Reset BEFORE measurement not collapsed""" + qc = QuantumCircuit(2, 2) + qc.measure(0, 0) + qc.reset(0) + qc.reset(1) + qc.measure(1, 1) + + new_qc = ResetAfterMeasureSimplification()(qc) + + ans_qc = QuantumCircuit(2, 2) + ans_qc.measure(0, 0) + ans_qc.x(0).c_if(Clbit(ClassicalRegister(2, "c"), 0), 1) + ans_qc.reset(1) + ans_qc.measure(1, 1) + + self.assertEqual(new_qc, ans_qc) + + def test_barriers_work(self): + """Test that barriers block consolidation""" + qc = QuantumCircuit(1, 1) + qc.measure(0, 0) + qc.barrier(0) + qc.reset(0) + + new_qc = ResetAfterMeasureSimplification()(qc) + self.assertEqual(new_qc, qc) + + def test_bv_circuit(self): + """Test Bernstein Vazirani circuit with midcircuit measurement.""" + bitstring = "11111" + qc = QuantumCircuit(2, len(bitstring)) + qc.x(1) + qc.h(1) + for idx, bit in enumerate(bitstring[::-1]): + qc.h(0) + if int(bit): + qc.cx(0, 1) + qc.h(0) + qc.measure(0, idx) + if idx != len(bitstring) - 1: + qc.reset(0) + # reset control + qc.reset(1) + qc.x(1) + qc.h(1) + new_qc = ResetAfterMeasureSimplification()(qc) + for op in new_qc.data: + if op.operation.name == "reset": + self.assertEqual(op.qubits[0], new_qc.qubits[1]) From dd615dbc2e4522dd341636e5d809b10f4ef87cc6 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Thu, 1 Sep 2022 23:20:59 -0400 Subject: [PATCH 50/54] Remove log warning with hetereogeneous basis gates in BackendV2 (#8652) When running transpile() against a BackendV2 with hetereogeneous gates defined in the Target a warning log message is always emitted explaining which gates are not global. This was done because the intent was if a user was inadvertandly using a backend v2's operation names as basis gates they could potentially get an invalid output for using non-global gates. The problem comes up when running with transpile(), for supporting passes that use global basis_gates as an argument but are not target aware this argument is always accessed to get the global gate list. This causes the log message to be emitted unconditionally when calling transpile(). This commit just removes the log message because while it was good intentioned in practice it just ends up being more annoying that helpful. Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/providers/backend.py | 12 ------------ test/python/providers/test_backend_v2.py | 12 +----------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/qiskit/providers/backend.py b/qiskit/providers/backend.py index 7ed69cadfa12..5506043db868 100644 --- a/qiskit/providers/backend.py +++ b/qiskit/providers/backend.py @@ -18,15 +18,12 @@ from abc import ABC from abc import abstractmethod import datetime -import logging from typing import List, Union, Iterable, Tuple from qiskit.providers.provider import Provider from qiskit.providers.models.backendstatus import BackendStatus from qiskit.circuit.gate import Instruction -logger = logging.getLogger(__name__) - class Backend: """Base common type for all versioned Backend abstract classes. @@ -351,15 +348,6 @@ def operations(self) -> List[Instruction]: @property def operation_names(self) -> List[str]: """A list of instruction names that the backend supports.""" - non_global_ops = self.target.get_non_global_operation_names(strict_direction=True) - if non_global_ops: - invalid_str = ",".join(non_global_ops) - msg = ( - f"This backend's operations: {invalid_str} only apply to a subset of " - "qubits. Using this property to get 'basis_gates' for the " - "transpiler may potentially create invalid output" - ) - logger.warning(msg) return list(self.target.operation_names) @property diff --git a/test/python/providers/test_backend_v2.py b/test/python/providers/test_backend_v2.py index 016e6feb41b7..b3a45d7e1f53 100644 --- a/test/python/providers/test_backend_v2.py +++ b/test/python/providers/test_backend_v2.py @@ -88,17 +88,7 @@ def test_transpile(self, opt_level): qc = QuantumCircuit(2) qc.h(1) qc.cz(1, 0) - with self.assertLogs("qiskit.providers.backend", level="WARN") as log: - tqc = transpile(qc, self.backend, optimization_level=opt_level) - self.assertEqual( - log.output, - [ - "WARNING:qiskit.providers.backend:This backend's operations: " - "cx,ecr only apply to a subset of qubits. Using this property to " - "get 'basis_gates' for the transpiler may potentially create " - "invalid output" - ], - ) + tqc = transpile(qc, self.backend, optimization_level=opt_level) self.assertTrue(Operator.from_circuit(tqc).equiv(qc)) self.assertMatchesTargetConstraints(tqc, self.backend.target) From ce1f8fedbbd24e30a14daa26b11fc2aaa43f43dc Mon Sep 17 00:00:00 2001 From: Naoki Kanazawa Date: Fri, 2 Sep 2022 13:34:24 +0900 Subject: [PATCH 51/54] Add curve fill control option to pulse drawer (#8658) * Add fill control option * reno * add option description in docstring Co-authored-by: Jake Lishman Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- .../pulse_v2/generators/waveform.py | 4 ++-- qiskit/visualization/pulse_v2/interface.py | 3 +++ qiskit/visualization/pulse_v2/stylesheet.py | 1 + ...d-pulse-drawer-option-936b6d943de9a270.yaml | 18 ++++++++++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/add-pulse-drawer-option-936b6d943de9a270.yaml diff --git a/qiskit/visualization/pulse_v2/generators/waveform.py b/qiskit/visualization/pulse_v2/generators/waveform.py index c398a26a6c20..6172a283d063 100644 --- a/qiskit/visualization/pulse_v2/generators/waveform.py +++ b/qiskit/visualization/pulse_v2/generators/waveform.py @@ -391,7 +391,7 @@ def _draw_shaped_waveform( channels=channel, xvals=re_xvals, yvals=re_yvals, - fill=True, + fill=formatter["control.fill_waveform"], meta=re_meta, styles=re_style, ) @@ -417,7 +417,7 @@ def _draw_shaped_waveform( channels=channel, xvals=im_xvals, yvals=im_yvals, - fill=True, + fill=formatter["control.fill_waveform"], meta=im_meta, styles=im_style, ) diff --git a/qiskit/visualization/pulse_v2/interface.py b/qiskit/visualization/pulse_v2/interface.py index 180dc274a52c..50e39ce21a9c 100644 --- a/qiskit/visualization/pulse_v2/interface.py +++ b/qiskit/visualization/pulse_v2/interface.py @@ -228,6 +228,9 @@ def draw( formatter.axis_break.max_length: Length of new waveform or idle time duration after axis break is applied. Longer intervals are truncated to this length (default `1000`). + formatter.control.fill_waveform: Set `True` to fill waveforms with face color + (default `True`). When you disable this option, you should set finite line width + to `formatter.line_width.fill_waveform`, otherwise nothing will appear in the graph. formatter.control.apply_phase_modulation: Set `True` to apply phase modulation to the waveforms (default `True`). formatter.control.show_snapshot_channel: Set `True` to show snapshot instructions diff --git a/qiskit/visualization/pulse_v2/stylesheet.py b/qiskit/visualization/pulse_v2/stylesheet.py index cf781bd68162..838c82fdd45c 100644 --- a/qiskit/visualization/pulse_v2/stylesheet.py +++ b/qiskit/visualization/pulse_v2/stylesheet.py @@ -296,6 +296,7 @@ def default_style() -> Dict[str, Any]: "formatter.box_height.opaque_shape": 0.5, "formatter.axis_break.length": 3000, "formatter.axis_break.max_length": 1000, + "formatter.control.fill_waveform": True, "formatter.control.apply_phase_modulation": True, "formatter.control.show_snapshot_channel": True, "formatter.control.show_acquire_channel": True, diff --git a/releasenotes/notes/add-pulse-drawer-option-936b6d943de9a270.yaml b/releasenotes/notes/add-pulse-drawer-option-936b6d943de9a270.yaml new file mode 100644 index 000000000000..17406410d26b --- /dev/null +++ b/releasenotes/notes/add-pulse-drawer-option-936b6d943de9a270.yaml @@ -0,0 +1,18 @@ +--- +features: + - | + New pulse drawer option "formatter.control.fill_waveform" has been added to + the style sheets. This option removes the face color of pulses in the drawer. + For example: + + .. code-block:: python + + from qiskit.visualization.pulse_v2 import IQXStandard + + my_style = IQXStandard( + **{"formatter.control.fill_waveform": False, "formatter.line_width.fill_waveform": 2} + ) + + my_sched.draw(style=my_style) + + This code allows a user to draw pulses only with lines. From 8a3e760ffaf6dcd06c0a0e04f13612fdefd9ab3c Mon Sep 17 00:00:00 2001 From: Isha Rajput <33170219+irajput@users.noreply.github.com> Date: Fri, 2 Sep 2022 05:33:33 -0700 Subject: [PATCH 52/54] Only run translation stage in optimization loop if necessary (#6940) * Add GatesInBasis analysis pass This commit adds a new analysis pass, GatesInBasis, which is used to check if all the gates in the circuit are currently in the basis set or not. The intent for this pass is to use this to conditionally trigger the execution of basis translation (normally the BasisTranslator) in the main optimization loop of the preset pass managers, however this is blocked on #6830. So for now this just adds the pass so we can use it in the future. * adding to runningpass and level3 * formatted * rename * minor format * edit * fixed make errors with gates_in_basis * added reno * changes * added suggested changes * format * Update qiskit/transpiler/passes/utils/gates_basis.py Co-authored-by: John Lapeyre * Update qiskit/transpiler/runningpassmanager.py Co-authored-by: John Lapeyre * fixed raise * added tests * added tests for nested do_while * Remove some tests that are added in PR #6962 These tests were in #6962. One has been modified there, and the others removed. PR #6962 should be merged to main first. Then main will be merged to this PR #6940 * Remove newline added accidentally * Add test for running _unroll if not GatesInBasis in level3 This also requires changing GatesInBasis to handle basis_set == None. * Black reformat * Fix pylint complaints * Format file with black * Build one list rather than concatenating the same two lists repeatedly * Update optimization level 1 and 2 too This commit expands the conditional unrolling so that it occurs in every optimization level that has an optimization loop. Since this PR branch was originally created we've expanded the use of the unroller stage in the optimization loop to account for other issues caused by new developments in the transpiler since this was originally developed. This commit updates level 1 and level 2 to avoid unecessary basis translation if the circuit is already in the target basis. * Update gates in basis to return True if no constraints are present For the gates in basis pass it previously was raising an error if you initialized the pass without a target or basis gates constraint set. This was because the pass didn't have any constraints to enforce so there wasn't anything to validate. However, with the integration of the pass into the preset pass managers this behavior wasn't desireable because people run transpile() without a backend, target, or basis_gates set. To account for this the pass logic is changed to just return True if there are no instruction contstraints because all the gates are in the basis since there is no basis. * Return early to avoid unnecessary nesting * Dummy commit to retrigger CI Co-authored-by: Matthew Treinish Co-authored-by: John Lapeyre Co-authored-by: Jake Lishman Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/transpiler/passes/utils/gates_basis.py | 12 +++----- .../transpiler/preset_passmanagers/level1.py | 14 ++++++++- .../transpiler/preset_passmanagers/level2.py | 13 ++++++++- .../transpiler/preset_passmanagers/level3.py | 24 ++++++++++++--- .../transpiler/test_preset_passmanagers.py | 29 ++++++++++++++++++- 5 files changed, 77 insertions(+), 15 deletions(-) diff --git a/qiskit/transpiler/passes/utils/gates_basis.py b/qiskit/transpiler/passes/utils/gates_basis.py index 34ea539890ed..06943ea2d652 100644 --- a/qiskit/transpiler/passes/utils/gates_basis.py +++ b/qiskit/transpiler/passes/utils/gates_basis.py @@ -13,7 +13,6 @@ """Check if all gates in the DAGCircuit are in the specified basis gates.""" from qiskit.transpiler.basepasses import AnalysisPass -from qiskit.transpiler.exceptions import TranspilerError class GatesInBasis(AnalysisPass): @@ -26,15 +25,9 @@ def __init__(self, basis_gates=None, target=None): basis_gates (list): The list of strings representing the set of basis gates. target (Target): The target representing the backend. If specified this will be used instead of the ``basis_gates`` parameter - - Raises: - TranspilerError: If neither basis_gates or target is set. """ super().__init__() - if basis_gates is None and target is None: - raise TranspilerError( - "A value for 'basis_gates' or 'target' must be set to use this pass" - ) + self._basis_gates = None if basis_gates is not None: self._basis_gates = set(basis_gates).union( {"measure", "reset", "barrier", "snapshot", "delay"} @@ -43,6 +36,9 @@ def __init__(self, basis_gates=None, target=None): def run(self, dag): """Run the GatesInBasis pass on `dag`.""" + if self._basis_gates is None and self._target is None: + self.property_set["all_gates_in_basis"] = True + return gates_out_of_basis = False if self._target is not None: qubit_map = {qubit: index for index, qubit in enumerate(dag.qubits)} diff --git a/qiskit/transpiler/preset_passmanagers/level1.py b/qiskit/transpiler/preset_passmanagers/level1.py index f6a32087ac95..48a798b62827 100644 --- a/qiskit/transpiler/preset_passmanagers/level1.py +++ b/qiskit/transpiler/preset_passmanagers/level1.py @@ -19,6 +19,7 @@ from qiskit.transpiler.timing_constraints import TimingConstraints from qiskit.transpiler.passmanager import PassManager from qiskit.transpiler.passmanager import StagedPassManager +from qiskit.transpiler import ConditionalController from qiskit.transpiler.passes import CXCancellation from qiskit.transpiler.passes import SetLayout @@ -32,6 +33,7 @@ from qiskit.transpiler.passes import Size from qiskit.transpiler.passes import Optimize1qGatesDecomposition from qiskit.transpiler.passes import Layout2qDistance +from qiskit.transpiler.passes import GatesInBasis from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason @@ -257,8 +259,18 @@ def _opt_control(property_set): if optimization_method is None: optimization = PassManager() unroll = [pass_ for x in translation.passes() for pass_ in x["passes"]] + # Build nested Flow controllers + def _unroll_condition(property_set): + return not property_set["all_gates_in_basis"] + + # Check if any gate is not in the basis, and if so, run unroll passes + _unroll_if_out_of_basis = [ + GatesInBasis(basis_gates, target=target), + ConditionalController(unroll, condition=_unroll_condition), + ] + optimization.append(_depth_check + _size_check) - opt_loop = _opt + unroll + _depth_check + _size_check + opt_loop = _opt + _unroll_if_out_of_basis + _depth_check + _size_check optimization.append(opt_loop, do_while=_opt_control) else: optimization = plugin_manager.get_passmanager_stage( diff --git a/qiskit/transpiler/preset_passmanagers/level2.py b/qiskit/transpiler/preset_passmanagers/level2.py index 7c7beb59f3fd..d1599fd0bc9f 100644 --- a/qiskit/transpiler/preset_passmanagers/level2.py +++ b/qiskit/transpiler/preset_passmanagers/level2.py @@ -20,6 +20,7 @@ from qiskit.transpiler.timing_constraints import TimingConstraints from qiskit.transpiler.passmanager import PassManager from qiskit.transpiler.passmanager import StagedPassManager +from qiskit.transpiler import ConditionalController from qiskit.transpiler.passes import SetLayout from qiskit.transpiler.passes import VF2Layout @@ -32,6 +33,7 @@ from qiskit.transpiler.passes import Size from qiskit.transpiler.passes import Optimize1qGatesDecomposition from qiskit.transpiler.passes import CommutativeCancellation +from qiskit.transpiler.passes import GatesInBasis from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason @@ -233,8 +235,17 @@ def _opt_control(property_set): if optimization_method is None: optimization = PassManager() unroll = [pass_ for x in translation.passes() for pass_ in x["passes"]] + # Build nested Flow controllers + def _unroll_condition(property_set): + return not property_set["all_gates_in_basis"] + + # Check if any gate is not in the basis, and if so, run unroll passes + _unroll_if_out_of_basis = [ + GatesInBasis(basis_gates, target=target), + ConditionalController(unroll, condition=_unroll_condition), + ] optimization.append(_depth_check + _size_check) - opt_loop = _opt + unroll + _depth_check + _size_check + opt_loop = _opt + _unroll_if_out_of_basis + _depth_check + _size_check optimization.append(opt_loop, do_while=_opt_control) else: optimization = plugin_manager.get_passmanager_stage( diff --git a/qiskit/transpiler/preset_passmanagers/level3.py b/qiskit/transpiler/preset_passmanagers/level3.py index 7f64b7873e5a..2092e23519e2 100644 --- a/qiskit/transpiler/preset_passmanagers/level3.py +++ b/qiskit/transpiler/preset_passmanagers/level3.py @@ -39,6 +39,8 @@ from qiskit.transpiler.passes import Collect2qBlocks from qiskit.transpiler.passes import ConsolidateBlocks from qiskit.transpiler.passes import UnitarySynthesis +from qiskit.transpiler.passes import GatesInBasis +from qiskit.transpiler.runningpassmanager import ConditionalController from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason from qiskit.transpiler.preset_passmanagers.plugin import ( @@ -255,6 +257,16 @@ def _opt_control(property_set): if optimization_method is None: optimization = PassManager() unroll = [pass_ for x in translation.passes() for pass_ in x["passes"]] + # Build nested Flow controllers + def _unroll_condition(property_set): + return not property_set["all_gates_in_basis"] + + # Check if any gate is not in the basis, and if so, run unroll passes + _unroll_if_out_of_basis = [ + GatesInBasis(basis_gates, target=target), + ConditionalController(unroll, condition=_unroll_condition), + ] + optimization.append(_depth_check + _size_check) if (coupling_map and not coupling_map.is_symmetric) or ( target is not None and target.get_non_global_operation_names(strict_direction=True) @@ -271,16 +283,20 @@ def _opt_control(property_set): # the coupling map which with a target doesn't give a full picture if target is not None and optimization is not None: optimization.append( - _opt + unroll + _depth_check + _size_check + _direction, do_while=_opt_control + _opt + _unroll_if_out_of_basis + _depth_check + _size_check + _direction, + do_while=_opt_control, ) elif optimization is not None: optimization.append( - _opt + unroll + _depth_check + _size_check, do_while=_opt_control + _opt + _unroll_if_out_of_basis + _depth_check + _size_check, + do_while=_opt_control, ) else: pre_optimization = common.generate_pre_op_passmanager(remove_reset_in_zero=True) - optimization.append(_opt + unroll + _depth_check + _size_check, do_while=_opt_control) - opt_loop = _depth_check + _opt + unroll + optimization.append( + _opt + _unroll_if_out_of_basis + _depth_check + _size_check, do_while=_opt_control + ) + opt_loop = _depth_check + _opt + _unroll_if_out_of_basis optimization.append(opt_loop, do_while=_opt_control) else: optimization = plugin_manager.get_passmanager_stage( diff --git a/test/python/transpiler/test_preset_passmanagers.py b/test/python/transpiler/test_preset_passmanagers.py index 2186813bf6ef..e954932e2f1c 100644 --- a/test/python/transpiler/test_preset_passmanagers.py +++ b/test/python/transpiler/test_preset_passmanagers.py @@ -23,9 +23,10 @@ from qiskit.circuit import Qubit from qiskit.compiler import transpile, assemble from qiskit.transpiler import CouplingMap, Layout, PassManager, TranspilerError -from qiskit.circuit.library import U2Gate, U3Gate +from qiskit.circuit.library import U2Gate, U3Gate, QuantumVolume from qiskit.test import QiskitTestCase from qiskit.providers.fake_provider import ( + FakeBelem, FakeTenerife, FakeMelbourne, FakeJohannesburg, @@ -41,6 +42,7 @@ from qiskit.quantum_info import random_unitary from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager from qiskit.utils.optionals import HAS_TOQM +from qiskit.transpiler.passes import Collect2qBlocks, GatesInBasis def emptycircuit(): @@ -207,6 +209,31 @@ def test_alignment_constraints_called_with_delay_in_circuit(self, level): transpile(circuit, backend=FakeJohannesburg(), optimization_level=level) mock.assert_called_once() + def test_unroll_only_if_not_gates_in_basis(self): + """Test that the list of passes _unroll only runs if a gate is not in the basis.""" + qcomp = FakeBelem() + qv_circuit = QuantumVolume(3) + gates_in_basis_true_count = 0 + collect_2q_blocks_count = 0 + + # pylint: disable=unused-argument + def counting_callback_func(pass_, dag, time, property_set, count): + nonlocal gates_in_basis_true_count + nonlocal collect_2q_blocks_count + if isinstance(pass_, GatesInBasis) and property_set["all_gates_in_basis"]: + gates_in_basis_true_count += 1 + if isinstance(pass_, Collect2qBlocks): + collect_2q_blocks_count += 1 + + transpile( + qv_circuit, + backend=qcomp, + optimization_level=3, + callback=counting_callback_func, + translation_method="synthesis", + ) + self.assertEqual(gates_in_basis_true_count + 1, collect_2q_blocks_count) + @ddt @unittest.skipUnless(HAS_TOQM, "qiskit-toqm needs to be installed") From 9ddc97da35f322748572bec75655f3e118bcebe5 Mon Sep 17 00:00:00 2001 From: ElePT <57907331+ElePT@users.noreply.github.com> Date: Fri, 2 Sep 2022 23:52:48 +0200 Subject: [PATCH 53/54] Fidelity interface using primitives (#8303) * fidelity_poc * init stuff * simplified design * unittests * unittest working * optional parameters * typo * documentation * Update test/python/primitives/fidelity/test_fidelity.py Co-authored-by: Julien Gacon * Update qiskit/primitives/fidelity/base_fidelity.py Co-authored-by: Julien Gacon * black * import order in test fixed * docstring fixed * Update qiskit/primitives/fidelity/base_fidelity.py Co-authored-by: dlasecki * context removed * Reset branch * Add init * Fix inits * lint fixes * removed abstractmethod label for set_circuits * added support for setting only one circuit * new unittest * Move fidelities to algorithms * Update interface with new design doc * Fix docstrings and unit tests * Add evaluate * Adapt signature run * Make job async * Fix types * Remove async, cache circuits * Update evaluate method, replace use of np * Remove circuits from init * Add async, tests, update docstrings * Add default run options * change names, abstract methods, improve docstrings * Update docstrings, typing * Fix style * Update qiskit/algorithms/fidelities/base_fidelity.py Co-authored-by: Declan Millar * Update qiskit/algorithms/fidelities/base_fidelity.py Co-authored-by: Declan Millar * Make async * Add FidelityResult * Update qiskit/algorithms/fidelities/__init__.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Add to algorithms init * Rename classes * Apply review comments * Update preprocessing * Update docstrings * Move run to base class * Remove left/right params * Apply reviews steve/julien/hamamura * Fix typo * Style changes * Allow different num.params in circuit 1 and 2 * Fix unittest typo * Fix black * Fix docs * Fix style/docstrings * Add AlgorithmJob * Add truncate, fix result docstring * Completely remove left-right * Add comments * Make create circuit public * Remove empty param distinction * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Takashi Imamichi <31178928+t-imamichi@users.noreply.github.com> * change list preprocessing * Update qiskit/algorithms/algorithm_job.py Co-authored-by: Ikko Hamamura * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Apply comments Steve * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Julien Gacon * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Julien Gacon * Update test/python/algorithms/state_fidelities/test_compute_uncompute.py Co-authored-by: Julien Gacon * Style changes * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Julien Gacon * Apply comments Julien * Style fix * Fix bug for lists of numpy values * Support single circuits * Support single circuits * Add fidelity interface using primitives * Apply reviews * Fix docs * Fix docs * Fix docs * Fix lint * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Update qiskit/algorithms/state_fidelities/compute_uncompute.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Update releasenotes/notes/add-fidelity-interface-primitives-dc543d079ecaa8dd.yaml Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Update qiskit/algorithms/state_fidelities/__init__.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> * Update qiskit/algorithms/state_fidelities/base_state_fidelity.py Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> Co-authored-by: Gian Gentinetta Co-authored-by: Gian Gentinetta <31244916+gentinettagian@users.noreply.github.com> Co-authored-by: Julien Gacon Co-authored-by: dlasecki Co-authored-by: Declan Millar Co-authored-by: Steve Wood <40241007+woodsp-ibm@users.noreply.github.com> Co-authored-by: Takashi Imamichi <31178928+t-imamichi@users.noreply.github.com> Co-authored-by: Ikko Hamamura Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/algorithms/__init__.py | 26 +- qiskit/algorithms/algorithm_job.py | 24 ++ .../algorithms/state_fidelities/__init__.py | 42 +++ .../state_fidelities/base_state_fidelity.py | 306 ++++++++++++++++++ .../state_fidelities/compute_uncompute.py | 145 +++++++++ .../state_fidelities/state_fidelity_result.py | 35 ++ ...interface-primitives-dc543d079ecaa8dd.yaml | 27 ++ .../algorithms/state_fidelities/__init__.py | 13 + .../test_compute_uncompute.py | 217 +++++++++++++ 9 files changed, 833 insertions(+), 2 deletions(-) create mode 100644 qiskit/algorithms/algorithm_job.py create mode 100644 qiskit/algorithms/state_fidelities/__init__.py create mode 100644 qiskit/algorithms/state_fidelities/base_state_fidelity.py create mode 100644 qiskit/algorithms/state_fidelities/compute_uncompute.py create mode 100644 qiskit/algorithms/state_fidelities/state_fidelity_result.py create mode 100644 releasenotes/notes/add-fidelity-interface-primitives-dc543d079ecaa8dd.yaml create mode 100644 test/python/algorithms/state_fidelities/__init__.py create mode 100644 test/python/algorithms/state_fidelities/test_compute_uncompute.py diff --git a/qiskit/algorithms/__init__.py b/qiskit/algorithms/__init__.py index f7929e337c4d..966986f3b7ec 100644 --- a/qiskit/algorithms/__init__.py +++ b/qiskit/algorithms/__init__.py @@ -201,8 +201,18 @@ IterativePhaseEstimation +State Fidelities +---------------- + +Algorithms that compute the fidelity of pairs of quantum states. + +.. autosummary:: + :toctree: ../stubs/ + + state_fidelities + Exceptions -========== +---------- .. autosummary:: :toctree: ../stubs/ @@ -219,8 +229,19 @@ :toctree: ../stubs/ eval_observables -""" +Utility classes +--------------- + +Utility classes used by algorithms (mainly for type-hinting purposes). + +.. autosummary:: + :toctree: ../stubs/ + + AlgorithmJob + +""" +from .algorithm_job import AlgorithmJob from .algorithm_result import AlgorithmResult from .evolvers import EvolutionResult, EvolutionProblem from .evolvers.real_evolver import RealEvolver @@ -268,6 +289,7 @@ from .evolvers.pvqd import PVQD, PVQDResult __all__ = [ + "AlgorithmJob", "AlgorithmResult", "VariationalAlgorithm", "VariationalResult", diff --git a/qiskit/algorithms/algorithm_job.py b/qiskit/algorithms/algorithm_job.py new file mode 100644 index 000000000000..16db4df93dfc --- /dev/null +++ b/qiskit/algorithms/algorithm_job.py @@ -0,0 +1,24 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +""" +AlgorithmJob class +""" +from qiskit.primitives.primitive_job import PrimitiveJob + + +class AlgorithmJob(PrimitiveJob): + """ + This empty class is introduced for typing purposes. + """ + + pass diff --git a/qiskit/algorithms/state_fidelities/__init__.py b/qiskit/algorithms/state_fidelities/__init__.py new file mode 100644 index 000000000000..ea8e4e03bf89 --- /dev/null +++ b/qiskit/algorithms/state_fidelities/__init__.py @@ -0,0 +1,42 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +""" +===================================================================== +State Fidelity Interfaces (:mod:`qiskit.algorithms.state_fidelities`) +===================================================================== + +.. currentmodule:: qiskit.algorithms.state_fidelities + +State Fidelities +================ + +.. autosummary:: + :toctree: ../stubs/ + + BaseStateFidelity + ComputeUncompute + +Results +======= + + .. autosummary:: + :toctree: ../stubs/ + + StateFidelityResult + +""" + +from .base_state_fidelity import BaseStateFidelity +from .compute_uncompute import ComputeUncompute +from .state_fidelity_result import StateFidelityResult + +__all__ = ["BaseStateFidelity", "ComputeUncompute", "StateFidelityResult"] diff --git a/qiskit/algorithms/state_fidelities/base_state_fidelity.py b/qiskit/algorithms/state_fidelities/base_state_fidelity.py new file mode 100644 index 000000000000..75f4d632396d --- /dev/null +++ b/qiskit/algorithms/state_fidelities/base_state_fidelity.py @@ -0,0 +1,306 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +""" +Base state fidelity interface +""" + +from __future__ import annotations +from abc import ABC, abstractmethod +from collections.abc import Sequence, Mapping +import numpy as np + +from qiskit import QuantumCircuit +from qiskit.algorithms import AlgorithmJob +from qiskit.circuit import ParameterVector +from .state_fidelity_result import StateFidelityResult + + +class BaseStateFidelity(ABC): + r""" + An interface to calculate state fidelities (state overlaps) for pairs of + (parametrized) quantum circuits. The calculation depends on the particular + fidelity method implementation, but can be always defined as the state overlap: + + .. math:: + + |\langle\psi(x)|\phi(y)\rangle|^2 + + where :math:`x` and :math:`y` are optional parametrizations of the + states :math:`\psi` and :math:`\phi` prepared by the circuits + ``circuit_1`` and ``circuit_2``, respectively. + + """ + + def __init__(self) -> None: + + # use cache for preventing unnecessary circuit compositions + self._circuit_cache: Mapping[(int, int), QuantumCircuit] = {} + + @staticmethod + def _preprocess_values( + circuits: QuantumCircuit | Sequence[QuantumCircuit], + values: Sequence[float] | Sequence[Sequence[float]] | None = None, + ) -> Sequence[Sequence[float]]: + """ + Checks whether the passed values match the shape of the parameters + of the corresponding circuits and formats values to 2D list. + + Args: + circuits: List of circuits to be checked. + values: Parameter values corresponding to the circuits to be checked. + + Returns: + A 2D value list if the values match the circuits, or an empty 2D list + if values is None. + + Raises: + ValueError: if the number of parameter values doesn't match the number of + circuit parameters + TypeError: if the input values are not a sequence. + """ + + if isinstance(circuits, QuantumCircuit): + circuits = [circuits] + + if values is None: + for circuit in circuits: + if circuit.num_parameters != 0: + raise ValueError( + f"`values` cannot be `None` because circuit <{circuit.name}> has " + f"{circuit.num_parameters} free parameters." + ) + return [[]] + else: + + # Support ndarray + if isinstance(values, np.ndarray): + values = values.tolist() + if len(values) > 0 and isinstance(values[0], np.ndarray): + values = [v.tolist() for v in values] + + if not isinstance(values, Sequence): + raise TypeError( + f"Expected a sequence of numerical parameter values, " + f"but got input type {type(values)} instead." + ) + + # ensure 2d + if len(values) > 0 and not isinstance(values[0], Sequence): + values = [values] + return values + + def _check_qubits_match(self, circuit_1: QuantumCircuit, circuit_2: QuantumCircuit) -> None: + """ + Checks that the number of qubits of 2 circuits matches. + Args: + circuit_1: (Parametrized) quantum circuit. + circuit_2: (Parametrized) quantum circuit. + + Raises: + ValueError: when ``circuit_1`` and ``circuit_2`` don't have the + same number of qubits. + """ + + if circuit_1.num_qubits != circuit_2.num_qubits: + raise ValueError( + f"The number of qubits for the first circuit ({circuit_1.num_qubits}) " + f"and second circuit ({circuit_2.num_qubits}) are not the same." + ) + + @abstractmethod + def create_fidelity_circuit( + self, circuit_1: QuantumCircuit, circuit_2: QuantumCircuit + ) -> QuantumCircuit: + """ + Implementation-dependent method to create a fidelity circuit + from 2 circuit inputs. + + Args: + circuit_1: (Parametrized) quantum circuit. + circuit_2: (Parametrized) quantum circuit. + + Returns: + The fidelity quantum circuit corresponding to ``circuit_1`` and ``circuit_2``. + """ + raise NotImplementedError + + def _construct_circuits( + self, + circuits_1: QuantumCircuit | Sequence[QuantumCircuit], + circuits_2: QuantumCircuit | Sequence[QuantumCircuit], + ) -> Sequence[QuantumCircuit]: + """ + Constructs the list of fidelity circuits to be evaluated. + These circuits represent the state overlap between pairs of input circuits, + and their construction depends on the fidelity method implementations. + + Args: + circuits_1: (Parametrized) quantum circuits. + circuits_2: (Parametrized) quantum circuits. + + Returns: + List of constructed fidelity circuits. + + Raises: + ValueError: if the length of the input circuit lists doesn't match. + """ + + if isinstance(circuits_1, QuantumCircuit): + circuits_1 = [circuits_1] + if isinstance(circuits_2, QuantumCircuit): + circuits_2 = [circuits_2] + + if len(circuits_1) != len(circuits_2): + raise ValueError( + f"The length of the first circuit list({len(circuits_1)}) " + f"and second circuit list ({len(circuits_2)}) is not the same." + ) + + circuits = [] + for (circuit_1, circuit_2) in zip(circuits_1, circuits_2): + + # TODO: improve caching, what if the circuit is modified without changing the id? + circuit = self._circuit_cache.get((id(circuit_1), id(circuit_2))) + + if circuit is not None: + circuits.append(circuit) + else: + self._check_qubits_match(circuit_1, circuit_2) + + # re-parametrize input circuits + # TODO: make smarter checks to avoid unnecesary reparametrizations + parameters_1 = ParameterVector("x", circuit_1.num_parameters) + parametrized_circuit_1 = circuit_1.assign_parameters(parameters_1) + parameters_2 = ParameterVector("y", circuit_2.num_parameters) + parametrized_circuit_2 = circuit_2.assign_parameters(parameters_2) + + circuit = self.create_fidelity_circuit( + parametrized_circuit_1, parametrized_circuit_2 + ) + circuits.append(circuit) + # update cache + self._circuit_cache[id(circuit_1), id(circuit_2)] = circuit + + return circuits + + def _construct_value_list( + self, + circuits_1: Sequence[QuantumCircuit], + circuits_2: Sequence[QuantumCircuit], + values_1: Sequence[float] | Sequence[Sequence[float]] | None = None, + values_2: Sequence[float] | Sequence[Sequence[float]] | None = None, + ) -> list[float]: + """ + Preprocesses input parameter values to match the fidelity + circuit parametrization, and return in list format. + + Args: + circuits_1: (Parametrized) quantum circuits preparing the + first list of quantum states. + circuits_2: (Parametrized) quantum circuits preparing the + second list of quantum states. + values_1: Numerical parameters to be bound to the first circuits. + values_2: Numerical parameters to be bound to the second circuits. + + Returns: + List of parameter values for fidelity circuit. + + """ + values_1 = self._preprocess_values(circuits_1, values_1) + values_2 = self._preprocess_values(circuits_2, values_2) + + values = [] + if len(values_2[0]) == 0: + values = list(values_1) + elif len(values_1[0]) == 0: + values = list(values_2) + else: + for (val_1, val_2) in zip(values_1, values_2): + values.append(val_1 + val_2) + + return values + + @abstractmethod + def _run( + self, + circuits_1: QuantumCircuit | Sequence[QuantumCircuit], + circuits_2: QuantumCircuit | Sequence[QuantumCircuit], + values_1: Sequence[float] | Sequence[Sequence[float]] | None = None, + values_2: Sequence[float] | Sequence[Sequence[float]] | None = None, + **run_options, + ) -> StateFidelityResult: + r""" + Computes the state overlap (fidelity) calculation between two + (parametrized) circuits (first and second) for a specific set of parameter + values (first and second). + + Args: + circuits_1: (Parametrized) quantum circuits preparing :math:`|\psi\rangle`. + circuits_2: (Parametrized) quantum circuits preparing :math:`|\phi\rangle`. + values_1: Numerical parameters to be bound to the first set of circuits + values_2: Numerical parameters to be bound to the second set of circuits. + run_options: Backend runtime options used for circuit execution. The order + of priority is\: run_options in ``run`` method > fidelity's default + run_options > primitive's default setting. + Higher priority setting overrides lower priority setting. + + Returns: + The result of the fidelity calculation. + """ + raise NotImplementedError + + def run( + self, + circuits_1: QuantumCircuit | Sequence[QuantumCircuit], + circuits_2: QuantumCircuit | Sequence[QuantumCircuit], + values_1: Sequence[float] | Sequence[Sequence[float]] | None = None, + values_2: Sequence[float] | Sequence[Sequence[float]] | None = None, + **run_options, + ) -> AlgorithmJob: + r""" + Runs asynchronously the state overlap (fidelity) calculation between two + (parametrized) circuits (first and second) for a specific set of parameter + values (first and second). This calculation depends on the particular + fidelity method implementation. + + Args: + circuits_1: (Parametrized) quantum circuits preparing :math:`|\psi\rangle`. + circuits_2: (Parametrized) quantum circuits preparing :math:`|\phi\rangle`. + values_1: Numerical parameters to be bound to the first set of circuits. + values_2: Numerical parameters to be bound to the second set of circuits. + run_options: Backend runtime options used for circuit execution. The order + of priority is\: run_options in ``run`` method > fidelity's default + run_options > primitive's default setting. + Higher priority setting overrides lower priority setting. + + Returns: + Primitive job for the fidelity calculation. + The job's result is an instance of ``StateFidelityResult``. + """ + + job = AlgorithmJob(self._run, circuits_1, circuits_2, values_1, values_2, **run_options) + + job.submit() + return job + + def _truncate_fidelities(self, fidelities: Sequence[float]) -> Sequence[float]: + """ + Ensures fidelity result in [0,1]. + + Args: + fidelities: Sequence of raw fidelity results. + + Returns: + List of truncated fidelities. + + """ + return np.clip(fidelities, 0, 1).tolist() diff --git a/qiskit/algorithms/state_fidelities/compute_uncompute.py b/qiskit/algorithms/state_fidelities/compute_uncompute.py new file mode 100644 index 000000000000..ff9080e5d3ba --- /dev/null +++ b/qiskit/algorithms/state_fidelities/compute_uncompute.py @@ -0,0 +1,145 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +""" +Compute-uncompute fidelity interface using primitives +""" + +from __future__ import annotations +from collections.abc import Sequence +from copy import copy + +from qiskit import QuantumCircuit +from qiskit.algorithms import AlgorithmError +from qiskit.primitives import BaseSampler + +from .base_state_fidelity import BaseStateFidelity +from .state_fidelity_result import StateFidelityResult + + +class ComputeUncompute(BaseStateFidelity): + r""" + This class leverages the sampler primitive to calculate the state + fidelity of two quantum circuits following the compute-uncompute + method (see [1] for further reference). + The fidelity can be defined as the state overlap. + + .. math:: + + |\langle\psi(x)|\phi(y)\rangle|^2 + + where :math:`x` and :math:`y` are optional parametrizations of the + states :math:`\psi` and :math:`\phi` prepared by the circuits + ``circuit_1`` and ``circuit_2``, respectively. + + **Reference:** + [1] Havlíček, V., Córcoles, A. D., Temme, K., Harrow, A. W., Kandala, + A., Chow, J. M., & Gambetta, J. M. (2019). Supervised learning + with quantum-enhanced feature spaces. Nature, 567(7747), 209-212. + `arXiv:1804.11326v2 [quant-ph] `_ + + """ + + def __init__(self, sampler: BaseSampler, **run_options) -> None: + """ + Args: + sampler: Sampler primitive instance. + run_options: Backend runtime options used for circuit execution. + + Raises: + ValueError: If the sampler is not an instance of ``BaseSampler``. + """ + if not isinstance(sampler, BaseSampler): + raise ValueError( + f"The sampler should be an instance of BaseSampler, " f"but got {type(sampler)}" + ) + self._sampler: BaseSampler = sampler + self._default_run_options = run_options + super().__init__() + + def create_fidelity_circuit( + self, circuit_1: QuantumCircuit, circuit_2: QuantumCircuit + ) -> QuantumCircuit: + """ + Combines ``circuit_1`` and ``circuit_2`` to create the + fidelity circuit following the compute-uncompute method. + + Args: + circuit_1: (Parametrized) quantum circuit. + circuit_2: (Parametrized) quantum circuit. + + Returns: + The fidelity quantum circuit corresponding to circuit_1 and circuit_2. + """ + circuit = circuit_1.compose(circuit_2.inverse()) + circuit.measure_all() + return circuit + + def _run( + self, + circuits_1: QuantumCircuit | Sequence[QuantumCircuit], + circuits_2: QuantumCircuit | Sequence[QuantumCircuit], + values_1: Sequence[float] | Sequence[Sequence[float]] | None = None, + values_2: Sequence[float] | Sequence[Sequence[float]] | None = None, + **run_options, + ) -> StateFidelityResult: + r""" + Computes the state overlap (fidelity) calculation between two + (parametrized) circuits (first and second) for a specific set of parameter + values (first and second) following the compute-uncompute method. + + Args: + circuits_1: (Parametrized) quantum circuits preparing :math:`|\psi\rangle`. + circuits_2: (Parametrized) quantum circuits preparing :math:`|\phi\rangle`. + values_1: Numerical parameters to be bound to the first circuits. + values_2: Numerical parameters to be bound to the second circuits. + run_options: Backend runtime options used for circuit execution. The order + of priority is\: run_options in ``run`` method > fidelity's default + run_options > primitive's default setting. + Higher priority setting overrides lower priority setting. + + Returns: + The result of the fidelity calculation. + + Raises: + ValueError: At least one pair of circuits must be defined. + AlgorithmError: If the sampler job is not completed successfully. + """ + + circuits = self._construct_circuits(circuits_1, circuits_2) + if len(circuits) == 0: + raise ValueError( + "At least one pair of circuits must be defined to calculate the state overlap." + ) + values = self._construct_value_list(circuits_1, circuits_2, values_1, values_2) + + # The priority of run options is as follows: + # run_options in `evaluate` method > fidelity's default run_options > + # primitive's default run_options. + run_opts = copy(self._default_run_options) + run_opts.update(**run_options) + + job = self._sampler.run(circuits=circuits, parameter_values=values, **run_opts) + + try: + result = job.result() + except Exception as exc: + raise AlgorithmError("Sampler job failed!") from exc + + raw_fidelities = [prob_dist.get(0, 0) for prob_dist in result.quasi_dists] + fidelities = self._truncate_fidelities(raw_fidelities) + + return StateFidelityResult( + fidelities=fidelities, + raw_fidelities=raw_fidelities, + metadata=result.metadata, + run_options=run_opts, + ) diff --git a/qiskit/algorithms/state_fidelities/state_fidelity_result.py b/qiskit/algorithms/state_fidelities/state_fidelity_result.py new file mode 100644 index 000000000000..04d4aa0ca411 --- /dev/null +++ b/qiskit/algorithms/state_fidelities/state_fidelity_result.py @@ -0,0 +1,35 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. +""" +Fidelity result class +""" + +from __future__ import annotations + +from collections.abc import Sequence, Mapping +from typing import Any +from dataclasses import dataclass + + +@dataclass(frozen=True) +class StateFidelityResult: + """This class stores the result of StateFidelity computations.""" + + fidelities: Sequence[float] + """List of truncated fidelity values for each pair of input circuits, ensured to be in [0,1].""" + raw_fidelities: Sequence[float] + """List of raw fidelity values for each pair of input circuits, which might not be in [0,1] + depending on the error mitigation method used.""" + metadata: Sequence[Mapping[str, Any]] + """Additional information about the fidelity calculation.""" + run_options: Mapping[str, Any] + """Runtime options for the execution of the fidelity job.""" diff --git a/releasenotes/notes/add-fidelity-interface-primitives-dc543d079ecaa8dd.yaml b/releasenotes/notes/add-fidelity-interface-primitives-dc543d079ecaa8dd.yaml new file mode 100644 index 000000000000..96e1977096ba --- /dev/null +++ b/releasenotes/notes/add-fidelity-interface-primitives-dc543d079ecaa8dd.yaml @@ -0,0 +1,27 @@ +--- +features: + - | + Add new algorithms to calculate state fidelities/overlaps + for pairs of quantum circuits (that can be parametrized). Apart from + the base class (:class:`qiskit.algorithms.state_fidelities.BaseStateFidelity`), + there is now an implementation of the compute-uncompute method that leverages + the sampler primitive (:class:`qiskit.algorithms.state_fidelities.ComputeUncompute`). + + Example:: + .. code-block:: python + + import numpy as np + from qiskit.primitives import Sampler + from qiskit.algorithms.state_fidelities import ComputeUncompute + from qiskit. import RealAmplitudes + + sampler = Sampler(...) + fidelity = ComputeUncompute(sampler) + circuit = RealAmplitudes(2) + values = np.random.random(circuit.num_parameters) + shift = np.ones_like(values) * 0.01 + + job = fidelity.run([circuit], [circuit], [values], [values+shift]) + fidelities = job.result().fidelities + + diff --git a/test/python/algorithms/state_fidelities/__init__.py b/test/python/algorithms/state_fidelities/__init__.py new file mode 100644 index 000000000000..d8b7d587c4cc --- /dev/null +++ b/test/python/algorithms/state_fidelities/__init__.py @@ -0,0 +1,13 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Tests for the primitive-based fidelity interfaces.""" diff --git a/test/python/algorithms/state_fidelities/test_compute_uncompute.py b/test/python/algorithms/state_fidelities/test_compute_uncompute.py new file mode 100644 index 000000000000..d4a605dbb964 --- /dev/null +++ b/test/python/algorithms/state_fidelities/test_compute_uncompute.py @@ -0,0 +1,217 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2022. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Tests for Fidelity.""" + +import unittest + +import numpy as np + +from qiskit.circuit import QuantumCircuit, ParameterVector +from qiskit.circuit.library import RealAmplitudes +from qiskit.primitives import Sampler +from qiskit.algorithms.state_fidelities import ComputeUncompute +from qiskit.test import QiskitTestCase +from qiskit import QiskitError + + +class TestComputeUncompute(QiskitTestCase): + """Test Compute-Uncompute Fidelity class""" + + def setUp(self): + super().setUp() + parameters = ParameterVector("x", 2) + + rx_rotations = QuantumCircuit(2) + rx_rotations.rx(parameters[0], 0) + rx_rotations.rx(parameters[1], 1) + + ry_rotations = QuantumCircuit(2) + ry_rotations.ry(parameters[0], 0) + ry_rotations.ry(parameters[1], 1) + + plus = QuantumCircuit(2) + plus.h([0, 1]) + + zero = QuantumCircuit(2) + + rx_rotation = QuantumCircuit(2) + rx_rotation.rx(parameters[0], 0) + rx_rotation.h(1) + + self._circuit = [rx_rotations, ry_rotations, plus, zero, rx_rotation] + self._sampler = Sampler() + self._left_params = np.array([[0, 0], [np.pi / 2, 0], [0, np.pi / 2], [np.pi, np.pi]]) + self._right_params = np.array([[0, 0], [0, 0], [np.pi / 2, 0], [0, 0]]) + + def test_1param_pair(self): + """test for fidelity with one pair of parameters""" + fidelity = ComputeUncompute(self._sampler) + job = fidelity.run( + self._circuit[0], self._circuit[1], self._left_params[0], self._right_params[0] + ) + result = job.result() + np.testing.assert_allclose(result.fidelities, np.array([1.0])) + + def test_4param_pairs(self): + """test for fidelity with four pairs of parameters""" + fidelity = ComputeUncompute(self._sampler) + n = len(self._left_params) + job = fidelity.run( + [self._circuit[0]] * n, [self._circuit[1]] * n, self._left_params, self._right_params + ) + results = job.result() + np.testing.assert_allclose(results.fidelities, np.array([1.0, 0.5, 0.25, 0.0]), atol=1e-16) + + def test_symmetry(self): + """test for fidelity with the same circuit""" + fidelity = ComputeUncompute(self._sampler) + n = len(self._left_params) + job_1 = fidelity.run( + [self._circuit[0]] * n, [self._circuit[0]] * n, self._left_params, self._right_params + ) + job_2 = fidelity.run( + [self._circuit[0]] * n, [self._circuit[0]] * n, self._right_params, self._left_params + ) + results_1 = job_1.result() + results_2 = job_2.result() + np.testing.assert_allclose(results_1.fidelities, results_2.fidelities, atol=1e-16) + + def test_no_params(self): + """test for fidelity without parameters""" + fidelity = ComputeUncompute(self._sampler) + job = fidelity.run([self._circuit[2]], [self._circuit[3]]) + results = job.result() + np.testing.assert_allclose(results.fidelities, np.array([0.25]), atol=1e-16) + + def test_left_param(self): + """test for fidelity with only left parameters""" + fidelity = ComputeUncompute(self._sampler) + n = len(self._left_params) + job = fidelity.run( + [self._circuit[1]] * n, [self._circuit[3]] * n, values_1=self._left_params + ) + results = job.result() + np.testing.assert_allclose(results.fidelities, np.array([1.0, 0.5, 0.5, 0.0]), atol=1e-16) + + def test_right_param(self): + """test for fidelity with only right parameters""" + fidelity = ComputeUncompute(self._sampler) + n = len(self._left_params) + job = fidelity.run( + [self._circuit[3]] * n, [self._circuit[1]] * n, values_2=self._left_params + ) + results = job.result() + np.testing.assert_allclose(results.fidelities, np.array([1.0, 0.5, 0.5, 0.0]), atol=1e-16) + + def test_not_set_circuits(self): + """test for fidelity with no circuits.""" + fidelity = ComputeUncompute(self._sampler) + with self.assertRaises(TypeError): + job = fidelity.run( + circuits_1=None, + circuits_2=None, + values_1=self._left_params, + values_2=self._right_params, + ) + job.result() + + def test_circuit_mismatch(self): + """test for fidelity with different number of left/right circuits.""" + fidelity = ComputeUncompute(self._sampler) + n = len(self._left_params) + with self.assertRaises(ValueError): + job = fidelity.run( + [self._circuit[0]] * n, + [self._circuit[1]] * (n + 1), + self._left_params, + self._right_params, + ) + job.result() + + def test_param_mismatch(self): + """test for fidelity with different number of left/right parameters that + do not match the circuits'.""" + + fidelity = ComputeUncompute(self._sampler) + n = len(self._left_params) + with self.assertRaises(QiskitError): + job = fidelity.run( + [self._circuit[0]] * n, + [self._circuit[1]] * n, + self._left_params, + self._right_params[:-2], + ) + job.result() + + with self.assertRaises(QiskitError): + job = fidelity.run( + [self._circuit[0]] * n, + [self._circuit[1]] * n, + self._left_params[:-2], + self._right_params[:-2], + ) + job.result() + + with self.assertRaises(ValueError): + job = fidelity.run([self._circuit[0]] * n, [self._circuit[1]] * n) + job.result() + + def test_asymmetric_params(self): + """test for fidelity when the 2 circuits have different number of + left/right parameters.""" + + fidelity = ComputeUncompute(self._sampler) + n = len(self._left_params) + right_params = [[p] for p in self._right_params[:, 0]] + job = fidelity.run( + [self._circuit[0]] * n, + [self._circuit[4]] * n, + self._left_params, + right_params, + ) + result = job.result() + np.testing.assert_allclose(result.fidelities, np.array([0.5, 0.25, 0.25, 0.0]), atol=1e-16) + + def test_input_format(self): + """test for different input format variations""" + + fidelity = ComputeUncompute(self._sampler) + circuit = RealAmplitudes(2) + values = np.random.random(circuit.num_parameters) + shift = np.ones_like(values) * 0.01 + + # lists of circuits, lists of numpy arrays + job = fidelity.run([circuit], [circuit], [values], [values + shift]) + result_1 = job.result() + + # lists of circuits, lists of lists + shift_val = values + shift + job = fidelity.run([circuit], [circuit], [values.tolist()], [shift_val.tolist()]) + result_2 = job.result() + + # circuits, lists + shift_val = values + shift + job = fidelity.run(circuit, circuit, values.tolist(), shift_val.tolist()) + result_3 = job.result() + + # circuits, np.arrays + job = fidelity.run(circuit, circuit, values, values + shift) + result_4 = job.result() + + np.testing.assert_allclose(result_1.fidelities, result_2.fidelities, atol=1e-16) + np.testing.assert_allclose(result_1.fidelities, result_3.fidelities, atol=1e-16) + np.testing.assert_allclose(result_1.fidelities, result_4.fidelities, atol=1e-16) + + +if __name__ == "__main__": + unittest.main() From aca01eb9867ccc08a49efc5a27fd60c2e28b5db3 Mon Sep 17 00:00:00 2001 From: Edwin Navarro Date: Fri, 2 Sep 2022 16:43:15 -0700 Subject: [PATCH 54/54] Clean up text drawer compression issues (#8588) * Add barrier labels to mpl and text drawers * Release note * Add import * Lint * Add barrier labels to latex drawer * Remove utils changes * Cleanup * Fix merge conflict * Lint * Remove label property for barriers and snapshots and increase mpl label font size * First steps * Fix vert spacing with text between lines * Fix low compress connections and change tests * Add tests * Additonal test * Lint * Add back test * Release note * Fix typo in release note Co-authored-by: Jake Lishman Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/visualization/text.py | 10 +- ...t-drawer-compression-a80a5636957e8eec.yaml | 9 ++ .../visualization/test_circuit_text_drawer.py | 123 +++++++++++++++++- 3 files changed, 134 insertions(+), 8 deletions(-) create mode 100644 releasenotes/notes/fix-text-drawer-compression-a80a5636957e8eec.yaml diff --git a/qiskit/visualization/text.py b/qiskit/visualization/text.py index 6fa431a1b2ad..7f89bdbaad0d 100644 --- a/qiskit/visualization/text.py +++ b/qiskit/visualization/text.py @@ -867,9 +867,7 @@ def should_compress(self, top_line, bot_line): for top, bot in zip(top_line, bot_line): if top in ["┴", "╨"] and bot in ["┬", "╥"]: return False - for line in (bot_line, top_line): - no_spaces = line.replace(" ", "") - if len(no_spaces) > 0 and all(c.isalpha() or c.isnumeric() for c in no_spaces): + if (top.isalnum() and bot != " ") or (bot.isalnum() and top != " "): return False return True @@ -959,6 +957,8 @@ def merge_lines(top, bot, icod="top"): ret += "╫" elif topc in "║╫╬" and botc in " ": ret += "║" + elif topc in "│┼╪" and botc in " ": + ret += "│" elif topc == "└" and botc == "┌" and icod == "top": ret += "├" elif topc == "┘" and botc == "┐": @@ -1518,8 +1518,10 @@ def connect_with(self, wire_char): wire_char = "║" if index == 0 and len(affected_bits) > 1: affected_bit.connect(wire_char, ["bot"]) - else: + elif index == len(affected_bits) - 1: affected_bit.connect(wire_char, ["top"]) + else: + affected_bit.connect(wire_char, ["bot", "top"]) else: if index == 0: affected_bit.connect(wire_char, ["bot"]) diff --git a/releasenotes/notes/fix-text-drawer-compression-a80a5636957e8eec.yaml b/releasenotes/notes/fix-text-drawer-compression-a80a5636957e8eec.yaml new file mode 100644 index 000000000000..a91cd87f0943 --- /dev/null +++ b/releasenotes/notes/fix-text-drawer-compression-a80a5636957e8eec.yaml @@ -0,0 +1,9 @@ +--- +fixes: + - | + There were two bugs in the ``text`` circuit drawer that were fixed. + These appeared when ``vertical_compression`` was set to ``medium``, + which is the default. The first would sometimes cause text to overwrite + other text or gates, and the second would sometimes cause the connections + between a gate and its controls to break. + See `#8588 `__. diff --git a/test/python/visualization/test_circuit_text_drawer.py b/test/python/visualization/test_circuit_text_drawer.py index 1ef9430c9a4d..3f2e4611b173 100644 --- a/test/python/visualization/test_circuit_text_drawer.py +++ b/test/python/visualization/test_circuit_text_drawer.py @@ -1683,7 +1683,7 @@ def test_control_gate_label_with_cond_1_high_cregbundle(self): str(_text_circuit_drawer(circ, vertical_compression="high", cregbundle=True)), expected ) - def test_control_gate_label_with_cond_2_med(self): + def test_control_gate_label_with_cond_2_med_space(self): """Control gate has a label and a conditional (on label, compression=med) See https://github.com/Qiskit/qiskit-terra/issues/4361""" expected = "\n".join( @@ -1692,8 +1692,7 @@ def test_control_gate_label_with_cond_2_med(self): "q_0: |0>┤ my h ├", " └──┬───┘", "q_1: |0>───■────", - " my ch ", - " ║ ", + " my║ch ", " c: 0 ═══■════", " 0x1 ", ] @@ -1708,6 +1707,31 @@ def test_control_gate_label_with_cond_2_med(self): self.assertEqual(str(_text_circuit_drawer(circ, vertical_compression="medium")), expected) + def test_control_gate_label_with_cond_2_med(self): + """Control gate has a label and a conditional (on label, compression=med) + See https://github.com/Qiskit/qiskit-terra/issues/4361""" + expected = "\n".join( + [ + " ┌──────┐ ", + "q_0: |0>──┤ my h ├─", + " └──┬───┘ ", + "q_1: |0>─────■─────", + " my ctrl-h ", + " ║ ", + " c: 0 ═════■═════", + " 0x1 ", + ] + ) + + qr = QuantumRegister(2, "q") + cr = ClassicalRegister(1, "c") + circ = QuantumCircuit(qr, cr) + hgate = HGate(label="my h") + controlh = hgate.control(label="my ctrl-h").c_if(cr, 1) + circ.append(controlh, [1, 0]) + + self.assertEqual(str(_text_circuit_drawer(circ, vertical_compression="medium")), expected) + def test_control_gate_label_with_cond_2_med_cregbundle(self): """Control gate has a label and a conditional (on label, compression=med) with cregbundle See https://github.com/Qiskit/qiskit-terra/issues/4361""" @@ -2046,7 +2070,6 @@ def test_text_conditional_1(self): " └─╥─┘└─╥─┘", "c0: 0 ══■════╬══", " 0x1 ║ ", - " ║ ", "c1: 0 ═══════■══", " 0x1 ", ] @@ -2148,6 +2171,98 @@ def test_text_measure_with_spaces_bundle(self): expected, ) + def test_text_barrier_med_compress_1(self): + """Medium vertical compression avoids connection break.""" + circuit = QuantumCircuit(4) + circuit.cx(1, 3) + circuit.x(1) + circuit.barrier((2, 3), label="Bar 1") + + expected = "\n".join( + [ + " ", + "q_0: |0>────────────", + " ┌───┐ ", + "q_1: |0>──■───┤ X ├─", + " │ └───┘ ", + " │ Bar 1 ", + "q_2: |0>──┼─────░───", + " ┌─┴─┐ ░ ", + "q_3: |0>┤ X ├───░───", + " └───┘ ░ ", + ] + ) + + self.assertEqual( + str(_text_circuit_drawer(circuit, vertical_compression="medium", cregbundle=False)), + expected, + ) + + def test_text_barrier_med_compress_2(self): + """Medium vertical compression avoids overprint.""" + circuit = QuantumCircuit(4) + circuit.barrier((0, 1, 2), label="a") + circuit.cx(1, 3) + circuit.x(1) + circuit.barrier((2, 3), label="Bar 1") + + expected = "\n".join( + [ + " a ", + "q_0: |0>─░─────────────", + " ░ ┌───┐ ", + "q_1: |0>─░───■───┤ X ├─", + " ░ │ └───┘ ", + " ░ │ Bar 1 ", + "q_2: |0>─░───┼─────░───", + " ░ ┌─┴─┐ ░ ", + "q_3: |0>───┤ X ├───░───", + " └───┘ ░ ", + ] + ) + + self.assertEqual( + str(_text_circuit_drawer(circuit, vertical_compression="medium", cregbundle=False)), + expected, + ) + + def test_text_barrier_med_compress_3(self): + """Medium vertical compression avoids conditional connection break.""" + qr = QuantumRegister(1, "qr") + qc1 = ClassicalRegister(3, "cr") + qc2 = ClassicalRegister(1, "cr2") + circuit = QuantumCircuit(qr, qc1, qc2) + circuit.x(0).c_if(qc1, 3) + circuit.x(0).c_if(qc2[0], 1) + + expected = "\n".join( + [ + " ┌───┐┌───┐", + " qr: |0>┤ X ├┤ X ├", + " └─╥─┘└─╥─┘", + "cr_0: 0 ══■════╬══", + " ║ ║ ", + "cr_2: 0 ══o════╬══", + " ║ ║ ", + " cr2: 0 ══╬════■══", + " ║ ", + "cr_1: 0 ══■═══════", + " 0x3 ", + ] + ) + + self.assertEqual( + str( + _text_circuit_drawer( + circuit, + vertical_compression="medium", + wire_order=[0, 1, 3, 4, 2], + cregbundle=False, + ) + ), + expected, + ) + class TestTextConditional(QiskitTestCase): """Gates with conditionals"""