From c6d8a3c5dfc645c18248c335bd1f602a87c793ec Mon Sep 17 00:00:00 2001 From: 2022tgoel Date: Sun, 29 Jan 2023 15:03:04 +0000 Subject: [PATCH 1/7] put submission --- team_solutions/pineapple/Documentation.pdf | Bin 0 -> 176426 bytes team_solutions/pineapple/Final.py | 72 + team_solutions/pineapple/README.md | 21 + team_solutions/pineapple/Subgraph.py | 75 + team_solutions/pineapple/four_color.ipynb | 872 +++++++++ team_solutions/pineapple/fourier.py | 0 .../pineapple/interpolate_maxcut.py | 202 ++ team_solutions/pineapple/maxcut.py | 190 ++ team_solutions/pineapple/maxcutSGD.py | 257 +++ .../pineapple/maxcut_interpolate.py | 424 +++++ ...ok-optimizecompilation-binarylifting.ipynb | 1648 +++++++++++++++++ .../pineapple/maxcut_notebook.ipynb | 1081 +++++++++++ .../maxcut_notebook_precompute_all.ipynb | 1377 ++++++++++++++ team_solutions/pineapple/maxcut_plotting.py | 34 + .../pineapple/maxcut_symbolic_compiler.ipynb | 1113 +++++++++++ .../pineapple/minimum_dominating_set.ipynb | 825 +++++++++ team_solutions/pineapple/overnight_2.py | 203 ++ team_solutions/pineapple/overnight_compile.py | 74 + .../pineapple/overnight_computation.py | 101 + team_solutions/pineapple/team_solutions.md | 3 + team_solutions/team_solutions.md | 6 - 21 files changed, 8572 insertions(+), 6 deletions(-) create mode 100644 team_solutions/pineapple/Documentation.pdf create mode 100644 team_solutions/pineapple/Final.py create mode 100644 team_solutions/pineapple/README.md create mode 100644 team_solutions/pineapple/Subgraph.py create mode 100644 team_solutions/pineapple/four_color.ipynb create mode 100644 team_solutions/pineapple/fourier.py create mode 100644 team_solutions/pineapple/interpolate_maxcut.py create mode 100644 team_solutions/pineapple/maxcut.py create mode 100644 team_solutions/pineapple/maxcutSGD.py create mode 100644 team_solutions/pineapple/maxcut_interpolate.py create mode 100644 team_solutions/pineapple/maxcut_notebook-optimizecompilation-binarylifting.ipynb create mode 100644 team_solutions/pineapple/maxcut_notebook.ipynb create mode 100644 team_solutions/pineapple/maxcut_notebook_precompute_all.ipynb create mode 100644 team_solutions/pineapple/maxcut_plotting.py create mode 100644 team_solutions/pineapple/maxcut_symbolic_compiler.ipynb create mode 100644 team_solutions/pineapple/minimum_dominating_set.ipynb create mode 100644 team_solutions/pineapple/overnight_2.py create mode 100644 team_solutions/pineapple/overnight_compile.py create mode 100644 team_solutions/pineapple/overnight_computation.py create mode 100644 team_solutions/pineapple/team_solutions.md delete mode 100644 team_solutions/team_solutions.md diff --git a/team_solutions/pineapple/Documentation.pdf b/team_solutions/pineapple/Documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fd716b5f41feecd3cb3254a8378e1d12e8708de2 GIT binary patch literal 176426 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 Bc>VwY literal 0 HcmV?d00001 diff --git a/team_solutions/pineapple/Final.py b/team_solutions/pineapple/Final.py new file mode 100644 index 0000000..674d5f5 --- /dev/null +++ b/team_solutions/pineapple/Final.py @@ -0,0 +1,72 @@ +from matplotlib import pyplot as plt +from pytket.extensions.qiskit import AerBackend +from pytket.backends.backend import Backend +from pytket.backends.backendresult import BackendResult +from pytket.passes import DecomposeBoxes +from pytket.utils import gen_term_sequence_circuit +import numpy as np +from pytket import Qubit, Circuit +from pytket.pauli import QubitPauliString, Pauli +from pytket.utils import QubitPauliOperator +from typing import List, Tuple, Callable +import networkx as nx +import networkx.algorithms.isomorphism.vf2userfunc as vf2 +import networkx as nx +import numpy as np +import matplotlib.pyplot as plt +import networkx.algorithms.isomorphism.vf2userfunc as vf2 +import os +import pickle + + +def subgraphInduce(G, edge, depth, rename=True): + # return: subgraph induced by edge + current = set(edge) + edges = set([edge]) + for i in range(depth): + next = set() + for node in current: + next.update(G.neighbors(node)) + edges.update(G.edges(node)) + current.update(next) + if rename: + # Rename nodes to 0, 1, 2, ... such that 0 and 1 are the central edge. + current.remove(edge[0]) + current.remove(edge[1]) + current = [edge[0], edge[1]] + list(current) + + edges = [(current.index(e[0]), current.index(e[1])) + for e in edges] + return nx.Graph(list(edges)) + + +x = pickle.load(open("subgraphs3.pkl", "rb")) # Subgraphs with frequency + +our_subgraphs = pickle.load(open("subgraphs.pkl", "rb")) # Subgraphs + +print(len(our_subgraphs)) +freq = [] +for idx, subgraph in enumerate(our_subgraphs): + found = False + for i in x: + if nx.is_isomorphic(i[0], nx.Graph(subgraph)): + found = True + freq.append([idx, i[1]]) + break + if not found: + freq.append([idx, 0]) + + +def filename(graph): + h = "".join(str(i[0]) + str(i[1]) for i in graph) + return h + + +print(len(freq)) +freq = sorted(freq, key=lambda x: x[1], reverse=True) +print("\n".join([str(i) for i in freq])) + +# Figure out which ones we urgently need to find +for i, f in freq: + if not os.path.exists(str(filename(our_subgraphs[i])) + ".pkl"): + print("FUCK", i, f) diff --git a/team_solutions/pineapple/README.md b/team_solutions/pineapple/README.md new file mode 100644 index 0000000..7700fcc --- /dev/null +++ b/team_solutions/pineapple/README.md @@ -0,0 +1,21 @@ +## Challenges on QAOA + +1. This QAOA [(Quantum Approximate Optimisation algorithm)](https://arxiv.org/abs/1411.4028) implementaion uses the most naive possible classical optimisation strategy. Parameters are sampled from a uniform distribution and if a list of parameters increases the value of the cost function these values are stored as the best guess so far. Can you improve on this using a more sophisticated optimisation strategy? COBAYLA and SPSA are two possible methods. + +2. The maxcut problem is one very common application of QAOA. Can you create an implementation of QAOA applied to a different problem? Examples of such problems included 3SAT and the maximum clique problem. Perhaps try and create and implementation which works for a more general Hamiltonian that could contain non-commuting Pauli terms like those found in Quantum Chemistry. Think about what additonal complexity would be added by a Hamiltonian with non-commuting terms. Interesting Hamiltonians to consider could be the Transverse Field Ising Model (TFIM), diatomic Hydrogen or a simple compound like lithium hydride. + +3. The given code implements QAOA on the idealised AerBackend simulator. Try instead to use a device/emulator with noise (i.e. the H1-2 emulator with the pytket-quantinuum extension). Can you optimise your circuit with pytket passes to improve performance in the presence of noise? + +4. Currently the circuits have to be recompiled on every iteration leading to a non-trivial compilation overhead if we use a large number of iterations. Can you think of a way to improve this? + +5. Implement a qubit reuse strategy to allow for the execution of a large QAOA instance on a small quantum device/emulator. See [this paper](https://arxiv.org/abs/2210.08039) for ideas. + +## Resources + +1. QAOA original paper (Farhi et al) -> https://arxiv.org/abs/1411.4028 +2. Quantinuum Qubit reuse paper (DeCross et al) -> https://arxiv.org/abs/2210.08039 +3. pytket API documentation -> https://cqcl.github.io/tket/pytket/api/ +4. User manual -> https://cqcl.github.io/pytket/manual/index.html +5. Notebook examples -> https://github.com/CQCL/pytket/tree/main/examples +6. Qiskit textbook section on QAOA -> https://qiskit.org/textbook/ch-applications/qaoa.html +7. Recent QAOA/qiskit review -> https://arxiv.org/abs/2301.09535 diff --git a/team_solutions/pineapple/Subgraph.py b/team_solutions/pineapple/Subgraph.py new file mode 100644 index 0000000..0a94365 --- /dev/null +++ b/team_solutions/pineapple/Subgraph.py @@ -0,0 +1,75 @@ +import networkx as nx +import numpy as np +import matplotlib.pyplot as plt +import networkx.algorithms.isomorphism.vf2userfunc as vf2 + + +def subgraphInduce(G, edge, depth, rename=False): + # return: subgraph induced by edge + current = set([edge[0], edge[1]]) + edges = set([edge]) + for i in range(depth): + next = set() + for node in current: + next.update(G.neighbors(node)) + edges.update(G.edges(node)) + current.update(next) + if rename: + current = {x: i for i, x in enumerate(list(current))} + edges = [(current[edge[0]], current[edge[1]]) for edge in edges] + return nx.Graph(list(edges)) + + +# adj = list(G.neighbors(0)) +# print(adj[0]) +# print(subgraphInduce(G, (0, adj[0]), 1).edges()) +# print(subgraphInduce(G, (0, adj[0]), 1, True).edges()) + +''' +for i in range(40): + for t in range(20, 30, 2): + G = nx.random_regular_graph(3, t) + for edge in G.edges(): + subgraph = subgraphInduce(G, edge, 2) + seen = False + # for k, (i, j) in enumerate(res): + # if nx.is_isomorphic(subgraph, i): + # seen = True + # res[k][1] += 1 + # break + for i in res: + if nx.is_isomorphic(subgraph, i): + seen = True + break + if not seen: + #print(len(res)) + #res.append([subgraph, 1]) + res.append(subgraph)''' + + +def gimme_subgraphs(): + res = [] + + for t in range(20, 100, 2): + G = nx.random_regular_graph(3, t) + for edge in G.edges(): + subgraph = subgraphInduce(G, edge, 2) + seen = False + for i in res: + if nx.is_isomorphic(subgraph, i): + seen = True + # res[i][1] += 1 + break + if not seen: + # print(len(res)) + # res.append([subgraph, 1]) + res.append(subgraph) + print("Generated Subgraphs len = ", len(res)) + return res + + +# res = sorted(res, key=lambda x: x[1], reverse=True) +# for i in range(100): +# print(res[i][1]) +# nx.draw(G) +# plt.show() diff --git a/team_solutions/pineapple/four_color.ipynb b/team_solutions/pineapple/four_color.ipynb new file mode 100644 index 0000000..6185e82 --- /dev/null +++ b/team_solutions/pineapple/four_color.ipynb @@ -0,0 +1,872 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a3b602e8-f1ca-4f06-9079-5000fbbaf8f8", + "metadata": {}, + "source": [ + "# Four Coloring Problem" + ] + }, + { + "cell_type": "markdown", + "id": "1a93c695-d39f-4651-82fe-4b87bc3e2156", + "metadata": {}, + "source": [ + "## Graph Construction" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f1a871da-89ec-4ff9-a074-5b5a40627a27", + "metadata": {}, + "outputs": [], + "source": [ + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "from collections import defaultdict" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "4e4449ae-93f9-426f-a575-c72167a65479", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# bigger graph\n", + "graph_edges = [(0, 1), (0,2), (1,2), (1,3), (3,4), (0, 4), (1, 4), (0, 3), (2, 4)]\n", + "N = 5\n", + "G = nx.Graph()\n", + "G.add_edges_from(graph_edges)\n", + "plt.figure(figsize=(2,2))\n", + "nx.draw(G, labels={node: node for node in G.nodes()})\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "4f6d078a-3c95-40ff-86cf-fdd08f7dd722", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graph_edges = [(0, 1), (0,2), (1,2)]\n", + "N = 3\n", + "G = nx.Graph()\n", + "G.add_edges_from(graph_edges)\n", + "plt.figure(figsize=(2,2))\n", + "nx.draw(G, labels={node: node for node in G.nodes()})\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "682e7535-41c4-4519-966e-c35de1e05cdb", + "metadata": {}, + "source": [ + "## Cost Hamiltonian" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "f010b143-c398-458f-9c1a-6473de5ca3d4", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple, Any, Dict\n", + "from pytket.utils import QubitPauliOperator\n", + "from pytket.pauli import QubitPauliString, Pauli\n", + "from pytket import Qubit" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "efd6691f-f389-4c4b-9d1d-55294a4f4b8f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(): 2.25000000000000, (Zq[0], Zq[1]): -0.250000000000000, (Zq[3], Zq[4]): -0.250000000000000, (Zq[0], Zq[1], Zq[3], Zq[4]): -0.250000000000000, (Zq[0], Zq[2]): -0.250000000000000, (Zq[3], Zq[5]): -0.250000000000000, (Zq[0], Zq[2], Zq[3], Zq[5]): -0.250000000000000, (Zq[1], Zq[2]): -0.250000000000000, (Zq[4], Zq[5]): -0.250000000000000, (Zq[1], Zq[2], Zq[4], Zq[5]): -0.250000000000000}\n" + ] + } + ], + "source": [ + "def qaoa_graph_to_cost_hamiltonian(edges, cost_angle: float) -> QubitPauliOperator:\n", + " qpo_dict = defaultdict(lambda:0)\n", + " for (i, j) in edges:\n", + " qpo_dict[QubitPauliString()]+=3/4\n", + " qpo_dict[QubitPauliString([Qubit(i), Qubit(j)], [Pauli.Z]*2)]-=1/4\n", + " qpo_dict[QubitPauliString([Qubit(N+i), Qubit(N+j)], [Pauli.Z]*2)]-=1/4\n", + " qpo_dict[QubitPauliString([Qubit(i), Qubit(j), Qubit(N+i), Qubit(N+j)], [Pauli.Z]*4)]-=1/4\n", + " for key in qpo_dict.keys():\n", + " qpo_dict[key]*=cost_angle\n", + " return QubitPauliOperator(qpo_dict)\n", + "\n", + "cost_angle = 1.0\n", + "cost_ham_qpo = qaoa_graph_to_cost_hamiltonian(graph_edges, cost_angle)\n", + "print(cost_ham_qpo)" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "a42b416d-97f4-4d66-8651-1f9ab0b1444a", + "metadata": {}, + "outputs": [], + "source": [ + "from pytket import Circuit\n", + "\n", + "circ = Circuit(10)\n", + "# circ.X(0)\n", + "# circ.X(N+1)\n", + "# circ.X(N+4)\n", + "# circ.X(4)\n", + "# circ.X(7)\n", + "vec = circ.get_statevector()" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "2c7dd7c0-fdd4-4443-b257-060891eeb4c1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0j" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost_ham_qpo.state_expectation(vec)" + ] + }, + { + "cell_type": "markdown", + "id": "dd0775f2-e48d-4378-a130-34f1b6653181", + "metadata": {}, + "source": [ + "## Cost Hamiltonian Circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "2d7f7edc-3934-441b-9417-fcbc7dda5efc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.utils import gen_term_sequence_circuit\n", + "from pytket import Circuit\n", + "from pytket.circuit import display\n", + "\n", + "cost_ham_circuit = gen_term_sequence_circuit(cost_ham_qpo, Circuit(N*2))\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "715d357e-da28-468a-aa24-b9385f9e8009", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.transform import Transform\n", + "\n", + "Transform.DecomposeBoxes().apply(cost_ham_circuit)\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "43b9166e-a355-488b-98d3-be988f52fe98", + "metadata": {}, + "source": [ + "## Mixer Hamiltonian" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "1f82803b-15c2-4486-8bf6-461c59dd535f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mixer_angle = 0.8\n", + "mixer_ham_qpo = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): mixer_angle for i in range(N*2)})\n", + "mixer_ham_circuit = gen_term_sequence_circuit(mixer_ham_qpo, Circuit(N*2))\n", + "Transform.DecomposeBoxes().apply(mixer_ham_circuit)\n", + "display.render_circuit_jupyter(mixer_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "3d298d00-124f-46de-b2c0-d58dbf9dd937", + "metadata": {}, + "source": [ + "## Initial Circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "51d87382-6263-49c7-b0d6-f74cf4c9077c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def qaoa_initial_circuit(n_qubits: int) -> Circuit:\n", + " c = Circuit(n_qubits)\n", + " for i in range(n_qubits):\n", + " c.H(i)\n", + " return c\n", + "\n", + "superposition_circuit = qaoa_initial_circuit(N)\n", + "\n", + "display.render_circuit_jupyter(superposition_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "ddb7438f-34a5-4d7a-815b-283252d3f7f2", + "metadata": {}, + "source": [ + "## Putting it all together" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "ab0e4675-f644-4227-82ce-f2bd3ea592ad", + "metadata": {}, + "outputs": [], + "source": [ + "def qaoa_circuit(edges,\n", + " n_nodes: int,\n", + " mixer_angles: List[float],\n", + " cost_angles: List[float]) -> Circuit:\n", + " \n", + " assert len(mixer_angles) == len(cost_angles)\n", + " \n", + " # initial state\n", + " qaoa_circuit = qaoa_initial_circuit(n_nodes*2)\n", + " \n", + " # add cost and mixer terms to state\n", + " for cost, mixer in zip(cost_angles, mixer_angles):\n", + " cost_ham = qaoa_graph_to_cost_hamiltonian(edges, cost)\n", + " mixer_ham = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): mixer for i in range(n_nodes*2)})\n", + " qaoa_circuit.append(gen_term_sequence_circuit(cost_ham, Circuit(n_nodes*2)))\n", + " qaoa_circuit.append(gen_term_sequence_circuit(mixer_ham, Circuit(n_nodes*2)))\n", + " \n", + " Transform.DecomposeBoxes().apply(qaoa_circuit)\n", + " return qaoa_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "58f78361-305b-41ef-9aa7-08a4b6a17b47", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple\n", + "from pytket.backends.backendresult import BackendResult\n", + "\n", + "def edges_fail(edges, meas):\n", + " num = 0\n", + " for (i, j) in edges:\n", + " num+=(meas[i] == meas[j] and meas[N+i] == meas[N+j])\n", + " return num\n", + "\n", + "def get_energy(edges, results: BackendResult) -> float:\n", + " dist = results.get_distribution()\n", + " energy = 0\n", + " for meas, prob in dist.items():\n", + " energy += (len(edges) - edges_fail(edges, meas))*prob\n", + "\n", + " return energy" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "a183907e-714e-4a5f-be72-4610a33ea122", + "metadata": {}, + "outputs": [], + "source": [ + "from pytket.backends.backend import Backend\n", + "from typing import Callable\n", + "import numpy as np\n", + "\n", + "def qaoa_instance(\n", + " backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " guess_mixer_angles: np.array,\n", + " guess_cost_angles: np.array,\n", + " seed: int,\n", + " shots: int = 5000,\n", + ") -> float:\n", + " # step 1: get state guess\n", + " my_prep_circuit = qaoa_circuit(\n", + " graph_edges, N, guess_mixer_angles, guess_cost_angles\n", + " )\n", + " measured_circ = my_prep_circuit.copy().measure_all()\n", + " compiler_pass(measured_circ)\n", + " res = backend.run_circuit(measured_circ, shots, seed=seed)\n", + "\n", + " return get_energy(graph_edges, res)" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "f7bc1fa6-0232-41ed-bba5-c896186c3d3b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.68100884, -1.30967135])" + ] + }, + "execution_count": 110, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.random.normal([0.5, 0.6], [1, 1])" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "f562e4e6-2b7f-4d0e-880c-613f5c20eb85", + "metadata": {}, + "outputs": [], + "source": [ + "def qaoa_optimise_energy(compiler_pass: Callable[[Circuit], bool],\n", + " backend: Backend,\n", + " iterations: int = 100,\n", + " n: int = 3,\n", + " shots: int = 5000,\n", + " seed: int= 12345):\n", + " \n", + " highest_energy = -1000 \n", + " best_guess_mixer_angles = [0 for i in range(n)] \n", + " best_guess_cost_angles = [0 for i in range(n)]\n", + " rng = np.random.default_rng(seed)\n", + " # guess some angles (iterations)-times and try if they are better than the best angles found before\n", + " \n", + " for i in range(iterations):\n", + " \n", + " guess_mixer_angles = np.clip(np.random.normal(best_guess_mixer_angles, [1]*n), 0, 1)\n", + " guess_cost_angles = np.clip(np.random.normal(best_guess_cost_angles, [1]*n), 0, 1)\n", + " \n", + " qaoa_energy = qaoa_instance(backend,\n", + " compiler_pass,\n", + " guess_mixer_angles,\n", + " guess_cost_angles,\n", + " seed=seed,\n", + " shots=shots)\n", + " \n", + " if(qaoa_energy > highest_energy):\n", + " \n", + " print(\"new highest energy found: \", qaoa_energy)\n", + " \n", + " best_guess_mixer_angles = np.round(guess_mixer_angles, 3)\n", + " best_guess_cost_angles = np.round(guess_cost_angles, 3)\n", + " highest_energy = qaoa_energy\n", + " \n", + " print(\"highest energy: \", highest_energy)\n", + " print(\"best guess mixer angles: \", best_guess_mixer_angles)\n", + " print(\"best guess cost angles: \", best_guess_cost_angles)\n", + " return best_guess_mixer_angles, best_guess_cost_angles" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "2e8941c3-b604-45c6-8aba-de496cca9a80", + "metadata": {}, + "outputs": [], + "source": [ + "def qaoa_calculate(backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " shots: int = 5000,\n", + " iterations: int = 100,\n", + " seed: int = 12345,\n", + " ) -> BackendResult:\n", + " \n", + " # find the parameters for the highest energy\n", + " best_mixer, best_cost = qaoa_optimise_energy(compiler_pass,\n", + " backend,\n", + " iterations,\n", + " 10,\n", + " shots=shots,\n", + " seed=seed)\n", + " \n", + " # get the circuit with the final parameters of the optimisation:\n", + " my_qaoa_circuit = qaoa_circuit(graph_edges, N,\n", + " best_mixer,\n", + " best_cost)\n", + "\n", + " my_qaoa_circuit.measure_all()\n", + "\n", + " compiler_pass(my_qaoa_circuit)\n", + " handle = backend.process_circuit(my_qaoa_circuit, shots, seed=seed)\n", + "\n", + " result = backend.get_result(handle) \n", + " \n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "377cf5cf-21cd-492a-8bab-d4a9443aea53", + "metadata": {}, + "outputs": [], + "source": [ + "from pytket.extensions.qiskit import AerBackend\n", + "\n", + "backend = AerBackend()\n", + "comp = backend.get_compiled_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "1b7112e5-eb3f-4a40-8165-a3fa7f9ce26a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "new highest energy found: 1.760000000000001\n", + "new highest energy found: 2.5500000000000007\n", + "new highest energy found: 2.630000000000001\n", + "new highest energy found: 2.71\n", + "new highest energy found: 2.7200000000000006\n", + "highest energy: 2.7200000000000006\n", + "best guess mixer angles: [1. 1. 0. 0. 1. 0. 0. 0. 0.12 1. ]\n", + "best guess cost angles: [1. 0.206 0.99 0. 0.524 0. 0. 0.912 1. 0. ]\n", + "CPU times: user 3min 4s, sys: 87.3 ms, total: 3min 4s\n", + "Wall time: 3min 4s\n" + ] + } + ], + "source": [ + "%%time\n", + "res = qaoa_calculate(backend, backend.default_compilation_pass(2).apply, shots = 100, iterations = 100, seed=43278)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "f002c01a-2224-48e9-b038-cef48dbabadb", + "metadata": {}, + "outputs": [], + "source": [ + "def prob_each_node(dist):\n", + " p = [0]*N*2\n", + " for meas, prob in dist.items():\n", + " for ind, val in enumerate(meas):\n", + " if (val == 1): \n", + " p[ind] +=prob\n", + " return p" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "448563e0-b558-472d-abb9-772c2552c314", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{(0, 0, 0, 0, 0, 0): 0.01,\n", + " (0, 0, 0, 1, 1, 1): 0.01,\n", + " (0, 0, 1, 0, 1, 0): 0.05,\n", + " (0, 0, 1, 0, 1, 1): 0.03,\n", + " (0, 0, 1, 1, 0, 0): 0.03,\n", + " (0, 0, 1, 1, 0, 1): 0.04,\n", + " (0, 0, 1, 1, 1, 0): 0.01,\n", + " (0, 1, 0, 0, 0, 1): 0.04,\n", + " (0, 1, 0, 0, 1, 1): 0.04,\n", + " (0, 1, 0, 1, 0, 0): 0.07,\n", + " (0, 1, 0, 1, 1, 0): 0.02,\n", + " (0, 1, 1, 0, 0, 1): 0.06,\n", + " (0, 1, 1, 0, 1, 0): 0.05,\n", + " (0, 1, 1, 1, 0, 0): 0.01,\n", + " (0, 1, 1, 1, 0, 1): 0.03,\n", + " (0, 1, 1, 1, 1, 0): 0.05,\n", + " (1, 0, 0, 0, 0, 1): 0.01,\n", + " (1, 0, 0, 0, 1, 0): 0.05,\n", + " (1, 0, 0, 0, 1, 1): 0.02,\n", + " (1, 0, 0, 1, 0, 1): 0.05,\n", + " (1, 0, 0, 1, 1, 0): 0.03,\n", + " (1, 0, 1, 0, 0, 1): 0.04,\n", + " (1, 0, 1, 0, 1, 0): 0.01,\n", + " (1, 0, 1, 0, 1, 1): 0.05,\n", + " (1, 0, 1, 1, 0, 0): 0.02,\n", + " (1, 0, 1, 1, 1, 0): 0.03,\n", + " (1, 1, 0, 0, 1, 0): 0.02,\n", + " (1, 1, 0, 0, 1, 1): 0.03,\n", + " (1, 1, 0, 1, 0, 0): 0.05,\n", + " (1, 1, 0, 1, 0, 1): 0.04}" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res.get_distribution()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "373de61a-7196-4437-8ea3-d3a57bffa2f0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.4200000000000002,\n", + " 0.5700000000000003,\n", + " 0.4300000000000002,\n", + " 0.47000000000000025,\n", + " 0.5400000000000003,\n", + " 0.5000000000000002,\n", + " 0.5700000000000003,\n", + " 0.48000000000000026,\n", + " 0.4800000000000003,\n", + " 0.49000000000000027]" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prob_each_node(res.get_distribution())" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "id": "fd60112a-7bfe-41e6-b0ca-a810331c4150", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.32600000000000007" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "get_energy(adj, res)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba155c72-d9ba-42c9-8f13-3a7ce445199a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 [Default]", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/team_solutions/pineapple/fourier.py b/team_solutions/pineapple/fourier.py new file mode 100644 index 0000000..e69de29 diff --git a/team_solutions/pineapple/interpolate_maxcut.py b/team_solutions/pineapple/interpolate_maxcut.py new file mode 100644 index 0000000..0dd031c --- /dev/null +++ b/team_solutions/pineapple/interpolate_maxcut.py @@ -0,0 +1,202 @@ +from maxcut_plotting import plot_maxcut_results +from pytket.extensions.qiskit import AerBackend +from pytket.backends.backend import Backend +from pytket.backends.backendresult import BackendResult +from pytket.passes import DecomposeBoxes +from pytket.utils import gen_term_sequence_circuit +import numpy as np +from pytket import Qubit, Circuit +from pytket.pauli import QubitPauliString, Pauli +from pytket.utils import QubitPauliOperator +from typing import List, Tuple, Callable +import networkx as nx + +# Define graph. + +max_cut_graph_edges = [(0, 1), (1, 2), (1, 3), (3, 4), (4, 5), (4, 6)] +n_nodes = 7 + +max_cut_graph = nx.Graph() +max_cut_graph.add_edges_from(max_cut_graph_edges) +nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes()}) + +expected_results = [(0, 1, 0, 0, 1, 0, 0), (1, 0, 1, 1, 0, 1, 1)] + + +def qaoa_graph_to_cost_hamiltonian( + edges: List[Tuple[int, int]], cost_angle: float +) -> QubitPauliOperator: + """ + This function takes a list of edges and a cost angle and returns a QubitPauliOperator + representing the cost Hamiltonian for the QAOA algorithm. + + """ + qpo_dict = {QubitPauliString(): len(edges) * 0.5 * cost_angle} + for e in edges: + term_string = QubitPauliString( + [Qubit(e[0]), Qubit(e[1])], [Pauli.Z, Pauli.Z]) + qpo_dict[term_string] = -0.5 * cost_angle + return QubitPauliOperator(qpo_dict) + + +cost_angle = 1.0 +cost_ham_qpo = qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, cost_angle) +print(cost_ham_qpo) + + +def qaoa_initial_circuit(n_qubits: int) -> Circuit: + c = Circuit(n_qubits) + for i in range(n_qubits): + c.H(i) + return c + + +def qaoa_max_cut_circuit( + edges: List[Tuple[int, int]], + n_nodes: int, + mixer_angles: List[float], + cost_angles: List[float], +) -> Circuit: + """ + Create a QAOA circuit for the MaxCut problem. + """ + + assert len(mixer_angles) == len(cost_angles) + + # initial state + qaoa_circuit = qaoa_initial_circuit(n_nodes) + + # add cost and mixer terms to state + for cost, mixer in zip(cost_angles, mixer_angles): + cost_ham = qaoa_graph_to_cost_hamiltonian(edges, cost) + mixer_ham = QubitPauliOperator( + {QubitPauliString([Qubit(i)], [Pauli.X]) + : mixer for i in range(n_nodes)} + ) + qaoa_circuit.append(gen_term_sequence_circuit( + cost_ham, Circuit(n_nodes))) + qaoa_circuit.append(gen_term_sequence_circuit( + mixer_ham, Circuit(n_nodes))) + + DecomposeBoxes().apply(qaoa_circuit) + return qaoa_circuit + + +def max_cut_energy(edges: List[Tuple[int, int]], results: BackendResult, maximize=False) -> float: + energy = 0.0 + dist = results.get_distribution() + if maximize: + for meas in dist.keys(): + energy = max(energy, sum((meas[i] ^ meas[j]) for i, j in edges)) + else: + for i, j in edges: + energy += sum((meas[i] ^ meas[j]) * + prob for meas, prob in dist.items()) + + return energy + + +def qaoa_instance_simple( + backend: Backend, + compiler_pass: Callable[[Circuit], bool], + guess_mixer_angles: np.array, + guess_cost_angles: np.array, + seed: int, + shots: int = 5000, +) -> float: + # step 1: get state guess + my_prep_circuit = qaoa_max_cut_circuit( + max_cut_graph_edges, n_nodes, guess_mixer_angles, guess_cost_angles + ) + measured_circ = my_prep_circuit.copy().measure_all() + compiler_pass(measured_circ) + res = backend.run_circuit(measured_circ, shots, seed=seed) + + return max_cut_energy(max_cut_graph_edges, res) + + +def qaoa_optimise_energy( + compiler_pass: Callable[[Circuit], bool], + backend: Backend, + iterations: int = 100, + n: int = 3, + shots: int = 5000, + seed: int = 12345, +): + + highest_energy = 0 + best_guess_mixer_angles = [0 for i in range(n)] + best_guess_cost_angles = [0 for i in range(n)] + rng = np.random.default_rng(seed) + # guess some angles (iterations)-times and try if they are better than the best angles found before + + for i in range(iterations): + + guess_mixer_angles = rng.uniform(0, 1, n) + guess_cost_angles = rng.uniform(0, 1, n) + + qaoa_energy = qaoa_instance_simple( + backend, + compiler_pass, + guess_mixer_angles, + guess_cost_angles, + seed=seed, + shots=shots, + ) + + if qaoa_energy > highest_energy: + + print("new highest energy found: ", qaoa_energy) + + best_guess_mixer_angles = guess_mixer_angles + best_guess_cost_angles = guess_cost_angles + highest_energy = qaoa_energy + + print("highest energy: ", highest_energy) + print("best guess mixer angles: ", best_guess_mixer_angles) + print("best guess cost angles: ", best_guess_cost_angles) + return best_guess_mixer_angles, best_guess_cost_angles + + +def qaoa_calculate( + backend: Backend, + compiler_pass: Callable[[Circuit], bool], + shots: int = 5000, + iterations: int = 100, + seed: int = 12345, +) -> float: + + # find the parameters for the highest energy + best_mixer, best_cost = qaoa_optimise_energy( + compiler_pass, backend, iterations, 3, shots=shots, seed=seed + ) + + # get the circuit with the final parameters of the optimisation: + my_qaoa_circuit = qaoa_max_cut_circuit( + max_cut_graph_edges, n_nodes, best_mixer, best_cost + ) + + my_qaoa_circuit.measure_all() + + compiler_pass(my_qaoa_circuit) + handle = backend.process_circuit(my_qaoa_circuit, shots, seed=seed) + + result = backend.get_result(handle) + + return result + + +backend = AerBackend() +comp = backend.get_compiled_circuit + +res = qaoa_calculate( + backend, + backend.default_compilation_pass(2).apply, + shots=5000, + iterations=100, + seed=12345, + maximize=True +) + + +plot_maxcut_results(res, 6) diff --git a/team_solutions/pineapple/maxcut.py b/team_solutions/pineapple/maxcut.py new file mode 100644 index 0000000..b6e0f6c --- /dev/null +++ b/team_solutions/pineapple/maxcut.py @@ -0,0 +1,190 @@ +import networkx as nx + +max_cut_graph_edges = [(0, 1), (1, 2), (1, 3), (3, 4), (4, 5), (4, 6)] +n_nodes = 7 + +max_cut_graph = nx.Graph() +max_cut_graph.add_edges_from(max_cut_graph_edges) +nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes()}) + +expected_results = [(0, 1, 0, 0, 1, 0, 0), (1, 0, 1, 1, 0, 1, 1)] + +from typing import List, Tuple, Callable +from pytket.utils import QubitPauliOperator +from pytket.pauli import QubitPauliString, Pauli +from pytket import Qubit, Circuit +import numpy as np + + +def qaoa_graph_to_cost_hamiltonian( + edges: List[Tuple[int, int]], cost_angle: float +) -> QubitPauliOperator: + qpo_dict = {QubitPauliString(): len(edges) * 0.5 * cost_angle} + for e in edges: + term_string = QubitPauliString([Qubit(e[0]), Qubit(e[1])], [Pauli.Z, Pauli.Z]) + qpo_dict[term_string] = -0.5 * cost_angle + return QubitPauliOperator(qpo_dict) + + +cost_angle = 1.0 +cost_ham_qpo = qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, cost_angle) +print(cost_ham_qpo) + + +def qaoa_initial_circuit(n_qubits: int) -> Circuit: + c = Circuit(n_qubits) + for i in range(n_qubits): + c.H(i) + return c + + +from pytket.utils import gen_term_sequence_circuit +from pytket.passes import DecomposeBoxes + + +def qaoa_max_cut_circuit( + edges: List[Tuple[int, int]], + n_nodes: int, + mixer_angles: List[float], + cost_angles: List[float], +) -> Circuit: + + assert len(mixer_angles) == len(cost_angles) + + # initial state + qaoa_circuit = qaoa_initial_circuit(n_nodes) + + # add cost and mixer terms to state + for cost, mixer in zip(cost_angles, mixer_angles): + cost_ham = qaoa_graph_to_cost_hamiltonian(edges, cost) + mixer_ham = QubitPauliOperator( + {QubitPauliString([Qubit(i)], [Pauli.X]): mixer for i in range(n_nodes)} + ) + qaoa_circuit.append(gen_term_sequence_circuit(cost_ham, Circuit(n_nodes))) + qaoa_circuit.append(gen_term_sequence_circuit(mixer_ham, Circuit(n_nodes))) + + DecomposeBoxes().apply(qaoa_circuit) + return qaoa_circuit + + +from pytket.backends.backendresult import BackendResult + + +def max_cut_energy(edges: List[Tuple[int, int]], results: BackendResult) -> float: + energy = 0.0 + dist = results.get_distribution() + for i, j in edges: + energy += sum((meas[i] ^ meas[j]) * prob for meas, prob in dist.items()) + + return energy + + +from pytket.backends.backend import Backend + + +def qaoa_instance_simple( + backend: Backend, + compiler_pass: Callable[[Circuit], bool], + guess_mixer_angles: np.array, + guess_cost_angles: np.array, + seed: int, + shots: int = 5000, +) -> float: + # step 1: get state guess + my_prep_circuit = qaoa_max_cut_circuit( + max_cut_graph_edges, n_nodes, guess_mixer_angles, guess_cost_angles + ) + measured_circ = my_prep_circuit.copy().measure_all() + compiler_pass(measured_circ) + res = backend.run_circuit(measured_circ, shots, seed=seed) + + return max_cut_energy(max_cut_graph_edges, res) + + +def qaoa_optimise_energy( + compiler_pass: Callable[[Circuit], bool], + backend: Backend, + iterations: int = 100, + n: int = 3, + shots: int = 5000, + seed: int = 12345, +): + + highest_energy = 0 + best_guess_mixer_angles = [0 for i in range(n)] + best_guess_cost_angles = [0 for i in range(n)] + rng = np.random.default_rng(seed) + # guess some angles (iterations)-times and try if they are better than the best angles found before + + for i in range(iterations): + + guess_mixer_angles = rng.uniform(0, 1, n) + guess_cost_angles = rng.uniform(0, 1, n) + + qaoa_energy = qaoa_instance_simple( + backend, + compiler_pass, + guess_mixer_angles, + guess_cost_angles, + seed=seed, + shots=shots, + ) + + if qaoa_energy > highest_energy: + + print("new highest energy found: ", qaoa_energy) + + best_guess_mixer_angles = guess_mixer_angles + best_guess_cost_angles = guess_cost_angles + highest_energy = qaoa_energy + + print("highest energy: ", highest_energy) + print("best guess mixer angles: ", best_guess_mixer_angles) + print("best guess cost angles: ", best_guess_cost_angles) + return best_guess_mixer_angles, best_guess_cost_angles + + +def qaoa_calculate( + backend: Backend, + compiler_pass: Callable[[Circuit], bool], + shots: int = 5000, + iterations: int = 100, + seed: int = 12345, +) -> float: + + # find the parameters for the highest energy + best_mixer, best_cost = qaoa_optimise_energy( + compiler_pass, backend, iterations, 3, shots=shots, seed=seed + ) + + # get the circuit with the final parameters of the optimisation: + my_qaoa_circuit = qaoa_max_cut_circuit( + max_cut_graph_edges, n_nodes, best_mixer, best_cost + ) + + my_qaoa_circuit.measure_all() + + compiler_pass(my_qaoa_circuit) + handle = backend.process_circuit(my_qaoa_circuit, shots, seed=seed) + + result = backend.get_result(handle) + + return result + + +from pytket.extensions.qiskit import AerBackend + +backend = AerBackend() +comp = backend.get_compiled_circuit + +res = qaoa_calculate( + backend, + backend.default_compilation_pass(2).apply, + shots=5000, + iterations=100, + seed=12345, +) + +from maxcut_plotting import plot_maxcut_results + +plot_maxcut_results(res, 6) diff --git a/team_solutions/pineapple/maxcutSGD.py b/team_solutions/pineapple/maxcutSGD.py new file mode 100644 index 0000000..7570030 --- /dev/null +++ b/team_solutions/pineapple/maxcutSGD.py @@ -0,0 +1,257 @@ +import networkx as nx + +max_cut_graph_edges = [(0, 1), (1, 2), (1, 3), (3, 4), (4, 5), (4, 6)] +n_nodes = 7 + +max_cut_graph = nx.Graph() +max_cut_graph.add_edges_from(max_cut_graph_edges) +nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes()}) + +expected_results = [(0, 1, 0, 0, 1, 0, 0), (1, 0, 1, 1, 0, 1, 1)] + +from typing import List, Tuple, Callable +from pytket.utils import QubitPauliOperator +from pytket.pauli import QubitPauliString, Pauli +from pytket import Qubit, Circuit +import numpy as np + + +def qaoa_graph_to_cost_hamiltonian( + edges: List[Tuple[int, int]], cost_angle: float +) -> QubitPauliOperator: + qpo_dict = {QubitPauliString(): len(edges) * 0.5 * cost_angle} + for e in edges: + term_string = QubitPauliString([Qubit(e[0]), Qubit(e[1])], [Pauli.Z, Pauli.Z]) + qpo_dict[term_string] = -0.5 * cost_angle + return QubitPauliOperator(qpo_dict) + + +cost_angle = 1.0 +cost_ham_qpo = qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, cost_angle) +print(cost_ham_qpo) + + +def qaoa_initial_circuit(n_qubits: int) -> Circuit: + c = Circuit(n_qubits) + for i in range(n_qubits): + c.H(i) + return c + + +from pytket.utils import gen_term_sequence_circuit +from pytket.passes import DecomposeBoxes + + +def qaoa_max_cut_circuit( + edges: List[Tuple[int, int]], + n_nodes: int, + mixer_angles: List[float], + cost_angles: List[float], +) -> Circuit: + + assert len(mixer_angles) == len(cost_angles) + + # initial state + qaoa_circuit = qaoa_initial_circuit(n_nodes) + + # add cost and mixer terms to state + for cost, mixer in zip(cost_angles, mixer_angles): + cost_ham = qaoa_graph_to_cost_hamiltonian(edges, cost) + mixer_ham = QubitPauliOperator( + {QubitPauliString([Qubit(i)], [Pauli.X]): mixer for i in range(n_nodes)} + ) + qaoa_circuit.append(gen_term_sequence_circuit(cost_ham, Circuit(n_nodes))) + qaoa_circuit.append(gen_term_sequence_circuit(mixer_ham, Circuit(n_nodes))) + + DecomposeBoxes().apply(qaoa_circuit) + return qaoa_circuit + + +from pytket.backends.backendresult import BackendResult + + +def max_cut_energy(edges: List[Tuple[int, int]], results: BackendResult) -> float: + energy = 0.0 + dist = results.get_distribution() + for i, j in edges: + energy += sum((meas[i] ^ meas[j]) * prob for meas, prob in dist.items()) + + return energy + + +from pytket.backends.backend import Backend + + +def qaoa_instance_simple( + backend: Backend, + compiler_pass: Callable[[Circuit], bool], + guess_mixer_angles: np.array, + guess_cost_angles: np.array, + seed: int, + shots: int = 5000, +) -> float: + # step 1: get state guess + my_prep_circuit = qaoa_max_cut_circuit( + max_cut_graph_edges, n_nodes, guess_mixer_angles, guess_cost_angles + ) + measured_circ = my_prep_circuit.copy().measure_all() + compiler_pass(measured_circ) + res = backend.run_circuit(measured_circ, shots, seed=seed) + + return max_cut_energy(max_cut_graph_edges, res) + + +def qaoa_optimise_energy( + compiler_pass: Callable[[Circuit], bool], + backend: Backend, + iterations: int = 1000, + n: int = 3, + shots: int = 5000, + seed: int = 12345, + learning_rate: float = 0.0001, + stepsize: float = 0.0001, +): + + highest_energy = 0 + rng = np.random.default_rng(seed) + guess_mixer_angles = rng.uniform(0, 1, n) + guess_cost_angles = rng.uniform(0, 1, n) + + # guess some angles (iterations)-times and try if they are better than the best angles found before + + for i in range(iterations): + mixer_gradient = np.ones(n) + cost_gradient = np.ones(n) + qaoa_energy = qaoa_instance_simple( + backend, + compiler_pass, + guess_mixer_angles, + guess_cost_angles, + seed=seed, + shots=shots, + ) + + mixer_perturbation = 1 #rng.uniform(0.1, 1, n) + cost_perturbation = 1 # rng.uniform(0.1, 1, n) + + qaoa_energy1 = qaoa_instance_simple( + backend, + compiler_pass, + guess_mixer_angles + stepsize*mixer_perturbation, + guess_cost_angles, + seed=seed, + shots=shots, + ) + + qaoa_energy2 = qaoa_instance_simple( + backend, + compiler_pass, + guess_mixer_angles - stepsize*mixer_perturbation, + guess_cost_angles, + seed=seed, + shots=shots, + ) + + qaoa_energy3 = qaoa_instance_simple( + backend, + compiler_pass, + guess_mixer_angles, + guess_cost_angles + stepsize*cost_perturbation, + seed=seed, + shots=shots, + ) + + qaoa_energy4 = qaoa_instance_simple( + backend, + compiler_pass, + guess_mixer_angles, + guess_cost_angles - stepsize*cost_perturbation, + seed=seed, + shots=shots, + ) + + mixer_gradient = (qaoa_energy1 - qaoa_energy2)/(2*stepsize*mixer_perturbation) + cost_gradient = (qaoa_energy3 - qaoa_energy4)/(2*stepsize*cost_perturbation) + + new_mixer_angles = guess_mixer_angles + learning_rate*mixer_gradient + new_cost_angles = guess_cost_angles + learning_rate*cost_gradient + + qaoa_newenergy = qaoa_instance_simple( + backend, + compiler_pass, + new_mixer_angles, + new_cost_angles, + seed=seed, + shots=shots, + ) + + + guess_mixer_angles = new_mixer_angles + guess_cost_angles = new_cost_angles + + print("iteration: ", i ) + print("energy: ", qaoa_energy) + print("old parameters: ", guess_mixer_angles - learning_rate*mixer_gradient, guess_cost_angles - learning_rate*cost_gradient) + print("new parameters: ", guess_mixer_angles, guess_cost_angles) + print("new energy: ", qaoa_newenergy) + print("learning rate:", learning_rate) + + qaoa_energy = qaoa_instance_simple( + backend, + compiler_pass, + guess_mixer_angles, + guess_cost_angles, + seed=seed, + shots=shots, + ) + + print("highest energy: ", qaoa_energy) + print("best guess mixer angles: ", guess_mixer_angles) + print("best guess cost angles: ", guess_cost_angles) + return guess_mixer_angles, guess_cost_angles + + +def qaoa_calculate( + backend: Backend, + compiler_pass: Callable[[Circuit], bool], + shots: int = 5000, + iterations: int = 1000, + seed: int = 12345, +) -> float: + + # find the parameters for the highest energy + best_mixer, best_cost = qaoa_optimise_energy( + compiler_pass, backend, iterations, 3, shots=shots, seed=seed + ) + + # get the circuit with the final parameters of the optimisation: + my_qaoa_circuit = qaoa_max_cut_circuit( + max_cut_graph_edges, n_nodes, best_mixer, best_cost + ) + + my_qaoa_circuit.measure_all() + + compiler_pass(my_qaoa_circuit) + handle = backend.process_circuit(my_qaoa_circuit, shots, seed=seed) + + result = backend.get_result(handle) + + return result + + +from pytket.extensions.qiskit import AerBackend + +backend = AerBackend() +comp = backend.get_compiled_circuit + +res = qaoa_calculate( + backend, + backend.default_compilation_pass(2).apply, + shots=5000, + iterations=1000, + seed=89023, +) + +from maxcut_plotting import plot_maxcut_results +print("hello") +plot_maxcut_results(res, 6) diff --git a/team_solutions/pineapple/maxcut_interpolate.py b/team_solutions/pineapple/maxcut_interpolate.py new file mode 100644 index 0000000..93707a6 --- /dev/null +++ b/team_solutions/pineapple/maxcut_interpolate.py @@ -0,0 +1,424 @@ +from matplotlib import pyplot as plt +from maxcut_plotting import plot_maxcut_results +from pytket.extensions.qiskit import AerBackend +from pytket.backends.backend import Backend +from pytket.backends.backendresult import BackendResult +from pytket.passes import DecomposeBoxes +from pytket.utils import gen_term_sequence_circuit +import numpy as np +from pytket import Qubit, Circuit +from pytket.pauli import QubitPauliString, Pauli +from pytket.utils import QubitPauliOperator +from typing import List, Tuple, Callable +import networkx as nx +import networkx.algorithms.isomorphism.vf2userfunc as vf2 +import networkx as nx +import numpy as np +import matplotlib.pyplot as plt +import networkx.algorithms.isomorphism.vf2userfunc as vf2 + + +def subgraphInduce(G, edge, depth, rename=True): + # return: subgraph induced by edge + current = set(edge) + edges = set([edge]) + for i in range(depth): + next = set() + for node in current: + next.update(G.neighbors(node)) + edges.update(G.edges(node)) + current.update(next) + if rename: + # Rename nodes to 0, 1, 2, ... such that 0 and 1 are the central edge. + current.remove(edge[0]) + current.remove(edge[1]) + current = [edge[0], edge[1]] + list(current) + + edges = [(current.index(e[0]), current.index(e[1])) + for e in edges] + return nx.Graph(list(edges)) + + +def gimme_subgraphs(): + res = [] + + for t in range(20, 100, 2): + G = nx.random_regular_graph(3, t) + for edge in G.edges(): + subgraph = subgraphInduce(G, edge, 2) + seen = False + for i in res: + if nx.is_isomorphic(subgraph, i): + seen = True + # res[i][1] += 1 + break + if not seen: + # print(len(res)) + # res.append([subgraph, 1]) + res.append(subgraph) + print("Generated Subgraphs len = ", len(res)) + return [list(i.edges) for i in res] + + +# res = sorted(res, key=lambda x: x[1], reverse=True) +# for i in range(100): +# print(res[i][1]) +# nx.draw(G) +# plt.show() + + +# Define graph. +# TOOD: Hardcoded for now, but should be able to take any p, k +# SUBGRAPHS = [ +# [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3)], +# [(0, 1), (0, 2), (0, 3), (1, 2), (1, 4)], +# [(0, 1), (0, 2), (0, 3), (1, 4), (1, 5)], +# ] + + +SUBGRAPHS = gimme_subgraphs() +print(SUBGRAPHS[0]) +print(len(SUBGRAPHS)) + + +NX_SUBGRAPHS = [nx.Graph(e) for e in SUBGRAPHS] + +P_DISTANCE = 2 # TODO: Hardcoded for now, but should be able to take any p, k +K_BRANCHING = 3 # TODO: Hardcoded for now, but should be able to take any p, k + +DISCRETIZATION = (4, 4, 4, 4) + +n_nodes = 24 + + +max_cut_graph = nx.random_regular_graph(K_BRANCHING, n_nodes) + + +# nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes()}) +# plt.show() + +max_cut_graph_edges = max_cut_graph.edges() + + +# max_cut_graph = nx.Graph() +# max_cut_graph.add_edges_from(max_cut_graph_edges) +# nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes()}) + +# expected_results = [(0, 1, 0, 0, 1, 0, 0), (1, 0, 1, 1, 0, 1, 1)] + + +def get_subgraph_frequency(nx_graph): + """ + Find the frequency of each subgraph in the graph. + """ + subgraph_freq = np.zeros((len(NX_SUBGRAPHS),)) + for central_edge in nx_graph.edges: + neighborhood = subgraphInduce( + nx_graph, central_edge, P_DISTANCE) + for i, subgraph in enumerate(NX_SUBGRAPHS): + if nx.is_isomorphic(neighborhood, subgraph): + subgraph_freq[i] += 1 + print(subgraph_freq) + return subgraph_freq + + +def qaoa_graph_to_cost_hamiltonian( + edges: List[Tuple[int, int]], cost_angle: float +) -> QubitPauliOperator: + """ + This function takes a list of edges and a cost angle and returns a QubitPauliOperator + representing the cost Hamiltonian for the QAOA algorithm. + + """ + qpo_dict = {QubitPauliString(): len(edges) * 0.5 * cost_angle} + for e in edges: + term_string = QubitPauliString( + [Qubit(e[0]), Qubit(e[1])], [Pauli.Z, Pauli.Z]) + qpo_dict[term_string] = -0.5 * cost_angle + return QubitPauliOperator(qpo_dict) + + +cost_angle = 1.0 +cost_ham_qpo = qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, cost_angle) +print(cost_ham_qpo) + + +def qaoa_initial_circuit(n_qubits: int) -> Circuit: + c = Circuit(n_qubits) + for i in range(n_qubits): + c.H(i) + return c + + +def qaoa_max_cut_circuit( + edges: List[Tuple[int, int]], + mixer_angles: List[float], + cost_angles: List[float], +) -> Circuit: + """ + Create a QAOA circuit for the MaxCut problem. + """ + + n_nodes: int = len(set().union(*edges)) + + # print(len(mixer_angles), len(cost_angles)) + + assert len(mixer_angles) == len(cost_angles) + + # initial state + qaoa_circuit = qaoa_initial_circuit(n_nodes) + + # add cost and mixer terms to state + for cost, mixer in zip(cost_angles, mixer_angles): + cost_ham = qaoa_graph_to_cost_hamiltonian(edges, cost) + mixer_ham = QubitPauliOperator( + {QubitPauliString([Qubit(i)], [Pauli.X]) : mixer for i in range(n_nodes)} + ) + qaoa_circuit.append(gen_term_sequence_circuit( + cost_ham, Circuit(n_nodes))) + qaoa_circuit.append(gen_term_sequence_circuit( + mixer_ham, Circuit(n_nodes))) + + DecomposeBoxes().apply(qaoa_circuit) + return qaoa_circuit + + +def max_cut_energy(edges: List[Tuple[int, int]], results: BackendResult, maximize=False) -> float: + """ + Given the results of all shots: + - if maximize is False, return the average energy of the distribution (used for training) + - if maximize is True, return the maximum energy of the distribution (used for testing) + """ + energy = 0.0 + dist = results.get_distribution() + if maximize: + for meas in dist.keys(): + energy = max(energy, sum((meas[i] ^ meas[j]) for i, j in edges)) + else: + for i, j in edges: + energy += sum((meas[i] ^ meas[j]) * + prob for meas, prob in dist.items()) + + return energy + + +def single_edge_energy(results: BackendResult) -> float: + """ + Return the expected enery of a edge 0-1. + """ + dist = results.get_distribution() + return sum((meas[0] ^ meas[1]) * prob for meas, prob in dist.items()) + + +def qaoa_instance_simple( + graph_edges: List[Tuple[int, int]], + backend: Backend, + compiler_pass: Callable[[Circuit], bool], + guess_mixer_angles: np.array, + guess_cost_angles: np.array, + seed: int, + shots: int = 5000, +) -> float: + # step 1: get state guess + my_prep_circuit = qaoa_max_cut_circuit( + graph_edges, guess_mixer_angles, guess_cost_angles + ) + + measured_circ = my_prep_circuit.copy().measure_all() + compiler_pass(measured_circ) + res = backend.run_circuit(measured_circ, shots, seed=seed) + + return max_cut_graph_edges, res + + +def single_precompute(graph, backend, compiler_pass, shots, discretization, seed): + """ + This function precomputes the results for a small k-regular graphs for many angles. + For instance, if discretization = (10, 10, 10, 10) [param_num = 4] + Then we will return results for mixer_angles = (i/10, j/10) and + cost_angles = (k/10, l/10) for all i, j, k, l in {0, ..., 9} + These are formatted as [*mixer_angles, *cost_angles] + + """ + # print(discretization) + results = np.zeros(discretization) + for index in np.ndindex(*discretization): + true_index = np.array(index) / discretization # normalize to [0, 1] + mixer_angles = true_index[:len(index) // 2] + cost_angles = true_index[len(index) // 2:] + + # get the circuit with the final parameters of the optimisation: + circuit = qaoa_max_cut_circuit( + graph, mixer_angles, cost_angles + ) + + circuit.measure_all() + + compiler_pass(circuit) + handle = backend.process_circuit(circuit, shots, seed=seed) + res = single_edge_energy(backend.get_result(handle)) + if (sum(index[1:]) == 0): + print("Angles", mixer_angles, cost_angles) + # print("Angles", mixer_angles, cost_angles, "Energy:", res) + + results[index] = res + return results + + +def precompute(backend, compiler_pass, shots, discretization, seed): + # precompute the results for all graphs + """ + This function precomputes the results for a small k-regular graphs for many angles. + For now we only precompute for a hardcoded list of k = 3, p = 1. + Node 0 = j, Node 1 = k. + """ + # TODO: don't cheat. + x = get_subgraph_frequency(max_cut_graph) + + filter = [i != 0 for i in x] + print(sum(filter), " out of ", len(filter), " graphs are non-zero.") + + results = [] + + for graph, f in zip(SUBGRAPHS, filter): + if not f: + results.append(None) + continue + print("subgraph: ", graph) + x = single_precompute( + graph, backend, compiler_pass, shots, discretization, seed + ) + results.append(x) + print("Maximum Energy: ", np.max(x)) + + rft = np.fft.rfftn(x) + rft[4:, :, :, :] = 0 + rft[:, 4:, :, :] = 0 + rft[:, :, 4:, :] = 0 + rft[:, :, :, 4:] = 0 + + x_smooth = np.fft.irfftn(rft) + # Sum along last two axes ( we are left with mixer ) + visualize_x = np.sum(x, axis=(2, 3)) + visualize_x_smooth = np.sum(x_smooth, axis=(2, 3)) + + # Sum along the first two axes ( we are left with cost ) + visualize_y = np.sum(x, axis=(0, 1)) + visualize_y_smooth = np.sum(x_smooth, axis=(0, 1)) + + f, axarr = plt.subplots(2, 2) + axarr[0][0].imshow(visualize_x, cmap="hot", interpolation="nearest") + axarr[0][1].imshow(visualize_x_smooth, cmap="hot", + interpolation="nearest") + axarr[1][0].imshow(visualize_y, cmap="hot", interpolation="nearest") + axarr[1][1].imshow(visualize_y_smooth, cmap="hot", + interpolation="nearest") + + plt.show() + + return results + + +backend = AerBackend() +comp = backend.get_compiled_circuit + + +PRECOMPUTE = precompute(backend, + backend.default_compilation_pass(0).apply, + 5000, DISCRETIZATION, 12345) + + +input() + + +def optimize_params(nx_graph, discretization): + """ + This function optimizes the parameters for a given graph. + """ + best = -np.inf + best_mixer_angles = None + best_cost_angles = None + + freq = get_subgraph_frequency(nx_graph) + print(freq) + for index in np.ndindex(*discretization): + score = sum(PRECOMPUTE[sub][index] * freq[sub] + for sub in range(len(SUBGRAPHS)) if freq[sub] != 0) + # print(score) + # print(best) + if (score > best): + best = score + + # normalize to [0, 1] + true_index = np.array(index) / discretization + best_mixer_angles = true_index[:len(index) // 2] + best_cost_angles = true_index[len(index) // 2:] + return best_mixer_angles, best_cost_angles + + +def calculateEnergy( + graph, + backend: Backend, + compiler_pass: Callable[[Circuit], bool], + shots: int = 5000, + seed: int = 12345, +) -> float: + """ + Given a graph, first compute the best parameters for the graph. + Then, run the QAOA circuit with the best parameters. + """ + + # find the parameters for the highest energy + nx_graph = nx.Graph(graph) + best_mixer, best_cost = optimize_params(nx_graph, DISCRETIZATION) + + print("Best parameters: ", best_mixer, best_cost) + + # get the circuit with the final parameters of the optimisation: + circuit = qaoa_max_cut_circuit( + graph, best_mixer, best_cost + ) + + circuit.measure_all() + + compiler_pass(circuit) + handle = backend.process_circuit(circuit, shots, seed=seed) + + result = backend.get_result(handle) + + return result + + +if __name__ == "__main__": + res = calculateEnergy( + max_cut_graph_edges, + backend, + backend.default_compilation_pass(2).apply, + shots=100000, + seed=12345 + ) + + dist = res.get_distribution() + energy_distribution = {} + energy_colors = {} + for meas in dist.keys(): + energy = sum((meas[i] ^ meas[j]) for i, j in max_cut_graph_edges) + if energy not in energy_distribution: + energy_distribution[energy] = 0 + energy_colors[energy] = [] + energy_distribution[energy] += dist[meas] + energy_colors[energy].append(meas) + + for i in sorted(energy_distribution.keys()): + print(i, energy_distribution[i]) + + best = max(energy_distribution.keys()) + print("Best energy: ", best) + coloring = energy_colors[best][0] + nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes( + )}, node_color=["red" if coloring[node] else "blue" for node in max_cut_graph.nodes()]) + plt.show() + + # print(res) + + # plot_maxcut_results(res, 10) diff --git a/team_solutions/pineapple/maxcut_notebook-optimizecompilation-binarylifting.ipynb b/team_solutions/pineapple/maxcut_notebook-optimizecompilation-binarylifting.ipynb new file mode 100644 index 0000000..06edbf2 --- /dev/null +++ b/team_solutions/pineapple/maxcut_notebook-optimizecompilation-binarylifting.ipynb @@ -0,0 +1,1648 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a3ba3449", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## The Quantum Approximate Optimisation Algorithm (QAOA) using TKET, optimizing Compilation Time" + ] + }, + { + "cell_type": "markdown", + "id": "45668632", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## The Max-Cut problem" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9456fbeb", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "G = nx.Graph()\n", + "G.add_edges_from([(0,1), (1,2), (2,0)])\n", + "plt.figure(figsize=(2,2))\n", + "nx.draw(G, node_color=['red', 'blue', 'red'])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "cad41481", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "There are \\\\(2^3\\\\) possible assignments of colour to nodes. In general there are \\\\( 2^n \\\\). The Max-cut problem can then be stated as that of finding the colour assignment which maximises the number of edges between vertices of a different colour." + ] + }, + { + "cell_type": "markdown", + "id": "7389bbe5", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Quantum Approximate Optimization Algorithm (QAOA)\n", + "\n", + "Introduced in 'A Quantum Approximate Optimization Algorithm' (found at https://arxiv.org/abs/1411.4028). The idea is to prepare a quantum state which encodes a solution to the Max-cut problem.\n", + "\n", + "\n", + "This is a variational algorithm, which is to say that a paramaterised state is prepared, with the parameters varied to improve the solution. We will have $2p$ parameters where p is our number of layers. In particular, the state prepared has the form \n", + "\n", + "\n", + "\n", + "\\\\[ \\left| \\psi \\left( \\beta, \\gamma \\right) \\right\\rangle = U \\left( \\beta_m \\right) U \\left( \\gamma_m \\right) ... U \\left( \\beta_0 \\right) U \\left( \\gamma_0 \\right) \\left| \\psi_0 \\right\\rangle \\\\]\n", + "where\n", + "\\\\[ U \\left( \\beta_i \\right) = e^{i \\beta H_B} \\quad \\& \\quad U \\left( \\gamma_i \\right) = e^{i \\gamma H_P} \\\\]\n", + "with \\\\( H_B \\\\) and \\\\( H_P \\\\) depending on the problem instance. " + ] + }, + { + "cell_type": "markdown", + "id": "3596e66d", + "metadata": {}, + "source": [ + "## Cost function for Maxcut\n", + "$$\n", + "\\begin{equation}\n", + "C= \\sum_{(i,j)} x_i(1-x_j)\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d720b387", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "For the previous 3 vertex graph the *problem Hamiltonian* is\n", + "\\\\[ H_P = \\frac{1}{2} \\big[ \\left( Z \\otimes Z \\otimes I \\right) + \\left( Z \\otimes I \\otimes Z \\right) + \\left( I \\otimes Z \\otimes Z \\right) \\big] \\\\]\n", + "\n", + "\n", + "where you will notice that there is a \\\\( Z \\otimes Z \\\\) acting between each vertex which is connected by an edge." + ] + }, + { + "cell_type": "markdown", + "id": "8ca2e1b9", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "The *mixer Hamiltonian* has the form \n", + "\\\\[ H_B = \\left( X \\otimes I \\otimes I \\right) + \\left( I \\otimes X \\otimes I \\right) + \\left( I \\otimes I \\otimes X \\right) \\\\]\n", + "\n", + "\n", + "where you will notice that there is an \\\\( X \\\\) acting on each vertex." + ] + }, + { + "cell_type": "markdown", + "id": "de6b9e03", + "metadata": {}, + "source": [ + "## Cost function for Maxcut\n", + "\n", + "A solution to maxcut can be found by maximising the following cost function $C$ .\n", + "\n", + "\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "C= \\sum_{(i,j)} x_i(1-x_j)\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Here $x_i$ and $x_j$ are the the \"colours\" of each vertex. \n", + "\n", + "$$\n", + "\\begin{equation}\n", + "x_i,x_j \\in \\{0,1\\}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "$x_i(1-x_j)=0$ if $x_i=x_j$ and $ x_i(1-x_j)=1$ if the terms are not equal." + ] + }, + { + "cell_type": "markdown", + "id": "61d4e798", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "We want to encode our Maxcut cost function as a Hamiltonain. To do this we can perform the following translation.\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "x_i \\mapsto \\frac{1}{2}(1-Z_i)\n", + "\\end{equation}\n", + "$$\n", + "\n", + "\n", + "The Pauli Z operator can be used to distinguish between the $|0\\rangle$ and $|1\\rangle$ basis states as these are eigenstates with eigenvalues $\\pm 1$ .\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "H_P = \\frac{1}{2}\\sum_{} (-Z_j \\,Z_k +I )\n", + "\\end{equation}\n", + "$$\n", + "\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "H_B = \\sum_i X_i\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Here we use the the convention that $X_i$ means a Pauli X operator will be applied to the \"ith\" qubit and the identity operator will be applied to all other qubits in the circuit." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "aeb6abd9", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "markdown", + "id": "3cbb783a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Circuit Construction for QAOA" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "688f1332", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "\n", + "max_cut_graph_edges = [(0,1), (1,2), (1,3), (3,4), (4,5), (4,6)]\n", + "n_nodes = 7\n", + "\n", + "max_cut_graph = nx.Graph()\n", + "max_cut_graph.add_edges_from(max_cut_graph_edges)\n", + "nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes()})\n", + "\n", + "expected_results = [(0,1,0,0,1,0,0), (1,0,1,1,0,1,1)]" + ] + }, + { + "cell_type": "markdown", + "id": "18a5bd16", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Define Cost Hamiltonian: $\\gamma H$" + ] + }, + { + "cell_type": "markdown", + "id": "543f87ca", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{equation}\n", + "H_P = \\frac{1}{2}\\sum_{} (-Z_j \\,Z_k +I )\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "99226b24", + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(): 3.00000000000000, (Zq[0], Zq[1]): -0.500000000000000, (Zq[1], Zq[2]): -0.500000000000000, (Zq[1], Zq[3]): -0.500000000000000, (Zq[3], Zq[4]): -0.500000000000000, (Zq[4], Zq[5]): -0.500000000000000, (Zq[4], Zq[6]): -0.500000000000000}\n" + ] + } + ], + "source": [ + "from typing import List, Tuple, Any\n", + "from pytket.utils import QubitPauliOperator\n", + "from pytket.pauli import QubitPauliString, Pauli\n", + "from pytket import Qubit\n", + "\n", + "def qaoa_graph_to_cost_hamiltonian(edges: List[Tuple[int, int]], cost_angle: float) -> QubitPauliOperator:\n", + " qpo_dict = {QubitPauliString(): len(edges)*0.5*cost_angle}\n", + " for e in edges:\n", + " term_string = QubitPauliString([Qubit(e[0]), Qubit(e[1])], [Pauli.Z, Pauli.Z])\n", + " qpo_dict[term_string] = -0.5*cost_angle\n", + " return QubitPauliOperator(qpo_dict)\n", + "\n", + "cost_angle = 1.0\n", + "cost_ham_qpo = qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, cost_angle)\n", + "print(cost_ham_qpo)" + ] + }, + { + "cell_type": "markdown", + "id": "6da499ac", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "$$\n", + "\\begin{equation}\n", + "H_P = 3 I^{\\otimes 6} -0.5 \\big[ Z_0 Z_1 + Z_1 Z_2 +Z_1 Z_3 +Z_3 Z_4 +Z_4 Z_5 +Z_4 Z_6 \\big]\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Using the same index convention as above" + ] + }, + { + "cell_type": "markdown", + "id": "785ff56c", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Hamiltonian Circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "11fe9917", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.utils import gen_term_sequence_circuit\n", + "from pytket import Circuit\n", + "from pytket.circuit import display\n", + "\n", + "cost_ham_circuit = gen_term_sequence_circuit(cost_ham_qpo, Circuit(n_nodes))\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9057c55f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.transform import Transform\n", + "\n", + "Transform.DecomposeBoxes().apply(cost_ham_circuit)\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "4690b787", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Construction of the Mixer Hamiltonian: $\\beta B$" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "296c560d", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mixer_angle = 0.8\n", + "mixer_ham_qpo = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): mixer_angle for i in range(n_nodes)})\n", + "mixer_ham_circuit = gen_term_sequence_circuit(mixer_ham_qpo, Circuit(n_nodes))\n", + "Transform.DecomposeBoxes().apply(mixer_ham_circuit)\n", + "display.render_circuit_jupyter(mixer_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "4d128a70", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Define the Initial State" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "0a9db628", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pytket.backends.backend import Backend\n", + "from pytket.extensions.qiskit import AerBackend\n", + "\n", + "backend = AerBackend()\n", + "def qaoa_initial_circuit(n_qubits: int) -> Circuit:\n", + " c = Circuit(n_qubits)\n", + " for i in range(n_qubits):\n", + " c.H(i)\n", + " return c\n", + "\n", + "superposition_circuit = qaoa_initial_circuit(n_nodes)\n", + "\n", + "display.render_circuit_jupyter(superposition_circuit)\n", + "\n", + "Transform.DecomposeBoxes().apply(superposition_circuit)\n", + "backend.default_compilation_pass(2).apply(superposition_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "da759b59", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Construct QAOA Circuit" + ] + }, + { + "cell_type": "markdown", + "id": "359a1a0f-e92e-40ae-bbe6-ce960b118f49", + "metadata": {}, + "source": [ + "Now lets define a function to create our entire QAOA circuit. For $p$ QAOA layers we expect that our circuit will require $2p$ parameters. Here we will pass and cost mixer parameters in as a list where the length of the list defines the number of layers." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "5e97191f-9d15-4f8a-bc2a-70ea60e78553", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1.4 s, sys: 1e+03 ns, total: 1.4 s\n", + "Wall time: 1.4 s\n" + ] + } + ], + "source": [ + "%%time\n", + "cost_circuits = []\n", + "mixer_circuits = []\n", + "\n", + "for i in range(10):\n", + " cost_circuit = gen_term_sequence_circuit(qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, 1/(2**(i + 1))), Circuit(n_nodes))\n", + " mixer_circuit = gen_term_sequence_circuit(QubitPauliOperator({QubitPauliString([Qubit(j)], [Pauli.X]): 1/(2**(i + 1)) for j in range(n_nodes)}), Circuit(n_nodes))\n", + " Transform.DecomposeBoxes().apply(cost_circuit)\n", + " Transform.DecomposeBoxes().apply(mixer_circuit)\n", + " backend.default_compilation_pass(2).apply(cost_circuit)\n", + " backend.default_compilation_pass(2).apply(mixer_circuit)\n", + " cost_circuits.append(cost_circuit)\n", + " mixer_circuits.append(mixer_circuit)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "23f8910a", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_max_cut_circuit(edges: List[Tuple[int, int]],\n", + " n_nodes: int,\n", + " mixer_angles: List[int],\n", + " cost_angles: List[int]) -> Circuit:\n", + " \n", + " assert len(mixer_angles) == len(cost_angles)\n", + " \n", + " # initial state\n", + " qaoa_circuit = superposition_circuit.copy()\n", + " \n", + " \n", + " \n", + " # add cost and mixer terms to state\n", + " for cost, mixer in zip(cost_angles, mixer_angles):\n", + " for i in range(10):\n", + " if (cost & (1 << i)):\n", + " qaoa_circuit.append(cost_circuits[9 - i])\n", + " for i in range(10):\n", + " if (mixer & (1 << i)):\n", + " qaoa_circuit.append(mixer_circuits[9 - i])\n", + " \n", + " print(qaoa_circuit)\n", + " \n", + " return qaoa_circuit" + ] + }, + { + "cell_type": "markdown", + "id": "bc2f8939-41b7-476b-a5a8-09de07211079", + "metadata": {}, + "source": [ + "We also need to extract our energy expectation values from a `BackendResult` object after our circuit is processed by the device/simulator. We do this with the `get_max_cut_energy` function below. Note that the fact that the maxcut Hamiltonian contains only commuting terms means that we do not need to calculate our energy expectation using multiple measurement circuits. This may not the the case for a different problem Hamiltonian." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "df387eea-4198-428e-9b92-4f3bceb12f0e", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple\n", + "from pytket.backends.backendresult import BackendResult\n", + "\n", + "def get_max_cut_energy(edges: List[Tuple[int, int]], results: BackendResult) -> float:\n", + " energy = 0.0\n", + " dist = results.get_distribution()\n", + " for i, j in edges:\n", + " energy += sum((meas[i] ^ meas[j]) * prob for meas, prob in dist.items())\n", + "\n", + " return energy" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "e5abad7b-e989-4156-9708-3d8c97d8ca2a", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from typing import Callable\n", + "import numpy as np\n", + "\n", + "def qaoa_instance(\n", + " backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " guess_mixer_angles: np.array,\n", + " guess_cost_angles: np.array,\n", + " seed: int,\n", + " shots: int = 5000,\n", + ") -> float:\n", + " \n", + " print(\"test1\")\n", + " # step 1: get state guess\n", + " my_prep_circuit = qaoa_max_cut_circuit(\n", + " max_cut_graph_edges, n_nodes, guess_mixer_angles, guess_cost_angles\n", + " )\n", + " print(\"test2\")\n", + " measured_circ = my_prep_circuit.copy().measure_all()\n", + " res = backend.run_circuit(measured_circ, shots, seed=seed)\n", + " print(\"test3\")\n", + "\n", + " return get_max_cut_energy(max_cut_graph_edges, res)" + ] + }, + { + "cell_type": "markdown", + "id": "2c01c28b", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Optimise Energy by Guessing Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "0a44bed8", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_optimise_energy(compiler_pass: Callable[[Circuit], bool],\n", + " backend: Backend,\n", + " iterations: int = 100,\n", + " n: int = 3,\n", + " shots: int = 5000,\n", + " seed: int= 12345):\n", + " \n", + " highest_energy = 0 \n", + " best_guess_mixer_angles = [0 for i in range(n)] \n", + " best_guess_cost_angles = [0 for i in range(n)]\n", + " rng = np.random.default_rng(seed)\n", + " # guess some angles (iterations)-times and try if they are better than the best angles found before\n", + " \n", + " for i in range(iterations):\n", + " \n", + " guess_mixer_angles = rng.integers(0, 1024, n)\n", + " guess_cost_angles = rng.integers(0, 1024, n)\n", + " \n", + " qaoa_energy = qaoa_instance(backend,\n", + " compiler_pass,\n", + " guess_mixer_angles,\n", + " guess_cost_angles,\n", + " seed=seed,\n", + " shots=shots)\n", + " \n", + " if(qaoa_energy > highest_energy):\n", + " \n", + " print(\"new highest energy found: \", qaoa_energy)\n", + " \n", + " best_guess_mixer_angles = np.round(guess_mixer_angles, 3)\n", + " best_guess_cost_angles = np.round(guess_cost_angles, 3)\n", + " highest_energy = qaoa_energy\n", + " print(\"iteration: \", i)\n", + " \n", + " print(\"highest energy: \", highest_energy)\n", + " print(\"best guess mixer angles: \", best_guess_mixer_angles)\n", + " print(\"best guess cost angles: \", best_guess_cost_angles)\n", + " return best_guess_mixer_angles, best_guess_cost_angles" + ] + }, + { + "cell_type": "markdown", + "id": "d22226cc", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Calculate the State for the final Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "da46e63d", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_calculate(backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " shots: int = 5000,\n", + " iterations: int = 100,\n", + " seed: int = 12345,\n", + " ) -> BackendResult:\n", + " \n", + " # find the parameters for the highest energy\n", + " best_mixer, best_cost = qaoa_optimise_energy(compiler_pass,\n", + " backend,\n", + " iterations,\n", + " 3,\n", + " shots=shots,\n", + " seed=seed)\n", + " \n", + " # get the circuit with the final parameters of the optimisation:\n", + " my_qaoa_circuit = qaoa_max_cut_circuit(max_cut_graph_edges,\n", + " n_nodes,\n", + " best_mixer,\n", + " best_cost)\n", + "\n", + " my_qaoa_circuit.measure_all()\n", + "\n", + " compiler_pass(my_qaoa_circuit)\n", + " handle = backend.process_circuit(my_qaoa_circuit, shots, seed=seed)\n", + "\n", + " result = backend.get_result(handle) \n", + " \n", + " return result" + ] + }, + { + "cell_type": "markdown", + "id": "9dd97e10", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Results with the Noiseless Simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "e7afb38e", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "from pytket.extensions.qiskit import AerBackend\n", + "\n", + "backend = AerBackend()\n", + "comp = backend.get_compiled_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "aaea7e2f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "test1\n", + "\n", + "test2\n", + "test3\n", + "new highest energy found: 1.8900000000000001\n", + "iteration: 0\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "new highest energy found: 2.1818\n", + "iteration: 1\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "new highest energy found: 3.0740000000000007\n", + "iteration: 2\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 3\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 4\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "new highest energy found: 3.314199999999999\n", + "iteration: 5\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 6\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 7\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "new highest energy found: 4.2726\n", + "iteration: 8\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 9\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 10\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 11\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 12\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 13\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 14\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 15\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 16\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 17\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 18\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 19\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 20\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 21\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 22\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 23\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 24\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 25\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 26\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 27\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 28\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 29\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 30\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 31\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 32\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 33\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 34\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 35\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 36\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 37\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 38\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 39\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 40\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "new highest energy found: 4.7476\n", + "iteration: 41\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 42\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 43\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 44\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 45\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 46\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 47\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 48\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 49\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 50\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 51\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 52\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 53\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 54\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 55\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 56\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "new highest energy found: 4.8962\n", + "iteration: 57\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 58\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 59\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 60\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 61\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 62\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 63\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 64\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 65\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 66\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 67\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 68\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 69\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 70\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 71\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 72\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 73\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 74\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 75\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 76\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 77\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 78\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 79\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 80\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 81\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 82\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 83\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 84\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 85\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 86\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 87\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 88\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 89\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 90\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 91\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 92\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 93\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 94\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 95\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 96\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 97\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 98\n", + "test1\n", + "\n", + "test2\n", + "test3\n", + "iteration: 99\n", + "highest energy: 4.8962\n", + "best guess mixer angles: [293 132 142]\n", + "best guess cost angles: [401 814 329]\n", + "\n", + "CPU times: user 13.7 s, sys: 12.1 ms, total: 13.7 s\n", + "Wall time: 13.6 s\n" + ] + } + ], + "source": [ + "%%time\n", + "res = qaoa_calculate(backend, backend.default_compilation_pass(2).apply, shots = 5000, iterations = 100, seed=14839)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "3b86301e-7645-4553-be38-3ebf89eedd37", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success ratio 0.3734 \n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from maxcut_plotting import plot_maxcut_results\n", + "\n", + "plot_maxcut_results(res, 6)" + ] + }, + { + "cell_type": "markdown", + "id": "6e36c4fb-a118-4ab8-be01-77a674f273e3", + "metadata": {}, + "source": [ + "Here the binary strings in the results correspond to the two optimal colourings of our graph." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "ffce2a97-902c-44d8-8d64-b25498752907", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = nx.Graph()\n", + "G.add_edges_from(max_cut_graph_edges)\n", + "\n", + "H = nx.Graph()\n", + "H.add_edges_from(max_cut_graph_edges)\n", + "\n", + "plt.figure(1)\n", + "nx.draw(G, labels={node: node for node in max_cut_graph.nodes()}, node_color= ['red', 'blue', 'red','red', 'blue', 'red', 'red'])\n", + "plt.figure(2)\n", + "nx.draw(H, labels={node: node for node in max_cut_graph.nodes()}, node_color= ['blue', 'red', 'blue', 'blue', 'red', 'blue', 'blue'])\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c4f545a-011b-44b5-943d-c520f4cb3483", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3 [Default]", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + }, + "vscode": { + "interpreter": { + "hash": "3289aa74b4cc5b65254d7b081e6c83acb4efa1b1c1d2fe845644451ee4b44b02" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/team_solutions/pineapple/maxcut_notebook.ipynb b/team_solutions/pineapple/maxcut_notebook.ipynb new file mode 100644 index 0000000..2f68c70 --- /dev/null +++ b/team_solutions/pineapple/maxcut_notebook.ipynb @@ -0,0 +1,1081 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a3ba3449", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## The Quantum Approximate Optimisation Algorithm (QAOA) using TKET.\n", + "\n", + "Callum Macpherson" + ] + }, + { + "cell_type": "markdown", + "id": "45668632", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## The Max-Cut problem" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9456fbeb", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "G = nx.Graph()\n", + "G.add_edges_from([(0,1), (1,2), (2,0)])\n", + "plt.figure(figsize=(2,2))\n", + "nx.draw(G, node_color=['red', 'blue', 'red'])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "cad41481", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "There are \\\\(2^3\\\\) possible assignments of colour to nodes. In general there are \\\\( 2^n \\\\). The Max-cut problem can then be stated as that of finding the colour assignment which maximises the number of edges between vertices of a different colour." + ] + }, + { + "cell_type": "markdown", + "id": "7389bbe5", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Quantum Approximate Optimization Algorithm (QAOA)\n", + "\n", + "Introduced in 'A Quantum Approximate Optimization Algorithm' (found at https://arxiv.org/abs/1411.4028). The idea is to prepare a quantum state which encodes a solution to the Max-cut problem.\n", + "\n", + "\n", + "This is a variational algorithm, which is to say that a paramaterised state is prepared, with the parameters varied to improve the solution. We will have $2p$ parameters where p is our number of layers. In particular, the state prepared has the form \n", + "\n", + "\n", + "\n", + "\\\\[ \\left| \\psi \\left( \\beta, \\gamma \\right) \\right\\rangle = U \\left( \\beta_m \\right) U \\left( \\gamma_m \\right) ... U \\left( \\beta_0 \\right) U \\left( \\gamma_0 \\right) \\left| \\psi_0 \\right\\rangle \\\\]\n", + "where\n", + "\\\\[ U \\left( \\beta_i \\right) = e^{i \\beta H_B} \\quad \\& \\quad U \\left( \\gamma_i \\right) = e^{i \\gamma H_P} \\\\]\n", + "with \\\\( H_B \\\\) and \\\\( H_P \\\\) depending on the problem instance. " + ] + }, + { + "cell_type": "markdown", + "id": "3596e66d", + "metadata": {}, + "source": [ + "## Cost function for Maxcut\n", + "$$\n", + "\\begin{equation}\n", + "C= \\sum_{(i,j)} x_i(1-x_j)\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d720b387", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "For the previous 3 vertex graph the *problem Hamiltonian* is\n", + "\\\\[ H_P = \\frac{1}{2} \\big[ \\left( Z \\otimes Z \\otimes I \\right) + \\left( Z \\otimes I \\otimes Z \\right) + \\left( I \\otimes Z \\otimes Z \\right) \\big] \\\\]\n", + "\n", + "\n", + "where you will notice that there is a \\\\( Z \\otimes Z \\\\) acting between each vertex which is connected by an edge." + ] + }, + { + "cell_type": "markdown", + "id": "8ca2e1b9", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "The *mixer Hamiltonian* has the form \n", + "\\\\[ H_B = \\left( X \\otimes I \\otimes I \\right) + \\left( I \\otimes X \\otimes I \\right) + \\left( I \\otimes I \\otimes X \\right) \\\\]\n", + "\n", + "\n", + "where you will notice that there is an \\\\( X \\\\) acting on each vertex." + ] + }, + { + "cell_type": "markdown", + "id": "de6b9e03", + "metadata": {}, + "source": [ + "## Cost function for Maxcut\n", + "\n", + "A solution to maxcut can be found by maximising the following cost function $C$ .\n", + "\n", + "\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "C= \\sum_{(i,j)} x_i(1-x_j)\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Here $x_i$ and $x_j$ are the the \"colours\" of each vertex. \n", + "\n", + "$$\n", + "\\begin{equation}\n", + "x_i,x_j \\in \\{0,1\\}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "$x_i(1-x_j)=0$ if $x_i=x_j$ and $ x_i(1-x_j)=1$ if the terms are not equal." + ] + }, + { + "cell_type": "markdown", + "id": "61d4e798", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "We want to encode our Maxcut cost function as a Hamiltonain. To do this we can perform the following translation.\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "x_i \\mapsto \\frac{1}{2}(1-Z_i)\n", + "\\end{equation}\n", + "$$\n", + "\n", + "\n", + "The Pauli Z operator can be used to distinguish between the $|0\\rangle$ and $|1\\rangle$ basis states as these are eigenstates with eigenvalues $\\pm 1$ .\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "H_P = \\frac{1}{2}\\sum_{} (-Z_j \\,Z_k +I )\n", + "\\end{equation}\n", + "$$\n", + "\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "H_B = \\sum_i X_i\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Here we use the the convention that $X_i$ means a Pauli X operator will be applied to the \"ith\" qubit and the identity operator will be applied to all other qubits in the circuit." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "aeb6abd9", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "markdown", + "id": "3cbb783a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Circuit Construction for QAOA" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "688f1332", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "\n", + "max_cut_graph_edges = [(0,1), (1,2), (1,3), (3,4), (4,5), (4,6)]\n", + "n_nodes = 7\n", + "\n", + "max_cut_graph = nx.Graph()\n", + "max_cut_graph.add_edges_from(max_cut_graph_edges)\n", + "nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes()})\n", + "\n", + "expected_results = [(0,1,0,0,1,0,0), (1,0,1,1,0,1,1)]" + ] + }, + { + "cell_type": "markdown", + "id": "18a5bd16", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Define Cost Hamiltonian: $\\gamma H$" + ] + }, + { + "cell_type": "markdown", + "id": "543f87ca", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{equation}\n", + "H_P = \\frac{1}{2}\\sum_{} (-Z_j \\,Z_k +I )\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "99226b24", + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(): 3.00000000000000, (Zq[0], Zq[1]): -0.500000000000000, (Zq[1], Zq[2]): -0.500000000000000, (Zq[1], Zq[3]): -0.500000000000000, (Zq[3], Zq[4]): -0.500000000000000, (Zq[4], Zq[5]): -0.500000000000000, (Zq[4], Zq[6]): -0.500000000000000}\n" + ] + } + ], + "source": [ + "from typing import List, Tuple, Any\n", + "from pytket.utils import QubitPauliOperator\n", + "from pytket.pauli import QubitPauliString, Pauli\n", + "from pytket import Qubit\n", + "\n", + "def qaoa_graph_to_cost_hamiltonian(edges: List[Tuple[int, int]], cost_angle: float) -> QubitPauliOperator:\n", + " qpo_dict = {QubitPauliString(): len(edges)*0.5*cost_angle}\n", + " for e in edges:\n", + " term_string = QubitPauliString([Qubit(e[0]), Qubit(e[1])], [Pauli.Z, Pauli.Z])\n", + " qpo_dict[term_string] = -0.5*cost_angle\n", + " return QubitPauliOperator(qpo_dict)\n", + "\n", + "cost_angle = 1.0\n", + "cost_ham_qpo = qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, cost_angle)\n", + "print(cost_ham_qpo)" + ] + }, + { + "cell_type": "markdown", + "id": "6da499ac", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "$$\n", + "\\begin{equation}\n", + "H_P = 3 I^{\\otimes 6} -0.5 \\big[ Z_0 Z_1 + Z_1 Z_2 +Z_1 Z_3 +Z_3 Z_4 +Z_4 Z_5 +Z_4 Z_6 \\big]\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Using the same index convention as above" + ] + }, + { + "cell_type": "markdown", + "id": "785ff56c", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Hamiltonian Circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "11fe9917", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.utils import gen_term_sequence_circuit\n", + "from pytket import Circuit\n", + "from pytket.circuit import display\n", + "\n", + "cost_ham_circuit = gen_term_sequence_circuit(cost_ham_qpo, Circuit(n_nodes))\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "9057c55f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.transform import Transform\n", + "\n", + "Transform.DecomposeBoxes().apply(cost_ham_circuit)\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "4690b787", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Construction of the Mixer Hamiltonian: $\\beta B$" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "296c560d", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mixer_angle = 0.8\n", + "mixer_ham_qpo = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): mixer_angle for i in range(n_nodes)})\n", + "mixer_ham_circuit = gen_term_sequence_circuit(mixer_ham_qpo, Circuit(n_nodes))\n", + "Transform.DecomposeBoxes().apply(mixer_ham_circuit)\n", + "display.render_circuit_jupyter(mixer_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "4d128a70", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Define the Initial State" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "0a9db628", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def qaoa_initial_circuit(n_qubits: int) -> Circuit:\n", + " c = Circuit(n_qubits)\n", + " for i in range(n_qubits):\n", + " c.H(i)\n", + " return c\n", + "\n", + "superposition_circuit = qaoa_initial_circuit(n_nodes)\n", + "\n", + "display.render_circuit_jupyter(superposition_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "da759b59", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Construct QAOA Circuit" + ] + }, + { + "cell_type": "markdown", + "id": "359a1a0f-e92e-40ae-bbe6-ce960b118f49", + "metadata": {}, + "source": [ + "Now lets define a function to create our entire QAOA circuit. For $p$ QAOA layers we expect that our circuit will require $2p$ parameters. Here we will pass and cost mixer parameters in as a list where the length of the list defines the number of layers." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "23f8910a", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_max_cut_circuit(edges: List[Tuple[int, int]],\n", + " n_nodes: int,\n", + " mixer_angles: List[float],\n", + " cost_angles: List[float]) -> Circuit:\n", + " \n", + " assert len(mixer_angles) == len(cost_angles)\n", + " \n", + " # initial state\n", + " qaoa_circuit = qaoa_initial_circuit(n_nodes)\n", + " \n", + " # add cost and mixer terms to state\n", + " for cost, mixer in zip(cost_angles, mixer_angles):\n", + " cost_ham = qaoa_graph_to_cost_hamiltonian(edges, cost)\n", + " mixer_ham = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): mixer for i in range(n_nodes)})\n", + " qaoa_circuit.append(gen_term_sequence_circuit(cost_ham, Circuit(n_nodes)))\n", + " qaoa_circuit.append(gen_term_sequence_circuit(mixer_ham, Circuit(n_nodes)))\n", + " \n", + " Transform.DecomposeBoxes().apply(qaoa_circuit)\n", + " return qaoa_circuit" + ] + }, + { + "cell_type": "markdown", + "id": "bc2f8939-41b7-476b-a5a8-09de07211079", + "metadata": {}, + "source": [ + "We also need to extract our energy expectation values from a `BackendResult` object after our circuit is processed by the device/simulator. We do this with the `get_max_cut_energy` function below. Note that the fact that the maxcut Hamiltonian contains only commuting terms means that we do not need to calculate our energy expectation using multiple measurement circuits. This may not the the case for a different problem Hamiltonian." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "df387eea-4198-428e-9b92-4f3bceb12f0e", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple\n", + "from pytket.backends.backendresult import BackendResult\n", + "\n", + "def get_max_cut_energy(edges: List[Tuple[int, int]], results: BackendResult) -> float:\n", + " energy = 0.0\n", + " dist = results.get_distribution()\n", + " for i, j in edges:\n", + " energy += sum((meas[i] ^ meas[j]) * prob for meas, prob in dist.items())\n", + "\n", + " return energy" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e5abad7b-e989-4156-9708-3d8c97d8ca2a", + "metadata": {}, + "outputs": [], + "source": [ + "from pytket.backends.backend import Backend\n", + "from typing import Callable\n", + "import numpy as np\n", + "\n", + "def qaoa_instance(\n", + " backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " guess_mixer_angles: np.array,\n", + " guess_cost_angles: np.array,\n", + " seed: int,\n", + " shots: int = 5000,\n", + ") -> float:\n", + " # step 1: get state guess\n", + " my_prep_circuit = qaoa_max_cut_circuit(\n", + " max_cut_graph_edges, n_nodes, guess_mixer_angles, guess_cost_angles\n", + " )\n", + " measured_circ = my_prep_circuit.copy().measure_all()\n", + " compiler_pass(measured_circ)\n", + " res = backend.run_circuit(measured_circ, shots, seed=seed)\n", + "\n", + " return get_max_cut_energy(max_cut_graph_edges, res)" + ] + }, + { + "cell_type": "markdown", + "id": "2c01c28b", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Optimise Energy by Guessing Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0a44bed8", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_optimise_energy(compiler_pass: Callable[[Circuit], bool],\n", + " backend: Backend,\n", + " iterations: int = 100,\n", + " n: int = 3,\n", + " shots: int = 5000,\n", + " seed: int= 12345):\n", + " \n", + " highest_energy = 0 \n", + " best_guess_mixer_angles = [0 for i in range(n)] \n", + " best_guess_cost_angles = [0 for i in range(n)]\n", + " rng = np.random.default_rng(seed)\n", + " # guess some angles (iterations)-times and try if they are better than the best angles found before\n", + " \n", + " for i in range(iterations):\n", + " \n", + " guess_mixer_angles = rng.uniform(0, 1, n)\n", + " guess_cost_angles = rng.uniform(0, 1, n)\n", + " \n", + " qaoa_energy = qaoa_instance(backend,\n", + " compiler_pass,\n", + " guess_mixer_angles,\n", + " guess_cost_angles,\n", + " seed=seed,\n", + " shots=shots)\n", + " \n", + " if(qaoa_energy > highest_energy):\n", + " \n", + " print(\"new highest energy found: \", qaoa_energy)\n", + " \n", + " best_guess_mixer_angles = np.round(guess_mixer_angles, 3)\n", + " best_guess_cost_angles = np.round(guess_cost_angles, 3)\n", + " highest_energy = qaoa_energy\n", + " \n", + " print(\"highest energy: \", highest_energy)\n", + " print(\"best guess mixer angles: \", best_guess_mixer_angles)\n", + " print(\"best guess cost angles: \", best_guess_cost_angles)\n", + " return best_guess_mixer_angles, best_guess_cost_angles" + ] + }, + { + "cell_type": "markdown", + "id": "d22226cc", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Calculate the State for the final Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "da46e63d", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_calculate(backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " shots: int = 5000,\n", + " iterations: int = 100,\n", + " seed: int = 12345,\n", + " ) -> BackendResult:\n", + " \n", + " # find the parameters for the highest energy\n", + " best_mixer, best_cost = qaoa_optimise_energy(compiler_pass,\n", + " backend,\n", + " iterations,\n", + " 3,\n", + " shots=shots,\n", + " seed=seed)\n", + " \n", + " # get the circuit with the final parameters of the optimisation:\n", + " my_qaoa_circuit = qaoa_max_cut_circuit(max_cut_graph_edges,\n", + " n_nodes,\n", + " best_mixer,\n", + " best_cost)\n", + "\n", + " my_qaoa_circuit.measure_all()\n", + "\n", + " compiler_pass(my_qaoa_circuit)\n", + " handle = backend.process_circuit(my_qaoa_circuit, shots, seed=seed)\n", + "\n", + " result = backend.get_result(handle) \n", + " \n", + " return result" + ] + }, + { + "cell_type": "markdown", + "id": "9dd97e10", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Results with the Noiseless Simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "e7afb38e", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "from pytket.extensions.qiskit import AerBackend\n", + "\n", + "backend = AerBackend()\n", + "comp = backend.get_compiled_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "aaea7e2f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "new highest energy found: 3.1432\n", + "new highest energy found: 3.283599999999999\n", + "new highest energy found: 4.361\n", + "new highest energy found: 4.925600000000001\n", + "new highest energy found: 4.941999999999999\n", + "highest energy: 4.941999999999999\n", + "best guess mixer angles: [0.392 0.247 0.138]\n", + "best guess cost angles: [0.592 0.738 0.608]\n", + "CPU times: user 35.1 s, sys: 7.19 ms, total: 35.1 s\n", + "Wall time: 35.1 s\n" + ] + } + ], + "source": [ + "%%time\n", + "res = qaoa_calculate(backend, backend.default_compilation_pass(2).apply, shots = 5000, iterations = 100, seed=12345)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3b86301e-7645-4553-be38-3ebf89eedd37", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success ratio 0.4252 \n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from maxcut_plotting import plot_maxcut_results\n", + "\n", + "plot_maxcut_results(res, 6)" + ] + }, + { + "cell_type": "markdown", + "id": "6e36c4fb-a118-4ab8-be01-77a674f273e3", + "metadata": {}, + "source": [ + "Here the binary strings in the results correspond to the two optimal colourings of our graph." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "ffce2a97-902c-44d8-8d64-b25498752907", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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uZLHHnuMlJQUrrvuOtNxXELF50L/+Mc/+P7771myZInpKCIil7V7925uv/12kpKSiPO0naWdSMXnQrm5ucTExDBr1izi4+NNxxERKVFOTg6tWrViwIABDBo0yHQcl1LxudiSJUsYN24cW7dupfyVbHYnIuJiDoeDnj17EhISwsyZM33yvN75tLjFxbp27UrlypWZMWOG6SgiIsV69dVX2b17N2+//bbPlx5oxOcW27dv59577yUtLY3KlSubjiMi8ocvv/ySPn36sGXLFmrVqmU6jluo+NzkySefJCAggKlTp5qOIiICwN69e4mNjWXRokW2Woeg4nOTo0ePEhMTQ3JyMjfccIPpOCJic6dOnaJ169b07duXoUOHmo7jVio+N5o6dSrLly9n1apVtphHFxHP5HA46PP77RPmzp1ru59HWtziRk8++SS//PILn3zyiekoImJjU6dOZceOHT65HVlpaMTnZqtXr2bgwIHs2LGD4OBg03FExGaSk5Pp0aMHmzZtom7duqbjGKERn5u1bduWJk2aMGXKFNNRRMRmMjIy6NmzJ/PmzbNt6YFGfEbs3r2bli1b8u9//5saNWqYjiMiNpCbm0tcXBw9evQgISHBdByjVHyGjBo1igMHDjBnzhzTUUTExzkcDh599FHy8vJYuHChLc/rnU/FZ8jJkyeJjo5m6dKlxMbGmo4jIj7szTff5N1332Xjxo26RygqPqPmzJnDtGnT2LRpE/7+Ot0qIs63fv16HnroIb7++msaNGhgOo5H0E9bgx555BH8/f013SkiLnHgwAEefvhhZs+erdI7j0Z8hm3ZsoVOnTqRlpZGxYoVTccRER9x+vRp7rzzTh588EFGjRplOo5HUfF5gH79+hEVFcWkSZNMRxERH/HEE0/w22+/sWTJEtsvZrmQis8DHDx4kCZNmrBx40YaNmxoOo6IeLnp06fz+uuvs2nTJipUqGA6jsdR8XmISZMmsWHDBm1nJiJXZePGjTz44INs2LBBX6RLoMUtHmLo0KGkpqbyxRdfmI4iIl7q4MGDdOvWjQ8++ECldwkqPg8RFBTE5MmTGTZsGGfOnDEdR0S8TH5+Pl27dmXAgAF06NDBdByPpuLzIB07dqRWrVq8+eabpqOIiJcZOnQoVatW5fnnnzcdxePpHJ+HSU1NpU2bNuzcuZOqVauajiMiXmDmzJm8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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = nx.Graph()\n", + "G.add_edges_from(max_cut_graph_edges)\n", + "\n", + "H = nx.Graph()\n", + "H.add_edges_from(max_cut_graph_edges)\n", + "\n", + "plt.figure(1)\n", + "nx.draw(G, labels={node: node for node in max_cut_graph.nodes()}, node_color= ['red', 'blue', 'red','red', 'blue', 'red', 'red'])\n", + "plt.figure(2)\n", + "nx.draw(H, labels={node: node for node in max_cut_graph.nodes()}, node_color= ['blue', 'red', 'blue', 'blue', 'red', 'blue', 'blue'])\n", + "\n", + "plt.show()" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3 [Default]", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + }, + "vscode": { + "interpreter": { + "hash": "3289aa74b4cc5b65254d7b081e6c83acb4efa1b1c1d2fe845644451ee4b44b02" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/team_solutions/pineapple/maxcut_notebook_precompute_all.ipynb b/team_solutions/pineapple/maxcut_notebook_precompute_all.ipynb new file mode 100644 index 0000000..bb3585f --- /dev/null +++ b/team_solutions/pineapple/maxcut_notebook_precompute_all.ipynb @@ -0,0 +1,1377 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a3ba3449", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## The Quantum Approximate Optimisation Algorithm (QAOA) using TKET, optimizing Compilation Time" + ] + }, + { + "cell_type": "markdown", + "id": "45668632", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## The Max-Cut problem" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9456fbeb", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "G = nx.Graph()\n", + "G.add_edges_from([(0,1), (1,2), (2,0)])\n", + "plt.figure(figsize=(2,2))\n", + "nx.draw(G, node_color=['red', 'blue', 'red'])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "cad41481", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "There are \\\\(2^3\\\\) possible assignments of colour to nodes. In general there are \\\\( 2^n \\\\). The Max-cut problem can then be stated as that of finding the colour assignment which maximises the number of edges between vertices of a different colour." + ] + }, + { + "cell_type": "markdown", + "id": "7389bbe5", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Quantum Approximate Optimization Algorithm (QAOA)\n", + "\n", + "Introduced in 'A Quantum Approximate Optimization Algorithm' (found at https://arxiv.org/abs/1411.4028). The idea is to prepare a quantum state which encodes a solution to the Max-cut problem.\n", + "\n", + "\n", + "This is a variational algorithm, which is to say that a paramaterised state is prepared, with the parameters varied to improve the solution. We will have $2p$ parameters where p is our number of layers. In particular, the state prepared has the form \n", + "\n", + "\n", + "\n", + "\\\\[ \\left| \\psi \\left( \\beta, \\gamma \\right) \\right\\rangle = U \\left( \\beta_m \\right) U \\left( \\gamma_m \\right) ... U \\left( \\beta_0 \\right) U \\left( \\gamma_0 \\right) \\left| \\psi_0 \\right\\rangle \\\\]\n", + "where\n", + "\\\\[ U \\left( \\beta_i \\right) = e^{i \\beta H_B} \\quad \\& \\quad U \\left( \\gamma_i \\right) = e^{i \\gamma H_P} \\\\]\n", + "with \\\\( H_B \\\\) and \\\\( H_P \\\\) depending on the problem instance. " + ] + }, + { + "cell_type": "markdown", + "id": "3596e66d", + "metadata": {}, + "source": [ + "## Cost function for Maxcut\n", + "$$\n", + "\\begin{equation}\n", + "C= \\sum_{(i,j)} x_i(1-x_j)\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d720b387", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "For the previous 3 vertex graph the *problem Hamiltonian* is\n", + "\\\\[ H_P = \\frac{1}{2} \\big[ \\left( Z \\otimes Z \\otimes I \\right) + \\left( Z \\otimes I \\otimes Z \\right) + \\left( I \\otimes Z \\otimes Z \\right) \\big] \\\\]\n", + "\n", + "\n", + "where you will notice that there is a \\\\( Z \\otimes Z \\\\) acting between each vertex which is connected by an edge." + ] + }, + { + "cell_type": "markdown", + "id": "8ca2e1b9", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "The *mixer Hamiltonian* has the form \n", + "\\\\[ H_B = \\left( X \\otimes I \\otimes I \\right) + \\left( I \\otimes X \\otimes I \\right) + \\left( I \\otimes I \\otimes X \\right) \\\\]\n", + "\n", + "\n", + "where you will notice that there is an \\\\( X \\\\) acting on each vertex." + ] + }, + { + "cell_type": "markdown", + "id": "de6b9e03", + "metadata": {}, + "source": [ + "## Cost function for Maxcut\n", + "\n", + "A solution to maxcut can be found by maximising the following cost function $C$ .\n", + "\n", + "\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "C= \\sum_{(i,j)} x_i(1-x_j)\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Here $x_i$ and $x_j$ are the the \"colours\" of each vertex. \n", + "\n", + "$$\n", + "\\begin{equation}\n", + "x_i,x_j \\in \\{0,1\\}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "$x_i(1-x_j)=0$ if $x_i=x_j$ and $ x_i(1-x_j)=1$ if the terms are not equal." + ] + }, + { + "cell_type": "markdown", + "id": "61d4e798", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "We want to encode our Maxcut cost function as a Hamiltonain. To do this we can perform the following translation.\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "x_i \\mapsto \\frac{1}{2}(1-Z_i)\n", + "\\end{equation}\n", + "$$\n", + "\n", + "\n", + "The Pauli Z operator can be used to distinguish between the $|0\\rangle$ and $|1\\rangle$ basis states as these are eigenstates with eigenvalues $\\pm 1$ .\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "H_P = \\frac{1}{2}\\sum_{} (-Z_j \\,Z_k +I )\n", + "\\end{equation}\n", + "$$\n", + "\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "H_B = \\sum_i X_i\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Here we use the the convention that $X_i$ means a Pauli X operator will be applied to the \"ith\" qubit and the identity operator will be applied to all other qubits in the circuit." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "aeb6abd9", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "markdown", + "id": "3cbb783a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Circuit Construction for QAOA" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "688f1332", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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e7cmTpwY65EAWAQrPljO7t27VVBQoJycHL355ptED0BYWPHBMrxer371q1/pj3/8o/70pz9p3rx5sR4JgAURPljCe++9p4ULFyolJUVVVVXKysqK9UgALIpTnTC9J554QtOnT9eCBQv04osvEj0AZ4UVH0yrra1N3//+97V371699NJLmjJlSqxHAjACsOKDKe3bt0+FhYVyuVyqqKggegCGDCs+mEogEND999+vBx54QKtXr9aCBQtiPRKAEYbwwTSOHz+uW265Rd3d3dq/f78+97nPxXokACMQpzphCs8++6yKiopUXFysnTt3Ej0AUcOKDzHV2dmpu+66Sy+88IKeeeYZzZo1K9YjARjhWPEhZt566y1NmzZNzc3Nqq6uJnoAhgXhw7AzDEMPPfSQrrnmGt1111168sknlZqaGuuxAMQJTnViWDU1Nen222/XBx98oD179ugLX/hCrEcCEGdY8WHYbN++XQUFBcrPzyd6AGKGFR+irru7W/fcc482bdqk9evX69prr431SADiGOFDWJrau1RWUaea+la1enxKcTuVn5WiBUU5ShudEHT8O++8o5tuuknZ2dmqrq5Wenp6DKYGgE/ZDMMwYj0EzO/AsRatLq/VriONkqQuX+D0fW6nXYakkrx0LSnO1eTxqTIMQ+vXr9dPfvIT/eIXv9CSJUtks9liND0AfIrwYUAb9x7Vim018vj86u9Pi80muZ0OLZt9gXY++iu99dZbevLJJ3XZZZcN37AAMADCh36dit4hdXoDAx/cw9elS73vqOy+HyoxMTF6wwFABLiqE306cKxFK7bVhIye9+RxvX//DWraujL4gc4EvZsyWe80dw3DlAAQHsKHPq0ur5XH5w9538mX1yohu+/tCB6fX2vKa6M1GgBEjPAhpKb2Lu060hjyNb2Og7tkd58j9wWT+3y8YUg7DzequZ1VHwBzIXwIqayiLuTtga5/qOW1TRp7zXcHfA6bpLLK0M8DALFC+BAkEAio+mhjry0LPVp2b9DoyXPkTDl3wOfx+AKqOdEWjREBIGKW2cAe7sZp9BYIBNTU1KSGhobTX/X19SF/3tTUpMwF/ybnBYW9nqO74V153j+g7Nt+P+j/bqvHO9S/FAA4K6bfzhDuxul4MlDMzvxxU1OTxowZo8zMzNNfWVlZIX+ckZGhn2x5W/9Z/UGv/17rvmfV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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "\n", + "max_cut_graph_edges = [(0,1), (1,2), (1,3), (3,4), (4,5), (4,6)]\n", + "n_nodes = 7\n", + "\n", + "max_cut_graph = nx.Graph()\n", + "max_cut_graph.add_edges_from(max_cut_graph_edges)\n", + "nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes()})\n", + "\n", + "expected_results = [(0,1,0,0,1,0,0), (1,0,1,1,0,1,1)]" + ] + }, + { + "cell_type": "markdown", + "id": "18a5bd16", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Define Cost Hamiltonian: $\\gamma H$" + ] + }, + { + "cell_type": "markdown", + "id": "543f87ca", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{equation}\n", + "H_P = \\frac{1}{2}\\sum_{} (-Z_j \\,Z_k +I )\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "99226b24", + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(): 3.00000000000000, (Zq[0], Zq[1]): -0.500000000000000, (Zq[1], Zq[2]): -0.500000000000000, (Zq[1], Zq[3]): -0.500000000000000, (Zq[3], Zq[4]): -0.500000000000000, (Zq[4], Zq[5]): -0.500000000000000, (Zq[4], Zq[6]): -0.500000000000000}\n" + ] + } + ], + "source": [ + "from typing import List, Tuple, Any\n", + "from pytket.utils import QubitPauliOperator\n", + "from pytket.pauli import QubitPauliString, Pauli\n", + "from pytket import Qubit\n", + "\n", + "def qaoa_graph_to_cost_hamiltonian(edges: List[Tuple[int, int]], cost_angle: float) -> QubitPauliOperator:\n", + " qpo_dict = {QubitPauliString(): len(edges)*0.5*cost_angle}\n", + " for e in edges:\n", + " term_string = QubitPauliString([Qubit(e[0]), Qubit(e[1])], [Pauli.Z, Pauli.Z])\n", + " qpo_dict[term_string] = -0.5*cost_angle\n", + " return QubitPauliOperator(qpo_dict)\n", + "\n", + "cost_angle = 1.0\n", + "cost_ham_qpo = qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, cost_angle)\n", + "print(cost_ham_qpo)" + ] + }, + { + "cell_type": "markdown", + "id": "6da499ac", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "$$\n", + "\\begin{equation}\n", + "H_P = 3 I^{\\otimes 6} -0.5 \\big[ Z_0 Z_1 + Z_1 Z_2 +Z_1 Z_3 +Z_3 Z_4 +Z_4 Z_5 +Z_4 Z_6 \\big]\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Using the same index convention as above" + ] + }, + { + "cell_type": "markdown", + "id": "785ff56c", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Hamiltonian Circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "11fe9917", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.utils import gen_term_sequence_circuit\n", + "from pytket import Circuit\n", + "from pytket.circuit import display\n", + "\n", + "cost_ham_circuit = gen_term_sequence_circuit(cost_ham_qpo, Circuit(n_nodes))\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9057c55f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.transform import Transform\n", + "\n", + "Transform.DecomposeBoxes().apply(cost_ham_circuit)\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "4690b787", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Construction of the Mixer Hamiltonian: $\\beta B$" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "296c560d", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mixer_angle = 0.8\n", + "mixer_ham_qpo = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): mixer_angle for i in range(n_nodes)})\n", + "mixer_ham_circuit = gen_term_sequence_circuit(mixer_ham_qpo, Circuit(n_nodes))\n", + "Transform.DecomposeBoxes().apply(mixer_ham_circuit)\n", + "display.render_circuit_jupyter(mixer_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "4d128a70", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Define the Initial State" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "0a9db628", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pytket.backends.backend import Backend\n", + "from pytket.extensions.qiskit import AerBackend\n", + "\n", + "backend = AerBackend()\n", + "def qaoa_initial_circuit(n_qubits: int) -> Circuit:\n", + " c = Circuit(n_qubits)\n", + " for i in range(n_qubits):\n", + " c.H(i)\n", + " return c\n", + "\n", + "superposition_circuit = qaoa_initial_circuit(n_nodes)\n", + "\n", + "display.render_circuit_jupyter(superposition_circuit)\n", + "\n", + "Transform.DecomposeBoxes().apply(superposition_circuit)\n", + "backend.default_compilation_pass(2).apply(superposition_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "da759b59", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Construct QAOA Circuit" + ] + }, + { + "cell_type": "markdown", + "id": "359a1a0f-e92e-40ae-bbe6-ce960b118f49", + "metadata": {}, + "source": [ + "Now lets define a function to create our entire QAOA circuit. For $p$ QAOA layers we expect that our circuit will require $2p$ parameters. Here we will pass and cost mixer parameters in as a list where the length of the list defines the number of layers." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "5e97191f-9d15-4f8a-bc2a-70ea60e78553", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "32\n", + "64\n", + "96\n", + "128\n", + "160\n", + "192\n", + "224\n", + "256\n", + "288\n", + "320\n", + "352\n", + "384\n", + "416\n", + "448\n", + "480\n", + "512\n", + "544\n", + "576\n", + "608\n", + "640\n", + "672\n", + "704\n", + "736\n", + "768\n", + "800\n", + "832\n", + "864\n", + "896\n", + "928\n", + "960\n", + "992\n", + "1024\n" + ] + } + ], + "source": [ + "cost_circuits = []\n", + "mixer_circuits = []\n", + "\n", + "for i in range(1025):\n", + " cost_circuit = gen_term_sequence_circuit(qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, i/1024), Circuit(n_nodes))\n", + " mixer_circuit = gen_term_sequence_circuit(QubitPauliOperator({QubitPauliString([Qubit(j)], [Pauli.X]): i/1024 for j in range(n_nodes)}), Circuit(n_nodes))\n", + " Transform.DecomposeBoxes().apply(cost_circuit)\n", + " Transform.DecomposeBoxes().apply(mixer_circuit)\n", + " backend.default_compilation_pass(2).apply(cost_circuit)\n", + " backend.default_compilation_pass(2).apply(mixer_circuit)\n", + " cost_circuits.append(cost_circuit)\n", + " mixer_circuits.append(mixer_circuit)\n", + " if (i % 32 == 0):\n", + " print(i)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "23f8910a", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_max_cut_circuit(edges: List[Tuple[int, int]],\n", + " n_nodes: int,\n", + " mixer_angles: List[int],\n", + " cost_angles: List[int]) -> Circuit:\n", + " \n", + " assert len(mixer_angles) == len(cost_angles)\n", + " \n", + " # initial state\n", + " qaoa_circuit = superposition_circuit.copy()\n", + " \n", + " \n", + " \n", + " # add cost and mixer terms to state\n", + " for cost, mixer in zip(cost_angles, mixer_angles):\n", + " qaoa_circuit.append(cost_circuits[cost])\n", + " qaoa_circuit.append(mixer_circuits[mixer])\n", + " \n", + " print(qaoa_circuit)\n", + " \n", + " return qaoa_circuit" + ] + }, + { + "cell_type": "markdown", + "id": "bc2f8939-41b7-476b-a5a8-09de07211079", + "metadata": {}, + "source": [ + "We also need to extract our energy expectation values from a `BackendResult` object after our circuit is processed by the device/simulator. We do this with the `get_max_cut_energy` function below. Note that the fact that the maxcut Hamiltonian contains only commuting terms means that we do not need to calculate our energy expectation using multiple measurement circuits. This may not the the case for a different problem Hamiltonian." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "df387eea-4198-428e-9b92-4f3bceb12f0e", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple\n", + "from pytket.backends.backendresult import BackendResult\n", + "\n", + "def get_max_cut_energy(edges: List[Tuple[int, int]], results: BackendResult) -> float:\n", + " energy = 0.0\n", + " dist = results.get_distribution()\n", + " for i, j in edges:\n", + " energy += sum((meas[i] ^ meas[j]) * prob for meas, prob in dist.items())\n", + "\n", + " return energy" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e5abad7b-e989-4156-9708-3d8c97d8ca2a", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from typing import Callable\n", + "import numpy as np\n", + "\n", + "def qaoa_instance(\n", + " backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " guess_mixer_angles: np.array,\n", + " guess_cost_angles: np.array,\n", + " seed: int,\n", + " shots: int = 5000,\n", + ") -> float:\n", + " \n", + " # print(\"test1\")\n", + " # step 1: get state guess\n", + " my_prep_circuit = qaoa_max_cut_circuit(\n", + " max_cut_graph_edges, n_nodes, guess_mixer_angles, guess_cost_angles\n", + " )\n", + " # print(\"test2\")\n", + " measured_circ = my_prep_circuit.copy().measure_all()\n", + " # print(\"test31\")\n", + " res = backend.run_circuit(measured_circ, shots, seed=seed)\n", + " # print(\"test3\")\n", + "\n", + " return get_max_cut_energy(max_cut_graph_edges, res)" + ] + }, + { + "cell_type": "markdown", + "id": "2c01c28b", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Optimise Energy by Guessing Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "0a44bed8", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_optimise_energy(compiler_pass: Callable[[Circuit], bool],\n", + " backend: Backend,\n", + " iterations: int = 100,\n", + " n: int = 3,\n", + " shots: int = 5000,\n", + " seed: int= 12345):\n", + " \n", + " highest_energy = 0 \n", + " best_guess_mixer_angles = [0 for i in range(n)] \n", + " best_guess_cost_angles = [0 for i in range(n)]\n", + " rng = np.random.default_rng(seed)\n", + " # guess some angles (iterations)-times and try if they are better than the best angles found before\n", + " \n", + " for i in range(iterations):\n", + " \n", + " guess_mixer_angles = rng.integers(0, 1025, n)\n", + " guess_cost_angles = rng.integers(0, 1025, n)\n", + " \n", + " qaoa_energy = qaoa_instance(backend,\n", + " compiler_pass,\n", + " guess_mixer_angles,\n", + " guess_cost_angles,\n", + " seed=seed,\n", + " shots=shots)\n", + " \n", + " if(qaoa_energy > highest_energy):\n", + " \n", + " print(\"new highest energy found: \", qaoa_energy)\n", + " \n", + " best_guess_mixer_angles = np.round(guess_mixer_angles, 3)\n", + " best_guess_cost_angles = np.round(guess_cost_angles, 3)\n", + " highest_energy = qaoa_energy\n", + " print(\"iteration: \", i)\n", + " \n", + " print(\"highest energy: \", highest_energy)\n", + " print(\"best guess mixer angles: \", best_guess_mixer_angles)\n", + " print(\"best guess cost angles: \", best_guess_cost_angles)\n", + " return best_guess_mixer_angles, best_guess_cost_angles" + ] + }, + { + "cell_type": "markdown", + "id": "d22226cc", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Calculate the State for the final Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "da46e63d", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_calculate(backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " shots: int = 5000,\n", + " iterations: int = 100,\n", + " seed: int = 12345,\n", + " ) -> BackendResult:\n", + " \n", + " # find the parameters for the highest energy\n", + " best_mixer, best_cost = qaoa_optimise_energy(compiler_pass,\n", + " backend,\n", + " iterations,\n", + " 3,\n", + " shots=shots,\n", + " seed=seed)\n", + " \n", + " # get the circuit with the final parameters of the optimisation:\n", + " my_qaoa_circuit = qaoa_max_cut_circuit(max_cut_graph_edges,\n", + " n_nodes,\n", + " best_mixer,\n", + " best_cost)\n", + "\n", + " my_qaoa_circuit.measure_all()\n", + "\n", + " compiler_pass(my_qaoa_circuit)\n", + " handle = backend.process_circuit(my_qaoa_circuit, shots, seed=seed)\n", + "\n", + " result = backend.get_result(handle) \n", + " \n", + " return result" + ] + }, + { + "cell_type": "markdown", + "id": "9dd97e10", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Results with the Noiseless Simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e7afb38e", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "from pytket.extensions.qiskit import AerBackend\n", + "\n", + "backend = AerBackend()\n", + "comp = backend.get_compiled_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "aaea7e2f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "new highest energy found: 1.8970000000000002\n", + "iteration: 0\n", + "\n", + "new highest energy found: 2.1770000000000005\n", + "iteration: 1\n", + "\n", + "new highest energy found: 3.0746\n", + "iteration: 2\n", + "\n", + "iteration: 3\n", + "\n", + "iteration: 4\n", + "\n", + "new highest energy found: 3.3115999999999994\n", + "iteration: 5\n", + "\n", + "iteration: 6\n", + "\n", + "iteration: 7\n", + "\n", + "new highest energy found: 4.275399999999999\n", + "iteration: 8\n", + "\n", + "iteration: 9\n", + "\n", + "iteration: 10\n", + "\n", + "iteration: 11\n", + "\n", + "iteration: 12\n", + "\n", + "iteration: 13\n", + "\n", + "iteration: 14\n", + "\n", + "iteration: 15\n", + "\n", + "iteration: 16\n", + "\n", + "iteration: 17\n", + "\n", + "iteration: 18\n", + "\n", + "iteration: 19\n", + "\n", + "iteration: 20\n", + "\n", + "iteration: 21\n", + "\n", + "iteration: 22\n", + "\n", + "iteration: 23\n", + "\n", + "iteration: 24\n", + "\n", + "iteration: 25\n", + "\n", + "iteration: 26\n", + "\n", + "iteration: 27\n", + "\n", + "iteration: 28\n", + "\n", + "iteration: 29\n", + "\n", + "iteration: 30\n", + "\n", + "iteration: 31\n", + "\n", + "iteration: 32\n", + "\n", + "iteration: 33\n", + "\n", + "iteration: 34\n", + "\n", + "iteration: 35\n", + "\n", + "iteration: 36\n", + "\n", + "iteration: 37\n", + "\n", + "iteration: 38\n", + "\n", + "iteration: 39\n", + "\n", + "iteration: 40\n", + "\n", + "new highest energy found: 4.7468\n", + "iteration: 41\n", + "\n", + "iteration: 42\n", + "\n", + "iteration: 43\n", + "\n", + "iteration: 44\n", + "\n", + "iteration: 45\n", + "\n", + "iteration: 46\n", + "\n", + "iteration: 47\n", + "\n", + "iteration: 48\n", + "\n", + "iteration: 49\n", + "\n", + "iteration: 50\n", + "\n", + "iteration: 51\n", + "\n", + "iteration: 52\n", + "\n", + "iteration: 53\n", + "\n", + "iteration: 54\n", + "\n", + "iteration: 55\n", + "\n", + "iteration: 56\n", + "\n", + "new highest energy found: 4.8962\n", + "iteration: 57\n", + "\n", + "iteration: 58\n", + "\n", + "iteration: 59\n", + "\n", + "iteration: 60\n", + "\n", + "iteration: 61\n", + "\n", + "iteration: 62\n", + "\n", + "iteration: 63\n", + "\n", + "iteration: 64\n", + "\n", + "iteration: 65\n", + "\n", + "iteration: 66\n", + "\n", + "iteration: 67\n", + "\n", + "iteration: 68\n", + "\n", + "iteration: 69\n", + "\n", + "iteration: 70\n", + "\n", + "iteration: 71\n", + "\n", + "iteration: 72\n", + "\n", + "iteration: 73\n", + "\n", + "iteration: 74\n", + "\n", + "iteration: 75\n", + "\n", + "iteration: 76\n", + "\n", + "iteration: 77\n", + "\n", + "iteration: 78\n", + "\n", + "iteration: 79\n", + "\n", + "iteration: 80\n", + "\n", + "iteration: 81\n", + "\n", + "iteration: 82\n", + "\n", + "iteration: 83\n", + "\n", + "iteration: 84\n", + "\n", + "iteration: 85\n", + "\n", + "iteration: 86\n", + "\n", + "iteration: 87\n", + "\n", + "iteration: 88\n", + "\n", + "iteration: 89\n", + "\n", + "iteration: 90\n", + "\n", + "iteration: 91\n", + "\n", + "iteration: 92\n", + "\n", + "iteration: 93\n", + "\n", + "iteration: 94\n", + "\n", + "iteration: 95\n", + "\n", + "iteration: 96\n", + "\n", + "iteration: 97\n", + "\n", + "iteration: 98\n", + "\n", + "iteration: 99\n", + "highest energy: 4.8962\n", + "best guess mixer angles: [293 132 142]\n", + "best guess cost angles: [401 814 329]\n", + "\n", + "CPU times: user 4.4 s, sys: 20.2 ms, total: 4.42 s\n", + "Wall time: 4.41 s\n" + ] + } + ], + "source": [ + "%%time\n", + "res = qaoa_calculate(backend, backend.default_compilation_pass(2).apply, shots = 5000, iterations = 100, seed=14839)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "3b86301e-7645-4553-be38-3ebf89eedd37", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success ratio 0.3734 \n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from maxcut_plotting import plot_maxcut_results\n", + "\n", + "plot_maxcut_results(res, 6)" + ] + }, + { + "cell_type": "markdown", + "id": "6e36c4fb-a118-4ab8-be01-77a674f273e3", + "metadata": {}, + "source": [ + "Here the binary strings in the results correspond to the two optimal colourings of our graph." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "ffce2a97-902c-44d8-8d64-b25498752907", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAAsTAAALEwEAmpwYAAAfkklEQVR4nO3deXxV9Z3/8VcSsieETUAQRVHQAgmLIsvUImLr0lZqsasQFm0HOnXpqJ2fo60zYvuzap0BCk6hKExdqBSxDws6I6IFQTsiMUBV3BhBUbQSAiQhkGT+OIgN3CQ3cG/u9no+HnkQzvne6wd4eN/5fM/3nG9aQ0NDA5IkpYj0WBcgSVJbMvgkSSnF4JMkpRSDT5KUUgw+SVJKMfgkSSnF4JMkpRSDT5KUUgw+SVJKMfgkSSnF4JMkpRSDT5KUUgw+SVJKMfgkSSnF4JMkpRSDT5KUUgw+SVJKMfgkSSnF4JMkpRSDT5KUUgw+SVJKaRfrAhR/qqth7Vr4+OPg9506wciRkJ8f27okKRIMPh321lswcyYsWADp6dDQEBxPS4ODB2HCBLjuOjjzzJiWKUnHJa2h4dOPN6Wqhgb48Y9h1iyoq4MDB0KPa9cOMjODAJwzBzIy2rZOSYoEgy/FNTRAaSn8/vdQVRXea/LyYOxYeOyxoDOUpETix1aKu+OO1oUeBGOffhpuuCF6dUlStNjxpbC9e6Fr12Axy9E+AaYC/wV0AX4OfKfRiJwc2LYNunSJdqWSFDl2fCnst79tbqryB0AW8CHwIDAN2NxoRFoazJsXzQolKfLs+FJUQwP06QPvvBPq7D6gI7AJ6Hvo2ASgJ/D/G4084QT44AOv9UlKHH5cpai9e4NpytC2ENzp0vdvjpVwZMf36fvs2BHx8iQpagy+FFVRAVlZTZ3dC7Q/4lgRsOeokZmZsGtXREuTpKgy+FJUVhbU1zd1tgCoPOJYJVB41Mj6esjOjmxtkhRNBl+K6tQpuFk9tL7AQeCNvzn2CtD/qJG1tcF1PklKFAZfisrMhEsuCVZmHi0fuBz4CcFCl+eBxwkWuDQ2YgR06BC9OiUp0gy+FHbjjcFTWEKbA1QDXYFvA3M5suMrLISbbopmhZIUed7OkMIaGuCMM4KHUx+Lbt3gvfd8ZqekxGLHl8LS0mDp0mPbbigvD5YtM/QkJR6DL8UVF8Py5VBQ0NT1vqPl5cGSJTB8eHRrk6RoMPjEeefBiy/CqFHB8zczM48e064d5ObCsGGwejVcfHHb1ylJkeA1PjXy1lvBvnyPPgqVlbB37z66ds3h8sszuPZaN6GVlPgMPjXrjDPO4IknnqBfv36xLkWSIsKpTjWrY8eOVFRUxLoMSYoYg0/N6tChg8EnKakYfGqWwScp2Rh8alaHDh3Y5fYLkpKIwadmeY1PUrIx+NQspzolJRuDT81yqlNSsjH41CynOiUlG4NPzXKqU1KyMfjULKc6JSUbg0/NcqpTUrIx+NQspzolJRsfUq1m7d+/n4KCAmpra0kLd8M+SYpjdnxqVnZ2NpmZmVRVVcW6FEmKCINPLXK6U1IyMfjUIld2SkomBp9a5MpOScnE4FOLnOqUlEwMPrXIqU5JycTgU4vs+CQlE4NPLfIan6RkYvCpRXZ8kpKJwacWeY1PUjIx+NQipzolJRODTy1yqlNSMjH41CKnOiUlE4NPLXKqU1IyMfjUIqc6JSUT9+NTi+rq6sjKyuLAgQOkp/uzkqTE5qeYWpSRkUFBQQGVlZWxLkWSjpvBp7A43SkpWRh8CosrOyUlC4NPYXFlp6RkYfApLE51SkoWBp/C4lSnpGRh8CksTnVKShYGn8LiVKekZJEQwffyy3DlldCnD3TrBr16wYgR8NBDsH9/rKtLDU51SkoW7WJdQHOeeAJ+/GPYuhVqaqC+/rNz27fDpk3w938P06bBv/4rZGfHrNSkZ8cnKVnEbcd3553wjW/AX/4CVVWNQ+9Te/fCnj0waxaMGgV+LkeP1/gkJYu4DL5f/Sro4KqrwxtfXQ0bN8KFFzr1GS12fJKSRdwF35tvwo03Bl1eY/uBqcApQCEwCFhx+GxtbTD1OWNGGxWaYrzGJylZxF3wzZwJBw+GOnMQ6AU8B+wGZgDfALYeHlFTA7Nnw4ED0a8zpTQ00KW6mh47d0JZGWzbBm7qISlBxdW2RNXV0LVrcO0uPMXAT4GvHz5SWAgLFsD48VEoMNXs2QP/+Z9w1100fPABlTU1FLVvH/xk0b073HRTsNy2oCDWlUpS2OKq41uxAtLSwh39IbAF6N/o6J49wTVCHae5c4N7R266CbZuJa2mhiKAysrgJ5R33oEbbgjGzJ8f62olKWxxFXzvvRdcq2vZAeC7QClw5lFnt2+PbF0p55ZbglCrroZ9+5oet29fcDH22mvhX/6l7eqTpOMQV/fx1dRAXV1Lo+qBCUAWMDvkiO3bP+LKK6+nqKiIoqIiOnTocPj7UMfy8/NJC7/VTG7/8R9w772hVhc1raoKfvELOPlkmDw5erVJUgTE1TW+X/8arr++uc/cBmAKwYKW5UBuyFG9elUyY8Yydu/e3eiroqIi5LHa2tqjgjGcwPzb3+fk5CR+eFZVBRdZQ3R5s4EHgI3Atw99f5TCQti5E3JyolikJB2fuOr4hg1racQ04FXgaZoKvXbt4NJL2zNx4sSw/7sHDhxoMSDff/99Xn311SbH1dfXH1Ng/u1XdqwfPbN4cZMXWXsAtwBPAU3eXtnQAEuWBAteJClOxVXHBzBgAGzeHOrM/wK9gWwa5/V/EFzvC+TmwoYN0K9fFIsMoaam5qiwbK7LDHWsXbt2xxSYf3usXbvj+FnmzDPh9debHXILsJ0mOj4I/gE3bjz2GiQpyuKq44Pg2ZzTp4e6peEUgqnO5g0c2PahB5CTk0NOTg7dunU7ptc3NDRQXV3dYkC+8cYbTQZpZWUl2dnZYXWcRx7rWF9Pr3fe4bgna197LVj52b798b6TJEVF3HV8NTVB47F9ezgLXRrLzYXly2H06KiUFvcaGhrYt29fqzvN3bt30/Hjj/njjh20dEdeix1ffn7wCJ3evSP4J5OkyIm7ji8nB557DoYODR46HW745eUFixFTNfQA0tLSKCgooKCggJ49e7buxW+9BYMGtebpAaE1NEB6XN0lI0mNxOUn1CmnwPr1wer4lh4Kkp0ddHrz5sH3vtc29SWlzp0j84Tv2lro1On430eSoiQugw+C8HvtteChIIMHB+FWUBB0hHl5wcr5Dh2CB1q/+SZ85zuxrjjBdegAxcVNnj4I1AB1h75qDh07ytln+wgzSXEt7q7xNWXz5mC1ZkVFEII9e8IFF0BmZqwrSyKPPgpTpoSc7rwNOPLZLD89dPywwkJYtAjGjYtSgZJ0/BIm+NQGDhwIbmA/xn33qnJzyfrkE9p5A7ukOBa3U52KgcxMWLgwaKlbqT4nhzv69WPUF77Ali1bolCcJEWGwafGvvpV+Ld/a1345eaSPmcOt69fz8SJExk1ahS/+tWvcDJBUjxyqlOhPfFEcL2vpibY6ymUwsJgpdH998PFFx8+vGXLFiZMmEBRURELFizgpJNOaqOiJalldnwK7ctfhh074OGH4bzzgnvzsrMhKyv4fvTo4Nme77/fKPQA+vbty/PPP8/nP/95hgwZwkMPPWT3Jylu2PEpPHV1sHt38H1REWRkhPWy9evXM2HCBAYOHMicOXPo3LlzFIuUpJbZ8Sk8GRnBjemdOoUdegBDhw5l/fr19OzZk5KSElasWBHFIiWpZXZ8ajOrVq1i0qRJXHzxxdx9990UeKO7pBiw41ObOf/88ykvL6empoZBgwaxdu3aWJckKQXZ8SkmHnvsMaZPn87kyZO57bbbyMrKinVJklKEHZ9i4mtf+xplZWVs2rSJYcOGsdHNayW1EYNPMdOtWzcef/xxrrnmGsaMGcNdd91FXWs3YZSkVnKqU3HhnXfeYdKkSTQ0NLBw4UJOPfXUWJckKUnZ8SkunHrqqaxatYrLLruMYcOG8Zvf/Mab3iVFhR2f4s6mTZuYMGECvXr1Yt68eXTr1i3WJUlKInZ8ijsDBgzgxRdfZODAgZSUlLB06dJYlyQpidjxKa6tW7eOiRMnMnLkSGbOnElRUVGsS5KU4Oz4FNdGjBhBWVkZ+fn5FBcX88wzz8S6JEkJzo5PCePJJ5/kqquu4oorruBnP/sZucewYa4k2fEpYVx00UWUl5ezY8eOww+/lqTWsuNTQnrkkUe49tpr+cEPfsDNN99Mu3btYl2SpARh8Clhvffee0yZMoWKigoWLVpEv379Yl2SpATgVKcSVs+ePXnyyScpLS1l1KhRzJ49m/r6+liXJSnO2fEpKWzZsoWJEydSWFjI/fffz0knnRTrkiTFKTs+JYW+ffuyZs0aRo8ezZAhQ3jwwQd95JmkkOz4lHRefvllJkyYQP/+/Zk7dy6dO3eOdUmS4ogdn5LOkCFDWL9+Pb169aK4uJjly5fHuiRJccSOT0nt2WefZdKkSXzpS1/innvuoaCgINYlSYoxOz4ltdGjR1NeXk5tbS2DBg1i7dq1sS5JUozZ8SllLFu2jGnTpjFp0iRuu+02srOzY12SpBiw41PKGDduHK+88gqvvvoqw4YNY+PGjbEuSVIMGHxKKV27duWxxx7j+uuvZ8yYMdx1113U1dXFuixJbcipTqWsrVu3MmnSJOrq6li4cCGnnXZarEuS1Abs+JSyevfuzTPPPMPXvvY1zj33XObPn+9N71IKsOOTgM2bNzNhwgR69uzJvHnz6N69e6xLkhQldnwS0L9/f1544QVKSkoYNGgQS5cujXVJkqLEjk86wgsvvMDEiRMZPnw4M2fOpEOHDrEuSVIE2fFJRxg+fDgbNmygsLCQkpISVq5cGeuSJEWQHZ/UjKeeeoqpU6cyfvx4fv7zn5ObmxvrkiQdJzs+qRlf+tKXKC8vZ+fOnQwZMoSXXnop1iVJOk52fFKYFi9ezDXXXMP06dO5+eabyczMjHVJko6BwSe1wvvvv8+UKVP45JNPWLRoEWeeeWasS5LUSk51Sq3Qo0cPVqxYweTJk/n85z/PrFmzqK+vj3VZklrBjk86Rm+88QYTJ06koKCABQsW0KtXr7Bet38/VFRAVhYUFUG6P35Kbcr/5aRjdMYZZ7B69WrOP/98hg4dyoMPPtjkI8+qq+GBB+CssyAvD3r3hu7dIScHxo+HF14AfwSV2oYdnxQBGzZsYMKECZx11lnMnTuXLl26AEGY3Xsv/PSnwbi9e49+bXo65OZCjx6wZAkUF7dh4VIKsuOTImDw4MG89NJL9O7dm5KSEv74xz/S0ADTp8OttwaBFyr0AOrrYd8+eOMNGDkS/vSntq1dSjV2fFKEPffcc0yaNIlOnWby2mtfpqoqrVWvLygIpj77949SgVKKM/ikKNi8eQ8lJdnU1WWFOHslsBLYB3QHbgKuOnw2LQ2GD4e1a9ukVCnlONUpRcGiRYVkZIQKPYD/B2wFKoE/ALcA6w+fbWiADRuCqU9JkWfwSRFWWwv33Rf8Glp/IPvQ92mHvt5qNKKuDmbOjFqJUkoz+KQI+/Ofwxk1HcgDzgROBC5pdPbAAfjd7yJemiQMPiniPv44nFFzgD3AauByPusAP1NZGdGyJB1i8EkRFv4TzDKAvwO2A3OPOuuyMyk6DD4pwjp1au0rDnLkNT6AwsJIVCPpSAafFGHDhgWLU0LbCTwC7AXqgKeAh4ELGo3KyIBLL41ikVIKM/ikCMvLg9JSCL1dXxrBtOZJQEfgBuDfgK82GpWdDT/6UXTrlFKVN7BLUbBlCwwaFDyc+licfPIutm7tQFpa6576IqlldnxSFPTtG3R9eXmtf21OTh3p6dO54oor+OijjyJfnJTiDD4pSmbPhrFjWxd+ubnw0EMZvPrq/fTp04fi4mKWLl0avSKlFORUpxRF9fVwww0w99DdCjU1occVFgYb0/7+9/CFL3x2fO3atZSWlnLuuecya9YsOnbsGP2ipSRnxydFUXo6/PKXsHUr/PM/Q5cuQQfYvn0QdtnZcO65sHAhfPBB49ADGDlyJGVlZXTq1ImBAweyfPnymPw5pGRixye1obo62LYNdu0KOryuXeGEE8J77TPPPMOUKVMYO3Ysv/zlL2nfvn10i5WSlB2f1IYyMqB3bxg8ONhvL9zQAxgzZgzl5eWkp6dTXFzMypUro1anlMzs+KQEtGLFCq6++mrGjRvHnXfeSX5+fqxLkhKGHZ+UgC6++GI2btxIZWUlJSUlPP/887EuSUoYdnxSglu2bBnTpk3jyiuv5PbbbycnJyfWJUlxzY5PSnDjxo2jvLycrVu3MmTIEP7nf/4n1iVJcc2OT0oSDQ0NLF68mGuvvZbvfe973HrrrWRlZcW6LCnu2PFJSSItLY1vfetblJWVUVZWxrBhwygvL491WVLcMfikJHPiiSfyhz/8geuuu46xY8dyxx13cPDgwViXJcUNpzqlJLZt2zamTp1KRUUFCxcu5Kyzzop1SVLM2fFJSaxXr1489dRTTJkyhfPOO4977rmHuqZ3yZVSgh2flCLefvttJk+eTH19PQ888AB9+vSJdUlSTNjxSSnitNNOY9WqVXz961/n3HPPZc6cOdTX18e6LKnN2fFJKej111+ntLSUgoICFixYwMknnxzrkqQ2Y8cnpaB+/fqxZs0axo4dy9ChQ1mwYAH+DKxUYccnpbiNGzdSWlrKiSeeyLx58+jRo0esS5Kiyo5PSnEDBw7kxRdf5JxzzmHw4ME89NBDdn9KanZ8kg5bv349paWl9OvXj7lz59K1a9dYlyRFnB2fpMOGDh3KSy+9xOmnn05JSQlLly6NdUlSxNnxSQpp3bp1lJaWcs455zBr1iw6deoU65KkiLDjkxTSiBEjKCsro0uXLhQXF7N8+fJYlyRFhB2fpBatWrWKKVOmMGbMGO69917at28f65KkY2bHJ6lF559/PuXl5WRkZFBcXMzKlStjXZJ0zOz4JLXKk08+ydVXX81ll13GnXfeSX5+fqxLklrFjk9Sq1x00UWUl5dTWVlJSUkJa9asiXVJUqvY8Uk6Zo8//jjTpk3jO9/5Drfffju5ubmxLklqkR2fpGN22WWXUV5ezrvvvsuQIUP485//HOuSpBbZ8UmKiMWLF3PNNddw9dVX85Of/ISsrKxYlySFZMcnKSK++c1v8sorr1BeXs4555zDK6+8EuuSpJAMPkkR0717dx5//HF+9KMfMXbsWGbMmMHBgwdjXZbUiFOdkqJi27ZtTJ06lV27drFw4UI+97nPxbokCbDjkxQlvXr14qmnnuKqq67ivPPO4+6776auri7WZUl2fJKi7+2332by5MnU1dXxwAMPcPrpp8e6JKUwOz5JUXfaaaexatUqxo8fz/Dhw5k9ezb19fWxLkspyo5PUpt6/fXXmTRpEnl5eSxYsIBTTjkl1iUpxdjxSWpT/fr1Y/Xq1Vx44YWcffbZzJ8/H3/+Vluy45MUM5s2bWLixIl0796d+fPn06NHj1iXpBRgxycpZgYMGMCLL77IsGHDGDRoEL/97W/t/hR1dnyS4sL69espLS2lb9++3HfffXTt2rXlF737LmzeDJWVkJ8Pp5wCAwZAWlr0C1bCsuOTFBeGDh3K+vXr6du3L8XFxSxZsiT0wPp6WL4cRo+Gfv3g29+Gq6+GK6+EESPgzDNhwQKoqmrT+pU47PgkxZ1169ZRWlrK2WefzezZs+nUqVNwYvt2uOACeP992Lu36TcoKIB27eCPf4SRI9umaCUMOz5JcWfEiBGUlZXRtWtXBg4cyBNPPBFMaw4eDG+/3XzoQXC+ogIuvBBWrmyTmpU47PgkxbVnn32W6aWl/OmTT+hcXU1aax97lp8PL70UTIFK2PFJinOjR4/m5euvp7CmpsnQewPIAa4MdbK6Gn760yhWqERjxycpvjU0QJ8+8M47TQ75IlANnAL8NtSA7Gx47z3o3Dk6NaaYDz+EX/8ann0Wdu2C3Fw49VT4/vfh7/4u/hfV2vFJim9r18LOnU2efgToAFzQ3Hukp8NvfhPZulJQWRl89avBXSM/+xk88wxs2BD8Ez30EFxySRCAc+cGi2/jlcEnKb6tWQP794c8VQn8BPhlS+9RXQ0rVkS4sNTy+9/DqFHwxBPBP0dNTePzDQ3BmqL//V+44Qb48peDv/Z4ZPBJim9//Ss0sYv7rcBU4KQw3qb6/ffZtm0blZWV7gzRSsuXw8SJwa2R4Vwcq6qCVatg3DiIxy0Y28W6AElqVnZ2yMNlwNPAhjDf5s133+WSkSPZvXs3+/bto7CwkKKiolZ/dejQgaKiIgoKCkhPT/7eYedO+MY3mnoewGjgBT6Lkp7A60DQEa5ZA3fdBf/0T21RafgMPknx7cQTg9UTR8ybPQtsBU4+9Pu9QB3wF+DlEG8z8KKL2PbYYwDU1dVRWVnJ7t27m/zatWsXW7dubXSsoqLi8PdVVVUpEZ7z5rV0vW42cFXIM1VVcM89cOONkJERjeqOjas6JcW3Dz6A3r2Pus5XRXCN71N3EwThXOCEI9+jsBAefhguvTRiZYUTnk2FZiTC89MAjWZ41tVB9+7w8cdNjRhNcBNJ6OCD4K/+wQfhK1+JfH3HyuCTFP++8pXg8WPNfFzdBrxJE7cznHAC7NgRX20H4YVnqMBsq/B8+mm4/HLYs6epP8FoYDPQAPQD7jh0rLExY+LrAToGn6T4t3o1XHwx7NvX+tfm5sItt8DNN0e+rjjQXHi2FJothedHH13Gyy9P5ODB0NdZ4UXgc0AWwY0l/0Bw9bVPo1G9ezd7G2abM/gkJYYf/AAeeKB1uy5kZUFxcbDKoolFMgodnhUVFfzudyeyePFgDh4MdznIRcClwA8bHe3WLZixjhcubpGUGGbNCvbdW7o0vPDLyQm2Lfqv/zL0WpCRkUHHjh3p2LFjo+N//SssW9bk3SQhpBFMezZWUHC8FUZWfC8nkqRPpafDokUwYwZ06hSsmgglPz+Y3iwthXXr4IgPc4VvwIDmzlYATwE1wEHgQeBPBF3fZ9LSgk014olTnZISz8GDwSNEfvELePVV6vbupTYtjdzTToNrrw02pW0qGBW2hgbo2xfefDPU2Y+AS4DXgAzgTOB24MJGo/Lz4b//O9gjOF4YfJIS3uLFi1myZAmPPvporEtJOvPnw3XXHdu6IgieL/7GG/H14GqnOiUlvKKiIiorK1seqFb79reDru1YgisvL5iZjqfQA4NPUhIoKipi9+7dsS4jKeXnB7swtHaBSl4eTJ8O3/pWdOo6HgafpITXvn17gy+K+veH558PtjPMzW1+bHp6EHo33hhcgo1HBp+khOdUZ/QNHAhbtsBttwX35RUUNJ7CzMsL7hq5/PJgZ4bbbou/Kc5PubhFUsKrrKykR48e7N27N9alpIT6+uD2yPXrg90bCgqgVy+44orE2OTe4JOU8Orr68nMzGT//v20a+dzOdQ8pzolJbz09HQKCwvZ0/TTlKXDDD5JScEFLgqXwScpKbjAReEy+CQlBe/lU7gMPklJwalOhcvgk5QUnOpUuAw+SUnBjk/hMvgkJQU7PoXL4JOUFFzconAZfJKSglOdCpfBJykpONWpcBl8kpKCHZ/CZfBJSgpe41O4DD5JScGpToXL4JOUFJzqVLgMPklJwY5P4XIjWklJYf/+/RQUFFBbW0taWlqsy1Ecs+OTlBSys7PJyMiguro61qUozhl8kpKG050Kh8EnKWm4wEXhMPgkJQ07PoXD4JOUNLyJXeEw+CQlDac6FQ6DT1LScKpT4TD4JCUNOz6Fw+CTlDTs+BQOg09S0nBxi8Jh8ElKGk51KhwGn6Sk4VSnwmHwSUoadnwKh8EnKWl4jU/hMPgkJQ2nOhUOg09S0nCqU+Ew+CQlDTs+hcMd2CUljfr6ejIzM6mtrSUjIyPW5ShO2fFJShrp6ekUFBTY9alZBp+kpFBXB2vXQmbmN3j44YM8/TRUVMS6KsUjpzolJbQPP4Rf/xr+/d+hthb27dtDbm4e7dplsH8/jB8P//iPMGhQrCtVvDD4JCWs++6D668Pvq+pCT0mIwOys+GLX4RHHgm+V2oz+CQlpBkz4Oc/h6qq8Mbn5kJxMTz3nOGX6rzGJynhPPJI60IPoLoaysvhu9+NXl1KDAafpIRSXx9MbzYdeo8AZwH5QB9g9eEz1dWwfDn85S9RL1NxzOCTlFCefhr27Wvq7H8DPwbuB/YAfwJOazTiwAG4995oVqh45zU+SQll7FhYubKpsyOBqYe+mpabG6wGLSyMcHFKCHZ8khLKunVNnakDXgI+Ak4HTgL+Aag+amRmJmzaFKUCFfcMPkkJo6EhuE4X2ofAAWAJwXW9MmADMOOokWlpsGtXdGpU/DP4JCWMtLTgvrzQcg/9+kPgRKAL8CNgecjRWVmRrk6JwuCTlFA6dGjqTEeC6c20vzmWFnLkwYPQrVtEy1ICMfgkJZQJE5rr1iYDs4CdwC7gXuDLR43q3BkGDIhWhYp3Bp+khPLDH0J6k59ctwLnAH0J7uUbDPxzoxH5+XDjjcG0qVKTtzNISjjnnw+rVwc7MrRWXh7s2AHt20e+LiUGOz5JCWfhwmMLrtzcY3+tkofBJynhnHxy8LDpjh2bW+XZWG5u8MSW8eOjW5vin8EnKSENHAhlZXDBBcFuC6F2XEhPD67pnX46LFsG3/9+W1epeOQ1PkkJb/t2mDMHFi0Kbkyvq4OCAhg9OljIMmyYi1n0GYNPkpRSnOqUJKUUg0+SlFIMPklSSjH4JEkpxeCTJKUUg0+SlFIMPklSSjH4JEkpxeCTJKUUg0+SlFIMPklSSjH4JEkpxeCTJKUUg0+SlFIMPklSSjH4JEkpxeCTJKUUg0+SlFIMPklSSjH4JEkpxeCTJKUUg0+SlFL+D3J+7gv5l/anAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = nx.Graph()\n", + "G.add_edges_from(max_cut_graph_edges)\n", + "\n", + "H = nx.Graph()\n", + "H.add_edges_from(max_cut_graph_edges)\n", + "\n", + "plt.figure(1)\n", + "nx.draw(G, labels={node: node for node in max_cut_graph.nodes()}, node_color= ['red', 'blue', 'red','red', 'blue', 'red', 'red'])\n", + "plt.figure(2)\n", + "nx.draw(H, labels={node: node for node in max_cut_graph.nodes()}, node_color= ['blue', 'red', 'blue', 'blue', 'red', 'blue', 'blue'])\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c4f545a-011b-44b5-943d-c520f4cb3483", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3 [Default]", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + }, + "vscode": { + "interpreter": { + "hash": "3289aa74b4cc5b65254d7b081e6c83acb4efa1b1c1d2fe845644451ee4b44b02" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/team_solutions/pineapple/maxcut_plotting.py b/team_solutions/pineapple/maxcut_plotting.py new file mode 100644 index 0000000..e2b6afa --- /dev/null +++ b/team_solutions/pineapple/maxcut_plotting.py @@ -0,0 +1,34 @@ +from pytket.backends.backendresult import BackendResult +import matplotlib.pyplot as plt + + +def plot_maxcut_results(result: BackendResult, n_strings: int) -> None: + """ + Plots Maxcut results in a barchart with the two most common bitstrings highlighted in green. + """ + counts_dict = result.get_counts() + sorted_shots = counts_dict.most_common() + n_shots = sum(counts_dict.values()) + + n_most_common_strings = sorted_shots # [:n_strings] + x_axis_values = [str(entry[0]) + for entry in n_most_common_strings] # basis states + # print(x_axis_values) + y_axis_values = [entry[1] for entry in n_most_common_strings] # counts + # print(y_axis_values) + num_successful_shots = sum(y_axis_values[:2]) + print(f"Success ratio {num_successful_shots/n_shots} ") + + fig = plt.figure() + ax = fig.add_axes([0, 0, 1.5, 1]) + color_list = ["green"] * 2 + (["orange"] * (len(x_axis_values) - 2)) + ax.bar( + x=x_axis_values, + height=y_axis_values, + color=color_list, + ) + ax.set_title(label="Maxcut Results") + plt.ylim([0, 0.25 * n_shots]) + plt.xlabel("Basis State") + plt.ylabel("Number of Shots") + plt.show() diff --git a/team_solutions/pineapple/maxcut_symbolic_compiler.ipynb b/team_solutions/pineapple/maxcut_symbolic_compiler.ipynb new file mode 100644 index 0000000..7c3dfb9 --- /dev/null +++ b/team_solutions/pineapple/maxcut_symbolic_compiler.ipynb @@ -0,0 +1,1113 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a3ba3449", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## The Quantum Approximate Optimisation Algorithm (QAOA) using TKET.\n", + "\n", + "Callum Macpherson" + ] + }, + { + "cell_type": "markdown", + "id": "45668632", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## The Max-Cut problem" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9456fbeb", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "G = nx.Graph()\n", + "G.add_edges_from([(0,1), (1,2), (2,0)])\n", + "plt.figure(figsize=(2,2))\n", + "nx.draw(G, node_color=['red', 'blue', 'red'])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "cad41481", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "There are \\\\(2^3\\\\) possible assignments of colour to nodes. In general there are \\\\( 2^n \\\\). The Max-cut problem can then be stated as that of finding the colour assignment which maximises the number of edges between vertices of a different colour." + ] + }, + { + "cell_type": "markdown", + "id": "7389bbe5", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Quantum Approximate Optimization Algorithm (QAOA)\n", + "\n", + "Introduced in 'A Quantum Approximate Optimization Algorithm' (found at https://arxiv.org/abs/1411.4028). The idea is to prepare a quantum state which encodes a solution to the Max-cut problem.\n", + "\n", + "\n", + "This is a variational algorithm, which is to say that a paramaterised state is prepared, with the parameters varied to improve the solution. We will have $2p$ parameters where p is our number of layers. In particular, the state prepared has the form \n", + "\n", + "\n", + "\n", + "\\\\[ \\left| \\psi \\left( \\beta, \\gamma \\right) \\right\\rangle = U \\left( \\beta_m \\right) U \\left( \\gamma_m \\right) ... U \\left( \\beta_0 \\right) U \\left( \\gamma_0 \\right) \\left| \\psi_0 \\right\\rangle \\\\]\n", + "where\n", + "\\\\[ U \\left( \\beta_i \\right) = e^{i \\beta H_B} \\quad \\& \\quad U \\left( \\gamma_i \\right) = e^{i \\gamma H_P} \\\\]\n", + "with \\\\( H_B \\\\) and \\\\( H_P \\\\) depending on the problem instance. " + ] + }, + { + "cell_type": "markdown", + "id": "3596e66d", + "metadata": {}, + "source": [ + "## Cost function for Maxcut\n", + "$$\n", + "\\begin{equation}\n", + "C= \\sum_{(i,j)} x_i(1-x_j)\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d720b387", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "For the previous 3 vertex graph the *problem Hamiltonian* is\n", + "\\\\[ H_P = \\frac{1}{2} \\big[ \\left( Z \\otimes Z \\otimes I \\right) + \\left( Z \\otimes I \\otimes Z \\right) + \\left( I \\otimes Z \\otimes Z \\right) \\big] \\\\]\n", + "\n", + "\n", + "where you will notice that there is a \\\\( Z \\otimes Z \\\\) acting between each vertex which is connected by an edge." + ] + }, + { + "cell_type": "markdown", + "id": "8ca2e1b9", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "The *mixer Hamiltonian* has the form \n", + "\\\\[ H_B = \\left( X \\otimes I \\otimes I \\right) + \\left( I \\otimes X \\otimes I \\right) + \\left( I \\otimes I \\otimes X \\right) \\\\]\n", + "\n", + "\n", + "where you will notice that there is an \\\\( X \\\\) acting on each vertex." + ] + }, + { + "cell_type": "markdown", + "id": "de6b9e03", + "metadata": {}, + "source": [ + "## Cost function for Maxcut\n", + "\n", + "A solution to maxcut can be found by maximising the following cost function $C$ .\n", + "\n", + "\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "C= \\sum_{(i,j)} x_i(1-x_j)\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Here $x_i$ and $x_j$ are the the \"colours\" of each vertex. \n", + "\n", + "$$\n", + "\\begin{equation}\n", + "x_i,x_j \\in \\{0,1\\}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "$x_i(1-x_j)=0$ if $x_i=x_j$ and $ x_i(1-x_j)=1$ if the terms are not equal." + ] + }, + { + "cell_type": "markdown", + "id": "61d4e798", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "We want to encode our Maxcut cost function as a Hamiltonain. To do this we can perform the following translation.\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "x_i \\mapsto \\frac{1}{2}(1-Z_i)\n", + "\\end{equation}\n", + "$$\n", + "\n", + "\n", + "The Pauli Z operator can be used to distinguish between the $|0\\rangle$ and $|1\\rangle$ basis states as these are eigenstates with eigenvalues $\\pm 1$ .\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "H_P = \\frac{1}{2}\\sum_{} (-Z_j \\,Z_k +I )\n", + "\\end{equation}\n", + "$$\n", + "\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "H_B = \\sum_i X_i\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Here we use the the convention that $X_i$ means a Pauli X operator will be applied to the \"ith\" qubit and the identity operator will be applied to all other qubits in the circuit." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "aeb6abd9", + "metadata": { + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "markdown", + "id": "3cbb783a", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Circuit Construction for QAOA" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "688f1332", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAAsTAAALEwEAmpwYAAAqOUlEQVR4nO3deVyU5cI+8GuYAQZZBBEFEbUkGdC0JM1MZbHXTv5yTVvUczRTTDwHyNdWUztWLpnmrh3PqWNaZpkLlp3KZMk8amoKyGKUppAoi8giMzAzz+8PY14nFkFh7meeub6fj3808zBefCou7udeHpUkSRKIiIgchJPoAERERLbE4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIofC4iMiIoeiER1AhKIKA3Ycz0N2QRnK9EZ4aTXQ+XthfHhn+Hq4io5HREStSCVJkiQ6hK2culCKdcm5SDlTCAAwGM2W97QaJ0gAIkP8EBsRjD5B3mJCEhFRq3KY4tt6+Bze3JcNvdGExr5jlQrQatSYO1yHSQO62SwfERHZhkPc6rxeelmoqjHf9FpJAqpqTHhzXxYAsPyIiBRG8SO+UxdK8eSmw6iqMdX7fmVmCkq/3wZTWSHU7j7w/X8J0Ab1AgC4OauxPWYAenf2tmFiIiJqTYof8a1LzoXeWH/pVZ39EVeS/w2/US/CpVMPmCpKrN7XG01Yn5yLjZPus0VUIiKyAUUXX1GFASlnChuc07t68EO0ffApuAbqAAAaz/ZW70sSkJRTiOIKA1d7EhEphKL38e04ntfge5LZBMPFXJivXUX+xunIWzcZJV9vgLnGYHWdCsCOEw1/DhER2RdFF192QZnVloUbmSpLAbMR13K+R8dJSxHw9GpUX/oFVw9tt7pObzQj+2K5DdISEZEtKLr4yvTGBt9TOV+/dekZPgIaj3ZQt2kLz36jUfXzsXo+p6bVMhIRkW0puvi8tA1PYaq1HlD/YU5PpVI18DnOLZqLiIjEUXTx6fy94Kpp+Fv0uPshlB//HKbKUpj0FSj7YTfaBPezukarcYIuwLO1oxIRkY0oeh9fUYUBDy490OA8n2QyomT/P1CZmQKVxhnuusHwiXoaKo2L5RpXjRMOvRjNVZ1ERAqh6OIDgJgtx/BN1qVGjylriEoFPBzWkfv4iIgURNG3OgFgVmQwtBr1LX2tVqNGbGRwCyciIiKRFF98fYK8MXe4Dm7OzftW3ZydMHe4jseVEREpjKJPbqlVe9B0U57OAMkMtUrC3OE9eUA1EZECKX7EV2vSgG7YHjMAD4d1hKvGCdo/rPbUapzgqnHCkO7eKNu5EIP8BQUlIqJWpfjFLfUprjBgx4k8ZF8sR5m+Bl5aZ+gCPDGu7/UnsL/++us4deoUduzYIToqERG1MIcsvpupqqpCWFgY3nvvPURFRYmOQ0RELchhbnU2h5ubG95++23ExcXBaGz42DMiIrI/LL4GjB07Fn5+fnj33XdFRyEiohbEW52NSE9Px9ChQ5GVlQVfX1/RcYiIqAWw+G7ir3/9KyRJwrp160RHISKiFsDiu4mSkhKEhobim2++Qe/evUXHISKi28Q5vpto164dFixYgPj4ePB3BCIi+8fia4KYmBgUFxfjs88+Ex2FiIhuE291NlFycjKmTJmCrKwsuLm5iY5DRES3iCO+JoqMjES/fv2wbNky0VGIiOg2cMTXDL/++ivCw8Nx4sQJdOnSRXQcIiK6BSy+ZlqwYAFycnLw8ccfi45CRES3gMXXTNeuXUNoaCi2bNmCIUOGiI5DRETNxDm+ZmrTpg2WLVuGuLg4mEwm0XGIiKiZWHy3YPz48fD29samTZtERyEiombirc5bdOrUKQwbNgzZ2dnw8fERHYeIiJqIxXcbZs6cCWdnZ6xevVp0FCIiaiIW320oKipCWFgYDhw4gF69eomOQ0RETcA5vtvQvn17zJs3DwkJCTzHk4jITrD4btPMmTNRUFCA3bt3i45CRERNwFudLeDbb7/F9OnTkZmZCa1WKzoOERE1giO+FjB06FDcc889WL58uegoRER0ExzxtZCzZ8+iX79+OHnyJDp37iw6DhERNYDF14JeffVVnD17Fh9++KHoKERE1AAWXwuqrKyETqfDxx9/jAcffFB0HCIiqgfn+FqQu7s7li5dynM8iYhkjMXXwp566im4ubnh/fffFx2FiIjqwVudreDEiRMYPnw4srOz4e3tLToOERHdgMXXSmJiYuDh4YEVK1aIjkJERDdg8bWSwsJChIWFITU1FaGhoaLjEBHR7zjH10r8/Pwwd+5cnuNJRCQzLL5WNGvWLFy4cAF79+4VHYWIiH7HW52t7Ouvv0ZsbCxOnz4NV1dX0XGIiBweR3ytbNiwYejZsyfeeecd0VGIiAgc8dnEzz//jPvvvx9paWno1KmT6DhERA6NxWcjL7/8MvLz8/HBBx+IjkJE5NBYfDZSXl4OnU6Hzz77DAMGDBAdh4jIYXGOz0Y8PT2xZMkSxMXFwWw2i45DROSwWHw2NHHiRKjVamzevFl0FCIih8VbnTb2ww8/YNSoUcjOzoaXl5foOEREDofFJ8DUqVPh6+uLZcuWiY5CRORwWHwCFBQUoFevXjh06BB69OghOg4RkUPhHJ8A/v7+eOmll/Dcc8+JjkJE5HBYfILExcUhNzcX+/btEx2FiMihsPgEcXFxwcqVK/Hcc8+hurpadBwiIofB4hPokUcewV133YXVq1eLjkJE5DC4uEWwn376CQMHDkR6ejr8/f1FxyEiUjwWnwy88MILKCoqwnvvvSc6ChGR4rH4ZKCsrAw6nQ67d+9G//79RcchIlI0zvHJgJeXFxYtWsRzPImIbIDFJxN/+ctfIEkStm7dKjoKEZGi8VanjBw5cgRjx45FdnY2PD09RcchIlIkFp/MTJ48GQEBAViyZInoKEREisTik5mLFy/i7rvvxuHDhxEcHCw6DhGR4nCOT2YCAgLw/PPPY/bs2aKjEBEpEotPhhISEpCVlYWvvvpKdBQiIsVh8cmQq6srVqxYgYSEBNTU1IiOQ0SkKCw+mXr00UfRtWtXrF27VnQUIiJF4eIWGcvOzsbgwYNx+vRpdOjQQXQcIiJFYPHJ3OzZs1FeXo5NmzaJjkJEpAgsPpm7evUqdDodPv/8c4SHh4uOQ0Rk9zjHJ3Nt27bFG2+8gfj4ePB3FCKi28fiswNPP/009Ho9tm3bJjoKEZHd461OO3Ho0CE88cQTyM7Ohru7u+g4RER2iyM+OzFw4EBERERg8eLFoqMQEdk1jvjsSH5+Pvr06YOjR4/izjvvFB2HiBxYUYUBO47nIbugDGV6I7y0Guj8vTA+vDN8PVxFx2sUi8/OLFq0CMeOHcPOnTtFRyEiB3TqQinWJeci5UwhAMBg/L+HZ2s1TpAARIb4ITYiGH2CvMWEvAkWn53R6/Xo2bMn3n33XTz00EOi4xCRA9l6+Bze3JcNvdGExppDpQK0GjXmDtdh0oBuNsvXVJzjszNarRbLly9HfHw8z/EkIpu5XnpZqKppvPQAQJKAqhoT3tyXha2Hz9kkX3NwxGeHJEnCsGHDMGLECMTFxYmOQ0QKd+pCKZ7cdBhVNSbLa5KxBsVfr4f+3EmY9RXQePvDJ2Iy3LrfZ/W1bs5qbI8ZgN6dvW2cumEc8dkhlUqFVatW4fXXX0dhYaHoOESkcOuSc6E3mqxek8wmaDzbw3/CEgQ9tx3eQ/6Mwj1LYSy9ZHWd3mjC+uRcW8a9KRafnQoLC8OECRMwb9480VGISMGKKgxIOVNY5/amk4sW3oMnQuPdESqVE9oE94embUcYCqxLTpKApJxCFFcYbJi6cSw+O/baa69h165dOHnypOgoRKRQO47nNek6U+UV1JTkw8WvS533VAB2nGja59iCRnQAunU+Pj5YuHAh4uLikJKSguLKarvdV0NE8pRdUGa1ZaE+ksmIosS34XH3UDj7BtV5X280I/tieWtFbDYWn52bNm0a1n60F48uTURupQuAP+6rKcA7+8/Ifl8NEclTmd7Y6PuSZEbR58sBtQbt/ufZRj5HPqvQeavTzm374QIMg2Yi44oTDEZznd/M9L+/9nXmJTy56bAslxYTkXx5aRseH0mShOJ9q2GqLIXfmFegUjd8rZfWuTXi3RIWnx2r3VdTbQZUTo3/q5T7vhoikiedvxdcNfX/fCn5ah1qii+gw7j5cHJueDpFq3GCLsCztSI2G/fx2an69tXcqKYkH7/9669w1z2I9iPmWL0nx301RCRPRRUGPLj0QJ27Scarl5G/YSqgdobKSW15vd2fZsGjZ5TVta4aJxx6MVo2aw04x2en6ttXc6OSrzfCNeCuet+r3VezcdJ99b5PRFSrvYcrInr44ZvMS7hxlKRp2wFdX/r8pl+vUgFRIX6yKT2AtzrtUkP7ampVZqbASesObdc+9b4vx301RCRfD3UywWy8tZ8XWo0asZHBLZzo9rD47FBj+2rMhmso/e5D+ERPa/Qz5LavhojkaefOnZj15KN47E4V3JybVxluzk6YO1wnu2kV3uq0Q43tqylN3QKPPsOg8Wrf6GfIbV8NEcmLJElYtGgRNm7ciP/85z8IDw9HX4U8nYHFZ4ca2ldTfekX6H89hYCnVzXxc+Szr4aI5KOqqgrTpk3DTz/9hCNHjqBTp04AgEkDuqF3Z2+sT85FUk4hVLj+S3St2ufxRYX4ITYyWHYjvVosPjvU0L4a/fl0GK9eQt76pwEAUrUekMy4WBRfbxleLSpAaWkpvL29WzMuEdmRgoICjB49Gt26dUNKSgrc3Nys3u/d2RsbJ92H4goDdpzIQ/bFcpTpa+CldYYuwBPj+sr/pChuZ7BDG1N+xjv7z9S53Wmu0UMyVFn+uezoThivXkK7h2dB3aat1bVqmOF94SDO7FkPnU6H6OhoREdHY9CgQXB3d7fJ90FE8vLjjz9i1KhRmDZtGubNmweVSiU6Uqvg4hY7NC68c72vOzlrofbwsfxROWuh0rjUKT0A0Gg0+HrjQhQVFWH58uVwc3PDokWL0LFjRwwaNAjz589HUlIS9Hp9a387RCQDO3fuxLBhw7B8+XLMnz9fsaUHcMRnt2K2HMPXmQW4vj6zeVQq4OGwjvXu47t27Rq+//57JCUl4cCBA8jIyED//v0tI8J+/frB2Vk+Rw8R0e25cRHL7t27ER4eLjpSq2Px2aFr167h8WefR4b/Q4Dapdlf35yTW8rKyvDdd9/hwIEDSEpKQm5uLh588EFERUUhOjoa9957L9Rq9U0/h4jkR6/XY9q0acjJycGePXssi1iUjsVnZ/Lz8zFq1CiEhIRg6LOvYdk3uaiqafyRITe6vq8m9JaXGBcXFyMlJcUyIvztt98wZMgQREdHIyoqCr169YLTTc4NJSLxahexdO3aFe+//z7atGkjOpLNsPjsyNGjRzF27FjMmjULL730ElQq1e8HVYvbV1NQUIDk5GTLiLC0tBRRUVGWEWGPHj0UPVdAZI9OnjyJUaNGYerUqYqfz6sPi89ObNu2DXFxcdi0aRNGjx5t9V5aXqls9tWcP38eSUlJlhGhyWSylGB0dDS6devWqn8/ETVu165diImJwfr16zF+/HjRcYRg8cmc2WzGvHnz8OGHHyIxMRG9e/du8Fq57auRJAm//PILDhw4YBkRurm5WW6LRkVFITAw0Oa5iByRJElYvHgxNmzYgF27duG++xz3kHoWn4xVVFRg0qRJKC4uxmeffYYOHTqIjnRbJElCVlaWZTSYnJwMPz8/y4gwMjISfn5+omMSKc6Ni1h2797t8L9wsvhk6tdff8XIkSMRHh6ODRs2wNVV3ich3Aqz2Yy0tDTLiPC7775D165dLSPCiIgInipDdJsKCgowZswYdOnSxeEWsTSExSdDBw8exPjx4/HCCy8gISHBYSaejUYjjh8/bhkR/ve//0VISIjVqTIeHh6iYxLZDUdfxNIQFp/MvP/++3jxxRexefNmPPLII6LjCGUwGHD06FHL/OCxY8fQp08fy63RBx54oM45gkR03e7duzF9+nSsW7cOjz/+uOg4ssLikwmTyYQXXngBe/bswd69exEaGio6kuxcu3YNhw4dsowI09PT0a9fP8ut0f79+8PFpfkb+omURJIkLFmyBOvWrcOuXbvQr18/0ZFkh8UnA1evXsVTTz0Fg8GATz75BL6+vqIj2YXy8nKrU2V++uknDBw40DIi7Nu3L0+VIYei1+sxffp0ZGVlYc+ePQ6/iKUhLD7BcnNzMXLkSERGRmLVqlU8B/M2lJSUIDU11bJYJj8/H4MHD7aMCO+++26eKkOKdenSJYwePRpBQUH497//zUUsjWDxCZSUlIQnn3wSCxYsQGxsrOg4inPp0iWrU2VKSkqsTpUJCQnhZD8pwqlTpzBq1ChMmTIF8+fP5y94N8HiE2Tjxo1YsGABPvroIwwdOlR0HIeQl5dnmR88cOAAampqLCUYFRWFO+64wyZFWFRhwI7jecguKEOZ3ggvrQY6fy+MD5f/AzxJfmoXsaxduxZPPPGE6Dh2gcVnYzU1NUhISMCBAweQmJiIu+66S3QkhyRJEs6ePWsZDR44cACurq5WRdi5c/3PPbxVpy6UYl1yLlLOFAKA1YOEa4+WiwzxQ2xEMPoEebfo303KI0kSli5dirVr13IRSzOx+GyopKQE48ePh4uLC7Zt28bN2TIiSRKys7OtTpVp166d1fFqt3NyjujDxElZ9Ho9YmJicPr0aSQmJnIRSzOx+GwkKysLI0eOxMiRI/HWW29xtaHMmc1mpKenW0aEqampCAoKsowIIyIi4OPj06TPul56WTZ9fBQp16VLlzBmzBgEBgZi8+bNXMRyC1h8NvCf//wHf/nLX7BkyRJMnTpVdBy6BUajESdOnLA6Veauu+6yOlXG09OzztedulCKJzcdRlWNyer1or1vQ3/uFMw1eqjdfeA14DF49nnY6prmPDCYHEPtIpbJkydjwYIFXMRyi1h8rUiSJKxatQpLly7Fp59+ikGDBomORC2kurra6lSZH374Ab1797aMCAcOHAg3NzfEbDmGb7Iu1bm9WV34K5x9OkGlcUZN8QUUfPQyOox/Da7+wZZrVCrg4bCO2DjJcU/Rp/+zZ88eTJs2DWvWrMGTTz4pOo5dY/G1kurqasTGxuLo0aNITEzkc+gUrqqqCv/9738tK0bT0tJw74Ah+K3fTJjQ+G/lNcV5uPTRy/B5KAbuoYOt3nPVOOHQi9Fc7enAJEnCW2+9hTVr1mDnzp3o37+/6Eh2j8XXCgoLC/HYY4/Bx8cHW7durfcWGClbeXk55m9LxZ5fTDCr6p/PLf5qPSrTv4VkNMClY3d0nLgETi7WZ49qNU547n96YMaQ7raITTJjMBgQExODjIwM7Nmzp8VXGjsq3iBuYenp6ejfvz8GDRqEXbt2sfQclKenJ6S2nRosPQDwfTgWQbM/QceJS+HW4wGo1HVP7dEbzci+WN6aUUmmLl++jOjoaFy7dg2pqaksvRbE4mtBiYmJiI6OxhtvvIFFixZx4tnBlemNN71G5aSGNqgnTOVFKP9xXwOfU9PS0Ujm0tLS0L9/fwwdOhTbt2+Hu7u76EiKohEdQAlqN5KuWbMGn3/+Oe6//37RkUgGvLTN+N/LbIbxysV63zLpK2A2m/mLlINITEzEM888g9WrV+Opp54SHUeR+H/SbdLr9fjzn/+MTz/9FEeOHGHpkYXO3wuumrr/i5kqS1GZmQJzdRUkswlVvxxHZVYKtN3uqXOtk2TEd4kfw8/PD2PGjMHq1auRlpYGs7npewLJPtQuYpk5cya++OILll4r4uKW23Dx4kWMGTMGXbp04WnoVEdRhQEPLj1gdTQZAJiuXUXhrsWovnwWkMzQtO0Az/AR8LznT3U+o3ZVp6GsGCkpKUhKSkJycjJKSkowZMgQREVFITIyEj179uSI0I7VLmJJT09HYmIi5/NaGYvvFh0/fhyjR4/G9OnTMW/ePJ7yT/VqaB9fUzS2jy8/Px/JycmWP6WlpYiIiEBkZKSlCPnfpH24fPkyxo4dC39/f2zevJnzeTbA4rsFn376KWJjY7FhwwaMGzdOdBySsYZObmmK5pzccuHCBaSkpFiKsKyszFKEUVFRCA0NZRHKUFpaGkaNGoVJkybh73//O0ftNsLiawaz2YyFCxfivffew549e3DvvfeKjkR2QMRZnefPn7cUYVJSEiorKxEREWG5NarT6ViEgu3duxdTp07FqlWrMGHCBNFxHAqLr4kqKysxZcoU5OXlYdeuXfD39xcdieyI6Kcz/Prrr1ZFWFVVZbktGhkZyYfy2pAkSVi2bBlWrVqFnTt3ckGcACy+Jrhw4QJGjRqFXr164R//+Ae0Wq3oSGSH0vJKsT45F0k5hVDh+ub0WrXP44sK8UNsZHCrH0x97tw5y2KZpKQkVFdXWxVhjx49WIStwGAwYMaMGTh16hQSExMRFBQkOpJDYvHdxOHDh/HYY48hPj4ezz//PH8Y0G0rrjBgx4k8ZF8sR5m+Bl5aZ+gCPDGur7gnsJ87d86yYjQpKQlGo9FSglFRUQgODuZ/+7epdhFLx44d8cEHH3ARi0AsvkZs2bIFs2fPxnvvvYcRI0aIjkNkE7VPp69dKJOUlASz2WwpwcjISHTv3p1F2Azp6ekYOXIkF7HIBIuvHmazGa+88go++eQTJCYmolevXqIjEQkjSRJ++eUXqyIEYCnByMhI3HnnnSzCBuzduxfPPPMMVq5cyUUsMsHi+4Py8nJMnDgRV69exY4dO+Dn5yc6EpGsSJKEn3/+2VKCSUlJ0Gg0VnOEd9xxh8MXoSRJePvtt7Fy5UouYpEZFt8Nzp49i5EjR2LAgAFYt24dXFxcREcikj1JkpCbm2s1R+ji4mI1R+hoz6M0GAx49tlncfLkSS5ikSEW3+9SU1Px+OOP45VXXsHf/vY3h/9tlehWSZKEM2fOWN0a1Wq1VkXYtWtX0TFbTWFhIcaOHYsOHTpwEYtMsfgA/POf/8Qrr7yCrVu3YtiwYaLjECmKJEnIycmxKsI2bdpYLZbp0qWL6JgtIiMjAyNGjMDEiROxcOFCLmKRKYcuPqPRiDlz5mDfvn3Yu3cvQkJCREciUjxJkpCdnW0pweTkZHh4eFgtlrHHW4Off/45pk6dykUsdsBhi6+0tBRPPPEEzGYzPvnkE/j4+IiOROSQJElCVlaWpQSTk5PRtm1bq8Uytn5aQVGFATuO5yG7oAxleiO8tBro/L0wPrzuXktJkrB8+XK88847XMRiJxyy+M6cOYORI0di2LBhWLFiBTQaPo+XSC7MZjMyMzOtnj7h4+NjVYSBgYGt8nefulCKdcm5SDlTCABWj5SqPV0nMsQPsRHB6BPkDYPBgJkzZ+LHH3/kIhY74nDFt3//fkyYMAGvv/46ZsyYIToOEd2E2WzG6dOnLbdGU1JS4Ovra5kjjIiIQKdOnW7772nueapxQzrjo7/PhJ+fH7Zs2cJFLHbEYYpPkiSsX78er7/+Oj7++GNERkaKjkREt8BsNiMjI8OqCP38/CxzhBEREQgICGjWZ97KEzRgNKC/cx4+fuOvXMRiZxyi+GpqahAXF4fU1FQkJiaie/fuoiMRUQsxm81IT0+3zBGmpqaiY8eOltuiERERjT5Npb5nJpYd34vK9G9RXXgO7qERaP/oc/V+bXOemUjyofjiKy4uxrhx49CmTRts27YNXl5eoiMRUSsymUxIS0uzzA+mpqYiICDAao6wQ4cOlutjthzDN1mXrG5vXss5BKhUqDp7AlJNdYPFp1IBD4d1xMZJ97X2t0UtSNHFl5mZiZEjR2LMmDFYsmQJ1Gq16EhEZGMmkwmnTp2y3Br97rvvEBgYiMjISNw3KAqLT7dBtan+H4NXUrfAVFbUYPEBgKvGCYdejBb2ZA1qPsUW3759+zB58mQsW7YMU6ZMER2HiGTCZDLh5MmTSE5OxifpV1Dg1xcqTf2l1ZTi02qc8Nz/9MCMIZxCsRd2s46/qftqavfUrFixAnv27MHAgQMFpiYiuVGr1QgPD0d4eDgubP8Ru0/+dlufpzeakX2xvIXSkS3Ivvga31dTgHf2n7Hsq9F1cMOMGTNw8uRJHD58WDHHIBFR6yjTG1voc2pa5HPINmRdfDfbV6P/vQS/zryElJxCuGZ+ge5SGQ4ePAgPDw8bpyUie+OlbZkfgV5a5xb5HLIN2RZffftqCj58CYbfcqByur5IRe3pi8CYdyFJ10uwpscwjB55N0uPiJpE5+8FV02B1Z0kAJDMJqD2j2SGZKwGnNSWnz030mqcoAvwtFVkagGyLL5TF0rx5r7sejeTthv2LDz7PFzv15mgxuIvc3BPkA/31RDRTY0L74x39p+p8/rV7z/G1e+3Wf658nQS2j74FLwHT6xzrQRgXF/bniVKt0eWxbcuORd6o+nmF9ZDbzRhfXIu99UQ0U2193BFRA+/Ovv4vAdPrLfk/kilAqJC/LiVwc7I7pydogoDUs4UNnhWXmnyZlxYNQEFW56H/te0Ou9LEpCUU4jiCkMrJyUiJZgVGQyt5tb2+Go1asRGBrdwImptsiu+HcfzGnzPJ+ppBD77T3SetRke9/wJlz97HTVXLta5TgVgx4mGP4eIqFafIG/MHa6Dm3Pzfhy6OTth7nAdp1XskOyKL7ugrM5Ecy3XTiFwcm0DlcYZHncPhWtgKKp+PlbnOu6rIaLmmDSgG+YOD4Wbsxoq1U0uliS4Oasxd3goJg3oZot41MJkV3zN2lejUuH61HJ9n8N9NUTUdJMGdMP2mAF4OKwjXDVO0GqsfzxqNU5wUatgPHcMbz/SmaVnx2S3uKWhfTVmfQUMv+VA2+VuwEmNyqxUGC5koN1DMQ18DvfVEFHz9O7sjY2T7kNxhQE7TuQh+2I5yvQ18NI6QxfgiXF9O2PT2jRsWvoq/t/u3aLj0i2SXfE1tq+mNHUrakryAJUTnH07w2/sq3BuV/dJzNxXQ0S3w9fDtcGzNxMSEhAWFoZvv/0WQ4cOtXEyagmyO6S6qMKAB5ceaHCeryl4WjoRtaadO3diwYIF+PHHH6HRyG78QDchuzm+2n01N51gbgD31RBRaxszZgx8fX2xadMm0VHoFsiu+ADuqyEieVOpVFi5ciVee+01XLlyRXQcaiZZFh/31RCR3N1zzz0YNWoUFi5cKDoKNZPs5vhudLOnM9RSqa6P9OYO13GJMRHZzOXLlxEWFoaDBw9Cp9OJjkNNJOviA4C0vFKsT85FUk4hVPi/RxEB11dvSrg+pxcbGcyRHhHZ3Ntvv42kpCR88cUXoqNQE8m++Go1tq+GC1mISJTq6mr07NkTa9aswZ/+9CfRcagJ7Kb4iIjkKjExES+++CLS0tLg7MzDM+ROlotbiIjsyYgRI9C5c2ds2LBBdBRqAo74iIhaQEZGBqKjo5GVlQVfX1/RcagRLD4iohYya9YsqFQqrF27VnQUagSLj4iohRQVFSE0NBTJycno2bOn6DjUAM7xERG1kPbt2+PVV1/F7NmzwTGFfLH4iIhaUGxsLM6fP899fTLGW51ERC3syy+/RHx8PDIyMuDi4iI6Dv0BR3xERC3skUceQXBwMBe5yBRHfERErSA7OxuDBw9GZmYm/Pz8RMehG7D4iIhaSUJCAvR6PTZu3Cg6Ct2AxUdE1EquXLkCnU6Hb775Br179xYdh37HOT4iolbi4+ODBQsWICEhgdsbZITFR0TUimJiYlBYWIjdu3eLjkK/461OIqJWtn//fsyYMQOZmZlwdeVj1ETjiI+IqJU99NBD6NWrF1auXCk6CoEjPiIim/jpp5/wwAMPICMjA/7+/qLjODQWHxGRjcyZMwdXrlzBv/71L9FRHBqLj4jIRq5evYqQkBDs27cPffv2FR3HYXGOj4jIRtq2bYuFCxciPj6e2xsEYvEREdnQM888g/Lycnz66aeiozgs3uokIrKx5ORkTJkyBVlZWXBzcxMdx+FwxEdEZGORkZEIDw/H8uXLRUdxSBzxEREJ8Msvv6Bfv35IS0tDYGCg6DgOhcVHRCTIyy+/jPz8fHzwwQeiozgUFh8RkSDl5eUICQnBrl27cP/994uO4zA4x0dEJIinpyfefPNNPr3Bxlh8REQCTZ48GTU1Ndi2bZvoKA6DtzqJiAQ7ePAgJkyYgKysLLi7u4uOo3gc8RERCTZo0CAMHDgQy5YtEx3FIXDER0QkA+fPn8e9996LkydPIigoSHQcRWPxERHJxPz585Gbm4uPPvpIdBRFY/EREclEZWUldDodtm/fjoEDB4qOo1ic4yMikgl3d3csXrwY8fHxMJvNouMoFouPiEhGJkyYALVajS1btoiOoli81UlEJDNHjhzB2LFjkZOTAw8PD9FxFIcjPiIimbn//vsRHR2NxYsXi46iSBzxERHJUH5+Pvr06YMffvgBd9xxh+g4isIRHxGRDAUGBiI+Ph4vvPCC6CiKwxEfEZFMXbt2DaGhofjggw8QEREhOo5icMRHRCRTbdq0wdKlS5GQkACTySQ6jmKw+IiIZOyJJ56Au7s73n//fdFRFIO3OomIZO7YsWMYMWIEcnJy4OXlJTqO3WPxERHZgaeffhp+fn546623REexeyw+IiI7cPHiRfTq1QtHjhxBcHCw6Dh2jXN8RER2ICAgAHPmzMGcOXNER7F7HPEREdkJvV6PsLAwbNq0CUOHDhUdx25xxEdEZCe0Wi2WLVuGhIQEGI1G0XHsFouPiMiOjB07Fr6+vti0aZPoKHaLtzqJiOzMyZMn8fDDDyMnJwfe3t6i49gdFh8RkR2KiYmBh4cHVqxYITqK3WHxERHZocuXLyMsLAzff/89QkJCRMexK5zjIyKyQx06dMBLL72E//3f/xUdxe6w+IiI7FRcXBxycnLw1VdfiY5iV1h8RER2ysXFBcuXL8dzzz2Hmpoa0XHsBouPiMiOjRgxAoGBgdi4caPoKHaDi1uIiOxcRkYGoqOjkZWVBV9fX9FxZI/FR0SkALNmzYKTkxPWrFkjOorssfiIiBSgqKgIYWFhSEpKQs+ePUXHkTXO8RERKUD79u0xd+5czJ49GxzPNI7FR0SkELGxsTh//jy++OIL0VFkjbc6iYgU5Msvv0R8fDwyMjLg4uIiOo4sccRHRKQgjzzyCLp37461a9eKjiJbHPERESlMVlYWhgwZgszMTPj5+YmOIzssPiIiBYqPj4fBYODG9nqw+IiIFKikpAQ6nQ779+9H7969RceRFRYfEZFCrVu3Dp999hm+/fZbFFdWY8fxPGQXlKFMb4SXVgOdvxfGh3eGr4er6Kg2xeIjIlIoo9GIuyMeRfDIWJypcAYAGIxmy/tajRMkAJEhfoiNCEafIG8xQW2MxUdEpFBbD5/Dwr2nUW00A04NL+JXqQCtRo25w3WYNKCb7QIKwu0MREQKtPXwOby5LwvVZjRaegAgSUBVjQlv7svC1sPnbJJPJI74iIgU5tSFUjy56TCqakxWr5uqylG8bxX0536Ek5sXfCImw71npNU1bs5qbI8ZgN6dvW0X2MY44iMiUph1ybnQG011Xi/5egNUamd0/ttWtB8xB8Vfr0d14a9W1+iNJqxPzrVVVCFYfEREClJUYUDKmUL88V6euVqPazmH4D1kEpxc3KAN6ok2wfej8nSS1XWSBCTlFKK4wmDD1LbF4iMiUpAdx/Pqfd1Ykg+VkxrO7QItrzl3uAM1fxjxAYAKwI4T9X+OErD4iIgUJLugzGrLQi1zTRVUrm5Wrzm5toG5uqrOtXqjGdkXy1sto2gsPiIiBSnTG+t93cnZDZLBuuQkwzU4ubjVe32ZvqbFs8kFi4+ISEG8tJp6X9e0C4RkNqGmJN/yWvXls3D269rA5zi3Sj45YPERESmIzt8Lrpq6P9qdXLRoE/IASr/7EOZqPfR5mbiWewTuPaPqXKvVOEEX4GmLuEKw+IiIFGRceOcG32s3LBaSsRp5ayaiKHEZfIfFwqWeEZ8EYFzfhj/H3tU/JiYiIrvU3sMVET388E3WpTpbGtRunujw2KuNfr1KBUSF+Cn64GqO+IiIFGZWZDC0GvUtfa1Wo0ZsZHALJ5IXFh8RkcL0CfLG3OE6uDk370e8m7MT5g7XKfq4MoC3OomIFKn2KQtv7suG3miqc9vzRo72dAYeUk1EpGBpeaVYn5yLpJxCqHB9c3qt2ufxRYX4ITYyWPEjvVosPiIiB1BcYcCOE3nIvliOMn0NvLTO0AV4YlxfPoGdiIhI0bi4hYiIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHAqLj4iIHMr/Byn37UJh3auiAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "\n", + "max_cut_graph_edges = [(0,1), (1,2), (1,3), (3,4), (4,5), (4,6)]\n", + "n_nodes = 7\n", + "\n", + "max_cut_graph = nx.Graph()\n", + "max_cut_graph.add_edges_from(max_cut_graph_edges)\n", + "nx.draw(max_cut_graph, labels={node: node for node in max_cut_graph.nodes()})\n", + "\n", + "expected_results = [(0,1,0,0,1,0,0), (1,0,1,1,0,1,1)]" + ] + }, + { + "cell_type": "markdown", + "id": "18a5bd16", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Define Cost Hamiltonian: $\\gamma H$" + ] + }, + { + "cell_type": "markdown", + "id": "543f87ca", + "metadata": {}, + "source": [ + "$$\n", + "\\begin{equation}\n", + "H_P = \\frac{1}{2}\\sum_{} (-Z_j \\,Z_k +I )\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "99226b24", + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(): 3.0*cost0_5, (Zq[0], Zq[1]): -0.5*cost0_5, (Zq[1], Zq[2]): -0.5*cost0_5, (Zq[1], Zq[3]): -0.5*cost0_5, (Zq[3], Zq[4]): -0.5*cost0_5, (Zq[4], Zq[5]): -0.5*cost0_5, (Zq[4], Zq[6]): -0.5*cost0_5}\n" + ] + } + ], + "source": [ + "from typing import List, Tuple, Any\n", + "from pytket.utils import QubitPauliOperator\n", + "from pytket.circuit import fresh_symbol\n", + "from pytket.pauli import QubitPauliString, Pauli\n", + "from pytket import Qubit\n", + "\n", + "cost0 = fresh_symbol(\"cost0\")\n", + "cost1 = fresh_symbol(\"cost1\")\n", + "cost2 = fresh_symbol(\"cost2\")\n", + "mixer0 = fresh_symbol(\"mixer0\")\n", + "mixer1 = fresh_symbol(\"mixer1\")\n", + "mixer2 = fresh_symbol(\"mixer2\")\n", + "vardict = {0: cost0, 1: cost1, 2: cost2, 3: mixer0, 4: mixer1, 5: mixer2}\n", + "\n", + "\n", + "def qaoa_graph_to_cost_hamiltonian(edges: List[Tuple[int, int]], name) -> QubitPauliOperator:\n", + " qpo_dict = {QubitPauliString(): float(len(edges))*0.5*name}\n", + " for e in edges:\n", + " term_string = QubitPauliString([Qubit(e[0]), Qubit(e[1])], [Pauli.Z, Pauli.Z])\n", + " qpo_dict[term_string] = -0.5*name\n", + " return QubitPauliOperator(qpo_dict)\n", + "\n", + "cost_ham_qpo = qaoa_graph_to_cost_hamiltonian(max_cut_graph_edges, cost0)\n", + "print(cost_ham_qpo)" + ] + }, + { + "cell_type": "markdown", + "id": "6da499ac", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "$$\n", + "\\begin{equation}\n", + "H_P = 3 I^{\\otimes 6} -0.5 \\big[ Z_0 Z_1 + Z_1 Z_2 +Z_1 Z_3 +Z_3 Z_4 +Z_4 Z_5 +Z_4 Z_6 \\big]\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Using the same index convention as above" + ] + }, + { + "cell_type": "markdown", + "id": "785ff56c", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Hamiltonian Circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "11fe9917", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.utils import gen_term_sequence_circuit\n", + "from pytket import Circuit\n", + "from pytket.circuit import display\n", + "\n", + "cost_ham_circuit = gen_term_sequence_circuit(cost_ham_qpo, Circuit(n_nodes))\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "9057c55f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.transform import Transform\n", + "\n", + "Transform.DecomposeBoxes().apply(cost_ham_circuit)\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "4690b787", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Construction of the Mixer Hamiltonian: $\\beta B$" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "296c560d", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mixer_angle = 0.8\n", + "mixer_ham_qpo = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): mixer_angle for i in range(n_nodes)})\n", + "mixer_ham_circuit = gen_term_sequence_circuit(mixer_ham_qpo, Circuit(n_nodes))\n", + "Transform.DecomposeBoxes().apply(mixer_ham_circuit)\n", + "display.render_circuit_jupyter(mixer_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "4d128a70", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Define the Initial State" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "0a9db628", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.extensions.qiskit import AerBackend\n", + "\n", + "backend = AerBackend()\n", + "comp = backend.get_compiled_circuit\n", + "\n", + "def qaoa_initial_circuit(n_qubits: int) -> Circuit:\n", + " c = Circuit(n_qubits)\n", + " for i in range(n_qubits):\n", + " c.H(i)\n", + " return c\n", + "\n", + "superposition_circuit = qaoa_initial_circuit(n_nodes)\n", + "Transform.DecomposeBoxes().apply(superposition_circuit)\n", + "backend.default_compilation_pass(2).apply(superposition_circuit)\n", + "\n", + "display.render_circuit_jupyter(superposition_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "da759b59", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Construct QAOA Circuit" + ] + }, + { + "cell_type": "markdown", + "id": "359a1a0f-e92e-40ae-bbe6-ce960b118f49", + "metadata": {}, + "source": [ + "Now lets define a function to create our entire QAOA circuit. For $p$ QAOA layers we expect that our circuit will require $2p$ parameters. Here we will pass and cost mixer parameters in as a list where the length of the list defines the number of layers." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "23f8910a", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_max_cut_circuit(edges: List[Tuple[int, int]],\n", + " n_nodes: int, length: int) -> Circuit:\n", + " \n", + " # initial state\n", + " qaoa_circuit = superposition_circuit.copy() \n", + " # add cost and mixer terms to state\n", + " for index in range(length):\n", + " cost_ham = qaoa_graph_to_cost_hamiltonian(edges, vardict[index])\n", + " mixer_ham = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): vardict[index + length] for i in range(n_nodes)})\n", + " qaoa_circuit.append(gen_term_sequence_circuit(cost_ham, Circuit(n_nodes)))\n", + " qaoa_circuit.append(gen_term_sequence_circuit(mixer_ham, Circuit(n_nodes)))\n", + " \n", + " Transform.DecomposeBoxes().apply(qaoa_circuit)\n", + " Transform.OptimisePhaseGadgets().apply(qaoa_circuit)\n", + " \n", + " return qaoa_circuit" + ] + }, + { + "cell_type": "markdown", + "id": "bc2f8939-41b7-476b-a5a8-09de07211079", + "metadata": {}, + "source": [ + "We also need to extract our energy expectation values from a `BackendResult` object after our circuit is processed by the device/simulator. We do this with the `get_max_cut_energy` function below. Note that the fact that the maxcut Hamiltonian contains only commuting terms means that we do not need to calculate our energy expectation using multiple measurement circuits. This may not the the case for a different problem Hamiltonian." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "df387eea-4198-428e-9b92-4f3bceb12f0e", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple\n", + "from pytket.backends.backendresult import BackendResult\n", + "\n", + "def get_max_cut_energy(edges: List[Tuple[int, int]], results: BackendResult) -> float:\n", + " energy = 0.0\n", + " dist = results.get_distribution()\n", + " for i, j in edges:\n", + " energy += sum((meas[i] ^ meas[j]) * prob for meas, prob in dist.items())\n", + "\n", + " return energy" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "e5abad7b-e989-4156-9708-3d8c97d8ca2a", + "metadata": {}, + "outputs": [], + "source": [ + "from pytket.backends.backend import Backend\n", + "from typing import Callable\n", + "import numpy as np\n", + "\n", + "def qaoa_instance(\n", + " backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " guess_mixer_angles: np.array,\n", + " guess_cost_angles: np.array,\n", + " prep_circuit: Circuit,\n", + " seed: int,\n", + " shots: int = 5000,\n", + ") -> float:\n", + " # step 1: get state guess\n", + " measured_circ = prep_circuit.copy().measure_all()\n", + " symbol_dict = {}\n", + " for i in range(guess_mixer_angles.shape[0]):\n", + " symbol_dict[vardict[i]] = guess_cost_angles[i]\n", + " symbol_dict[vardict[i + guess_mixer_angles.shape[0]]] = guess_mixer_angles[i]\n", + " \n", + " measured_circ.symbol_substitution(symbol_dict)\n", + " res = backend.run_circuit(measured_circ, shots, seed=seed)\n", + "\n", + " return get_max_cut_energy(max_cut_graph_edges, res)" + ] + }, + { + "cell_type": "markdown", + "id": "2c01c28b", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Optimise Energy by Guessing Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "0a44bed8", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_optimise_energy(compiler_pass: Callable[[Circuit], bool],\n", + " backend: Backend,\n", + " iterations: int = 100,\n", + " n: int = 3,\n", + " shots: int = 5000,\n", + " seed: int= 12345):\n", + " \n", + " highest_energy = 0 \n", + " best_guess_mixer_angles = [0 for i in range(n)] \n", + " best_guess_cost_angles = [0 for i in range(n)]\n", + " rng = np.random.default_rng(seed)\n", + " # guess some angles (iterations)-times and try if they are better than the best angles found before\n", + " my_prep_circuit = qaoa_max_cut_circuit(\n", + " max_cut_graph_edges, n_nodes, len(best_guess_mixer_angles)\n", + " )\n", + " for i in range(iterations):\n", + " \n", + " guess_mixer_angles = rng.uniform(0, 1, n)\n", + " guess_cost_angles = rng.uniform(0, 1, n)\n", + " \n", + " qaoa_energy = qaoa_instance(backend,\n", + " compiler_pass,\n", + " guess_mixer_angles,\n", + " guess_cost_angles,\n", + " my_prep_circuit,\n", + " seed=seed,\n", + " shots=shots)\n", + " \n", + " if(qaoa_energy > highest_energy):\n", + " \n", + " print(\"new highest energy found: \", qaoa_energy)\n", + " \n", + " best_guess_mixer_angles = np.round(guess_mixer_angles, 3)\n", + " best_guess_cost_angles = np.round(guess_cost_angles, 3)\n", + " highest_energy = qaoa_energy\n", + " \n", + " print(\"highest energy: \", highest_energy)\n", + " print(\"best guess mixer angles: \", best_guess_mixer_angles)\n", + " print(\"best guess cost angles: \", best_guess_cost_angles)\n", + " return best_guess_mixer_angles, best_guess_cost_angles" + ] + }, + { + "cell_type": "markdown", + "id": "d22226cc", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Calculate the State for the final Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "da46e63d", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def qaoa_calculate(backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " shots: int = 5000,\n", + " iterations: int = 100,\n", + " seed: int = 12345,\n", + " ) -> BackendResult:\n", + " \n", + " # find the parameters for the highest energy\n", + " best_mixer, best_cost = qaoa_optimise_energy(compiler_pass,\n", + " backend,\n", + " iterations,\n", + " 3,\n", + " shots=shots,\n", + " seed=seed)\n", + " \n", + " # get the circuit with the final parameters of the optimisation:\n", + " my_qaoa_circuit = qaoa_max_cut_circuit(max_cut_graph_edges,\n", + " n_nodes,\n", + " len(best_mixer))\n", + "\n", + " final_circ = my_qaoa_circuit.copy().measure_all()\n", + " symbol_dict = {}\n", + " for i in range(len(best_mixer)):\n", + " symbol_dict[vardict[i]] = best_cost[i]\n", + " symbol_dict[vardict[i + len(best_mixer)]] = best_mixer[i]\n", + " \n", + " final_circ.symbol_substitution(symbol_dict)\n", + "\n", + " compiler_pass(final_circ)\n", + " handle = backend.process_circuit(final_circ, shots, seed=seed)\n", + "\n", + " result = backend.get_result(handle) \n", + " \n", + " return result" + ] + }, + { + "cell_type": "markdown", + "id": "9dd97e10", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Results with the Noiseless Simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "e7afb38e", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "from pytket.extensions.qiskit import AerBackend\n", + "\n", + "backend = AerBackend()\n", + "comp = backend.get_compiled_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "aaea7e2f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "new highest energy found: 3.1432\n", + "new highest energy found: 3.283599999999999\n", + "new highest energy found: 4.361\n", + "new highest energy found: 4.925600000000001\n", + "new highest energy found: 4.941999999999999\n", + "highest energy: 4.941999999999999\n", + "best guess mixer angles: [0.392 0.247 0.138]\n", + "best guess cost angles: [0.592 0.738 0.608]\n", + "CPU times: user 4.53 s, sys: 31.1 ms, total: 4.56 s\n", + "Wall time: 4.55 s\n" + ] + } + ], + "source": [ + "%%time\n", + "res = qaoa_calculate(backend, backend.default_compilation_pass(2).apply, shots = 5000, iterations = 100, seed=12345)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "3b86301e-7645-4553-be38-3ebf89eedd37", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success ratio 0.4252 \n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from maxcut_plotting import plot_maxcut_results\n", + "\n", + "plot_maxcut_results(res, 6)" + ] + }, + { + "cell_type": "markdown", + "id": "6e36c4fb-a118-4ab8-be01-77a674f273e3", + "metadata": {}, + "source": [ + "Here the binary strings in the results correspond to the two optimal colourings of our graph." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "ffce2a97-902c-44d8-8d64-b25498752907", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "G = nx.Graph()\n", + "G.add_edges_from(max_cut_graph_edges)\n", + "\n", + "H = nx.Graph()\n", + "H.add_edges_from(max_cut_graph_edges)\n", + "\n", + "plt.figure(1)\n", + "nx.draw(G, labels={node: node for node in max_cut_graph.nodes()}, node_color= ['red', 'blue', 'red','red', 'blue', 'red', 'red'])\n", + "plt.figure(2)\n", + "nx.draw(H, labels={node: node for node in max_cut_graph.nodes()}, node_color= ['blue', 'red', 'blue', 'blue', 'red', 'blue', 'blue'])\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f129e390-f926-497d-a2ba-88bdc6d07378", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Python 3 [Default]", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + }, + "vscode": { + "interpreter": { + "hash": "3289aa74b4cc5b65254d7b081e6c83acb4efa1b1c1d2fe845644451ee4b44b02" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/team_solutions/pineapple/minimum_dominating_set.ipynb b/team_solutions/pineapple/minimum_dominating_set.ipynb new file mode 100644 index 0000000..f9bf261 --- /dev/null +++ b/team_solutions/pineapple/minimum_dominating_set.ipynb @@ -0,0 +1,825 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a3b602e8-f1ca-4f06-9079-5000fbbaf8f8", + "metadata": {}, + "source": [ + "# Minimum Dominating Set Problem" + ] + }, + { + "cell_type": "markdown", + "id": "1a93c695-d39f-4651-82fe-4b87bc3e2156", + "metadata": {}, + "source": [ + "## Graph Construction" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f1a871da-89ec-4ff9-a074-5b5a40627a27", + "metadata": {}, + "outputs": [], + "source": [ + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "from collections import defaultdict" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "60ae8e92-fe73-47bf-9923-ce90dfea13aa", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ4AAACeCAYAAADDhbN7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAAsTAAALEwEAmpwYAAANQ0lEQVR4nO3dXWxT9R/H8c+e2rVswBwrWycIQ2GCmwJDdEMgPkX04i8PEdAgKgqiQmJEiciFkkGgasJwIPOJGwUUFlGcKEMdA72YTyhxMW7snw2GMIQp22i7svP5X5zwj4R2O+05Z6fdvq+EeEH723fk7elpz69tHElCiF4Wb/UAon+S8IQlJDxhCQlPWELCE5aQ8IQlJDxhCQlPWELCE5aQ8Ex09Cjw2GPAmDGA2w2MHAncdhuwcyfQ2Wn1dNaKk0tmxtu/H3jhBaCuDvD7ga6uy/8+NRWIjweWLgVefhmw2y0Z01ISnsFKSoAXXwS83p5v63AAY8cCBw4AgwebPlpUkfAM9O67wPLlwIUL2u9jswF5ecC33/avI5+c4xmksRFYtiy86AD1XK+2FnjlFXPmilYSnkFKS688l9PK6wW2bOlfTzgkPAP4/UBZmb5wFAX4+GPjZop2Ep4B9u8H4uL0rdHWBmzebMw8sUDCM0BzMxAI6F/n+HH9a8QKCc8APl/k53f/5vfrXyNWSHgGGDQISErSv87AgfrXiBUSngEmTgT0vhqamAgUFhozTyyQ8AyQnw+MGqVvjaQk4NlnjZknFkh4Blm5EkhJifz+Y8aoVzD6CwnPIHPmABkZQEJC+Pd1OACPx/iZopmEZxC7HaiqUi/2hxOf0wmsXw/cdZdZk0Un2SRgsKYmYPp04MwZoL099O1sNjXQ0lJ1z15/I+GZwO8HysuBDRuA+nqgs9MHIBFJSYlITFSvcixZAjz9NHDNNVZPaw0Jz2S//grMm+fBtGn/wU03jYHbDdx9d//aAhWMhNcLxo4di127dmHcuHFWjxI15MlFLzh58iTcbrfVY0QVCc9kHR0d8Pv9GNzf9rb3QMIz2aWjXZzefVN9jIRnMnmYDU7CM5mEF5yEZzIJLzgJz2QSXnASnskkvOAkPJNJeMFJeCaT8IKTS2YmIomUlBScOnUKqampVo8TVeSIZ6Lz588jPj5eogtCwjORPMyGJuGZSMILTcIzkYQXmoRnIgkvNAnPRBJeaBKeiSS80CQ8E0l4oUl4JpLwQpMrFyYhCYfDgdbWVjgcDqvHiTpyxDPJuXPn4HQ6JboQJDyTyMNs9yQ8k0h43ZPwTCLhdU/CM4mE1z0JzyQSXvckPJNIeN2T8Ewi4XVPwjOJhNc9uXJhAkVRkJycjPb2dthsNqvHiUpyxDNBS0sLBg8eLNF1Q8IzgTzM9kzCM4GE1zMJzwQSXs8kPBNIeD2T8Ewg4fVMwjOBhNczCc8EEl7PJDwTSHg9kysXBgsEAnA6nfB6vUhMTLR6nKglRzyDnT59GhkZGRJdDyQ8g8nDrDYSnsEkPG0kPINJeNpIeAaT8LSR8Awm4Wkj4RlMwtNGwjOYhKeNhGcwCU8buXJhIL/fj9TUVPh8PsTHy//T3ZF/HQP9+eefyMzMlOg0kH8hA508eRLZ2dlWjxETJDwDyfmddnIlWy8SqKsDzpxBXHU1JtpsQCAAJCVZPVlUkycXkWprA95/H/B4gJYWICkJXp8P8QDsDgfw1FPqH3noDUrCi8SOHcDjjwNxcUBHR/Db2O3q3z/5JPD664A84biMhBeujRuBVasAr1fb7Z1O4J57gF27JL5/kfDCsWcP8OCD2qO7xOkEnnhCjVYAkPC0UxT1fO3Uqcjub7cD9fXA1VcbO1eMkmO/VgcOAO3t+tbYssWYWfoAOeJpdeedwFdf6Vtj0CD1GbB8ipQc8TQ7fFj/GooC1NbqX6cPkPC0CASAzk7968THA62t+tfpAyQ8LYx8GUTe9ghAwtMmIUF9SUSvixeBIUP0r9MHSHhazZwJJiToWyM9HcjNNWaeGCfhaXDs2DEUe73wdnVFvsiAAcDzz6uX0YSE151ffvkF8+fPx+TJk+HLzUXS9ddHvBYVBXj4YQOni20SXhCHDx/GfffdhxkzZmD8+PFoaGhAcXExknbuVI9cYfInJGD1kCH479mzJkwboyhIkoqisKKiglOmTGFOTg63bt1Kr9d75Q2//pocMIBUd+L1/MfhoOLxcOPGjRw6dCgrKyt7/5eLQv0+vEAgwO3btzM/P5/5+fncvn07A4FA93c6coQcN450OsmEhODBpaSQLhf50Uf/v9s333zDzMxMvvbaa1QUxeTfLLr12/C8Xi+3bt3KnJwcFhUV8bPPPgs/hh9/JB96SA0wLk6NMCmJnDqVrKggL1684i6NjY2cMGEC58+fz46ODoN+m9jT78I7f/48PR4Ps7KyeO+997K6utqYhTs7yWAPzUFcuHCBCxYs4I033siGhgZjfn6M6TfhtbS0cPXq1UxPT+e8efN45MgRS+dRFIUlJSV0uVzcv3+/pbNYoc+H19jYyGXLljEtLY2LFy9mXV2d1SNdpqqqipmZmfR4PP3qvK/PhldbW8uFCxcyLS2NK1asYHNzs9UjhdTY2MiJEydy7ty5bG9vt3qcXtHnXserqanBrFmzMH36dFx77bU4duwYXn311ah+v+vw4cNx6NAhJCcno7CwEA0NDVaPZD6ryzeCoiisrKzk7bffzmHDhrGkpCQmjxyKonDTpk10uVz88ssvrR7HVDEdXldXF8vLy1lQUMDc3Fxu27aNfr/f6rF0q6qqYlZWFjds2NBnz/tiMjy/389t27YxNzeXBQUFLC8vZ1dXl9VjGaqpqYkFBQV84IEHYvLo3ZOYCq+9vZ0bN27ksGHDeMcdd/DAgQN99ohAqi9yP/LII8zLy2N9fb3V4xgqJsI7d+4c16xZw4yMDM6cOZM1NTVWj9RrFEVhaWkpXS4Xv/jiC6vHMUxUh9fc3MwVK1YwLS2NCxcuZG1trdUjWaa6uppZWVlcv359nzjKG/L2xr/+An77Dfj7b8DhUN+zfP31ke95rK+vh8fjwe7du7FgwQI899xzGD58uN4xY96JEycwa9YsjBgxAu+99x5SUlKsHilykRarKOS335IzZ5J2OzloEDlwoPpfp5O87jrynXfIcK6D//zzz5w7dy7T09O5evVqtrS0RDpen+X1evnoo4/yhhtuiLqrMOGIKLzWVrKwUN2WFhcXeivagAFkair51Vfdr1ddXc0ZM2YwKyuLHo+H//zzTyRj9RuKonDz5s10uVzct2+f1eNEJOzwzp4lR44kbbaw9kJyz57L11EUhXv37mVRURFHjRrFsrKy4BsvRUiHDh1iVlYW161bF3PnfWGFd/EiOWFCeNFd+uN0kj/8oG68/OCDD5iXl8f8/Hzu2LGj542XIqTjx4/z5ptv5uzZs9nW1mb1OJqFFd4nn6gba8ON7tKfMWOOMycnh1OmTGFFRUXM/V8arXw+HxctWsRx48bFzHlfWOEVFkYeHUDGx/u4a1f/eQ2uNymKwjfffJMul4uff/651eP0SHN4dXVkcrK+8Gw2csUKM38dcfjwYbrdbq5duzaqH1E0b4s6dEj9JAc9OjuBffv0rSG6V1RUhJqaGnz66aeYM2cO2trarB4pKM3htbaqH5qk199/619DdC87OxsHDx7EVVddhVtuuQV1dXVWj3QFzeElJRnz6Qvy9Q+9w2634+2338by5ctRVFSEiooKq0e6jObwhg415oMshw7Vv4bQbsmSJdizZw8WL16M4uJiKIpi9UgAwgjvnnvUT9nSIyVF/fBz0bsKCwvx/fffo6KiImrO+zSHN3AgMG+evicYigLMnx/5/UXk3G43qqqqMGTIEEyePBl//PGHtQOF8xT46FH18lekL6UsXWrWk3MRjrKyMmZkZHDv3r2WzRD2tdqXXlIvf4UTXUICOWKEurlARIfvvvuO2dnZXLNmTci3DRw9Si5aRObmkm63eo1+6lTyww9JvW9tCTs8RVGPXFrjs9nI4cPJpiZ9gwrjNTc389Zbb+X9999/2Y6gykpy/Hj10S3YZxKlpqrb31atIn2+yH52xPvxtmwh09PVIULtSElOJmfPJs+di/SnCLP5/X4uWbKEubm5/P3337lpk/bTKYeDnDQpskeyiMMjyUBA3e5UWKhuHoiPVzeFZmeTxcXk6dN6Vhe96a233mJKyjO02wNhn7tPmhT+kU++2UcAAJqagNGju+D3h/+yhcMBPPsssHat9vv0uY+wEJEpLQXIyF4r83qBzZvD+w4aCU/A7wfKyvR9eZGiqN+qqpWEJ1BZqZ6x6dHWph41tZLwBE6c0H859NI6Wkl4Aj4foOe7Y/69jlYSnsCgQcZsVxs4UPttJTyBiRP1n+MlJACFhdpvL+EJ5OcDo0bpW8NuV1/L00rCEwCAlSvV/ZKRGj0ayMvTfnsJTwAA5sxRv9U0kv2WDgewYUN495HwBAD1ofLgQWDw4PC+kNzpBNatA+6+O7yfJ9dqxWUaG4Fp04CzZ4H29tC3s9nUQN94A3j88fB/joQnruDzAbt3qw+fl7754OJFNbRLL7ssXgw88wwwYkRkP0PCE906cgT46Sf1fdVOJ+B2q2/8stv1rSvhCUvIkwthCQlPWELCE5aQ8IQlJDxhCQlPWELCE5aQ8IQlJDxhif8BERFmEIS6F/gAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# smaller testing graph\n", + "graph_edges = [(0,1), (1,2), (1,3)]\n", + "adj = defaultdict(lambda:[])\n", + "for (i,j) in graph_edges:\n", + " adj[i].append(j)\n", + " adj[j].append(i)\n", + " \n", + "for i in adj.keys():\n", + " adj[i].append(i) # connection to itself\n", + "N = len(adj)\n", + "dominating_set = [1]\n", + "G = nx.Graph()\n", + "G.add_edges_from(graph_edges)\n", + "plt.figure(figsize=(2,2))\n", + "nx.draw(G, node_color=[\"red\" if x in dominating_set else \"blue\" for x in range(len(adj.keys()))])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "id": "4e4449ae-93f9-426f-a575-c72167a65479", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# bigger graph\n", + "graph_edges = [(0,1), (1,2), (1,3), (3,4), (4,5), (4,6), (5, 7), (1, 7)]\n", + "adj = defaultdict(lambda:[])\n", + "for (i,j) in graph_edges:\n", + " adj[i].append(j)\n", + " adj[j].append(i)\n", + " \n", + "for i in adj.keys():\n", + " adj[i].append(i) # connection to itself\n", + "N = len(adj)\n", + "dominating_set = [1, 4]\n", + "G = nx.Graph()\n", + "G.add_edges_from(graph_edges)\n", + "plt.figure(figsize=(2,2))\n", + "nx.draw(G, node_color=[\"red\" if x in dominating_set else \"blue\" for x in range(8)], labels={node: node for node in G.nodes()})\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "682e7535-41c4-4519-966e-c35de1e05cdb", + "metadata": {}, + "source": [ + "## Cost Hamiltonian" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f010b143-c398-458f-9c1a-6473de5ca3d4", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple, Any, Dict\n", + "from pytket.utils import QubitPauliOperator\n", + "from pytket.pauli import QubitPauliString, Pauli\n", + "from pytket import Qubit" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "efd6691f-f389-4c4b-9d1d-55294a4f4b8f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(): -1.81250000000000, (Zq[1]): -0.562500000000000, (Zq[0]): -0.0625000000000000, (Zq[0], Zq[1]): -0.312500000000000, (Zq[2]): -0.0625000000000000, (Zq[0], Zq[2]): -0.0625000000000000, (Zq[3]): -0.0625000000000000, (Zq[0], Zq[3]): -0.0625000000000000, (Zq[2], Zq[3]): -0.0625000000000000, (Zq[0], Zq[2], Zq[3]): -0.0625000000000000, (Zq[1], Zq[2]): -0.312500000000000, (Zq[0], Zq[1], Zq[2]): -0.0625000000000000, (Zq[1], Zq[3]): -0.312500000000000, (Zq[0], Zq[1], Zq[3]): -0.0625000000000000, (Zq[1], Zq[2], Zq[3]): -0.0625000000000000, (Zq[0], Zq[1], Zq[2], Zq[3]): -0.0625000000000000}\n" + ] + } + ], + "source": [ + "def qaoa_graph_to_cost_hamiltonian(adj:Dict[int, List[int]], cost_angle: float) -> QubitPauliOperator:\n", + " qpo_dict = defaultdict(lambda:0)\n", + " N = len(adj.keys())\n", + " for node in range(N):\n", + " for i in range(1<<(len(adj[node]))):\n", + " qubits = []\n", + " for j in range(len(adj[node])):\n", + " if (i&(1<\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.utils import gen_term_sequence_circuit\n", + "from pytket import Circuit\n", + "from pytket.circuit import display\n", + "\n", + "cost_ham_circuit = gen_term_sequence_circuit(cost_ham_qpo, Circuit(N))\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "715d357e-da28-468a-aa24-b9385f9e8009", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pytket.transform import Transform\n", + "\n", + "Transform.DecomposeBoxes().apply(cost_ham_circuit)\n", + "display.render_circuit_jupyter(cost_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "43b9166e-a355-488b-98d3-be988f52fe98", + "metadata": {}, + "source": [ + "## Mixer Hamiltonian" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "1f82803b-15c2-4486-8bf6-461c59dd535f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mixer_angle = 0.8\n", + "mixer_ham_qpo = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): mixer_angle for i in range(N)})\n", + "mixer_ham_circuit = gen_term_sequence_circuit(mixer_ham_qpo, Circuit(N))\n", + "Transform.DecomposeBoxes().apply(mixer_ham_circuit)\n", + "display.render_circuit_jupyter(mixer_ham_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "3d298d00-124f-46de-b2c0-d58dbf9dd937", + "metadata": {}, + "source": [ + "## Initial Circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "51d87382-6263-49c7-b0d6-f74cf4c9077c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def qaoa_initial_circuit(n_qubits: int) -> Circuit:\n", + " c = Circuit(n_qubits)\n", + " for i in range(n_qubits):\n", + " c.H(i)\n", + " return c\n", + "\n", + "superposition_circuit = qaoa_initial_circuit(N)\n", + "\n", + "display.render_circuit_jupyter(superposition_circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "ddb7438f-34a5-4d7a-815b-283252d3f7f2", + "metadata": {}, + "source": [ + "## Putting it all together" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ab0e4675-f644-4227-82ce-f2bd3ea592ad", + "metadata": {}, + "outputs": [], + "source": [ + "def qaoa_dominating_set_circuit(adj:Dict[int, List[int]],\n", + " n_nodes: int,\n", + " mixer_angles: List[float],\n", + " cost_angles: List[float]) -> Circuit:\n", + " \n", + " assert len(mixer_angles) == len(cost_angles)\n", + " \n", + " # initial state\n", + " qaoa_circuit = qaoa_initial_circuit(n_nodes)\n", + " \n", + " # add cost and mixer terms to state\n", + " for cost, mixer in zip(cost_angles, mixer_angles):\n", + " cost_ham = qaoa_graph_to_cost_hamiltonian(adj, cost)\n", + " mixer_ham = QubitPauliOperator({QubitPauliString([Qubit(i)], [Pauli.X]): mixer for i in range(n_nodes)})\n", + " qaoa_circuit.append(gen_term_sequence_circuit(cost_ham, Circuit(n_nodes)))\n", + " qaoa_circuit.append(gen_term_sequence_circuit(mixer_ham, Circuit(n_nodes)))\n", + " \n", + " Transform.DecomposeBoxes().apply(qaoa_circuit)\n", + " return qaoa_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "58f78361-305b-41ef-9aa7-08a4b6a17b47", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple\n", + "from pytket.backends.backendresult import BackendResult\n", + "\n", + "def sat_dominating_set(adj:Dict[int, List[int]], meas):\n", + " # how many dominating set constrainst are satisfied \n", + " num = 0\n", + " for node in adj.keys():\n", + " sat = 0\n", + " for x in adj[node]:\n", + " if meas[x] == 1:\n", + " sat = 1\n", + " num+=sat\n", + " return num\n", + "\n", + "def get_energy(adj:Dict[int, List[int]], results: BackendResult) -> float:\n", + " dist = results.get_distribution()\n", + " energy = 0.0\n", + " for meas, prob in dist.items():\n", + " energy += (sat_dominating_set(adj, meas) - len(adj) - 0.1*sum(meas))*prob\n", + "\n", + " return energy" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "a183907e-714e-4a5f-be72-4610a33ea122", + "metadata": {}, + "outputs": [], + "source": [ + "from pytket.backends.backend import Backend\n", + "from typing import Callable\n", + "import numpy as np\n", + "\n", + "def qaoa_instance(\n", + " backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " guess_mixer_angles: np.array,\n", + " guess_cost_angles: np.array,\n", + " seed: int,\n", + " shots: int = 5000,\n", + ") -> float:\n", + " # step 1: get state guess\n", + " my_prep_circuit = qaoa_dominating_set_circuit(\n", + " adj, N, guess_mixer_angles, guess_cost_angles\n", + " )\n", + " measured_circ = my_prep_circuit.copy().measure_all()\n", + " compiler_pass(measured_circ)\n", + " res = backend.run_circuit(measured_circ, shots, seed=seed)\n", + "\n", + " return get_energy(adj, res)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f562e4e6-2b7f-4d0e-880c-613f5c20eb85", + "metadata": {}, + "outputs": [], + "source": [ + "def qaoa_optimise_energy(compiler_pass: Callable[[Circuit], bool],\n", + " backend: Backend,\n", + " iterations: int = 100,\n", + " n: int = 3,\n", + " shots: int = 5000,\n", + " seed: int= 12345):\n", + " \n", + " highest_energy = -1000 \n", + " best_guess_mixer_angles = [0 for i in range(n)] \n", + " best_guess_cost_angles = [0 for i in range(n)]\n", + " rng = np.random.default_rng(seed)\n", + " # guess some angles (iterations)-times and try if they are better than the best angles found before\n", + " \n", + " for i in range(iterations):\n", + " \n", + " guess_mixer_angles = rng.uniform(0, 1, n)\n", + " guess_cost_angles = rng.uniform(0, 1, n)\n", + " \n", + " qaoa_energy = qaoa_instance(backend,\n", + " compiler_pass,\n", + " guess_mixer_angles,\n", + " guess_cost_angles,\n", + " seed=seed,\n", + " shots=shots)\n", + " \n", + " if(qaoa_energy > highest_energy):\n", + " \n", + " print(\"new highest energy found: \", qaoa_energy)\n", + " \n", + " best_guess_mixer_angles = np.round(guess_mixer_angles, 3)\n", + " best_guess_cost_angles = np.round(guess_cost_angles, 3)\n", + " highest_energy = qaoa_energy\n", + " \n", + " print(\"highest energy: \", highest_energy)\n", + " print(\"best guess mixer angles: \", best_guess_mixer_angles)\n", + " print(\"best guess cost angles: \", best_guess_cost_angles)\n", + " return best_guess_mixer_angles, best_guess_cost_angles" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "2e8941c3-b604-45c6-8aba-de496cca9a80", + "metadata": {}, + "outputs": [], + "source": [ + "def qaoa_calculate(backend: Backend,\n", + " compiler_pass: Callable[[Circuit], bool],\n", + " shots: int = 5000,\n", + " iterations: int = 100,\n", + " seed: int = 12345,\n", + " ) -> BackendResult:\n", + " \n", + " # find the parameters for the highest energy\n", + " best_mixer, best_cost = qaoa_optimise_energy(compiler_pass,\n", + " backend,\n", + " iterations,\n", + " 3,\n", + " shots=shots,\n", + " seed=seed)\n", + " \n", + " # get the circuit with the final parameters of the optimisation:\n", + " my_qaoa_circuit = qaoa_dominating_set_circuit(adj,\n", + " N,\n", + " best_mixer,\n", + " best_cost)\n", + "\n", + " my_qaoa_circuit.measure_all()\n", + "\n", + " compiler_pass(my_qaoa_circuit)\n", + " handle = backend.process_circuit(my_qaoa_circuit, shots, seed=seed)\n", + "\n", + " result = backend.get_result(handle) \n", + " \n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "377cf5cf-21cd-492a-8bab-d4a9443aea53", + "metadata": {}, + "outputs": [], + "source": [ + "from pytket.extensions.qiskit import AerBackend\n", + "\n", + "backend = AerBackend()\n", + "comp = backend.get_compiled_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "1b7112e5-eb3f-4a40-8165-a3fa7f9ce26a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "new highest energy found: -1.1560000000000001\n", + "new highest energy found: -0.955\n", + "new highest energy found: -0.32600000000000007\n", + "highest energy: -0.32600000000000007\n", + "best guess mixer angles: [0.734 0.22 0.082]\n", + "best guess cost angles: [0.16 0.34 0.465]\n", + "CPU times: user 13 s, sys: 0 ns, total: 13 s\n", + "Wall time: 13 s\n" + ] + } + ], + "source": [ + "%%time\n", + "res = qaoa_calculate(backend, backend.default_compilation_pass(2).apply, shots = 100, iterations = 20, seed=12345)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "f002c01a-2224-48e9-b038-cef48dbabadb", + "metadata": {}, + "outputs": [], + "source": [ + "def prob_each_node(dist):\n", + " p = [0]*N\n", + " for meas, prob in dist.items():\n", + " for ind, val in enumerate(meas):\n", + " if (val == 1): \n", + " p[ind] +=prob\n", + " return p" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "373de61a-7196-4437-8ea3-d3a57bffa2f0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.42, 0.8, 0.52, 0.42]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "prob_each_node(res.get_distribution())" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "id": "fd60112a-7bfe-41e6-b0ca-a810331c4150", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.32600000000000007" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "get_energy(adj, res)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba155c72-d9ba-42c9-8f13-3a7ce445199a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 [Default]", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/team_solutions/pineapple/overnight_2.py b/team_solutions/pineapple/overnight_2.py new file mode 100644 index 0000000..fa41409 --- /dev/null +++ b/team_solutions/pineapple/overnight_2.py @@ -0,0 +1,203 @@ +import os +from matplotlib import pyplot as plt +from pytket.extensions.qiskit import AerBackend +from pytket.backends.backend import Backend +from pytket.backends.backendresult import BackendResult +from pytket.passes import DecomposeBoxes +from pytket.utils import gen_term_sequence_circuit +import numpy as np +from pytket import Qubit, Circuit +from pytket.pauli import QubitPauliString, Pauli +from pytket.utils import QubitPauliOperator +from typing import List, Tuple, Callable +import networkx as nx +import networkx.algorithms.isomorphism.vf2userfunc as vf2 +import networkx as nx +import numpy as np +import matplotlib.pyplot as plt +import networkx.algorithms.isomorphism.vf2userfunc as vf2 + +import time + +import pickle + + +def single_edge_energy(results: BackendResult) -> float: + """ + Return the expected enery of a edge 0-1. + """ + dist = results.get_distribution() + return sum((meas[0] ^ meas[1]) * prob for meas, prob in dist.items()) + + +def subgraphInduce(G, edge, depth, rename=True): + # return: subgraph induced by edge + current = set(edge) + edges = set([edge]) + for i in range(depth): + next = set() + for node in current: + next.update(G.neighbors(node)) + edges.update(G.edges(node)) + current.update(next) + if rename: + # Rename nodes to 0, 1, 2, ... such that 0 and 1 are the central edge. + current.remove(edge[0]) + current.remove(edge[1]) + current = [edge[0], edge[1]] + list(current) + + edges = [(current.index(e[0]), current.index(e[1])) + for e in edges] + return nx.Graph(list(edges)) + + +SUBGRAPHS = pickle.load(open("subgraphs.pkl", "rb")) +needed = [22, 20, 13] +SUBGRAPHS = [SUBGRAPHS[i] for i in needed] +# print(len(SUBGRAPHS)) +# for i in SUBGRAPHS: +# print(i) + + +def qaoa_initial_circuit(n_qubits: int) -> Circuit: + c = Circuit(n_qubits) + for i in range(n_qubits): + c.H(i) + return c + + +def qaoa_graph_to_cost_hamiltonian( + edges: List[Tuple[int, int]], cost_angle: float +) -> QubitPauliOperator: + """ + This function takes a list of edges and a cost angle and returns a QubitPauliOperator + representing the cost Hamiltonian for the QAOA algorithm. + + """ + qpo_dict = {QubitPauliString(): len(edges) * 0.5 * cost_angle} + for e in edges: + term_string = QubitPauliString( + [Qubit(e[0]), Qubit(e[1])], [Pauli.Z, Pauli.Z]) + qpo_dict[term_string] = -0.5 * cost_angle + return QubitPauliOperator(qpo_dict) + + +def qaoa_max_cut_circuit( + edges: List[Tuple[int, int]], + mixer_angles: List[float], + cost_angles: List[float], +) -> Circuit: + """ + Create a QAOA circuit for the MaxCut problem. + """ + + n_nodes: int = len(set().union(*edges)) + + # print(len(mixer_angles), len(cost_angles)) + + assert len(mixer_angles) == len(cost_angles) + + # initial state + qaoa_circuit = qaoa_initial_circuit(n_nodes) + + # add cost and mixer terms to state + for cost, mixer in zip(cost_angles, mixer_angles): + cost_ham = qaoa_graph_to_cost_hamiltonian(edges, cost) + mixer_ham = QubitPauliOperator( + {QubitPauliString([Qubit(i)], [Pauli.X]) + : mixer for i in range(n_nodes)} + ) + qaoa_circuit.append(gen_term_sequence_circuit( + cost_ham, Circuit(n_nodes))) + qaoa_circuit.append(gen_term_sequence_circuit( + mixer_ham, Circuit(n_nodes))) + + DecomposeBoxes().apply(qaoa_circuit) + return qaoa_circuit + + +def single_precompute(graph, backend, compiler_pass, shots, discretization, seed): + """ + This function precomputes the results for a small k-regular graphs for many angles. + For instance, if discretization = (10, 10, 10, 10) [param_num = 4] + Then we will return results for mixer_angles = (i/10, j/10) and + cost_angles = (k/10, l/10) for all i, j, k, l in {0, ..., 9} + These are formatted as [*mixer_angles, *cost_angles] + + """ + # print(discretization) + results = np.zeros(discretization) + for index in np.ndindex(*discretization): + true_index = np.array(index) / discretization # normalize to [0, 1] + mixer_angles = true_index[:len(index) // 2] + cost_angles = true_index[len(index) // 2:] + + # get the circuit with the final parameters of the optimisation: + circuit = qaoa_max_cut_circuit( + graph, mixer_angles, cost_angles + ) + + circuit.measure_all() + + compiler_pass(circuit) + handle = backend.process_circuit(circuit, shots, seed=seed) + res = single_edge_energy(backend.get_result(handle)) + if (sum(index[1:]) == 0): + print("Angles", mixer_angles, cost_angles) + # time.sleep(5) # cool down. + # print("Angles", mixer_angles, cost_angles, "Energy:", res) + + results[index] = res + return results + + +def filename(graph): + h = "".join(str(i[0]) + str(i[1]) for i in graph) + return h + + +def precompute(backend, compiler_pass, shots, discretization, seed): + # precompute the results for all graphs + """ + This function precomputes the results for a small k-regular graphs for many angles. + For now we only precompute for a hardcoded list of k = 3, p = 1. + Node 0 = j, Node 1 = k. + """ + # TODO: don't cheat. + + for graph in SUBGRAPHS: + # Check if we have already computed this graph + if os.path.exists(filename(graph) + ".pkl"): + print("Skipping", graph) + continue + + now = time.time() + print(now) + print("subgraph: ", graph) + x = single_precompute( + graph, backend, compiler_pass, shots, discretization, seed + ) + + what = filename(graph) + + pickle.dump(x, open(str(what) + ".pkl", "wb")) + + print("Maximum Energy: ", np.max(x)) + print(time.time() - now) + + +# y = pickle.load(open("7073760102818118101112925114.pkl", "rb")) +# print(y.shape) +# print(y) + +print(len(SUBGRAPHS)) +print(len(set([filename(i) for i in SUBGRAPHS]))) +backend = AerBackend() +comp = backend.get_compiled_circuit + + +DISCRETIZATION = (10, 10, 10, 10) + +PRECOMPUTE = precompute(backend, + backend.default_compilation_pass(0).apply, + 5000, DISCRETIZATION, 12345) diff --git a/team_solutions/pineapple/overnight_compile.py b/team_solutions/pineapple/overnight_compile.py new file mode 100644 index 0000000..0bf5085 --- /dev/null +++ b/team_solutions/pineapple/overnight_compile.py @@ -0,0 +1,74 @@ +import os +from matplotlib import pyplot as plt +from pytket.extensions.qiskit import AerBackend +from pytket.backends.backend import Backend +from pytket.backends.backendresult import BackendResult +from pytket.passes import DecomposeBoxes +from pytket.utils import gen_term_sequence_circuit +import numpy as np +from pytket import Qubit, Circuit +from pytket.pauli import QubitPauliString, Pauli +from pytket.utils import QubitPauliOperator +from typing import List, Tuple, Callable +import networkx as nx +import networkx.algorithms.isomorphism.vf2userfunc as vf2 +import networkx as nx +import numpy as np +import matplotlib.pyplot as plt +import networkx.algorithms.isomorphism.vf2userfunc as vf2 + +import pickle + + +SUBGRAPHS = pickle.load(open("subgraphs.pkl", "rb")) + +print(len(SUBGRAPHS)) +for i in SUBGRAPHS: + print(i) + + +def filename(graph): + h = "".join(str(i[0]) + str(i[1]) for i in graph) + return h + +# Collect all subgraphs into one file + + +results = [] + +for i, graph in enumerate(SUBGRAPHS): + # Check if we have already computed this graph + if os.path.exists(str(filename(graph)) + ".pkl"): + results.append(pickle.load(open(str(filename(graph)) + ".pkl", "rb"))) + print(i, "#", len(results)) + x = results[-1] + # print(x.shape) + # rft = np.fft.rfftn(x) + # rft[4:, :, :, :] = 0 + # rft[:, 4:, :, :] = 0 + # rft[:, :, 4:, :] = 0 + # rft[:, :, :, 4:] = 0 + + # x_smooth = np.fft.irfftn(rft) + # # Sum along last two axes ( we are left with mixer ) + # visualize_x = np.sum(x, axis=(2, 3)) + # visualize_x_smooth = np.sum(x_smooth, axis=(2, 3)) + + # # Sum along the first two axes ( we are left with cost ) + # visualize_y = np.sum(x, axis=(0, 1)) + # visualize_y_smooth = np.sum(x_smooth, axis=(0, 1)) + + # f, axarr = plt.subplots(2, 2) + # axarr[0][0].imshow(visualize_x, cmap="hot", interpolation="nearest") + # axarr[0][1].imshow(visualize_x_smooth, cmap="hot", + # interpolation="nearest") + # axarr[1][0].imshow(visualize_y, cmap="hot", interpolation="nearest") + # axarr[1][1].imshow(visualize_y_smooth, cmap="hot", + # interpolation="nearest") + + # plt.show() + else: + results.append(None) + print(i, "X") + +pickle.dump(results, open("p2data.pkl", "wb")) diff --git a/team_solutions/pineapple/overnight_computation.py b/team_solutions/pineapple/overnight_computation.py new file mode 100644 index 0000000..3c3f90b --- /dev/null +++ b/team_solutions/pineapple/overnight_computation.py @@ -0,0 +1,101 @@ +from matplotlib import pyplot as plt +from pytket.extensions.qiskit import AerBackend +from pytket.backends.backend import Backend +from pytket.backends.backendresult import BackendResult +from pytket.passes import DecomposeBoxes +from pytket.utils import gen_term_sequence_circuit +import numpy as np +from pytket import Qubit, Circuit +from pytket.pauli import QubitPauliString, Pauli +from pytket.utils import QubitPauliOperator +from typing import List, Tuple, Callable +import networkx as nx +import networkx.algorithms.isomorphism.vf2userfunc as vf2 +import networkx as nx +import numpy as np +import matplotlib.pyplot as plt +import networkx.algorithms.isomorphism.vf2userfunc as vf2 + +import pickle + + +def subgraphInduce(G, edge, depth, rename=True): + # return: subgraph induced by edge + current = set(edge) + edges = set([edge]) + for i in range(depth): + next = set() + for node in current: + next.update(G.neighbors(node)) + edges.update(G.edges(node)) + current.update(next) + if rename: + # Rename nodes to 0, 1, 2, ... such that 0 and 1 are the central edge. + current.remove(edge[0]) + current.remove(edge[1]) + current = [edge[0], edge[1]] + list(current) + + edges = [(current.index(e[0]), current.index(e[1])) + for e in edges] + return nx.Graph(list(edges)) + + +def gimme_subgraphs(): + # load subgraphs from file + found = True + + try: + x = pickle.load(open("subgraphs3.pkl", "rb")) + except: + found = False + if found: + found = input( + "Input y to use existing subgraphs, else will generate new ones: ") + if found: + return x + else: + res = x # Continue from savepoint + + for j in range(100): + for t in range(20, 40, 2): + G = nx.random_regular_graph(3, t) + for edge in G.edges(): + subgraph = subgraphInduce(G, edge, 2) + seen = False + for j in range(len(res)): + if nx.is_isomorphic(subgraph, res[j][0]): + seen = True + res[j][1] += 1 + break + if not seen: + # print(len(res)) + res.append([subgraph, 1]) + # res.append(subgraph) + res = sorted(res, key=lambda x: x[1]) + + print("Generated Subgraphs len = ", len(res), "Sorted by size = ", " ".join( + map(str, sorted([(i[1], len(i[0].edges)) for i in res])[:-100:-1]))) + for j in range(1000): + for t in range(20, 100, 2): + G = nx.random_regular_graph(3, t) + for edge in G.edges(): + subgraph = subgraphInduce(G, edge, 2) + seen = False + for j in range(len(res)): + if nx.is_isomorphic(subgraph, res[j][0]): + seen = True + res[j][1] += 1 + break + if not seen: + # print(len(res)) + res.append([subgraph, 1]) + # res.append(subgraph) + # sort by size + res = sorted(res, key=lambda x: x[1]) + print("Generated Subgraphs len = ", len(res), "Sorted by size = ", " ".join( + map(str, sorted([(i[1], len(i[0].edges)) for i in res])[:-100:-1]))) + + pickle.dump(res, open("subgraphs3.pkl", "wb")) + + +gimme_subgraphs() diff --git a/team_solutions/pineapple/team_solutions.md b/team_solutions/pineapple/team_solutions.md new file mode 100644 index 0000000..0783463 --- /dev/null +++ b/team_solutions/pineapple/team_solutions.md @@ -0,0 +1,3 @@ +# Team Submission + +https://www.overleaf.com/project/63d56fbeb163d65c5d067fc4 \ No newline at end of file diff --git a/team_solutions/team_solutions.md b/team_solutions/team_solutions.md deleted file mode 100644 index 71eb0e7..0000000 --- a/team_solutions/team_solutions.md +++ /dev/null @@ -1,6 +0,0 @@ -# List of Projects - -### Sample Team - -- [Code](TEAM_NAME) -- [Documentation](https://url_to_documentation.com) \ No newline at end of file From 2dfacf26693f7475f74fe835cab796d30e14de44 Mon Sep 17 00:00:00 2001 From: Tarushii Goel Date: Sun, 29 Jan 2023 10:06:57 -0500 Subject: [PATCH 2/7] Update team_solutions.md --- team_solutions/pineapple/team_solutions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/team_solutions/pineapple/team_solutions.md b/team_solutions/pineapple/team_solutions.md index 0783463..eaf5b4c 100644 --- a/team_solutions/pineapple/team_solutions.md +++ b/team_solutions/pineapple/team_solutions.md @@ -1,3 +1,3 @@ # Team Submission -https://www.overleaf.com/project/63d56fbeb163d65c5d067fc4 \ No newline at end of file +[Documentation](https://www.overleaf.com/read/tzjzwhxkhnzx) From a3ca25e88cdf61cd8168ac4e8be00b9819426993 Mon Sep 17 00:00:00 2001 From: Tarushii Goel Date: Sun, 29 Jan 2023 10:10:05 -0500 Subject: [PATCH 3/7] Update team_solutions.md --- team_solutions/pineapple/team_solutions.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/team_solutions/pineapple/team_solutions.md b/team_solutions/pineapple/team_solutions.md index eaf5b4c..c5c6f3a 100644 --- a/team_solutions/pineapple/team_solutions.md +++ b/team_solutions/pineapple/team_solutions.md @@ -1,3 +1,10 @@ # Team Submission [Documentation](https://www.overleaf.com/read/tzjzwhxkhnzx) + +Code: +* Question 2 +** [SGD](maxcutSGD.py) +* Question 2 +** [Minimum Dominating Set](minimum_dominating_set.ipynb) +** [Four Coloring](four_color.ipynb) From 1b04c448023557fc9768f2af1af32a75c86f7811 Mon Sep 17 00:00:00 2001 From: Tarushii Goel Date: Sun, 29 Jan 2023 10:13:28 -0500 Subject: [PATCH 4/7] Update team_solutions.md --- team_solutions/pineapple/team_solutions.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/team_solutions/pineapple/team_solutions.md b/team_solutions/pineapple/team_solutions.md index c5c6f3a..c8f7b33 100644 --- a/team_solutions/pineapple/team_solutions.md +++ b/team_solutions/pineapple/team_solutions.md @@ -3,8 +3,13 @@ [Documentation](https://www.overleaf.com/read/tzjzwhxkhnzx) Code: -* Question 2 -** [SGD](maxcutSGD.py) -* Question 2 -** [Minimum Dominating Set](minimum_dominating_set.ipynb) -** [Four Coloring](four_color.ipynb) +1. Optimization +* [SGD](maxcutSGD.py) +2. Mapping Other Problems +* [Minimum Dominating Set](minimum_dominating_set.ipynb) +* [Four Coloring](four_color.ipynb) +3. Reducing Compilation Time +* [Symbolic Compiler](maxcut_symbolic_compiler.ipynb) +* [Binary Lifting](maxcut_notebook-optimizecompilation-binarylifting.ipynb) +* [Precomputation](maxcut_notebook_precompute_all.ipynb) +5. Other open-ended investigation From a3b30d16b7e590563890ac73533ed9826f15c024 Mon Sep 17 00:00:00 2001 From: Rishab Parthasarathy <56666587+rishab-partha@users.noreply.github.com> Date: Sun, 29 Jan 2023 10:13:39 -0500 Subject: [PATCH 5/7] Delete Documentation.pdf --- team_solutions/pineapple/Documentation.pdf | Bin 176426 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 team_solutions/pineapple/Documentation.pdf diff --git a/team_solutions/pineapple/Documentation.pdf b/team_solutions/pineapple/Documentation.pdf deleted file mode 100644 index fd716b5f41feecd3cb3254a8378e1d12e8708de2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176426 zcmeFXV~}l4*dYN-m-1i)cd_(f79L5F)_b-{`84BktcKK zesbq}GS*rrbCbvkiO?|6vOtmaJm-HwF)`uO z8Q55v8Cmh^#PBtLe*bi3WM{A}Lm!hz4j z17&Pu^iN3q|BW9gCg%TcB1-Od#`tt<3dSZs(=fI%buz=}_<2SVb1Nrfho90)-^p0W z*wEJKr`NxwoW6s#BmO@i2-;dXTiZDPGbcF*VCwwNBe=CYVpyD&I|6utO)8#*)Vx|9| z;h_^3!q?<7G+|>mVld=jW@BVxVdvm5GBRe?H!(4yXJF7bqUYe?;WB14GNRWvFgDgV zV&pJl=3p`AFlJ$5U}T_YFkv%fVdByLCkc*D4#xV{P;P$=4UF`5O!W-(^w=Q@*P!|? zFcHScK}mB0#H#o4=YwE{$^(ZAOajCr9r+UEPr<^bCLu^M_=qEE)2ty(azHab(*474 zzae33Utyw%f{i*kZfwv=LNOr$2>oD({>k-!j`aUS*8gV&|4;q@An<<>_}_v6)PGRh ze^U+_eQRS!d=C15*-qBZ*oNQG$=uckpW`1|{$WE|XD6#4b#cUJ|IY?FeN$uU{~%yx zN8|sxO7~Cm5BIYEd)L1_E~xLMZ)I!x-zf{zKiB`;*#ApbSNx&u9|o7jXQclj-T%}8 zh9435ADB^3?;l#^9PjP#?QO~7j{}72wNk-1($nJ@%%?X*F%1U>-tYHQg;r~+HW|$> zVHcNk94o`3^WvrUZm-Ut8Zcfna;Bqyc4t<4Iw-PM>1WAEUa{dmNS{4*yqk9@`B3>Z zBQEd@fo7!NJ_cR`A7s?a%wfD?q9=EqK9Gn(J>NpPX%G(?ic;h!=daP<-3=s6Z>Z78 z%5XV|=5O!41y96QVRWyR+R?#p72p6kvl9dp3FL**(+%GS1UPUM0r`Kj?~gG5-^lRW z*w{Kb{z%l%y#L7p$G@<0{L|;B#{O@?@gD^P{lCfk5t09_GyZ4!k3&$vXQ2N#aSZhT z#$x!v_22e?qx}e?pskIQvCYqbO#eovlm3xUeF58lMDm~DKlXr@k&X3d2{6#IbNnNi zKdSq4!+)h)!PwE(*}?E<0Wi@2XNZ4Sz(1?vzfb=^7yn<=|DOqGWM=#iL-Jo*c&VZ8 zxWSI-^IWq-q-@E+4&nEw%zZR#Qb*>ZtSW;TzEMcBvPdjA6z96;uMIPKIJ1}3UdEWs zRAhL;+{xGM)=9`@fO2oZis*&^UsF?2S)DOr1nPN>(wz&!9meQJ1^->@1X9T9l)lg# ztCR@(8P zOsGW^Qnh~I;)o=*RWi&`w>wsX8{_nu;;5|N9kft8Hfk^JA$0KfcWH036Ccn`+Yc^b zq1TZvSy>A^kP<1oImMc$G<6g0k1UL?)Y~iUzQKyG23e}iZ|CjRDkG&3qoN8>RfGd> zxz3mj$#H468`PR{M?KZ=@q4m5;miQUiXp$XLGFneHNYK7h{R{V{wOoW2YD}R0Yg&= z#^=j1c8BjFcX6zc&f8;88peT*#O>a#(iW17MUs6WXG!-i{%8r9qD+fyL<9`xdM! za(uUuD3%@3RTy^*xjVfyw@>nKDlelrA4awi4T#leUh$kK8xoJ5oD2O6l(Dhg~Sez0wPWNuuP(NFnjcAgzLSQa$zDhA%k%%`64F zRg${(Ik|;KAsAHDqiN)d8AvSVp>qU3pRfSjCYLg!F(eEIBj{Fd;61qy^Q+HPg9<%- z?+jL16-1^Y>qBCd-ap_JJbdQQ2)$h);C|kyw&ULg0Tx(xx+)$ZhcUgeNExlY%6z?V zuf&SQAPfKE?fd?f$0MY1>G#DX=0%gu77+BpB(`bTb|#-VIGMYJCwJ-Me`u3thG25!uOZ;6`LCP(inPq{#^z?dg&SC z3wO!em#EspPx-f6pXjXzIB#&zP6;#+IyQWt@bSQl`@%PZ-ag<<#|zg>5}sZwXKr-A zD`;;D{kH30&kFAdJOz=md62gbTuJrbxe!*KEv?H4r=tib+2HB{G&fqgqJg@D)j!DR z3w&TzM&A~Og-{?~ENBndcQxwyaj^i?8^s}rT7~*s?eUfQwsrm-%!!g8iMDqZU`9AH z83@86`8HV#y^OXI6X^kBvg>fNIrTttNv4WJIXNHh*J<-wUmPv$ReC7~75DUbBE-;DTb3*rG_Tm{{ zA)updp!Y$oeDLnGb)=boH{Q-LcMLc>>Qs4aKoo4AAbR8l@cLE)h`zP1dW{2aEe0@z zaYlzw7BMzmd9S-;BaA(lN(M+pI|(YOv?baVdycksjJrJ*n4#5_XC^e>Rec8g$ao@B ztEqmrI?pz5AR~9h=b4VCmnq8?n2k9$RYd7Gl64%pqTuY@9Nrezw>OZEaoPe7Lnve2 z3)~smn5GD^Km_<_mePaY_(d^ecGZ=Qvq#}WjTF;We{3LZmW1cpr){v3xQ|YjwN;X6 zR&(_!z~C4v9i>!+g+Hm(L@Y;hCoC~_50$r#a1Ol4*}KWeJh?FjO01E@uY^j}8cxoN zyQtXh^7N~4Yr44EiSObd1(MBn_OmZOZVkyuRY?)0VxHgZOfU8{gx7Cw6Y#FLM(OQ3 zojN0Y9k6Zzq%d@w;hz~G2U(FIrimc<8uQy-@xsD1q>$_7hl5NTh~eg1iUO3nv>xI> z50uhzMfy_6X?J+aZ+R@Pq7F8N#?wM^moEb(!)s2EM8H**1QphH(pGmM3Fp4fYzw!^>K3!vWf@Bbazw$;iG@@a(sBn;JoQ(REpcn1a!p`swT-cDAa zX+paXQkdTP>udhX2R+vl@dE6c!8B?B)_*?FA`Gx&p@lP=PQ`({!r z0TfsNCK}M!HYzl6jU>8YANV}V74;ZaMA1=^2cOyK={8%;9zMS{8AOQMB&GJIA%Y_) zjC)B|rvxp2cT~GwG)a|5N4yZuY9WU;QSJEz9HVwEeL@!>hL6UrVxpl&STZKOkrh1V zFxI=7L(UrsY_E9H&>tc2p_q>?f83uB9#$V-^z`I#ZSJ^W%XXO()B!L(1PJY*&%p6v z7YRCrJ{&_4hSbSeoNWg=E((HcfRUZsL-ZSuep{{(><@115G5l6-q17ya)FzR>Z~MO zd=D&a*sq=G*h7OoAGCcaAdub^kv}D#uP;1#*(PIYtPZ<2R++Wi>4yF0d=lIm2TfB0 z-o&e^Y1A4=%9lRUESsRxfxI5aQ)e0L&1Rf`tZE35*5uyvX(c62U8U|MFIJ4N&maf1 zG5uiQ-0A^kllurjDE7Z(2}3jH7=pyS%=WZna4sFbot$tf+z_Z6 zJbT9S0-91oa7iq3^}}D&E*F*EFBN9m@#eb#MWocX-cd|gw|MI2FkLh(6R<`TuGg*#>SB#|f83Mx@EmdNc z>#yK-0Plyt=er~2&9RH@lqmoyLK`fp}x4Cf#3bo(2y!rjC+@-3>a<92n;puwa#JAjsdjca%aRhMZR9|1~ zUK?72I?td53ns&5hMWbc)iqV$zU zTZ^w#O6q5ZQNu3NQE)P-0n85ou2g7}ew4EqCkJ56z#nsrd~>UCFRqqRH%S1_l2pe% z*cNa{v{%D2e7zlg%j3vq*B`ih7PeqcK%F&ka*6TaimL=(OX zpE#eQgjDamfzi^^I2U}wPuVI@r~r;sn)rO;3fXf*1Hrg@R<=*zbF0g1yWHEWQ>)|4 zs|Q&(rl-RI;=fS*ZaqVNpO3B1j6faiO`MwRKMO>QdFMNA8-lvh(*m<_X19khzGB}7 ztN!>EU%y|CJv{HOuX46-cz%PYYp!Lcf6s-aQ-z5SY>&^OkQ05e9dChr$4&vA0PW}< z9U1H&0RZ3t^1&-g7W1OYJ%a##JJo;a`&{>}U>yJerS-G`J~T0ccl-8wa$w+d+4t;wPmZPe zsXfwTV0;iUa~HYGL_alJiE_{~h~xb$WdH-gdadNn3k+gs*Sc8~x&&P8s@T z<$@Ams#5Fnt44Kr=*1gb=z?aOWU9A+dUWzDb!%LGejM1W*y_;0;x*OktKRa1!LC{5 ziO(3^w1T%f?U~%<=zHHYhfy)}*>dnzJJYu?3?S*?-+J~ZR%@73$TY5#Vr6*5l`^cXM|qQnQj0_aIzO(xQs-kUgEdV zQ@TM=J;ZnLTYxm;ugKQ4zeUgR27vV9pMh$CQuE*VHUNoxzH{$>4CWt!+batn;9X2j z-;r+Hsh7hl5ec(|lHyfL0-0e8bEh1ld#AEE}sCY}>Jk)3BLJS1a6YAVe1WJJ;lw?h9@&k2gK@BZ)VV zz2g9fAJl<{i}&Ac;Jg^rKXVhTF-mZ%<*8(lGuWmt(5ErVGh5*OiAx`<#UzQC85!-)$O{B zJ=vImyIQ_RR38rupM0;SiT!8e^^!7`wt$lpQ9!yTj`&8y+wN*ZU=8Qo1Q%@XwT=h& zk}m*`GxTV2g{##psGrq!KjycSe57(J=Rm!rcCAw&Ss@c2R&+G%*c4@f3UGSa;rmHw zf~@Pd&P9#z3O9GYl4XqZ+*92NgAS)O7LWQ+uxu)|)c#a)IxK^M&Xr4tD~~g7$Jq&kef1X{RCpbr;TG zM`dWr&C7>y8j}pyxb1`&)4)!+jazb5D+B7mNx&rf$dbBXQO;-Vh4@m*bvucLFKM*# zS(z~(W*Na?0YlJ()eioAY9iSY*Bqv7R;VB^D;z+h#O>T6#I~fia3N~E!jLSHEjc0q zq`Zwf=JD}bJN(#U5l2N63B3)Z}& z**_>y+RpRa{D(A3SXcA0F^W@%3QLGYo99k|-XFZJ>O6Xsq>j>~l54F9 zLGKx7B#ab2Gm!2E?*`V0tW(Xt8YzlF^jV40e-Vhvuz9$NxIqC)x9T z5F&0vi6+}oHz|6|68Xr_Sq!%YJqG5dSXp0t$wO^+!EVs+K8i?nzsNuoDuF@?^3m>; zLyll?u{}5by`XXBx(O64-Ep~vTC^LD6U<{lI>R#{XV*s%6J7UF$on;H81h!h82P-y z2jeC69x&Qk#5KlZi}ZL^M(dbX+Z7prc`f$(%2XcK&GQ0zsg?a1KA%f*jT5Z>UAlX@eiY8Rh1A{6x5x|%(Mb~)Nj0J=*nYPl}lmt~{{ zs2W2{zee?Qsg*dxW&C6Bs7=SzoNt4U=DDg*^xEW6v5->) zy1RePl+|NBC6Am9PIq`5FD&h;+@C)xFRp2NS1U&xxgK!>{_+tIsNcKBm_@zN>Q0pb!{ zd&Wf7`4)TqE6fpI2HKlENtS_jxnZs&It>5=Uuo_QTaC9SGy<8{Mhtk>3Tv|vqS|j+ zwv4qppyGkVLNG=STr`u<^yFZ}z+8C=i$yUZbZqLeURz9T(ny0`VM0rjfemwps|pG&0JSh?hv)uAWQ4WWi%=s+OC0 z=ec><%AHO5&fJ@4SN9>DkIZqw$C~$k@%GQgNBvqw4@EsO@U)gnH)RINEvZSHn6){} z*oWjJ&oykInU!<-EH4$7cB!niR?ZK(S~8p^i0&hr=1jy1N-ZXEQfQMjBT(3FeZQ!Q zu_U~nAZ8!X5A=!gq|4pYDSQ|Yp1S1>_~Xas9NaB7fS{?PPF`p11SBe7`6MR2YcqD{ z0BJ5wkAh)s^u)7=aC?J>bs53ZwyanELh)?RJhT)rql{~wX|(t>sHF5x^);5^#h8=F z+nFwrQ3)e#X}Z2s!f>XnWyPsHVi@&4Q{Uby?sGIz8priuuKY*ZlRbo5HV5rv6A(go zni68^BrjNPFE~K|S9Pi|YG@0$by?ukVIQZ7b~kbypN<7_?l(Jc$oW7;JyLebkdKVq z$bq<8>WLruoI<^xnxy7cEPq)l4OTvy7$Nn&OTD$guThIxVJP>h3eIO&0rj2t(}_>iws%{>PDV) z0UfEjsJz~5mL8+&s-sW{bKCFqmB0mDs)f1E3#SI5`dBG63>`)sxA`aET$ zWHf6Z;|5m{+fiWRmguaHTSiCv4*hku%tLQwnr6vMIPZ~3@{=L%5TxWG|GIAo*VzJ2 zXi_NwDuB4(Gf`LnnS7fT@xKvgE8|hm8e4>2y?EU)UL@lc#?nQfwQBEnI*2Y@OS;(R z@{K2|Zi?JS-e#mmeRXS`FIi}t4TY1G&4UVR&_rGdt_;771bvnMs{F(V2Po)@r@rgA zCfj?weDZ`#QjaCXTjMXrqn*@JaECYRIH$#_z>$?IN9Mp+zqR!7-kfcQ$K$&ifR|b1 ziNAawk|!z%#I@8R1%be(&nkZLYf+6>kXR>^0qR;hSD7o=I%pF53SSUBM2A8sbe87( zI~x9;D@mTE{Fa*8S(K_N`DF_*FZsDsVN7Hx%dLxCJ6IoFu_JG=-(DPb)d?PcxPdb_zs_<|DEM}#KgLM-9s@+u--H-$P zL@e1QO`Ur%Xo^`0RMMwgM>l26X%Iza%Kg*+xU2~tF#Pu^TiG8@#74X$OU8s9Kkt5R zXuTc#o}>U1_o-8YHkcqm86! z5o}{>ttJ~Ni0u$e2OE*W-%SU(hCi_wO>;7l)j~e^#U?%nA;nl`8X|A&m&k1W!dMOK zoHmZ40%A&}(ujasU!LC#I%gAzNLkx^Ki6C#2AoI#-PrKi>03E1#4))}mowh2`TI4? zOFugC(G9#{BF@jQ--Y#)1NLImLU@Mp)Eq7;H`yMCD^V;xA`RB~1bt zeIM=;J7R?Lt<_Ayw+TynBV}blY&jWX8nu{ioyA;DYmK9-u06lo70~xAOOhS?Zz_cK zRgH!x)<)L`*$C*4HYRc%JLrq`>mAXMggmypjf89=A`}t^`IOr)V^3%#xhaT{Za57M zuJ$Tfq0Xu*7=U3}qkfN69t~|wd|EP?)t9riY@a-7o~ts~s^vv}lthdF$`5WPf*W=) z-NyZt2jVebUZ1@ZA=ubH5>b?T2vns%OnApqz`rvV$(gSSY3hH3PBlO*0anxdIN}lf(xZnW@U6&&qKINY&5IbT@rGxik z0Q;EO@#kavJ6MuzMVPVeLj=8(=LorCC!s#ZOWA^9Gkv|Wm3)N$d&GKoI1Xa6Bt~jlVs9iRs-=|Um34R{WL6% zeMv_(Ss}0;=FLXF65{Hrtf#9owPAPi%4L99VIP3f*Nf88wU6ykjEdK!hyX}EUEyPBkq9hhM* zVC!VxL&{&eB#5J+k!liKa|F{u<#TFVN*JHNdea`t5oxYXZjCF9S4GK)N36dGw@K5Qt_JBmU->c>clka`B|ls!s5gM}#a3!!QpWMZ%IJYb6}# zfo28WZK`2gqB4i{quw2*&Bs<+r&1h{%{F#(5XEl+hcCUyT))XnaijE$(z%&i zWNS?2*omsbM37Mec=i~MVU`I8hgBJS^Uj42+et%&Vj7=MoYi`guy_5-RDY7r7`as< z!<1}?%&D3LuaBJVyPlA*C#;9Ia*K@+O`(BSc~gfoZwivK4rB~Qj!VqX%?~dRRej@!B#q&i7|xVgVni<)0tklxwHeu&*Xx(h0R1eTlKuKvNshjkw5w zFvWD<Vf`LuOWs2An`!Oj9t!?0ogP-*^C7AM~QGf`+=I!Xm$T0nRW-!=DojnKBA;M_y zb~hbiCr^=n@iah}a7zp_Z^Y=r%abT-@60FN5%55}F{e1e35wPbRHb0z!a{eF6m-uP ztxQqfVuysk$n2t?5nOm+=FUR9p$|W(n)CUFUvJPJCkLRw)SH5ht4Mw=m!Vu!>oePbHSY2QdV);F#pspU2ejK zYr_ytoVkX$2(r#cnUj^yy)EQ#pCA~#5D!InrP8=e6KC?q4?GwWr{CU*ulWqH8}eNxK$o?RN{aqxTFRR~U%QY8826k+UCm{{o5X5W#L)v=mnro# z)ACj*ns)~SzE3)3GNSyy^X1=RNx&%wlv#J34< zeX6H0hk@tPv1VU7aM*o@Bv{JQCQEUph+ktfNJ@ce{1x;>#zXL5cQ{c3lT(>6lJAxl zA_if4{8}-5kCg@&j6R8oAPA#Hb=H>M+rrwCW8_hGUu2vG3E;t^2_vqJy7utvmu{d- ziKv?n3TYv{X_;ccsW>*B5={ZVGSV8iG5u!FbK3kx6D-b;UpgwG4&OSv7wFYGTZR~e zr;RQiBso$;6^|4arBqD6YHj7!HwkS?(UCCV2%ZVB#9z{_#jis%2gnZYB=Ns}CBEa4ce0Wn4b7I5o@rC}5hoQ{^t3PA+ zSYU3NTo`F8()df8guQuiiO#1?$&-hV7a2f;a!dmrDFO^#ROtWWXCBp&Q?(QS!N@9M zLZ0(QEX1xCBJ)0o)jjDoRz7pc@4Y<+Cs3+-uP@&U`@1ka)u>uM z$a!j)$2>|<;3t5m1cTQETrf{;Omz1qPB!6;g?pq z*dBOg#zp0_(U}rSH(>%q()9Kp#gqMQp3~L=Va_La26dm>r^tg3{DA=!X+Y%QKC*)? zFuV#kKZ~I-2;`AWfQ*Ep)5f$eh88qymUHTxz%K&?d$^PJhk}f3nBJ0jALBlI z+zB0AsIhN?_LPbe{*1baJg1JQ6lG~{N!Rcj9e6Yu?5yyGAi+skc1rU1FA}$+4qLJw z)p7!K;lW7ekNZ=`U)q3qGRosZ%H5;a%t;DjS;<4K)}**JtrWi7zZ+6d^5cb*B9JE3 z{rVR}Y^V=5zs-#{X~9!1dlWy@aKDq!O@aY8M&^_BgUICdNo1gkIUocSQWdHFop)I} zWi{p!_Z@@r&|gb~yrg>}-1#8~+*9ic&H%=pUkn0T$AG5o)xI4bwSi?KJqr&Ah6H!o zP*HGh^D=|1)cW`^(Vx@4+_n@>N!!NN{g-kXQZsy^nw@sdnbuzCn%ZYeMZk(P?%c}t z+DhP{fySnwizM+b&r{8#CF7)p)$Ozb5EjuyH45FafzGp?{bM3mNLS9U)5B=d=(Yw{ zI`VK4pP&i*N5m(9;|NCwlpKWJ@2y7nXXwnLs)Q8J8nytUEUgxyIqr01eG|(sN19{i zlM;-NH=ll!MoyaZc`%HdU!U2!@`R?EqRf*z2lBPaHR_r3Ps^$csSjeA;vOCD^=gl~ zJj>mj734)7VWqS=E`NntHuhUOe3Nh*yg&4I11Fe3-wV86n@T$<1f#aA?~H_wBXN37 z5fid#fwwObu?`3^=A0o}UWL*<{r!&f>~je!7T+fJ>?M=h_NsyKE*MfajAtUMrM=L+ z1c-c^^0!&_D7-Ea+DbBNbrW8@GXABB26#zpVCQ()C}#^-CXx{8Q=5su4$2ok?@ZA| zd?N_j?~^?&(%9TCIn71q*(LT(h#>&{u<$Y%586RMrj9|Y`ZhdMPVBGXc&6d2p3S%9!M}cC2oO7sLn}!`m|~MCob{ z{MaVO**-1n*}<~nDI_}pdOZ86P|wo5HSaxY486r;+MaMCr7Lpa7Rt=DL9hQ< z#9~IMHD06wbBg1RRW579+2L-5@;+q!Obl!3ghH~GMi|D|P#qs!`SWbnm!Cl8J&nGo z*{alkz^V_fy%!eu?TfGt(i%?^&)INJpbvL`=F`B(V>|uj+Z+~=yW&7U{I|cT%kKD!&e;(MtN_$>8C}-6P-EF< z1UR&?^gvR5s~S0(kdM^~JwYbvaxvV8d0WF(@Bq5>3jsaU2XLB|gmd<+OVk3Rn@^a% zwYPKY^iI5ZhP*GCO}^44<5pelXsBHm9lFtSFWuX;Q0yfEK({_rdr{SGx05&3ZwY!% z4AHT%oniwLVS>WTVkQFkvkQ1C@Utv_=RjRN-{>WVBD63c-bNFZQfz!5mWhVPuxK{Q zsF=SW9Bm6$PwGw0&&O0SRnx5>XOk;~SjNU`#oE|=F+tv2g^Vb7lPFXJSZh~~Jt)bH zPlo*sd1E^?@>ESVg+C{W?=`q}7>uB~WyZ#w8@Dj6rsOwEavK8u&Q)!{(Hds1@el1~Du;@4MQ%%g`ZAMdcG`d} zPZg)=_*ztH0a5#nW8B;D|k{izRxwqWVPclBenc2_?%EseJ)2MKK8s6&G@D zfZpi#t{LOH6ejiXbk?`q@alSh0z#gZtnjG{#-TP5vTe2-alQT$v)Mzv?!-l$uubf2 z5^!G4HOGlCitAv$=hjnSw~lQzo@EHE#V|D}h{XIPp_QJz+Fvk=s1N+US3sPI=QR)! zl)s6`EzfFul0nSnTTBsf79KKz^qkDVGHEIMTMZaM0cPyju_2p$`k+{0DWRl`ttaxr7mWbm>&2Ww*~PzPLpJR*FF zxwGP;MUm`^04V|A%3F>79Uem(5mx_rDr$AMO{h>Ztv+?pU@U7z_tI>!QW3eZa20=e zPF#jdxzq6*pkvaAZ}q*qiJrGM(&-*c6VgE2Cf2zP0ZM78nA1tsacu^QVnj;J4I=K~ zy@0jp-<8;B7eltdjVP`*<8xfqYMw=bxsWqC#(SF>w9;i#)kbY1avi<^TUO~xeg*$U z?$3G|hUgSLYs6fEHKk2y*{*|I0=$ICOv9LtP+?x$=KD+&_u(#$+P^m zXF}ZArSdwIYtOm1X~YG4YiVSkddR2x)`6Xv4ihm<2L~_Zr5b`OyYt~~DyR{;8;vwJ zkiXUHPBatqRvy722?CW+Z0`iQ7u%eGcH z68_Pfv0TA06QlX8QvEX0X{-Z%b)Ltkx%Eey%Q~fR%z^gIAM3G-i-Yxk-0zDlfM5H# zWMZ9Ug$6!ITHZTN4K4=F$Kds|m~x3MeY1oHG~?J}*hH2fZ!*dUO zINe?`!&PJQCV33g+ItHe?mlGfg>{aaZL?_GVO8Vsx#<>F z5IZov2F0>FCgV=Yfcbvt+Kq7*yoY3zO;n)Rvr+J&w7=YwYM)^%r-6CJylGWTS#hQI zQB{0Yh>V`!^Ko`9{}YTFHfjJ%P%I$F=qVPpH}%TOkmyeE52}O{W^-w$UPV=X1ZQz- z#q@^~Kt=}SxXH!7mIJ(I&=8t+7{h%&3LbV#!KgAZ@-MPLUeOdV%fLH4_6H0AQ7Mew zoI@D=DM(L7C&EtpKH`QytvyaHaF5gC89;}&!MDVRllNG)hPC9RF-FWMsT^mLJWn`Ma6pVf<6_ukY84Z!t>wCGw(u~JYG1nXx44qUd9_{Ot=EEh zAmhZYlw)}5-han>F~9SylRt`9m6B=02nrSIMX5M2Lx);Go3GU%W*sX)ym@sl1!E_X z_!CKP_N&{#%5MLq!RvbTSRzX69&QVdtJO)2i&Ay%a80h`3yx7yU*#H_TJe+C=9rEK zBFXefFByv3tI_Hr9gTkPn(39jS>buf0-`@Bpc&5?_F^!Ukr9Q{bsT&1TyGXSorPTF zM2D`ecnceo|9q|g-0>r(yJT`pI6_6~+!{(ZTIrgc&l#5-k;oa5dgQkwTS$AKz(*il zaYXb$3<)S|1_^i@^Llp#^H#L!ZUQ?vd~$4j=CD|mpo0#e&hxTAVP$>%rbBG;2MhE@ zF(Psv+N>Ie@JPhpnbOuXwybQF6wASq=&ZAN!b6SVaCdu`CBac)VL6g|VP^@+Ck^-1=6@%+J4zF^&_JR|VITj055)W?oWcIy_AaTdTB6omkL3&*5^0)Iz#a=4o4Ps)slhUA+B3V|tc8zmF*3*t;U^fBWt`Zdwz zP?N9)?I9NbeiIpAmBQ&P8Z%|RwdrzRvZfa7jh}=_Nm3A~Pv)%c0F78xM7O$yjVMRj z?=`R*zj`q_Wv|Yx;C9@fmowxt`Lga-CfZMhU^nEP`IqmT^sRxx9m2O^i>3urL-3Ks zRd}j>S|5c($hCFvc!u6XG+!tB_cHf!?oT%iEI1xstaXLO7i|ELp#RHr<&T7`%m5%?RuPreIWYha!}Q1B z)y~BGhZ}iFr6g;8qbs4=&&e(qF@ou+py|9>Otd`eC53+g$x%rEK_Z4PAF%~}F8(4n zi9M$OZD(D8(rTdn{jho6jTW`U1BKDlkGJqx!V6Oe*D&W=%Z`v+phk#S2nm@LL2i;! z==dvSSta3Q@CkQS-BfYg%fP;xP>F$^eKdyAr89Ge^4P z=k2n*PXr@%WS`4iYOA+j&jy0+*KL=MV`{di)?2Es5@?bXx@so4zjX`W!^qs60xuW1 zlAOsHzjs2w4-EeHyJcq7;XMFvU$UO)iDCucsF;05P{z1R8{{feOyiKNQLXFT}dlx9& zH6+FPB!gBGh4U4%hfVdlbfAo@;^RqFM;99jj?3p=_eK^JeweTe%RpQ?<=Yumm!Go0 zoF%;)zoiL?h>pr!8B`w7xVA|}>*KVjs{5F)%E7apS!T|dM?YRr zgf*G!9?Nya(f%#cKaWxsyz*;ffgwFP^Y7sPcp8)AXKay=46n~dN_kp+iFfDFkYgxj zXesl@2@}8H=&c@*R@W)bkOhgglNiI{Jica<>b^n~ssV8fsOq}aw#}6-nb5xdzHl`< zGan2PiH^C4(??vzMR(sk=v9291G)ckI)+970YEJafnb!rFv*KJ$@3(b_v|5$iko#v zn3cA2IkdME39gN^!|i$q@yfg!sr_A9hDH{y`^Qbid~G(jU+E|kL2YDdY#qh=z$IWi z>E`1Ecx=!^yC_sUAQ2xr0s3}D3SAr0+1n;v;5<+{wvro9(9i$#i`$6}!+49C<*(5I z@YfiT_n{XaA^ONBt>3zfWJ&oVFt^jlB$U;m1P@Bci^C`*%H)-X7)c&k1;G>ehrnc(>N@$vwr-vr*xDW9u^6_= zKOZpba3lt^3}*AqX4dMsYSlfk&#fjL{{{h75n35uPPk3Mh_ed}aiC!(hsd9;zM@%X zNVte?=G7xgnzjU*AGVk=@(6hHVXB6YzHT6d1DK_tk_{sP%eEuX`DG6b zo(UZR*3;FQ4H0uWK0bdtz2kA2Y>?#9cjemBsw3OhRnX{Z(`>3l!t`g^igo>U<^>^)qB|n-0 zpRZoj30`)XZ9godzD{>p90x(2XM4=^Hx=GQ^nl%NLaquDJ?EOtx%CKEFLRc8Ii<;J zM9xp=?zQ~NOg3XM`rW&#m>YdGqYx2YGjLj_j$Z6K?h)>H15kof*OUlFSPbqm`4H_3 z!<8C~az-j;>R3HqzbEJrp`=V|DYF;@K1o6EuK8D4e-vet&4shd^2r6A0yCCTKq3{> z4Yl5b;v)P)h=fiEy~D_pK> zE1?D?p1WqZ>p&E2agG3qCDVL#)`E1c)g7^(PgS^76(fFW(t4YO(E zOC*s<@0T2bR-S>XBQaSQiD?#+Y^pXF9DzxOZeO%_!hS`!sF^l)|tW$%VU%0F2OX9nC zD-hS>{UWZ=mSF2=%R1439Z4|WJIh!(@yuDK0};7y%`al(`FRcDsvXhA3d6@I<5-7w z$~;Pg9qTT}=vxt*!hH1~RlNs{NYFJ7n6o)hZbELncb#UCNs1(lbN*^@e+^n` zP<9d9tb56#(ONPY9XXGpt9FT&$dD4)X5Ak`wO3WI2;H?GC!tR+7d*0QM6yQm7kzG> z04n|}s+($SP!MQivQTq3C3!ja`_N!9E+yntzL+e0?I z#%CcU$PV@_p2>SiXfB^t?K462)vVMKth*RGpG*?Dq^k(G<57CNYw<08-MM}1U~s8S zb|yy5mVcAyr~KDI#S&J!c|VC!)$TJX*h0%wBNX})x0B204emu*1Tq0**%i=0B3scp zKRV6mjOZ-BZ@ud?)1kTk&JFA#0h3kC_C<@nT)N6g7OZ}B-7OEIOWpmNj7C@!>$1yo z`Zt6IL2PF7KMA zdt(fJ&e}&>s#!|GnW~WG z|0@lQ7Nvx2cj5QNRy`7#&s*zn-pBp-1*>Z(y zBo_`5s6D-lmstq3^aOzzFDj*bnrPPWey5bf2jW9^GwfQcz$k{N4kA8+BMaGvn*1-d zu@eGq1&(y{YKOnl`i@%7K+q1D!jEIA!0LL1V&3`95c{q6{YQ77M`z+q>h?q5>`{>iZ4IWs9+0c<^#=1tI-E^5@BeOQLVHT0v-5tko5(`}>%w7JYpNMy!bxE1t1+ucHjNctnB=io7N zH5kzeaf$GaWE;tu`69&2tHwKa{=U;Egg&z9mE3;=-gh>{{$GrpQ*b3fqi$o{wy|T| znb@{%+vdd9#I`Z9ZBJ}Zoa{S)ovL$B)x8hrwYwkst*g7&`o90y0%HG<8vehtfH=7S zDgFPYcC(UjbF=@q+5bN!ARg|2e*6El{Nr07)%0x980AQ$Nw{H=;`!JYy`0+j9T3?S zxE4FQZ5u#-GkV=YP`C)GE9RPwdK7$0|Qna*Sy*Y4A8knx z9wTmW)v2R|1Uj<2n~!h(cR1mR9p&IKoKt(SF8DGj0L79k3Uc3b2n4eM{HT6*ec>D= zdzBLqxWQqR?&R6P261QA(9RMmtWQL)SA>OPIdC`ziuWKBw3dK!W@uL04^tD=ZwbC{ zcKYer)n5`w-4y%{3zd^IL_qLcNfEySb6|0l2+WJIWEklss2OZPDRxi1p%?y&h3E>Z ztr0p$0PR~132Hp58gw8L@p~sfwzD~&d^>z+Wc1rJmY{!$UqKtsh7{J-DM{L zrO7!WQz&64<*+`bHFR*hXg3gC7QZ6=_?C)6kC3OOkW--!#k;bfHj(Nn&`tw|8wBF$ z^zh^qN;nq;1=-a$VegznfRHpWH@AN#k?_@rZ;${qJyBlR&z^xaG4N~`V8jIja&rZD z|My#QERftyK_MtSo`=8)s(IF0CM+oyXPpG_|Oz2 zaxDNX0`eFl!Mdx%3LvKU^M1E0ih`Yh-dP+TfHpV>2Z1OkD3Ao*-jBTWFI9xte*?f@ z6>IpH(V)DJfd5ca1t8tVwId|+cQ2t_5Ky5E%r})0V&FA#5;2&h@a-`45vY9`DEbYg z_~x4e${z!Dlj5p-zlgaGiGjc|M308Xm(QHL3LVYYLnxXdq8E_&el@~zL)~hG#s+8i zSHpUKg3k`v1Ep#yj%MeF25|51rmc?gbuVECHT(UO)j;bLrtZ~S{pR*yQ8i-#XFpTM z7!Ao?pkE@qg~N+ia0fr!BNO)evGdk`V8T6D1pm!a;2J3+N2KjLbpq>g!6!b8GzcZ2r0K-HV zf6+&qT;XE2jfX1EFEgNWYJ^k6Dh}#4EuU3ecF`-N^_Lb^^ZF32soho)*&ny8Ue>^i zUS%om+X>fMN!n(63F~y`7pHHtlYbT=?q32AHqm^ADu{5SXji5XI&XG`Q#NJzY6C=G zJK~7VIe5qIb66SkR}4{I^-VrondVf3pRiUyJo1CN|3 zBN={`MY&R?3SojISp}c>N#l3vQ0i-(^o#F^??k8`x&fn!WVTwuo0wb`e3?RwmJz($ zbdy`6uhnrr!XIOAcSW>=u@XlsMTov}v(Z?i40yzsF^lMd{l?DmR$EVWuKt`Jd3xgn z0S3rK&D}gGhX*ALme~zb9*%#0`1n>7rgQ9v0Mj-R>s2;v}tAdIq@s2dv>tu zI&>8@Yiw&Ir#CC)wTS9%XmPXK+}Sr`Z~yd9-qDbq_MyWs%FeM(N3*4eJu;>FXjY3; zzW)_05D}>UMS@c3_S=Ut!(Qa($i59A`9`S7L;`IbHj3NyE{VtZ{qtw~20ZVS#(k&x z?<_=U8C8a2R^oRDzD3HAKO{*++8Mx>a01Ybv$bpN;p|P<8%6JP>lp$>X)Gdv|7%m2QE#t-kD9uJ>F&P;P-lR-VRH&b*A%ZB6dI4t#wEdJC)@=jnS7^j><`haYNH0kQ;*oi}vQD8RVoC&yTAi-omSe}MCeX|iZc1V=t2W40OMJ@D z#mS%TrNzfH^EY!!a?D=ZhX$~WQbStQYO_aa&35Q=4m&NzFgb4E9jo4y;5M9!AjE7U zU4!)g=9tfpLAWx%ev=B!Ma(%1)e=yl){w)8rU>p!Ae*>9-No zC)WLnu*(gu$W*Y4x>Nmu0nwb$v19G5FCvHa^f+I$TJpQ zI&@#qotOA~^OV+ff4MhmXDu(n$`L=N&$UlGMsDh=Sc>evWj7|I; z!l>z`<97^A4zb4UMyWU+?BYc#=*_lVc+?eLHM(FRYofsK39~<`{-73^`N+j;it7EgDd5|7~PBnw~r#&oc_bP{Ls|pN~c8L{E_u+3NTJcpiT;za3bt6 zX`SDHrf{>Irs!N~i9Z(gOCfrz0kB)})svU=+0$r-OBW@Dx7r-5En&F2Ex7mDF1>bM z2!jQ+a%OJ55QLlnNq_^d)dAuzDm>>~Q9mm~n&2LH4uI=YN@7%UN0&j@mHJzU_|!Yw zQ;O?8eR8X5nki`^Pkc(VlPT;43(+v-ff2=-HZZW>vou1Gn6pNY95hwZNs6TAE-99c zwD=IkKKp~f9?6II%(>Vpo}GtIsK}f8D1$*f(bg+({8bKj#CAg=l;vPT-8EJ8H${14 z`gOzxCq-rkeN=9#j#A4TMzc>)&bM*swRD&KOW081-@1WX`lae0a`znqqdzU$k7tSh zuCd0(%7x5FF*T?uGnQ{ARhaS^5>v;f+K4YY=0x6*?N7Bs6Evyg=0@UgO#UE9)2-7- ztF0KI2qt+8!;K~eJtEmf&%Witq-TGpC-Jd~Xm~8OG2EU9RKtZ53w<_#tzGD>9w%k` zy>OI;o<6@=N(*E?ex!m7>f?o?gPRG;m4Ws?H`#WKqix$4s=*rkvRhjo1x zSC5~Ap_X;3G+eCe{Gljs+n!wee105-c#f8Y`0U+V zPWdZ->9y|tjsGT2f+ve88CmQur+VMz&z7N22M<%JvjH|-Z1aL(t-KM=C*D%{oF8Ov?BtJUCbckc{c?L zm5b06&z{n{`YG0NerhhxsnRunm%(Tl;EzdvEl!v|PFj`^q|GuzOO>!n`&dzD?J%VN zv8GeURV5njADE}Gw7royZ9X8(DrVpxRzX`85M`|3`P(F}J%)7URh$Bk<(^;JzjaC7 zcQ^EeLUwqG^nFQ>>WgkNYm7QIcj(OQD2yS-&?>*v*h4e^8kx<5$VJs}n`*%qKDilj zbb$Y>5F*~WtG-h9xPH-2nP0ez*GEPBZL2~J)pBMqE?6^(=W?#6F&PqZRlYO+5iOp} zq=G4G$o1a?*DX?2ztOKvQWXlLI_J3Q}|^g>CQ60|2#YYd$IK+6$heQR4Js+@%S#M9HUPhS^dDNIh z2@>VuPZ4yI#-=QZRX)nqpN5Tybw@k92U^eBjPYY4AU1O~U7s{+whwiWKEt@lj04!W zJBJ!AvycPiH+>lCQfk(sVODVkl3ZZ|+H*8*tqKHQ;uMEJ1s>xu#Ji#fPqU8g@f?3ak)1E^}`Js?|||ISeQ94G~cBxxV@MjzaHFLN?dsJ|LFdIwX?Q#~kFhm~-4B{}oZ(OWeoI{ooi)r;av+c;Vowzf ztN6|-6gzgjVx4u;RrIn$`q>H5AaZ>>`B}Tw_B|Qr(kN!#YjmL$I=2XGgkx2AntNxvGehOKh_$FPOg6U%>$ICAJo|zK8v0#?|-&? z5rZM$hifvZCV0bjj0?%Z8p%?>!bWp!i?(2Zj&c?xFd!5DdO9j!bq$$S7Ao}5>FBW| zOUurb?X*+Y$Y~w1K@2=2Z!%Am?VaVto|5_Tq|VoMYw0|mT!fLCmOX`pnPIWbUVn4-54~Mw5V1M)`?Nn6g{u@mCyfiaN%%*|k`~gRWOu_sMp2#a{6F7R*ut*Zp)xB>BtJ?rE7~-5&0eH?L!s zJh7%?{`=l9MBfIbC48)YOOH8c{_0*%!E zDDcHA7m~?e6~ccxba5*m$viH-Ni|^q*i2;650$e-Hsw&~Xhiw^HM`=g3x%Ada5#Er z84-$QkUCR$NRJdXy95ZJqKtT?OO!e!w0^&Ztf`IbOsZpa}3;xR7{O%a8cdI zQ#HC`dbtdFmgjQ(5{eVF6sa(=9{?{)fK$ULmpR{_T2_e+mlceQ*P*$M?yL?}}tOD`G@KUv<$A`XX?{j8LFYwYyWZex{bd z(8g~w5*HUGSRc|$3R@brn8m0MS&HejZcP!H34=rD#2`{#{n5wF?cVG)Ls~xS2 zZ`9uX#Izj!>T@Az%G#%J&vUV97n2RKX*?m@*oTi^s9xO9OLi|-o(pMM>_dG%3T4j= z1#hilWfK_oC-B?^0(t7{DEI`hlB?1xjg<0TFz@x{oeb+>+7M4K`0gF1vK#Bs-h{4V zt!T3}$+Y?TZDq&u2Ud*uQ#GmsqRHt5)l3b(gZ7n0V_LDoO~bv`&%Jv{d;h=z+yo;c z>HIOfob(RSHMbB28UBG% z={6Ti{V2YVkxc=ZiOdZT5?O~^8TuG>Oi-DHspJIJ!vrnMs)fufGj%FSxH==JEV2|= z+rM5^y?;C1Co*Y|Q%vWVDqqi+YD!e7HZNPc3|s~Y{oDC*qZMVenyfz^^o|MHjgkQG ziT45drAb$YU>R6+p(fk^@}YR|u3qCVc;rjr^?>BOzrW%$RI|k4A<@~oq`@pZ>?H4Z zpQto-b15wR`V5|okJmo zu`qqX{Af=R(7Q{Kfp#YdwJ;)!GLbxZxJIHy%+>6DL}ijCHuzcP^i(B4kQ}N_}GDneh<9 zds41z{QYNI?7|3+P-mqQ715;Jv8;WV=8WNC?X`{AUT^f8xOxZwn);}z!XIK5gQrcl z$e#F->O6!r3p!Or?_H6!(T|q3-g|B)x3A2f?5+`fnCfVnDe=_ zHiL(}>km=P$*~JDuEhUtN3!wxcaVrT{t>3bmzkrg6kGz0dOQb_xXt3goDCT5&{(m} z2?R09d8Gil-|K%DXBb2wy3A3@q_{YlZZ02P=Z=Oa#*Jof$-&MA8@VLwPm@06Q|#$I zu`aotwa5n9+zcStv@oj8{0u**aa2u!wHeJdGA2$xV#e34Y71B3ufs}Zqst@M7#WBa zuWPaL(R~mkHgJROM)6_EVpgH2kGVDv5WJ!BEGgR+mO5zX>~}bsxnd22u@Y!Yh6IR?Hry^H5HB41pYuE7VB!& zrKRT71-n$&FDkC42$vh(mph3(?~Qh?A1xr^g=|h=Pg`}Ny|(|>u)f26xWmqgt^3Q< zOj!K&?QgKVbn?@OBPR(bVuvmMCNz-g`SH`GF-)Be&5GV#kB@A zqghvV`x?}i$L8sy*<=I4Wx~oLW=n)|oUKf2m+!RVt;SW!r!Rd$RZas# zR!higao9c3HoNi2wPuyC^~InWmhR_9eghHAn~e07iX6*-9h#6o%lQw9Hc8h-No0+i^?ZgZEPG}%J@^qmUd-28F8+M zTaIQ63^nC3GwNwmSpt{!=E}9p1oN7{Me%q8?Mh6+28n%gL`5Mq2v!&v$$3ii%3-Bo zfa3{0z92AHvV4Q{VqoNapD?eVa4g2#58{@2Wv7$@pGZA(>AO>cY60q+aX9(7>mRk= ztt=Y_6b%t??{|fW$s)tcojGC|A^hOwB00{)6ObAa7) zW-|(&2l1gWCOr@v^}E}ORYWcBiAD?McM=B9Jr$E=bu-++Xu#KKs5TQi^527oR1f3k z?iX9~lSfVGQDi_P5-ZGDemsFO^*uMoxcgeroBdKKIS-=+$4)j<4AXUvi2Yu+`TI zFcOx~(aM#KxQ{xjm{&iT(B0v~2c|{&BqpSGy`Kl6+Kq#vEe{Ja>!0e(t$8-u-FERL zf|)P0*xO4SQBta+I*_pSH(L!P#ik10Vea44HD)`^07WMcWi#a~%i z5MOrtw^O=0c$;UX)4(vMcLolLV@5I!sIm)+q@wR4t}i!PT(qvg&I*THP0&{u>RXpn z_*XnJnqKiz{8FQz zrLlomu^tPFaE#s2LD>aj{qIO)C2So~5G%|&r{EfvtZqHEsWkWb!%z0LGy*x}fEV|) z&!0Z952YIX8@C)o$LQHNDhLdm&)Y)lKxWL|wV*z?Y+D=BUxOr}q=AzQBUtCaT+*AA zxF6&7a)S9we_}MQJZc;#@X~&4B3VV-NlYT#Zm-oE_F8@5IxyI$s0lLujF@EEoYkB& zkVUiJi>MG$J?e_U^ApkbMO{??<3$=0L;Ji+IMCB>ocMJ7S9gucwVWIwW2^a+9Kpp@ zHp%wj-a&waP9(#+3qo#t!|EucL&7)Fa~GBA2UdR3hivzpcwd1TKPMLpxsd&WlG{#T zKd!wZ+TN|mdu3fv_on#AwRG>Z8*aXak#S~0b9UfvSGOLT5L-00b}Y?_j9is@mMAm} zMq)Y_^AOcluRVDD(&jVew+e;Os(@smu|1vl$r|y}8vdA8dS*`K;k~2t9nypEn&N_U zMo&l3T*He(S)4g zR3fYsoIlUilp$HhbLNSlniGfOf@IWJ;J~Yv9lQctw9rcEI(&2=Zjlq2)q&HQ(l5@I zuhrE_y@wg2Fc#F|SnT?Axb@`jV{$kvy3XKM-Moi&{#-D=saC}TwI;-e>|!Uwu)2sw zGqT6BHYJPu-9)GPz%=s51xE}+osrfO=(ek?iGxxYnv$%}QKAA-Ih%Y4DMt0{qGy*VOwxBt zhxEb;y4V+4q&8BG=Q`epr@eJ9I0NGYFEg6Vl+dSB(@rLr2kj;yUqRoZO|y;6{6nO$ zw#roZf7Gi9;}_emj(%h+pxlZr+lS*kgilw790XS{hCMzh`UnmlMt8s?4q=%OKICqb^bIV=borO$G#M>G-y>a$Zp6{>8NMq}p zFibHfusY2d%UBuQth#^dwq0Zp$Hw$*pvhZ@Br@;MO$b8*N!6^x*d*evogO6w$WC;Tj zh+YKWq)@K+(TeRZG9uA&pOi5%npma%ND@;`lB7fUD@H0BXZwgBtZ{L=k>geU78T(x z-jUl)H~$X4l=MyXsLI&^nDnfqT@T8so|yNs59_rSE1O(F5zXBhM}%S0>rJHwlYqjB z2=+xrcQpBUmY>+l(|Bw;reJGrHDTsXt5&c0)RgL@?&mT=e#L)A^R0zu5oxcz!cHpM zw0(o`7ZY}yXH6JW;!{7`DC*WUnyF|~R?I^AE?e*}!Wy$?QYxbAKfz&1_{&*5)8Rzz za_3hwN#OO~SIJX!faP=UefXIR!Q;ie7D;&@+Us{$&Dj04)z6#$1Xg2-+4?C&6uHfr zcbJ%JLHgtP8F8?tDzRNGVX9WxOm8fY*vbR|m5y3#_D}Ae-tJtEgAMTU5h z%6lSc7pwU7cYiguy!31MIVhQ(SY$gx;p6)UXwfvpq;QW-&_VbOFCo1fJtM^oZ;k_! z3ZZ!UMz=@~KE4S|&P;=HES?c^@a)~-Kfde_@9O1dKP_ZOEX9X4MX13%4bRZm+KH5+ z+~}PQrJf(OiO(m`8^?Cn)R7R_YafA4MxhIdzxwdh8)fo+P~q<0lx)Z0*o2?KIU2^< zewN|D4H;(BMDSxm63M7p=6({OKu)Q_{iMBJzQLL{=rHjs5Klsnx7A*mCivbg1$TXL zkwK>^anl$YFD&VZb^p*acDXiG_Cx2d7YqP&Y#QwT{6+ZzvYc^kqituwD|pUX@-|-{ zv7lf77}TP-Ii=O}?iT04a&vMfF}d-aX-fFa99kp#=gA#=gTO_>(Gw&*BGBR|umLQ>`%a5xg{Kgzhf`jT%VQHHbW*iE^!Gwr%i4lgz7Ng7}rsz59tb2 z4e{5yY0s)=Rmum}SMP? zf@V)4I~HZXod2)8dL-r8`d(r@Hhb8@0CrC#kCckEnRz};^YV?YH3RcSXhj*1W$kve$`d$>~-%6&6-Uo&|H-z|k%#RTv> zw@$wiceN2BU+nL5`$+d??(yxUdp}`2o-;#_msiRO`4XD*@)Ernx1xF*4p6nnfyLLl z&W|5>z4dGs`vc>A(yWG1=jWsab$E*bMgTwbbKbasKek3fqFktHW;?xE_9t1Mo@v3@ zM(GrYAZ3iz6`XNA{Q{X638sz>Yg(3{1+V+sVeK!i~ zYw9PxjBI8XGbaL?HK6ZRi`~7;y0!z**)u&A<7lYCdKZ{2FJFGe7S6$0SJlS69SQHx zTqHnql;cDKoJDC6w-+FTUGAKnSm4;4$n7H?a)&9xwLz36W;48rhnt!pkx@`j2ZbNg zFd4@5EXTy}uP(!HmXX#Wz}Ob7hk({i(GDmIoLaM(`(slHE(cZCzGI<|-DP}G7)C1? z_bib7sRfMgWS>s~(e1(0owu>S%%aFt`%>!iyG;mMI0Gy_BW*kkj!WiYx;BzY;?==j z*h%isFD#_`ypA&~?wiwRA3DO#4wj`d*?1MN)|>z0H!<@`Ckmk;;&45Ag14mzemzXe z+=i>4FVez6&M|}8y##fdty{Qr8p5|X5+@V0x7t&I6oX;T=Xw%`YgDVZsdl#yWzmMK z&$y%c_@$96w``#{;`ze?m&`>h(Bs3DZV&XAr@?sALm$5fLl;qQW)u8Es6t~uFIiU? zmkJ7(x!B zhYk6?4wlgy*<191F|}%8t=4{;iqL~RP$ccYX!U+-bj&4HMFr$)Gu)lzzq7;bIP4)j zD}TffZ@D}FmeYF(V116Th_0fwA45ZZl_N}y11KVH%k<6 zBmZEmpQ$p{V0j7C*WU9V$U@qjNWjYLPpErt!Z%-!3uefpl7!{jjm8(aC)54~UrTPIO*N%?b}XM059*etQ^Q4L$S_G?byEu{PE!T`HW-Ab zR!8?gYz!hJyt^CHQ#5G*#^E>m_RbDRhip=J6VTtIY0g*u1xuZ||AxrE#8+WFI!*07 zT>d&f812~u@HCAe#}A_HjcGvzf{soPj*bq`&(oP*8jEWvD<8bLNg$g*)ZK-8|~ z8G-@%z~hjZxxtZ<;K<~Kf2rTU$5*p{?@s6iWh3o7oST3uf%1aqZ3mSF?LmTL#MuP{ z)kZ-Sk(8Pn+`gsiY#dJx9F8C$f*?54sf76~=V3MZR148TFbE3i7@?KiKsLWj8D0`W z3HSGUL7CZ@fnz)Uia-xD>zDc=Nh+%6HY7=p{B(~K5H?wS5@BW0gx~+dv5}0-EZ?{0 z$457a+;+!j#urD&am?=Or{h7;1}8ztm4bnQxsBn8#or@Yzc&_7Jfq|KcY?YY94zT< z9BtuST%99;c?FrJ=<^WE9*U!Z4y&89yF0TVdqx)4mNw7bFsho+lJ0!6QksP=>;3Y= zWUoT3u7&VHdC}3)DLI%RZV(^>att_u-I|YXAm6eRpSlQD18ZBqcR`Jy=)lfwt)U>k zf?qs1UBJQga`l4yb_40ZbM~{cK+Dpp03fD?ou!1I#J40Y^H;=B`h6*-(87_h?7q_= zWqU$E??v$VjLP1;_*3G?z#XQNmavwZHn3|UOrR7snaM5aU74jR*nD#X8)#-AGA{Mm z@0b1^8eHvfzWDxGnXRl1@DAVv)^ZteV*Pp#T=?(paUs-aI}@bu{4yA*T401;Ms(f; z#8d1W(0du^egt$J4D@~LM|=Y+NDr=zo*3Fx1)c+iY{+$G@#g~ZgCbT}AX`8lo(nk| zKK9D82LjVIh^%bRZ9e*27Xgxm5-4qK?Qe?sjCqs{0zqXm=>RG$pxl&@%ild+3sY-o zwIrpBirI6OSK-h-h4 zT=6RqM~ittHkiOS$1sQ_6rV5lJSs>9zhO{TFZ$;#{;?4>GaL}>ON;KTx+aOiBs9Oo3eRi;VU`j8{##M^MtlGz@%kDm+$GfN z8p_J{{cmIf%V6~(=0|Dbnr`%mG zq_oFH0v#_hKFcp@wQ&)%x3ssKuH$6<8S+bG6;hW_SaUy5@hoSJQ-r(c(FYa_4ZKL^ zc6VnAEfjlDCn)9zKk|nguzUiy&7%EtA9bpgOr39rNr&E|wzuji_!eX@ z{cBud?NvUd*{s!|h_bhxmnFF^O6}qvPMt>rSv75r(4&e@6aO9Tu)!F8i91OXHph3S zas-><-5nHtPL8dHyiW6t>zgoVUgKzf7(Vziqn!$g@2S?S=vcswu^SioOHU7DU#lSo z-y%%qxGdIF;;3#+neK5F6yH)Pjm5xD!-O>|%?EA5f7imWhk%6MEG7MFL$?AiW*PCJ z#ph_&l6$E_%`w(;PLpa^Ai9{C&klhA;|*hR%HPtb!(Y1j#xOh|sP!8Dr`kety+!iO<;Be) z;?!&FdGpsme9CWSX;hU=Bn>LJ;CpmhVG&yM(Jnnw#`i5hlk}A~&9ZrPWj(gQv}T7L z-gibrX`X(Ea!#C$h)ko7cg2p0FUy2qSJucAdgk51EJST@);y!pA9I3hE=2uHMd<0u-9ZWPFV ze^btWsc_^@m%lU48)P|t8u3Gd8c)vO;u}(tvZ+=g+g;!rZY5uPi!B|RjJ_w0jQA+r zNggYM*qNHj%XjUgBoys)SU#{&h5WWcN>x~Vu>~Mg3UZ$CgxCgTL_=44PK`(P5L7bG z^eHseO-t4EFD^^$iD;J@b4qurt;)~5?s}V`&-TA(q5Qmb;Le9WYiqk{rfup(z5Ip0 zE!%#wlDnoUWcqZQBmRfg9wpUqVv2v#(w0pFff52-Y{;oxph z%x^+1XEohiD{bVPM|?*jl9Gqv(jEiwt}M=44W6Gg;2I7`tCG&z5-E{vElFM)Bc>A_ zH+{0Upen)UPqtd7K>d8r;ABU0VGM$eCFS8391_0$8SC7tx!yZXqd=Ee-CN)XDa+Kh z)^&NhoZFy{l-g()8vIh=)!|Gm8GD0y}v>Ham{MWEQuU* z2fwn*pNGcgf3rB-`ma-f&p)?^7>4Aw_LGGp>`z~7-$=2g;c7Ez1*;coY8#G-hrl#u zqd-c~=z+DFWQe{TXE-C_(@_WVg`NR4iZn?&gz3~qW3@r2YU(2K+_IYG4%$@cSeJ>8S;)Wh|)qhSu^A7HP7;hov^niXX0k7PRid zMUR!tTEUR>< z?@|9UM8~ujX=*S`>&s%S)I5kMOSJV0Ps2S(SMO?u%|OZX3-zJmO^*2<5H75MzZriU zGo+Y>a|(Veh;Mj}D4q#FZKnzO9m3GeRj%B2aJfv7gk;Z3P=>#jTdpH0JWt0XLYATYtJ5q&e$T*VVNG)g#+zhoXc(x;5k{fPy;BUN( z0!MN7;#Tced9IY#KJ$)cD%4{TVzhJ8-LCcYjvvDc6nsR*rkmf~-?+l1DL4zvD2bL`;sgEVU+YkD zY{kq?4OY@R?fCU^nPxr)30K3ENxO~E?s_cK*a3(bA^bd6+XZJ_ zIpgKq#U5nNLc%Mjg=qG(#xkZJ1{Y!_I%!-*qZp>?KaR>so&{tKex~He>C8T)ktusE z5I9cFMhu}d$Uy-VL>up86tNs`wXAD|Sv0h8eAgM-7Xtk^sS*zg??rqai-KLOKl4r= zj&`YIX8Fs6wFl^tB=JfpbB`BW=yRR19NKC4*M#dc8r1&ianj@TP!FXkBuGs?XTvu) z*qUpf_(K1Ig(7V8TamyrePL>$0?AkmVS^+Av_bZ*TkYV9691rMDcW=3VPY%~bqMZ; zMyh&lqv-j@>-Jh%zc40)q6=vIZ6n)ccKEeAq6~srbmyBx)l$i3F{BRAjIh<*Y|f+n zS#Aru3(p%^Ulc*>;`PyX5l?^|B~n&DD?;-a%3bk~`6WWPY>uSG2YJ-o3d@v4Mx5Ik zHBYUSLlaP861qw?fo`t`4FAJr! zR^g1Bm76$>c-VU0@`NnW?ZGJXD+*DuN-*olV+Xvr+Tr94>AM2+Lj3DK?|MX*h$hwy zQ*&CDBC+B$p#E%Y56`U8;6~EWIp7pKr&=~{uq?|a6y{_0oTh)at zH8gaVq;GnWUZu=5S>>0kbk>JI70|fg_aEOT(_opGASPNr&r26x)UsgV`lL(HuMLJH z`!A>~T#Tj^((1OV4fVwFENg;nXW<=9;Rn#cs8ecIYg(lp$5ls^s{hCnT5zV53nW_Z zyB6bH@ql=5TLT>QGsSfoE+eV>bOjSo}=Ay2WsON)nt*lj|K$EU}BUp*ha-0=|lVpc>vu6q1yq!|ad?D|{h zy{BMEd8cjem{UXd<#8R&F|+^YTM5qwTz?)9b&=>-ABtQvvK0lJU|y>F~Dpc{MHWSL%)a-&Z@{aDsv% zWa(uKGyIkpLB@b{M7>Bw1hL+UJ*$~f=pKIAZ9!Cf+~sI5b;L;X$lV5*u9>zW(NJKI zL%%-Er>7xVL~x}4{&q^x64ry-%40Xe1e9W}UrQr)mQa;+ z7`e=>8@YuKzgv5Z=hDm5uSiB({hwJbglEtvNB7IB=pNzFH>}X0SPEI3$r+cDmXcA;FV>G^t4X<@=QQT$$c^Vsw&;@a?>}V&SadMM?4B8q(LU<%19$_$2d~snIr4y8tL_SNa%(a-8DL8 zcTu*Ufef)6;z=afqK;$lZ?@&UqCHk(eE51CQ!isRXPUjs_U(tOF5$^#9oR4N7n*t? zg~A90&otj|Ok?pC43RGH-H1+n(=pj4xFeQf4|)F1L7i=3YrkYRM^SRx8HMBOB7#DESUg`uCHAlFRHoo7iJN_HKNKxNmo z#a+oL;}~Me4^;A9>7|CD4qrlsQqv*8F00bQHD3AUYhlfI-c=PWz78pqjOfRz0`J?~ zO|lo39G-`UZ@n26zEt|>{4b@RuD7r|P2T?T#flapgCM$psboPr?N2fS>W zEA?UP-G<77sebnmTBmr5R;gf2_&F+F7tE0aJ9yl7%!9E}hTOS(vfE5)ebmL%g+~hr zYK1hSwMgAhqHntUT|+kf|A-4U=W7vVtj;Qp9}bibfD< zYFvY`O)Bq-3H9(0q`lzqW5R8NVE!yiP2g>5^Z@oB`} zGM8Se4Lex+Cy(G%UkJ8$0>Q_#A*u5=euW#u<=B@Nm=T9hTi9HaL7=)&YLhH0c@B+j z3zYbCmSlFb;?q4Zo9&Oqf7ATiq~hQAswnk05Gj_7iSRNqV*^OLnI-4QdK^aM91I5> znn0-T7s|KYG{ z9xnXY0Amhxq|JHBMz>m+GlQ+`&WlW5p)AQ2k9Q|=5)a=obnIq38JH3km_{gR3=a|S zKsiG!#YlzT9UCxT|)jmNpj32nvIHj8MZOhWJc56F+H1|0N)Oq$! zi8TCU!HRGBNsDR|j@KH*>&G!uzxd?w{QVhV_$JVLhT9gFsk;t$wpvWB_zdU-AL0s# zpA;~j%$b25HZAvtU>*mELAYIlFu{lK!Wy|K#?$o?#GJqWUNX7v=doCLD}1rCca2Lh z;)%yCR}v+D8gYO5tMSwKZxOb`Ukpc~-1^t8^&O|>Dl=nM)vq|s{7#y${~Q zLG|o_wO=I!^L>EB>i6^3y^oK$HDJpH^Yn)cm%__`xzv~Q@Gs`zZ5fa~-%BXDr9>af|QLH$L) zuI@tXXm>bb2_15NOGR_5aN|q#McE+7L2-O?ZiUR8$3jP82+#Q!H%FEb--jgfW`Lpi zBZ;1fSO`tS3o8TiXL z=)3BvHCK|F8v^%5B~0IWu^hDN7Rs=?+@s_ z(Cr_vyU1>E7?i12>7~hCt#Fh2i<&CUrd%oFc_B9Z<)X1@r&`c(jxfwsI{LP9t$vux z_Ebl#*(pNAvY;9jhJZzx&L|7E)G7%K1uzV9&w()l$fPqiP5Y;I7 zKa8D2lPEy4M%#AZwr$(CZJW1k+qP}nwr$%s-(9|mn8o~nipWh>R91d<&Tk(ca zrdOQ@+1(UVk-;6bm$-gSSf*&kIGSULLh6twBJfL=iuZcuufv$L8sQ*}p;I~jk*YVQW!-)oQj}uR(i)r}fn2lAJ=V&RGPyKwgvJ3Mufccv_6!_33^!WL3 zE`pCUs3F;8o(arAF10@RuZXr?o{yle3ssQwGblZrTR7dlvV=x-5+8Ooy z8Xj4}EYpI^JjG@8l>3Yl6LQ^Y-Ia3c&xwnL2dC7LiHee0I_k?or5l|YLQl>}LS+XJ zkkB3$frN;g>&9ibPqZ3i?@3xOt=}&M)K9Gtt}&u=mS2zH;;GBC`lEzbllh#s3zXM`jStmd*< zU^X?sAwh&o!)1rPi7xQl1(drjl(+C5)xIlsm`edsqo865O#smPYE_$!EF>Y*P^3Fq z!^&UY#TiDSffZ^1IBq9YF*kfl79%u8;~%)VO=W$mtTq9L^S7;GKJ)>4eYvAEVhS7{ zwkG#UXI!)HNaDH1^6Ey&*G5RLzljY!!ri>HJC!NO!c!sn2(cwJ0xuR{Oo6gh!4ML? z75)6<3+}5x6{QyVm0@nuy3c}X0PP7g3q}4??^PF%QykM?X1`C?k-;0FG6jEgQe0oZ zB7CCEbDGfCQ;bS9t-ob4Ri^Qu7i+6t6NB@e6Bw7K^w32ipta~d{24f`*tk8;6dmeL zzPG&1$~S#bJ}7Z#hY$l-P@d}%U-)gBGE^5hgR2;yGVT1n$5_QnV3l=$1rp*|pXkgK zJ&7vaD&jpe(Iiq_o~3Yql-B=E)tn2l4aEmkBqdx5$y#H^Yl8ns)Q-p0I?~J&UDK30 zad*?kfMh5tIrXufwI;F;h`!Ae3J$2Y(-te% z@3$ZK;kwjx!%%IfF1_K@o6jf=YNc4LgW(TOyUMr7u2G5Yb1o}gstXR_{P7UllJ{6i z(c&r)Yqd3f#YF}eYA>N9+B5~IoqKbRpDYe&jdet;u0>a*QzY?UDc%%bQ4=vm>r%T1 z+t4K76NNBAmy2|C%#$PQrNAPTu-9tSIG{ebRLd5L)P}6D6`nwWGJS_1B3AI{>%#Zh za}=^|QyI>Gu_l0LO?|ym+Il>!h*0tbo%Kvmzb{`^qYrV-D0@v5^e*WLV`eh+&r77c zSDJT;j(p9xB{-A9xWrvuwH%3ieP7}-<-q-m7FkvSzu)x$4$~Z zhK_Onj^q2ffTia`#i3NpUV=nhL2W)Fyt*%1`8)w1{>=G!BBDGcLRz;p+qibA5dvil z@50gf7&(i`hYjiDy|Y11fL`@WjrIh;(^_!XwvZ0ozcWNU!}N}761YE(=VI@5sb?RIwhJKo zBo(uV;6Zx={akhD^fe-0Wl>4*os&vJ?mAqoy%u0U=1gy>m%8X^(Z@~60_FCyDyD|@ zMB*4YaQUR;(z6N6Q*#+cRYa)`hyzXnw9=6i9&vk{7~ChMeS#5ENbM|jz+#xZDgVnH zzdZ2c5%H8_DB@ouf;nM$B-SDY7YWiJ-?WV3t&MQcw6Yq6oQs-(3Ji5ex32ufE@XYQ z-l`*mdh7EMMc7{S2E(C0^&zS-0oGc+rsW0|X|>z73Y%L7q~~p&W{JvJWFQxTxp38! zQ?+X>pe|yWmuws*vjlKQ*|vwc9#^^Hvr+FGu4~7^Ha(agy4G>@$CBrAR>f*rf+HQE zGK4yHn`dlL_FZubhDLtO8X^3FiD5k8tvNn*tV#N@ki0BFc^mQm?Zd+ zYdKx2;81Q%aqJ`YUX|9aX5NT!xKhrjN*!2fTMDap&w}OE6#m{>ua>cbWv!S%^aG#T z=ZCHq1?RS%C*Po5B4X$gyKQAHw#@PQ#IS1yD^msOC5Afyq?%{f27*6Byo8mW*SioP z%7lX;;?U0bhloqTY3JqS24#F$4H_NnarA&aKU6%SXxqz1+c~qO15`?C>pvq0XUn^C z@b{2l%Qfzj`xQD(AXyh$IP~E!cr{s2_EnrFk(Igc_kpGP+9_5&Y}|l&YT~cuc`8;Bv(UVS%!D2(ZSioZH^99|s7M7#gVH#Bk3BqQa3 z5F?Rbc#_7brJd)>PWDj~T_ARIC$v?#e8N$IwKh>DPAUT1BVmNz=J^(4g08P~wM(+iFK_+O(a7+!lyAcXwJIwDG$ZOK9YCj72~JKw~)fEk7M;5$HJKq$(g%(%y;$6 z!HnT{!iuVRp2XiFs*E7D-5;L6se78JT_JA+304L8B9#vyc{w3Uly(Yyv58@i-t&|s ze@N6Ah*H-NtBj)^Oqq7g#n3PvJGRhyLbd=y3<R)>k+m}QfwA^sS zmV~C)V@1M9^b9tbrfF($;v-_7Jj^XA(>rRV(nJq`_ziPzw9)(5cG7whCEyvA$Eh23 z7wzr|X@~oXg`_WUr$_1|V2`ZTgYKc-P~2~==Uw|uLrHR)E5GhwIZsPQjjwP9SIKU} zuA2f5sV5qkW`p1UxV}Z#S$nKgOkE?=7PT`I*SUrsNo^nw z0gyFJZjge!y`np9ABpH--*JuWE4U@(1%%?VpjwDw_m`jZ%jyzUps~Zr)9#k4j%JeE^}ejNirm? zTOLVu5gjRf7oN}c`Mjh-==I#1Akkcm{ogTp1B*AX8}c{_uurU-t}AsU@=HCx3XM4RGAos8 zISD|}mVW`3SZe7wFOj|n8s{WdlvDYFn1afXeV9?Z)l%2;i-RA)hIby-YSQuL)z*#| zEG@~}fR~9SV=Eu=-KA_*a7U=FzGi!~N~lq6W0bfwy|9hs^YKL| zJG4uMbrFa*@CPT^K`UaTJ$Z5B1IF2DQ^E`TcyIN*oqJtqe}?EupqIHjDd!!X*ZxXo;? zC*S%W#sgw|9GTbm-I?2j0id#AUjx9}ndU~iWMzkmWs~1ymI@*g>V=1p={@$q^1qEb z_6_WjZRw`Fk|~DW3p>(P=7JeHA@@5cI4qx}F`<_!#UOS|^CpXX>eFtf>3pDidE!z> z6w$o<4E#oWKg!$^lF$Zhf~^~jar&DXNU{-O4)qo0GC@o_T2s9Re2H`y8`ynEcbr(A zb4AR#d~_alO<4w$!)E@?^S-Ol!|k0juCT;$Cz*MLi}G=S)FlqL@~a`3xPC&w}4* zI%QS&#V4f*OIw9YY`lo?@FK?DeH&A`_x%c7CYSW>fjUQ*qg6uA@gyiC8|B@vlf5cO z`VVYsFxj0Ea@uE33f@Lqx_h&1;M?Q0)yY3ihJ>_u^^)eEa8=AZVnjN{pIrqMQ8|`Y zF*d`GpghKVQRlFB9qox+qZVJ4ltn(9_o`BCRTdqu8eJF1bGYHFZ};6vWx*gkwdGqn z;&FW(3qsFdt3@}6PDKVg%YOI+E(0fP_7Jx`fs4%|)N~Qx6|LoQAk8Hm9kvzv_tFSzANumMn9#0!IPkpUgkvN{M%R{s$#@XN8YFti%F0ee zL5H@QSku&hMXF zJ;>j#P_r46m-o0e#6YEYnf@++++(D540^yJF?G;2*XE%HR4$kaU01$&J;s=2B;7VQ zMe`X*Nu#P?8|jn8BLzpf=|j^+jJiQVL9gTs3^Dc(K^B%qrdJoJG7EEotZqrU=WB3o zt}vMImK3a1p%BGUE$G5~+}vJdnJY#XXTpsob*DI4vU35b_EYdd--oezIkvwcl#O+j zBk-;33`f)waF)f*T@?Q)CgX8*9Zd4wHknc$E8PX*`>60U5)N&hAgvKjqOFAnenYN$ zcPUIn<~?1Rg$1LjP!j}}Fzt~O4*FU*!S`=J_~T?9R*kbn)*|DU8hPNC54Ev2IJ0p+ zl)Kb@;ClhAt7~=Dr4y3nk#(pv+oHM!rni~9IxV7-A`C63mmR?&sIqrTgn8=(b~@NL zq%#|mZvo9fkb0F7LK;al@9cWND?0F-WW2{4=?oU85(tOy>;YX1(r0U``Kj(tao0vs zYTI6(B$C>A;uqAKAxmZSswnYk!3l&9{p{Z_IPjl{@6L3D$s*|};8q^4Pr9)+e3o%o z^iVt;({`QQ5G{&0GIF$WQ~F#!rQk|N&6oHq31^q(iQA+REvAd{0mYtbIBvyujsX(N z#P-Ju)tds5>=k}H2#$)3Met8X^(?Gs;8ExI#}M9|i+6V8)g_AG&@U$+n1n+f6}d_2 zAu`_!UGA5>xLSI0WxmndLZ7JcWNjoe6Tf$3xXrUoLd4KX!nvE~#ca}7%|o}W4orM^ zB9v6$5BJ2jBt7*?QfKg_95j)Si4qwP2B;G1^XtLH7sx44=29!|m9l1k)KL+_-{dg` zClG#N!hv`?R&UWo#xNfLTX$RZDmejKOZz^;B@sgibeI~R2~~?4w_+2GQ#g)bD4#p9 zTd(;UcX4zwrzyhy+T5av&Obnzzb5062=1jEh>nCxJL$a-w~*H6^RDU8oa(W39}%8W z2mK|XVTndIGDM042X@0M0r_d`wk^J5OO}K-3h#2q_*<&%$vpd#R<`__(-9$s(wjP( zD-AlFn^{FwIHjai+c?&q=Wht(v^^<|*f!doybJu|XuDR5VQ%^@>wLuF5Bmj+;FyzR zBfhWydBs1()xw1+#=3qpV-xgZ%J!9McG4%ZZ9-)HO# zjQz${?)>-U2R6A5oY` z&Q|3qiSf+DKm};P?S5=|{c3C*Z9{=W^ddSh*4VebCeBotRvX~dr==_f-s6Xk1T6ee z>t@!?A+64LsrfDlL;rs>nmWR#8y9_9df99-_*FkmKRFEelrCE9*uvB7x*_s+sIP8- zm;4+0Vx#dOKH=nU!4NR)B1l=8pYGbY`Q(~R_!bIl9#m>6T8+3lH5Y~l00xwfqcD$w z+n9Yg7MB^QCppDU5nxH|OWSvCcx`W)<_L>JZ2?PMqx#^;Pa~?LdC+TuxGyRCl!!|@ zy^oQcY1Y5&JG2puk@1R+52Y`V{be8~yHiLEP+wJ@;+=`#v2?O|#@V4~AzKysXj2lA z`i?JUNObuXDY&o&(hmkJ>T^b%^WwqvvGo1cEb{aX-G`AD1~EMw_Ax8-_&ieJt@r#Pm<3ej`7PB)5WQLtysA#t<5?c4{&m@TP2oN zD-Kyk3Q|wKIRd)J7;-a_+qZ?m!IPRPyMKsu(%q3JzZ|lCCp-~%jS3bM92>ntH<5~^ zd@so1wF_7tKUDkQTo88vx9SDX%o+kwYUe1H7Z?x!d8%P(9?fHU$n5cAfyN2KgaLO8 z4wlp!N$Wg+poW^>n!$my3K5`TqeC-Umbf%R_K_(C2JSKTo9n}^)f}F5?Rq;GaF+8F zH+40Dp!HvW!T$WrpASk^(or;H?M3{8!d4l&DmR%SCB)u`O$kc|83@uWdC0Km{rX44 zv+I#LXLt`M2PbzhbP(HuioGyW5MMMK`EZ;}QrW8^>2$CVMt9=76MO34nLmT&wY(ai zGp_SXJczX`+bTl6sFD{Mnok?>!4vw?Mp$iJW^uy?4Gd9TbHbLeDOI%3ACkro&3aTJ zaVz%L)~@dK$hyR6CM1lcg}1yY>CUTcl%`-t3iU`Ar!1|Vo_e2n1c5Jbz53cCGMk*q zw*7m(NY?iFYvhl4_y=C};ohnR%`!H<>vS9;eACCe9wb~Z6EVRBXlvI zNMWG8z?g6;`d}cItdUVOr1oA0Y8jr0PfH=t`%t^hQIM9e5&6|};)I?3vxALRH)v?F ze8nYaDPXczK1Di1fcXeD2b=d7TQ-Xj0q{dWa1Kjb zHyn8|f@UEo4r}_2jR28Aug6+0-^GhQ9MXjw-Yxtc%%|ydQN*G))}@}T81@}_6Brdk zXoI3FHg+z=hR3PJt?;^NLuP+Q=FF!l-g4{!8CgaSIGjQdxmF`DqozYL_e_nVTIL7w zE89NO;pvgw3ez?*H>+V*=+vr>!uWGHQjnO7u@5ejS<9+n=U6k-GzgUeoZ}cxNW8DB zCR>(HycQIO(%a%O+S`XU+uMJYQ)b8ST&}WgpYL0B-zk`;&it2mIFYEuWxv25`B(6G zL%}sXd3Ny9$_|7FYQka6aa2Hdv@&Qv`N+q~5n_M!id6>$Ch#lcdTS}Laj+dzsrd2) zMDgXzvL@c}Fmr+`jQW}BPr{I{R6MI8UjeU_$8ZF_Exh9UNKH!_nsRdxMm+(iOLSif zIiCIxp-xS0qf^WY;~RC2nHQX4hyr+lU1M2IslT^U&aP_ZC;5`Hw=ekf=7C(F9IZQ= zt~=4iNQ~Q$%~WREV)qosWG0D;13c9^iMJOzpn^ViCBVCOeA#EVL^dJGE|y{i(u$3~D%ED6L1YF8>NIQN9>d(Z}w_bzd) z$wRPA!4@V(syDN~DGFKZKl&zA=wh&$=Zi&ub+hE@Vs+LHc{CJH&JZ=}vYzLba8421 zTS6&^_jg4B(aOy&MKWw@05tKAGqE;n-O~Vdj%=H0DcTN2pqZTLh&-P`u^F>om!`tE zx@)F>pHT2*FuNuOdgQ*Xu@Q!ZKYIPjN)*|1-C32*bch!X3TA4fB&1b(g$L(0abhU9 z#(NArR@q=d#XD_hm)MPWxYm-AI&q12Kv^5?Khuq|@3SK}NbE0p1wAZJd zv{U$<$_?< zVQeUukhU`0ZhP6fC0)M#Ek6%Ho3E6aLb8xLyyY(Jt#__uus^E3Xp*dO9ShjPN*mgh z{nF%YQBPp7$I8!g++2`~=`kj`ssPT+#!szg|LA`|_(1924wXvE<&C{bY~*;ni0p30 zK;4{)(T%pB(W^F#o(5OLbN9pI4@-UEENyE~`#0g%oH-9+vW*)ta{H~{L~Uht4J$#o zhUWY<|7Miki96|SzVHOM=jLt}%B=Yemy=gig?$iAK%BR62=UFb(O<#vs5naXlx-KwMgHiw<-(4_e?Zx)vCeNtiG)G~u1rd+>VZYUm2U=RkvFF_6f1zl7COdwm z=5HpcD3G`-ctx46xL3q#)A>QNeTC^q;zy6yj`Z>0G*fK9UDz0i+A6WTjFgupVyaG1 zzo#@8p5df2{OiSRgpl{u*gl)4{t;Z_Z{#{;=Zj$~=n$@q5U4*WLNX`Qs8BaEref-j z#ZRfY??y^R_0$OqlWv5^-}4)}#~xbx zA_Qwx`vnR3CMP#(eyd_f_~UPOFzyqGGWiNWf)Vd|fv@d}!(Ql%Ud1&j82Sii)a;`f z1&5g$K3pIo7yg2@^Dmrgk;w~8sS7)wxACik$a&Pxe40B@@pI@pehuS+aVP&3V8{rQ z@rq2o#)j_~o1XR7Bq{Z|-Tz_7oPF zesb6>t1a~a1uC8Yxd!RWKAaEwrY(;!U1#*+_zn3|@ej)K3Xm(Ft>C3>$RZHx@9Vw9 zDf&K#L-HrFf8zPm@KdQ>8qoUYnCIz^4lkl0H*ZIQ&emmfa8iOYZa68>$bq!k0yPMy zAU&R8Z&&BTfOAY#I~DH{ck)`NDA*W@q*IFl<&m6CdRF>lfHr(yA-Bu;ADUs|bk`7r z^)GpPPZ1pEueJ8*R6Ow;Z9i##o*@ps`ZU49@NIAdA3h)Xl5vOipc)p6*P(I}R6H#m z;^Ce>KYbKLV#l1y9}kxPGIvrjpB_aSds_aEk7Mokd1eyT735|0RSCYS0^MX~{O^@l z9w~O^wUMw@x?kyk{)~}I1{)CLq+t{WP#5ibry68gvv^>@?N^|;mz-dRS?3go5|$h3 zk!?~hgcg7>u9TixbfkwiGvX=C=3d}8t?$sbptyUW}&15ZZVvc)gp+}uNiiLwVUY9EdJqx z4B()uU_@`XHvvjLAPD&CzQ{V9EXL9J67ok-#|U%*Rr@DCZBqX=47cxK`4CUecK^u* z^}Pg@JiS?h&Yk3IA;bzsO{>1kWpa0U4HsvQ1X$|(QeJ8r z8N#J1ZVDv5cFHVBq7h})W`kt^kubaV0U1F;L|^RmavpdkVGO`Vddpn5>-R3hVISt8 z2`0yN&+V(WK9z5_40X&L5;{AtD<@Cey7K<8D6;@LX=*@2gkVQ9#?Z(moL7W!rvX$^ zybi`^7N(x*_%bftKJ3b%J~6G(o!4I1l}g*`Zg+SZjC%Y$HWsD)B*#0SnuP}8hUfJ- z1SO1v7>Pe8kQ$=wfsm9lE%-8_*^9?9wAb&jct|oO>z9CgoUmih$p!k?i=~HJ5_{{N znH=?U{Ox-&6k3Yzt(<6lj;&&#^7a%f)GC{rKVT5olo9oV5mM3Oyv9|9n!Hd)#B6)BBf^5g%ep3dr)F>|VrQa$e07shK^=Y%+ z+5@LRq1S4Mvbw0G!s3G6_nYY5@X^N+YV)l^9cNh^sn71&fYK(>a$)m&%olt38khsZ zEsh<{FKp$hN@cj)7};%AVWj5Z;PQec-0!?GUbJ0ql5(>dO@g!gCvAsY_AM`EE?~JQ zL2=1Sv|FO^ftO+nFqsr@dp>!?;`F=JaA+uMSP(9NjhrsV)qLSL$ozF5+wqj4e;p0< ziqVs6Nr*wqH}kGI_r)+MJtl8jInJgDJjd{}Zd@HgB5*HHukINUsMNO)JUhuZ$^Ujt zEmEZ8m3j=&EHTZ~&m2d~v;%s9yrA|6D}8BJXtDWCCMyIP5XnN+j}W<@>A9@lxH=@wXHAcDgzgR$4YZ_Vf{B2s-p`TcXq>i!Oj-p z&f}4_qKi!eaq0AhMec52LGSba+UJbCx6V^%_PDuVaXH-9E|DzYphC4O){|0Tr{lrQ z7>s48oF)+6LstQe?LynxKtN$mTLZT1269W&{LnGJLR71ra(0Eccyy?okHMe=X~HXq zMLt4vpBZgqBdX-GDa+2@*TWZDF~>*$B1R$%W$Sgq+0WPsM0p$~4LPh%NMSHH=8BE>H!M2&vVYLb#& ztjZQSn(RX9z2=jX5GR;PzC+^#Q6;7>#N%OU7<`IoN5>IqL{L`>RCDcMM$wg~Xdsjd z(}|T)2~FtR1n@?Buiif#h?UGq@|fYu6^4edxN1 zFZl=U%ur{Ag4m$QH9LN@arUBctr>MP-8qBY_GyjMA-6)*F)*`@0qBL0-^>j12a_!Q ztb%gqTwRK2g@GQo+TA+Wi^#&QM5uU_=rS`OHn}%)kx^h}Se`0}+yH^EM|D76A6Ir~ zk<;*g@p^J%y?Ro4UrT0y4Ek5I`#-xMU2I2F%5+=rY{>aTJ5oy+JhDn^a zjPP0WRfmP0xj;0y0X?e-9`vNxp04iZNKs@Yp4ozlgIX#rd_Sp}#WjD=$n3ffPze)8 z|5Vr9n~D4$(!tS!G?p6DM2~v4|4Y28w*^)?k90Fh&U(|0Q<#J}k!7=!o+` zrH2RqC9^_HI(udf-*}tHl6}eeG+><*mWDq?{H6l*-IGT_Qg#Y!@}It?+q}e%Et{<+ z_1UvA#2SRI%#N)Z8lkm-$oxDeb8KAMj$U@mr$O*zROZv!0gXbX(-IxHQ5sTtHKg=@ zI9sH!)IoCU;M{e75?$#Wx`1x<^n zIuoofw--pav{xI`I;&bXz$t|&_&nd{)$591J_{tJ;#`qz^;LOM^BchB+&!+aQJJlh zt&bK7m?IyzOixM8gF~n=fN(jbu*D5h#U$4}g_kyH36XMhNWgN@&QVp`o0?qCV0Kz$ zj?XpLb)MV&EI{4HB@mJlgA7_g)S-JFVUHovQk4!YF1bMf%Im)38G6lGhBB z=@+*E4G!Z@uHO}^3)e;d-CyHoa+P&BW#tQHpGa#^fFekp6VOicY|-=8cmf;yLu|H! zp3o4BR?2_NL6=vn>cRw^e~6(Q+Sop;(^Yug6>N)!>T(85X{$$l^??};%6lLhZpv#v z;F!*XvL|_77WK^mz<9kPv$)-1k)^oBIt}#p+h{gpt?cZW(1`*4@RVCyBncX}00_c# zfuP{jrznV1HN>0`iUrT2RD9aCJ=v6B@0WnMp}5D)`f?zbajVC z{jfxQFC>GIc#b`*pqc^A=!%quO$Jx2^+M^JhqD9nK_Y}n3O0CnvYk=uc6UUpD3dxs z$`_!}-zcU6(kltXnkQBgxi+})tLb?%Lya~-Kl04ghS|r0zR;a9tW(q8?c`I-2OA1Z z|123qZ|q_YY~X-4d~n&e2a!r$jG?D*6tnZfZWm-2zvcx0niv;KIQun22&~a)r>ebQ zq;+kXOU<^XEjLa+URecUH40!&ax@V@XZ5Qir#N993JzwK`Z8(3usOj?mBPJS^*txO&o;8QmIs&+<}%$C8M`%p|DMN9=E z5GK7<-pz0>u5XZSlM%V0+$*#75G9&E&;kfN89_grVuWyB*r!#Ma4c#d30N2~;qmxM zw9=YC^tT=NYmPrnhnzg5#~Vo8L5_ATy|?`w;p;}4#bDqsRmErfyt)|UWC>g#WUFF&|&}I7luZ=&XF^TRh+_d+Asv^QHa@h)Am% zHW0{(D2qA5rRjxa>aJ5gBO@Oy*Vpr@ofBJ8?@Yb+%hBt?tW=V3wL7tq?{8~{$suV>Jp+r+>y2S!gppSY;$=JV71T?=md+AX|TOpFCL zGUEtW?bf1Pvj&J=4eZ3K@geXfi1qvyISzZhn&>D{wQU31!Ev!>j!^ZdNg41jZI5Y%Wi&P4 z$|$E8sWb8uI3z(=tGApQuoL9%lNEGv4O#}AnBS&23Ep)o`MUDWCz6uw4`Awqphq@X zXnLw%I;RoyTYNU-*nJ^U%3qH-h#DhfIJZNQ;#5_?lO0o569~N*vK-tr%kv`nG~y}- zMrF}r_=gvnr7h=!t+@NwICQ484`6vKd#VK*M_jW0p^$(>Nl3$C1ti9a2F`T#WXf)> zCxJrA+-LgGqy7-{!(HA@@;RDEy!CO7)~l%1}*WJ z^G>v_L~y3CwZh)T9U}gvXEQ%+pm8qCKVf&Iy4?v%2Q5RkrRGik-r&?X>hR^I*FXXJ zTo*Qtoz+H)KpeLy@g-#T2k-8#;azI&wJ<8s8=&Ugcy>vG@6(;g>t>{LR0tP_ zLy+unA4>2gwn@e+tVv`jY~-7R=p)BvEUzISZ9cxtJo+$}CFoI`Y;5l??4b#KC&#)|&E33rb>Pkgvs+h|K)X?d-5O2Y zJ0hKs+KUHQfx5qp0sVax-?#*3xkX$x0nyBeE6CcyvQdNQn*xxuZrozAmEmD;kdQ9$ z#=B#3C~9a`=}3J2WvV}%Ha93OLa`|ZClmP=sQB&+$Hb~VEX-hw$S&ys}T=PvJB`J z;EnNrGcHwMpn7n-1f@s+VO;cU^3nA?bdMlRQZz83%@MEOIcod?+;eOEV3=CIQkpp{`lg4gYHsaqwx*8wSq?J-);9i+0&l2MFEeO~(u z>|9?dk<2X9AX&Vqxtg;1@s#DcNi?WF2)g^JtNeqY#yzSGM0a?<0yj!&9`BvETCk7I zOU{X8KT6sdp9Ho?dJ%7Sy2z6R36tY$F!dlD`1u;mW>58duvPk-!gx@PMciL?_@A2B z12wAh3lV>5?o(EQ4)ims{n0B!rebw&VQaKC_AkmYZd~`dY**oTvTI?C96B;rMsStj zh|GHk2C^f8KLAh7eoTQ+0es}NvJR)}pLs!Vp&Xt60#?)DaDb(7D3MtvF>YY9|Mj5L zp{sM(AMmI11M}-)-u7!D|0gs2%dyWWE=);}0Sa2C z@g#w3pNU5qD_00!_RNMSLVDq7d>n_DM0bg2j-EhMsc+H^JF{cDLFMNSJQjUL))uIJ6#;Gy1|Ol zOER}-b>oykh^>cv$2^|AOD3j3L~581`-LEbLNF*}#H_7_mZULcvUqpLROaP|oUY0= zcd1r#3kE#3M{IT#z?ber|Cl9r)f_eLY4A=7Rj4G;z%Hb(>n>F`Xrh+CeU1M~f5IHB z>8VS%xe+DA-mV0F1qZrD0zn0j=;2~_!)wmu{^%SE8ro3DXQN6?krCw|s&k0m$Xv~8 zn55>)=2O1;ScIeC%aT9)HGG1nA20rw@dNqLoHzY7>AA2f^Q?|quFE-0w)a4@Dh=b_ z8{iM_9I;<2_|%3DiTF(lqswaq<${8o{>3r44}rV2GnM3#G&QRVG;=bV`Y~{o^hjb@reUG#lf%uL7Y5E;FZ+zgM=Y$!jV2Xzd{7yC3 zqDP5py<_4NuRKGetrjH+Pe8Nu5~;nfg+#xa>D1X^%3n3Yd0U8jyS6LneF zU$S3Mk?kQgzU%`Kg z!btd5HGzqVC@<-^E)t43I;AjW)%b+o1#$WI;a)crtM|&Gq4Rdmalh??5nZMpg z@lABMha3C(xKwTx=;UcSoKE4R^xUz9s0O7&c|u0U37x%P87Laj4zbep6|)ecx=Q`8 zSBa*-xOv+J5E%;nJX`iOTxBnwhj$(p6AS`%hu3nGNY_n8kl|+9Xb?+o3`KwQ66Y+J z(9g^%@HT4Bc5(#9_erg`S6|IE@cZjW(@c<=NFx@X8g(wd?at(l0o_j?j56BrU3a@9 zb0G@=Mb{>0f4X+-ka%K(NF?0)66Ofdb>ql_!HX9(en*I!dEWYi$G-wHWRhTO{pBlUDIqB+UhBr`0o+)+PJrdaob%j; zu^~fem`K1EfW0=@|JAg#)@-3nZ5ZbM_Utb>zc-bh>CswQL_|*>tFcbiri$eKCA&^i zkN@v&q#tYo|4OcIsjou1BrVo`LXR@0egL+w6NHYd)$c;5;b;^p*bePdCBZWEwc%OZ z$zyMhOt_kA_cW|TODS3M>40$YLE()@yZ^AUv|e{#aeETV%5^DdRG03P63tQM2JPI? ztNYo>f4*cs?X>GD5?LgWiVZ=|vbp1skW{tfj0p61*Hbn-*e&b1yxEsdq3Z5K zn#sOjr0JgqxiwruriG1CysWEXACt!038fX=BZ(+hzYg#=*usNO7Yim@m+?X`l83g} zoFSJDrB;_fnFLr=`2pV9ANZJJ=^L^J=}B!EC22^`pdPxZ1JGfYy;$g z^~pM(U19jGWm>eCyrKSXYV<&~)nE~d5VIP?#L+t|we`lv}k1KAZ+60r7!=QQEP z`)aZ{Ms-%40Ob?Wt3&}Ypiyeg;%NN297M<4cVr5I;w|f|+RFEsxv}HCAR-&s=#0(Dujh_LKGBLuFpMB-1JmnSAB%f&nnw@v~9`W=~8&k44=oI+l%3V-g<{1zy!!p3X zx^150l!|UKD{!@7z;j`}l!EgrW`)|Q(R^I4anb}MO3em#6Uzv_gsEtsG@_1wK0uD_ z2+Elm56PTX+bu)~*&loaoSD6Rw2TSHbAw|J3V%=&;s?rmrAF2~H{7eXQ@9X8$cPZk zFrJ87(JHTL=T&X;+L`t3v%NVsggw^?pSqa3&4b|3%!J~G5}iox#AFzyYzeG4whmJ*YtTx}ZiwNH^%QC&34ts#02(M@jsEDwbGE~5`W40NEBl3U; zp=j9C@BaO`G6HF{4YV7Qc^hC|l|*w4*M>Dxs$nk>2Sn@5$qif}?7-sB+kTRZ^O;ss z#H(5A9&KR}YZWA!99;j2X(5%}ba6TmV_b@MNYNMS#&>O3B|)pK_7|06o#S<1a~#e_ zE4VRNn$DXMA}TxyK+3`>Q_HApv);MX&uLZ{5}cUHm@ysw`if1zMS8C;+@OO}s-b(h6m zr5v-wo5I!MprX`&k=~}3?7pHknx@bMX~dHnK%MJtWBEq&n4&T%w%@_lI2iQ}vLdOy z6zW(DopQfkQwk<8*6+r9SXJh|vLZd)x{z1e^lOHciVedU>X=qe6Y_b570W)0vl9BY zh4;(B4#OS^e~b%buz|=hVO3L6tRh&-E}U$JUZqf~TGA0E)5`)w(z8f>pSSk+Auu8( zA!la!l=dglBOw(~yTlJETS9lRr@}(~8m=BZS>qyK{QxXXah2s6zkNx#UhTABJj+I) zfFGr_4=CUO;b5HwQaHY(ox26s1a<)+$(2_4=c zagWY;gJe@5N{%k^NDR`cU7uF2A--P8n5MLA+C8BUhyx%2;L`+{LQ~y+B==8RyqXkI z->%lT!?S8l7QkuwRB-^zGb?kIpApv4$P2^5o(FS2=tHjgxnaj>8gfTKTWq@175xy$ zi-uq4oqzB~2;MMKu=~99qiv8tOVdRVH#2}Q)7wdjktHyVLoAg91o~3hxhc-(v?g&9Di`L1gE>&3AD0%m6XpTW!wEdLM8%)rRb@n6Br z49pB{4F3UUj&3ng&e~k?g9L%Ukv*i1{zqm;F0#n8cZI|a=oGr+_uE7Ghh`?>ugmKv zfjQM4Z~xc&Xmq1)%ei-VTK3M#msvD~X|ZPnnqcE>sryx30Rc#u$jCtQ;B)z9XD23S zX9K5)h(aHjg8vi>l*|Kmwh3b6fczK`oddBtdL~Pxw|8eya&ZFu*}DEe#?B!)6W~w7 zaWb)O+qRR5HL-2mwrz8QFSc#lw(acvt9B1twTHcQRd-kQr4QX*{d=AlNKg(aUIJ*8 zrgs{CSKsX9C$69<3P^B#67-)v*%X|TliOb>!GaVor&EVeb=ek>@%?}zh+qf=^!DbF z@#6{^z7eEDNXP=|U!Rf1w))LRGCB#Le+Cukzt#Ce0oE1Yl$DhPgp*ZPMp2p3MN?T6 zl>!CI(u=Zh3O5VX5var4i|*gE4pE-I7WA`$OT!E&IDx(Y&X7`CRFYMe0fTu&clCB$V)? zV1cv?4?^ojHiU#IAE&Hq_h@4Roy4X6W@c@0a`ArRcwh`#&B*A%{?zHj5){|Q(|=w+ z=;3h&ZxhVk)Yi};a`kf=dsa(dfuy_ACpt5?LvXcs68o;?rwWI`e0)FbTKo1IY=)1` zh41!TMc&spcvGW6zm~IJhetGXtL)gh1@a20TKkqN zJh}q=*824+{kb0214t@D>Ai14s}&eT{(KL)ys$h5hG=bT4f^u=sd&{Bh5!LZM~uhm z#kB@^5d22@`UBhiiP0k$05b@qKl;rbEC}?Wm-q9{?3=>^BLT^CBXI0Tz?v1B+FslV zyx^Dh4bT+spM%+*=!XHTwYP5o^}qc51k&Yq_5b-1S7HhJ>`3%`9p_Q!26_GYb9<5W zEt|HK*)7M2DfnZy8?)NBCIs;F|LGa|woCf~Sp3k8|HK9S^stS! zZmfOT2>lQw{iKCt@D2X6RkH(FF0Y^45yoQyT6?#CvMzl;nnu4Qc%ptPliXOmwxAs# zX*z!RrNS#=2VtxWARIt7eyq&D$yUCtjxGt|_1PrUM)g);{lQ14zx|v6UJ&&@T~gY5 z6c2W2uP!m)93_pQqjUQJpM%|F;PkfEbPtjq{6`uGQ11Xhlm+nfyH_f(brpQ9Er8yC z<@gggHI{zVFNYd|!(aB3VXh|}vX}fW%pKS|(JvgKm;5R071(@SFTF3eo_N;ezZ+#c|R!^VBy+6U`=&Ehp5p03zO?*h) z^{!}Y{{#T=ZT&obWRFd+K)xkj086bN+}{IxPv)Edrn=n!Eqw9t8H5Yi*8S;Sx!v}Q z^l^Ct?)ap6{;5J6-5NT2VtaV`2jV&X?Dgze=+|Ok26uMuLLtL8RlwPFRH9Qn8?R*{ z2J%SvEF9=(PH8FCVQAIR1oiZr*+i5PPnzic5Y`~gobDz z_eO5=`tBV;c+!u(qy{?zcVSWMar_CC$zLoXkcwf2E`s^J*#B2A31Ta*rrC{ZED8Oj z0Tv*vo+Txr_H<%R#*6HmlefdR*`0x4apjXc~LFaVLBOWNG!j|@)XK& z__bSrJ{mT=AT?*LUoALGfDp^yucv;~Tbh*1IwskMg}vV-!3R+}O(FeEyQE-sEUu8u zG;lyYBW=DTMmL8gm1;pF*PO2Klti23I<*ZlEbL9Vu1;R+(SD0!-}lJFAuhWlS$~)H z2UA0f2mWHQMy~rxDnNh#<^H0MI>0dQa{e}e1|I?&=8+ zbF29jU6BV=NCw$|4H^!j^UNg1shR#KQfUZ#8RBgO?{({btq*i}YOn ziO!m|VSsEvwjH+1;i!)YmmcNxEfSBQbg97v-X58KRB>iEb*5DT(bcYtq~G1*-PVLn zIF>~xGT*xmq=we(%m{CM)aYY+zz_M!9+Onh4BpQ-*+kKUvFX0S9-+7UXLUCp7KxNC zCDccPXyc3Sp-WbA@@l1mqp;mtv44Ih<*enHXm09YdS zhk`e`k5@HNW-$o%)c58cat)jloU9(@tBdMr7i zh-ra@-v-mGB7Z_aD96p?0ezdUJ`1st*nl&|fjF>fZxPm5e8~Q!=WRbu(V6$kO~3LV ztgs?jCINTC_5;v1nWFT6zbwov|gNLD_H1K`BzWL1} zn>u8w@Wzo{jaVeCa_2D60FKvj(*Zv^zUn1Pmj>b4fXd9wsDU%d>_D*Ax~W|nb-eWu ztN5@5L;Qo$qsi+ zB{6l8(({V!XtVVRp6wyWr^Nq@ajULUQ#q}tacd< zKVE}D12}#m69HQmD78;9IF5mo7=j$a1T$GCB)`jvd%XXx_-5TBlC1CBm?=T%y_F)y zKwZGx;!Pi6-rOWp};&s7NX(R8@RqNbW6jC&5NuT|?euzoYO zqDRC@19oTnV+w3t9Pf+D9ZJ9cUYEdD86r*LrNK1M`R`8u29qy>_$Gs4^#)0$RsBj& z6Y8VVFOyoZ1~)a9AL;822Q2HXc*dHA$GAQRf~~|e4r8jsFm&)jP?8Eq#_^8=Fs?2H zYLV&P$e`=2p-eyf(BR{WBjFqQif-e?Cts{0w6oB~@-8YUx%k(}E&4|?xJ8ITczs_l zJIl*6rDvTmS0SECdLqjv8E`S+bmau43q-eqtC$lur%(S8-Cew|n(o3E|LVZEElcVB zidqd~)fT`$=pZeNMQ}9`(r~{UGgg%T)+WZL`f2iN;;iTJp(nw3;i84}{ zXm$|SS~D3Qy6x>YL(Oaf)QXme(g}sJ@6Gs}SCHjv|51Jg zbu9-&pg%9K#+iwL4(1&8h2Zz?UPN){AdfdI>SwWtO5_c%Sc>O##J!CDTNFQ?#G2Jy ztda^YX!JnA24)M!vMKYa16bTvnIv-lA)Aa?F3egColt9K8B_(2^`5?CpE{WN`=koVH z7bF-)vH6iE(g%%43fTrRVRbD0v)QS*=d9LoSTfy*?tfiQatylbR>t^!fcdevm#!tL zNnwEWXZ^Za701U(`C%+@yRZLWXiH(2h(uieR*uAa zZ6#PqMQPe_T)(m0_0##y!z`&6Wo;WY4tVy+oq6&!my$e0q!PN&2jL58JccE_LzgYzSF0qV!6SGw@9_0Jy zP^0;(fMiG_VMp(9>0G)*>=4cZN|1w315Vm+|2ry5vyb!}?xp>53!wv%2@0YHV*zPK6n`M1@8I=aR)VBG4i`nW*pU zV2Z$v`^*bNN<7bW(9yUw=ke?zMqBCWr9;xv8g2B^MZ?8C$LhfR^8KERKrd!Y(pJ6B z%H`O^NbP0fOW{HW5chFsKRvmUR_k1)QByE7gS!}Jof#dgog+H|+uix()(=VzXJ@0t zfCLm5Lt7uQVVL<6@r)nR|LM#1Iy-NbB_A%pE|hM}ow{jZT%CnWZiodA*QfIspPaD4 zblkBzvzM`xVqibl-_zV{&BHPrH|vq_?BDe%j5_vw(D9mGdh(eLeL$?&yc zl6~@arP;_0^Rh)d^G}19wu}Q$i?}eUT2Y3fe6bnr@qvwU2F$oj*ME@{P{esai}!W`yCZ3uuxB9;u%I3>q zb7;XGR+~pf35oB-iv9SR1)cGtcSr zNwMvYJ-lrp=B{8y7M2&+x0;y)YC$Zp7GbC03X2b7`$0P(7}m1igU`+~ z)}zNHdd>iahgxQwain$?s0;_)`qLw%ukc^Y0e|}Wxi?s8FXuzinF21_Vz(iUfN`!_ zl;<&nUA;`l;PzC)wc#>8Ki0+@%2hW}qs+8CgWN}gy}C0Ywck~N@vd4@^b1FDB-0ms zpH7nG(ojug^Dp^vBy|5d8wKuL+ts=zkS!J}kYsZ~Bs?nIKCnN;Js=rGD*=x@*od^Z zTxrISHi{%kU$ehUr&cz*hsMP*uBtFJX^`^`UefWI*h($-eG*^JDYmW{kM+h`^B)na z+wQxD>T6V`^YFhz1{3w=%I0Mq4?Z}zUBW+jo9)4N8d=F4@;R)GP^MSS@w6Fu^tm)m zV9tSZ&W;Ul>L)09YIKT{fPg|S_SGhW&rZF7<%1}>bu9VrTGTy26dPv)f-B{%^@Q>K zsXiZ=@`ci1Q@Y4t33ni@Y?z0j)_3n;bdi5AgwQM|bq3n{TyfYtcs^h_JiLqK&P?G+ z5C{Gm)%AGCC`9!_3>rN2Tv4dDLwr}1-P_kv_Tj8B8g~*xJtojGpXq0C)SemTT{h3| z#XmNezGZHVS#8K;*5dpO<7qQmu%vB{Vn7Mbr+0Y8%oA2EK zn(RT+3?R9-;>*cS@@u?s);Hm6%JY21RW@07CunWS$Qt-Gx3OHi-kH4S-#BN%QuJg> zQ%4m1G+}}YMg3seWQ9DkyVbQv*?l=7Ru4AG5pn_UC^ylGI z1^&>Al-rW8rsw7njZRF8uwbG<3RrE(#ovJBI{Zl8T4nGBy;!f}&L@C1f>ZL2-fGJv zfSIwq4(k%hlGWEpln!L$R@7CGby=Y20}T*6(PW#k7xPzb@53N;)9QT%iY8%({k`+q z<53f{a?#;-(>}o5uK~*W?3T&)9JS&E`|k6x4Nkkb?d6<}AnY6s9a?!U_Gg#%J*G@h zS$Ae74JDzeyFmOORB33;i%DN{T;Lg>cBdPFy+9NGLC%P-aeMV?h4KugVChWHE9w^DZ$ z3l5(s?~&mzPV%2WJj&TV@lLQOizvLF#{W_xx1-Q6I*qjQ1Teonfe3So+`Lf(+YdR{}eeTp-H=lbe)9M{tlOHBLSx!z2VA}qra3e5Q?x`U&i!((PYMe@RNrcSfMj7qf= zL9QjT=+x_B^{V)DerboIRrN->K?JD=j6_KN=3obd+=Zq9=J9^UXZU)*DIUP7=l+x3 zq@eN&Os+h<)VZK{Ia6jFJq9C7TBRQ_H+V}>HTdZAMXqJTSAgVDDeFMSI{!dm})6Kc0% z`@tEhjlo)prT`Mb1z2?Vx76k+wh04@u*bimS$ew>9k-U{xlF9G5=PRF^Jp*P!&dL_ zLw0uKwcl4VaJ2 zQUmshGUXq?2aRqpxPpSLL*{}*%-@`(PqvAi?L^26B!9kriKgBL9+rdb=w3lT`@N97 zELL)ba))Bi4D1>X3Fjls-!i$#M(}Q+2hq5YCLr7t<5qM*D9{tOk6#Wr{)Ii&g}r+p z7~ybw1NNm{j#Rf~CT#j#*z5!co``}c(G1FR)!K!Ja5rq|UwInzjk zGYA>vN4~NK-F%u-r4hZsZ4yqGOx7rEtxxQ}t2;_yG*PyAS$qBg>%9w+t0BE`h3c5$ zto`QhI)=}1J%NKqs*n$L)e4pzEs5BTD?S=gK2FK)n`wA>)_yfdvM`R=XZU4auGsU!&9cZ`vS^UzIvMo!n+7pN2%f!B6h0O8RiHlQgnzXM8u3w0xMgSG3Sm*@7Ce zt`l$P4_4OF6Zxk}uS&>`Z>FBX0qVYhc7Js@(vD@uop;s?g^ijVPNFw10R3>Lu)XKs zG9qZFN6-FxvuC0(F9SC#sdM4JP|RfM>)nlp-0gx=4g>46bhByv%-WY_=C;KZWDIFv zQGr}_1(NlhzlkSN_7!O%4x0x%tJV_}md-B3H`(heNu4ojSIY`cx!Z9?SlmYCp=J?J=Mx!3Bjjn5H(NV+Fnn|hPu54;D}emrRc1K$$lCE^1gkMztkEqTb?8(i zPJ(2Z><|gMK}0amT?JY4*2s_&5f0sSd+dZ!yeb|f_e@yU% zaR4X;e_HDKnPZ2bqoVOinB`#22DUE9=F(d0{92FKy!Q7yddhYv@r;w>RtzoA7aBeW zc>+WkuQk^ zP7&>V(?@!zl*TDNQ6>rnFt0axK$d`WzBKsaHSbRv+3?It-+ezT#4m z;L;VA(krYFJ!OO#TI2CO2;rTH7VfqWsZx0MTi=7W+mP4UD3FGnJco5t4Iy|^q?cV} z6Zh=%H+V1}%Fj8zj@nVl32h3{CCNaYxuv&_jn`paS3kAIP)9Ld^ym!?LecZa29Bil zgn0hYufh570G5_*(=?wTN@Vw1n+M&rY1=k1xi&z3S^xQL`YGC;wNOkU94P=f^%KZ{ zL3&TcZfq(SEXq+Fl&5{nL?nyACX(m_Do3dTL_^z4b8xT) z!~5^P4Y& z&MnaM3Af%D7m_uG3UBzAs-p&kC#)RQc=n~wR2QGPtSFC^!@Lp0zmT?qV`05AUuk|Z z(d#cKU0*Wx$|l8T-12cQmXM?NI#}ENAa3w#X$ZJ%^1OnD7r<#rnZtu7qdBHxwv1%G zrSGp{)f!%7%3q;2?K78nLwH{jLZHZpy6Tx{FCt;~e+Skl;089_1*A8S&9gSwat@jS z#j18{0B6M|w{qQ;|mU${q9I|f-Y@3rf3&v9mk7k=$0y`-;G}; zc%4xd#Sds)`>0^EsZSbZfubhAYdR!hJq%J5UFt%TrkNnZ$mNa8CcYX zzTOG$^%rbAh$2jHi)W-$hFgEj4Qre(MKYCaPYcKK-ifm!Q{a3;Li}KkN%6|vkzb8M zQ;ndGt9ZiF^jr{isLf2;XD_@3ZGB~ z(tDVJR!!)?+#jZJtHdzDYH#Bu64=MLbiNA)A?{z-kHOLrO7B1`m3!jS#!^=Y!aIr8 z_I!e3ULMVZk!{vP;ItB^!rDNNE~|D+^OZmPW)SQc;5z3luQp${iNVx75D9+smy~a% zp}1i1raf{hBbB%GY{~zYXK^6<6fG{sesP#btHrrvq)BrK&a_7xAf#fZ$sg=z-;Q59 zVTrCk^(krD>EoamI^WxCp^GOc{hj%CWl3$P=DdiN5-Y-^ePj3{S`OATtnHU$OV^9U zZ=RSQMu0ZSoVzA@3%Y$wUDu&nm7Cc^-aZ}uIw11(?~>+~u-oAVclywB-p-(1kcL0Y zmsZLMJ|Xmk*|4a0^)4T1r(J2fp=v|Hs&=z~%&d_15A`*d0FeW!%Gz1CG2F5>$RSe7 zwWt%;%8#I?cTY6^3Fd$reeU9<@NQ_Cy484KO^rSoi$(yY)-4d*s3=V zdjf?!e$oBrSaX2BHsF}&P2Rk5v9v@o#a2=mhxcWx|D+t`B+`#X5BrgPWTE_l&Evf8 z!pD&M&E1o(I00|9pmtwFn3_U9{%JT~EQ{Zgtn#aCv2@GYbib&cL>YFo3zVMuK(6m` zud=mYQ6q)o@=8RxfC;nU^C)o?1eeD?9^pn;S*q}4@T@g~s5Es<(;e!K4{TY@8Aqc0 zgHZ^kUaJr`AeHIER}IR_vA`+|gZmU@i1p$L7$V0d$yTk2?A6egVb9~ocLImXG$s`^ z3y2%1E+I8#b!c43d1fsB1yxQeNXj;M-SCji@$X*xj#ZOvZP()MI}DA?R>s23*nrs_ z4Dysv-vS@oJ%1^@dsOG+5@B66#1VL>d?QpJ3qgYKKh}&~#4RwH1j>@jTCOXh=UQrx zCJMrpan0B-ih+DS>i$5)NmBO_LFb*SzCt<{mp^X|KcxI%B(W5Ru<$puBBE%5%7T`-6%5j1FGEiq=aK-}#+;K?PJnTwm?k7#a6qc)T+&KHvfOwSm==qNf zS6F+`Yd1^}vQ9(|)Edt#cLfZF0=T>*qGDA)=n4hoO@#tFUea49zaK^d5GZ zgVW6L(Wp3=A{myU z8opSGj^0Xlf1$m9+X&UL{;N)hMG6mz4#xR*+Shfc>oq%y!>{?hLZ)`{#4)M2j?Ldj zW>oDOY*7i2$Doq1H9Y-#lma1)VnW3Oc`%x@MCQrOOY7+i>sKePRjD;hp-wV{^P8+f z{#(qw?KZCHX^V-H8pZY(MYQ=0OlePE6X!;!Fas{-{=)op&%wq1x{@ghGw)(mdBsgS4(QMU^x==+69p=wq!-|>!`Uh&|t65?3$I)02)&A!4(DQ zc`6IR<&XLt>~Zqz5Mf|Xkf-Alj3lOo9x&y@-9w zSiaYcv9~_g#9;hAT=@Rif3Zq;IyFXA3`MV^IOxNj1aC`DoIQYjqdLgiH1hao`@D?0 zp5w(=rc&)1el_N0tBC?ZEDPZ}kf@*F12bxuT!11`KZx$thg+i`382e|WJ3xSACK`||R ziWBfvTrx0SBp4Y|jPZ#)vX!)eoNM1E>f;W~-mM;t8+3gcy~uAY(58JP8xl9bKcO1y z8H8UHiDstMwoK_p&ipW+MSq1Zc`fRZH}_f2v!W~f3y@D^Hb;i%X@?!EgfNDqUDr{wld1`y zwLU>XnMyPh8@#7i?bYeSpxwf)b(Z2#9pz_?cVm$8lu`(tBW{;2rI!44V=P3nWCMiV zWVdO@@Zk)15*wQdQQF7am>5% z>3V=eTB{8(U@ZOu*V z4}LPdNQqgbMeBsQp7d@d6zhz#wrsI@qztTEr~N^>XiPbm)%hq%32_@Q&N)-}D4kT# zkPLM8Ln1M7*-C{MHpcn6ooOsR-QucKXFhtQkuALohh9l)R|hYsS)so0CW41`GY(pb z-&uP-57oh1V(+%OY~FtYS^L`uD+E_^!#l)1%`s%xVe&{8Edsn(+nw*anp$fiGHxAU z>F=3>MD3V)ug**6vXirAiC(eMDBw?8j*&cwVNox?@jd6qvss41zdgrLk8SW_$6}|A zIDZ??M@N@#XdEMCz?JXn4Z})HvN`O)b#$l=93WP*K&xsMwLg?#>ZKykN?H(A6{7DE)d3~6e%1Cq9E68T@0B6#eei8UdN63SVM-FjV zVM27WcYb|}_lzBgyZmSl6^y!7jy`nPF&MQAgk9Mrtm9BHRs%94H`TB~m`d9FJ^Cc9 zj3u8=`3XAeY~z#?j~M}iV9DtV%N2ZD{Bd%3J&r*t%oK9^pg*5`(P43AAppi9=)ow4 zV+|@AJe8jyevMos9_KPk@zI~r;V0o%UQ&IaAdcO6yfTjZd&J1l^cul1_6|8c8g1L_ zuUQN%v5fByT!7GJjrlVQy1Q-0>#A$ii;1X=!;|cDOF(Wk>XAf5gc!{e3Caae;s@wl z(Re8Z!hq&xw6E%AgDwk%km;+~7LbB7M})(X<%KGW5)*x_<=}3aCO$eFsdvV4QryIh^Y@@B39dT4-D3(MVV*!-%b+9POOx(vlOT5M~nqV>4;nN=pRb9Pr9 z5(1!G4lYIB()iC8OWc{>Y>U`wjPtqAq?Ie#vhNH%+|2K~dQ(9Q{PUS1YbIMEWO8al zn)!mEZb~;Ek6uUfLOHiiCm7u4yIohECqME`b+wjFe{rJb!-$0e!Nr}yr4I{w_ozk- zsU7r&2_WjZk2Pl8>zO?m?93hS8E;FM!|t;9$9j}U9hMMB7Z1a>u56oJv%GzpZgpY|6|O`Q`3c7G+iqygUOM*sn7>Kc z(>uVjPPDO}sX7IuG>6Sjr_^`L9gCYl-Zu4~IpZZ|v>*(xb8MifbBcjM6(3pHA-c_nE#4XOG2Z_Eao{yEYdNkQS0j#F4nsX;tm zzRnGNc=3_cN+#6P8%YK#iodgE#!Xke=}kq@1Wkj*TnZyz1KjyzL8^Az-GFpmYg$@r zD!n+30ST#Hc<68aD0!*^v9)R72iT;82Nw=Z2rsmtIdi#_<+JB43LeN>h9rJwU2b5j z>@b(HNfPY?Hu&QBhEPhSi6>=|s{i(V-G;|j5WZ>TWP^dCSajhX7d)#@B>&07<{YCy zfNt$z2H>77%U;UOr$j&pDbe9HD8aAAtACYukW-rpU12=smW7BLwEnILKxvsux}seo z>UKtW)^h0guquF1?88j(bm8Xtkl|7@7rs>7bP9)&Qo*M13s8H`NkO?;l_r7;V{BUn%Q&*+d^5{J^q7Qa`=Ok7t-K>bH2l5^W~Myn zH?4gw2mL5m;pzEmohBZ_jFTtO=ap&jlf=$vqW;RFG>Sv)OBhjOq@iI+e#W8@^p?=8 zKSv&3mp~q>rFXY=CfHn5^c5y(lN~)KH^>Nb0?^wzicUKWk<3>8LXq{SoQXd@=Yp#h236{*s>T%3TISX&nR3c+cD&u;Jo@5Zv*&uiOi-w)F z01Im`_yi+R@8VvIjVHr)<2- zA+$yLh%~N;?+&JJWwzRU*GT(e_Uu|Th%DIT@zr6jF0@4ou;_ymgV~h@f{x@${<{k)3z_(u z=p%H#Ai(IUJz01KwrF?bRduF9@a5*w-rLfM4^C%8NGdgbJp(N@wX%7USA+4Zk}VEF zB3S;#c*0RIn#tqc@CCe=z?N-q?gn-Hk{oP0@9h>h2Lc359#XtIf#*)!)Yx9gEEf1! z{{u)`w>09QK>t1F)DlJyt`?@5_9__Ji~^c1ExRx;?}yd2;l(oQJ1c! zT%8U!yeu*(4M&pIi16*o=Um}K*8JB*qP~uKBCV7Ct|4E&;TnUA`-rF0KYo`!O6g#; zB~PDn>X}~su+Gv(jurV!4%bWdMpfJk^mUeR+ARnKXGRu59q2i%;GV#7SmMUmGfp*W zB(RXG&wiiL#Kh~-f$IrfW?VCR;Z1ia{&19NER~$A(`&r79Bv)8!tR8JU>i3?6fmh` zx|HtMOnKnurxHH9(!l#gXZe-ABiiaecUp(SeCuOoz7N?DackBcc068PS09FFqn+@l z`8amGsPNLqJv9L=&fK&KW!Mz1gEO^Klvto8&Ymp+4`Z!L z++)ghX2X2%F464rAE>H7T{3UG8sAhr$YluaDN+98(0)tSRS*sjzix46&Y@H(C=Lq; z?oX85>PY`Q)OQ4!4R&>hQJJz2{|WW*r3<>ZIL?icLOa=TLNlPP>qtnKNJX&wSkWo#!9wGM% zVWbZ(hPcm>^R|RAHOxnZ!RS!Af{{O*^2Z7lFnZ%4?_`JXVP%#S(JQSDH6*3qC@@qy zyS8PIg7vMhNlQ&zJZZ83=875f=RcbUuW5XT?TX7pexe`z#d>)1aEZyEI6B7p>)mX@ zKvnheDPSgVpo+}p1G9Z2-qeqP@ALQGwa}~v3*18eG#y?lCo-jJ5J##cTar=wc-|aFyX~MzkbYAw|ifF1>TNo<*qHy+#7$NRLy3xMBNOOj#+j8nimw+nYAg8?YH?gG zn}n*fm+jGe^2~!TXWb@;1xFh286l1C6lL&4rDN6NjEaUQFNoyZX`7DsMa@t}&|H1L zokh3m9(5A@OQm(!WT?D0*YXB;(p)|r-2UTEe<_40AQ>4Wb=)4JQr?zlcuXpDmGv@g zj4>{15YP5?pXhPvN*Bs77lCW`t4=E$Vb0`ejUv>7(p3DMRtl_Af$0x1Ecg4JY;N!$ z1t@E1p549vA>tfC%BfHuU>P)_re6Dsw9jvn-=COK%y^>8aZK={?n5|HB$QGn$UM`uUo$Bs=P{=Sp{!!|IC3-WyDyW z2z{YtdR$V^D&muv74Hu(sm@SK`8-*37Q0N*I-=!2b%hWMzfwjNJVXzo^1rp)1$3_Cq1OFG;8qqxlWc4mwC%P`QV@Z5?X_N8Hj3zylTk+KYt zPXazpZ%ksQ#HlQ=4N9^tVLlPWm1!{B_wohLDfQ3!gzJ8jz?M$iT2=Z3{9lKeayT4{Z4IyU_ zfy?_0^uh2OKsJ{);P!XJMXw%SNc`aj;de1mQ1;%h;NzWuJA?!UF$Gb=oxwWtUBQ40 zfP6TiK*T+NXuz_HNs!N|rzbAX&c;BUg>HMdaEsU4fN~LwNdyt1fjT_=uYh`_Ak2Yv zdi|sh`ivkjIfW7ZupalGCFS#RF#SRD5fL#%1>0H&E_-c(7O#PP{=oS+(_lVhXdEzr zVC>H90lj*>{-9jPz5L_(R_)9Pp}^c6!23Ii7$N=nz@Q<_X)JCDyW+Kh2q&*Gkf6kR z6~6@$2*IEm#gKf<;K3-z&OrRjp??;`{++7Y2~hZ8VDFXU+j<5HBUMlh%Kja#{sxj@ z+knqp!OdR6#Wt^pZ;Kih*y~>p|IlfKfVH(B>VfI4lodn>k8^lcpZl<&z}xRW++In4 z#Ju#{T0{Y$PgJ015U%_0_1@kMw9k!K9Py>yn+s?+@YSMmpbwGDzH$U!J+N6&Si$zT z|6qI@w>N0`0s_78Ai^Nleej5w+X8cnjH}-Ow!c5Nhz$N*1X8}AK;3$PA6|_@R8z<> zp{}2TA6q6sMt5_2Ce}$_;*U{sT9_BGcN_R1(57L(H;}KduYrGfIAZV5j)Sv*ynx4N z8i0BdA0F|8MrV=hE2n;h0Iv263(>W=$H<~jaU2|U^&6=jJP(lo>S_4rhxTQM{>P8{ z2kq#G`tfH@>h`A&REJREMgTV1aVw#mYBspY6!^JE#pqVAsPb2HP;190 z;1Aj_QQ08eN#GK5+wT!x@3^0SA}F$Oj8!?vKrpWFlFT0a0lf!^kltQyd$7Y5xS;#} zgAW26%TdAUaxJic#A7=YOg539Z8ao_z>P0#c3>g{pxG(7)0nVxHcK+F+an3t61>%m zmUQ4wUPeyjBM`x*Q-s>Ej=e8SS^;W#UBbz}WjH8Dh$34NuS14@f~;A;jc?1-9r1s@ zi2!a|sD7*^!I2+FWQf~!kgabRL_y$k#ND4?^skWLZrUmZos`FbUq4|qf&IDdBE0?z zjIbqu9tU7lj7V<0WVn*N9!1nskbpLlZ-*0!B`A?Cwq8F%AOMY}Q7hj0w=i0O(!AfZ zM9B?&(5KRSUiuHWU3^Ct&iK)betzcN%lnHgB!pLhkULC+eY|M-!p3a#ge4cX{57Cx zb%F*@@vhV-L0B@iO|3f?n=@maAa{IY^$$O`+(HHeTweB5(f(==?nAwM8eU`a-^3_U zPv84#U>PgOGG|PT-%*+*T#~aTMDpvKq~kS`J zU>(E*MLi%$oglEY%+EC4WQPV0LCV5^{myxjw%GQrLd5qVL)#=xA;unkxm+0B%b{rR za2RB>dU5XPG13^?Xve#U-qox)aZTr1N42W^OGGdtg6+BwXg-t`0KD*7<%loH=k8>UJFhIOaXnm(km_;vqI;PGAXPTxMO zsbMOoAAlxj@A2<092G0hpv?5vYR*u^WeffFNFjZ%$(<~BmbytS7zCy>lkfvqtrUBu zsCd*WU`t=Od&cs7DbU^5}G=6jsDGzte8G@S^7 zaP)4IMINuFqbrI@yH(N|X<~y_aj1Z_Q^+#_EzM1xG1<>fa?G2vq9yF8pe&wQFFd3A zV-P7W&|Ydelg7;7n=`9?>y7^nM$7B8H2b_H7R^(`CiFy@+#(_8JU=py1?N*u%F_?ONu&TZvDXS3Bq_hH6kogB{eigzssHYNVH z_#;u8yQp>B^yk)w3&6m^))NpM>&Z z*NudtN-B>lkSA4h@?mORHC_g5H}n2;dagGr1hv{go$bz0t*V94nc+!d^{Ws~_HTe< zB(Div!D?#}zQ@z5hSvGswrtyF6%k?GAxpBAB4o|0_t{=3%eylKWC7H*GVDX#e=&DX zL81iPnr?fyvD?^f+t_W}wr$(CZQHhO+qN}*;tuY)_e{)roR`X|%#4b9$S*5%)t~Es zSZPP&!5BVjF8VQn?^Uvwh@_;`mX4wl704yCJ&z1AN}8E*?zk;4SGq`j0Mm8{_5~q1 zp+I?uMrx!u;Jtic}>Q4NbQEsc+v_c@y)Xf?dOzY6#JoP;!vV$Wzh$x z#2gQL)@CpfyS$bC=`47j1?a{Km5I7XS)~|V9oQ#e8dSGA>&1d7sP5m?3-habYbF+` z-Im!#xE9fh1{vGr4f>TQuWO=%n;SmgS^$yBWpF(n$mh7VGomOA->>*x<2EXZt0;!n zU0}H89wdHHGjG~t%GLi`%#lfIME(}o3B}QmPSNSCP``lnn4P5Sl$*PuwbH&Bt8h9rx2# zDfFc7LbF3TZgc)Puc9Xee%^*VK|a~q*;Ags-XGu$IS&%rzga5PSF&JEVo?cGBrE(C z^jo|vjlg}OY&}%F7X4H(x-q13=ftwggCx~E_gILRL-P8&+yCC$q}zM!FBGj>qHVtr z&(ZK1-5T0eeM5HD$}AwCcKU6?9*e0GTGA6);n~ecw@uibweeAf4S89DF5f!EAj|-9 z#}{FGG#_v(V7t%>xMzAB;@<}^*eBZ8>!B=ugiVKA zu~ZEf3ndQN(K%vF1?hRZt1@VV5!K09o8r}ci@td5YEw+!&-G|8M^oH^n$@nclAoN> z^s!iP9ev}jP@f~s2hb_&LSS``iaDL^=E?gG7roFxCi*t|5I(>dEWEA~=rqLJNJT-Cn^ zy=(#NMIqOxleKy>lB~bU!SsS5Bs(p&y{)C$2G8jOGz>wRihFTKi@Z9}oTS!0YZ)K| zE>qR+l=(b32fMq2hd3M9;VQwmM_a-Z(WT3?mNUgNvd&Mz-n_3oJ?TtMgB$9k217bM zTa~+#amFuqHR5Fjx#|vRKk5v zI0TdyLlO}--y2$0r6`7VNMy_;eu@KbwI=VRPm8e92^0tS`$-QUOHrYnc+VI+eGb?% zbq_0F9E0)cB%fx)Z2(c#CsYbCgR#q?(gVSHm4thYi2XsK+};8_wZu8!o8C<4QI(bh zJvRS!#0#y-o7=0}X()#(wSeT$SNxCiHg|2R_m-ucBqq-MK9Aov;9z`O5@_>57%mCs zkJpP~ZXvy%HyS$BgyaW*tooS8Il_m7tf`^M;C1>AT1Jg&H6M92XoIBs%QMaH7<(D7wW~F zm9wV|Mf`MwAEnT^rfW5yPh#y_T13ESGH z-fvDHHYp)it>&h8wp>z-mIAyV1Ki)3*zdyg&J;g}QIGF-fzr!sH6_}uD9Gs~lwJ2V zuYTJ~+V}T^{qs`*)zF4T>l$Sr{<>5=>jaTL4i zi@jZfqx4%kBf!(0=aJf3#H1SnC7pD4U5nrVOG-7Hgu?|FiKvWk8yg@$-II}TW@9dX zCuGdLB<=dg`i(6eiqD!J2Qxsb#BC+7s$GHf7-U@b#XWIn<$VD=6ewxxS`#YlP}#=U zXOtO&yz@_r=lOtrenhIzFMz6W8Qwr!Ttu{>Cn3U?tEBmYEK$TzV$7c9QzQ-X@{AtV zcKJ1g!>);rb)LO9uR|MVjNGCG% zpSuq4l-P$h?+|$~y&+yQ;N1|48CIs_U4a;`>gQfLnf)aCYN9cS@E zBU7Lga!MEoQKUyDj9l2`8WS5E6ORvbC>o>$=Qqa^=r>|6(t-o!cK5rOzP`^A; z!}L8uUeR4#y6UH_jVX51uaGc{2wMk14!z5+DZySN1RF)MNGLPFpCM|c{oSId zY~z+rCY{Cj9g&&AARW^VsfB#c(ORoArEF&9j%2aAsSM_Y*)<5}L^V~)NDkg^w^L7! zJXK23wa&&ufNb9_VxKE@>Eo|)sH$igQ;U0!HaF0_$1bO|s;Aa)?Nh2!rYlm>SCx-(I+T)cjj-_;7IkS7Jj-E>)PlV&v~{p!p4<{&ZD(Ccp6L7agrp2;&v^>>D|hWJbb$lFh;VH$ zw0jPe@rsZYGOld{?XrW!1-6{*6lI9?tq)+Ju>e`_kq~#95%&D!k1Y71a`D8oEYDR) zfoE-bz?(o!v2$B;io00myiHKQv8O8_)?z&s?5vnvWtM`*yYdps<2g`^(e7LQ7ch8F zIPhKBMJWkH2oc^|+v}nO+WPmSN#bcth%h!+(YqGKK3*!a)WmrNO3{?XB1uw7Nlkn_SWaLLeMlO?F_3Tyaw*YRNP~S zzg?y9?2K9eh8)mtn>e;KB-Q&B)YRtHoreh#wk^RUWV{+RHEg@zpUYSyM)6uj_{}8N zrT3TNJJHn6K*(zdsKJD5J8F0uGhWpv2p-lwy3S@aSo(F4TS!J%k6TE=#SY?|j|2GS z-+HXfY9$?}7-mzyh1}-TUcQ2iiJ; zJTQzvHAk1!Y@|MPq>boT`1X{kC*q>dI-4io1OgPIu*kkKt(+`Qp%j6tq};{G z04s{18EoTHtu4cao`B~&WwgFVn)aQL%*Htn!IWucI1xod{zHz7RTxf`Wty88|1qR9 z5!YuDZ+7lV`MsQgDA<=t$MTPJjm2Y29R7JGf1Jm|cuH*-Xy)gNJfthdChO%KVefS& z*4;CRIsb-kT+h>>8j8IneleA z#Uv`7B?*~dT5m!=lx5k^J+P43wK*0?jhg8fY)g!C1ekkBZP@z`N}uF9l*E?VXWDBJ zcv&qMmaHfOLW~L9O$Tg=foP8}bjZt=8CS#8dxx+vY4MV#0vtzq!)aS2<%Ze8(4nmH zKVn5XdhneRLbV)QMVH9eOoB3aE%!ijwm7jfLi2NkdzF0msKMv7$p8|Zz}!|FDoOS; zd(8CB=syF$<=uaBReRDAD%O3i%AcQ)tKl_BaE6`Ashg-8b1l>lyAg=R(xhp5iqe|t zrSzViA2v+J%xQ*AXdT1vG70Tuw_vi8xCwm^xa6!s6A+2UJG+DKL^`{Ya-2i zrYDIj1mcnxlxb7w+_))qJGlDDf4Pcyr=3P#Nw0~5M$Ui42N2s;J50B0vxk}VC8QU4pp4K{H?faMD_kQSrMv3IIa55qo2 zaSOP)Oop_tpA!EB_gvL^T+DTbV-%j&lI-s@omvh#8^+F|%WIBr(`rW5LHDLe&KlNO zk*^6Z>Q}G~xTr3}Bj|(LC!2w@E(dNXJimp^1qn$`WNn>w6gkHC`B5DGd$8d=IJ0rJ zf2AdP!Q4|(a@QDgPPgf29qw~wvGxZ*9#y{_aQ;a!Dkf<*?_WYAKF6d9JhY_Tbp72* z{rM-?Y+l_d|GH__<`Deqx*OR|fe`F(S7~tE)?E`pp^O`9bxRUIsXwxYRXgW| z^ySt0I;zQL{s|_`DIi+K)jPkJ!NXiOi1*!Mr_0Lx)0)|lt-jLQv%0#8)>dXY+^*E^{U5eb^E&CM`JmvO~J?9h?7jGWm^oWVfHH5 zLCyIZn_?MEx0r^thV8wSn$;lkbGcmnvLc`1ky=J+Ib2UvTFRZih^$#@ZO|fm(WYTcukGaqGnQv2ox5x?HtT@Of1LD5r z(I_|21vFqg^HB z8o_0I<_`5OkzZ~(R1A4~Ts7#^hqcVkrsB*gLL!l|Yb6_BygPnRdV1v=$~FD*B#^Y(E8HB zP^a5q^n^;fUPWoy_Iv4SbMzonrYKT`l<0wC7hEoDI7z5=n`q1KG*o9_VV7DSB(M7F z9hygBwECNdA^iOs|48-KD#ot(Xy|YsK6r8y5RZwmy}*4J{l!9_No^$Ja+my4Xc?P( z7j+n*v6O|!v#*m2zkAuYT`o`7GFDI6dL_<++dO_x`6a}|x zlh&-U{9t71LeymS;hrWJc$4&jF`+;yF!0aPkG?#x(Br9ybI4h2WU{9tEmLUM?=KWO zbt)V*5I0FB^Z+OPN1Bqky40@SGkR0!t=3UAJkTLv^n}b3b_BiNTz=D@bN28-G6iO& zCU$>H7pG8{5h0E@Uw=l!y@Lvw%Hr+q%Y^9X7BOa?`L2rfIMugCV^Em)L#x(E5G#^? z=)#zLuJy}lrSp{rwGQ(o;Q(U-ZbkIHj!v=LW1$s~$Eaa4v6yFPs(ZGd7kA^HRg}xl zi;(lE6>R>F0=3TGy!#00k9Fsxq~i40f=K2={?YNLGBIV87304Q_gx_9o0U5jeA4H>iA8uY!sMG-{oh4YQHOTQgj zmQ8OB2F?WfG+qS|uzmY!QaMCAxNt&LBsx;tu&g{}5-qA$Ry}7G^5l#+cr-Ms$OMM0 zUD~4r^Gg;qan^@xWl1GQMqDy+G`Bq8`c9)4NR{H8A=a*Sc@~jGm|O9XQgqK~F_PNM zQIk=mlKq8-E-I6ZOn7zC`AgMtT2V9-Our{cSo!R;QHEXt<6S7#YuixN(i0R5g~ozj ztxx^3{LsX(iCnz|wS`Z(OSjKzcmzZVZi%%x+P9m<>!UuUGHR6u{x#yeM#VD{)$8wf zSds`|l&(KY1dQXOFP`xJq}cQY77A&RSsM&2!Ikc`DD=(Cr{|X2(k6p=LQaBOin*s? zZ5Al+eWpmanT@~R!>Li)Q2l16wTulN(2X!#J0_dwr$~^gXZj?RZhhrxj0O8Y%2rNT zx9|@TdW&r~&;62KJ4TNy!KO-I!WT2et2P%5Kb#ZW-+L%e!SamA2^XS<*NMYNl4M>dduHjk; zcZSP4yCWd!VGOQw@IJSg?K9^lZv%SJw2s|en0z2tCkS`uKv;Hsro+VSl3Qm!qB4Kh zF>HvB7zFf8^W`TQxS7v`GWQ-+z|Jr)TzoSMbE@$hWQeZ}D`w%dWO6JAZnv$d>Eol9 zvz?O7xD?G(v+LtSfpbRNp;#eumf{((l!X}fR$vJ}n??IFsG;rpBAXC)WA$=Gbqnli zn}gsy$OS?dZ-s=+fLOz(!{HQ&WKpJhth7^EbSV;V*fcH(P0ylzBD!?IKP3&mrZi2$ z{Y^Ls-7+y3)T@}zaWj(5LtAB%!g!N#EFcU}%Y`g~S)9o|^XhZW$Wt7)@^Ob?X}dNG z+h+r$*4(BO+q(r9(SSS1He-!cOCNdVZz-jW6;POO9f$6;&MKL5*gy9&c9A;65?{x= z$%$!alniFp7_n9}j@b|Ixh?VeI@{5zYyJ(p_zCMi;{kWtwXA41kts7RibYGp8}7&U zeSy67=cc@gGix)fa|<$Bg{UH_pYV?&QWZ658A(SPdD3RFU%ltiHYgwav8V`3@<3mw z+WtDz8^Uz)kC7huf>A6wy+70L@T2C+QlmM}Dp5Y$?vR-xBjI-2z*_llwBJPFzpUd1 zN|2=!v!0PR5K>X^Iih#1?3*E-nVNyl$BL6XR2Sf3>fK51TQv2q*fowERaM($K`+lX z9KP;sZ#i-+&AN3dp&NZK%h2o*9N3kh+Lj{s;W$^3gpu<=5Z6Gja4lRMJR3$^#~%tS z=PWW?-JBFnFkIyfq((RGl4j|8(C!-6{k(kI8t^Vm&D{4qQhe-$c6oURun%J(yBQk{ zIMB)K*NHIvL~M)WX5U=W6O?}`2XtD|&*Lk6;V7VD_LKyjxMK;jx}WiMJdaavA8s=| zFF5eauP%qxG6O|1D^78d6AjBczwjyx*0OcG92T^?gx_51jyXaOVYW=IJ>d3vWm@gK zY-zA6s(>99DAP0d-|_gXWj=`yA$W5?>S44( zJ(=B=C{3L|c7dFJilacl(A>HtJ3~9Yt1HfsK>NyS;6QHL0nl^XY|-*=yD@VsvZQWy z@0LLur=RqkSflFk30ZupAEkKmbsKbf6ZmzovzAN3SNuoz-6d8r&0u1Qwl9KbhH778 zTHe1p3mq+t*+Gr#(X?>D6T<;KD>a*7n(;nHEZ@ywbg9xVYDY3u7_nd+5~ln0W1AG#DTRj zg6VM~{t2t9Ydx@K;TwC`gVwTi)?#P$n^9P4tgQsQzQ1DFp(ST<@RvD0yR#;$oThO9 zH?Y+yCD*^uwJ`pBx)wa+)(xoc80o^P%ask3X;})wD6tB$}Vt;YruoJguYPt ztB|p*7V3#+jmjbtEQq2q5W!#XkC;dmN?h=gS=$pGx6t;_=Z+k+ip|YPk0Yz;T+Yc| z4e=MxSIC>2hnlXY795=F>Z@j)Ts*bQT@=kuI?t=b+YOI5J0s~$oLb}@bza2i@3PIl ze%u#dn_rm;lJd~ptJ-J#GR;V^ckWzR*r&txM}MDC3=$rOpN`wivr}9SGB|WLl~k8? zBJ3GE#dPOoH*&4YzsiCybEy&I6dl<#wog=k=Cb6@Ezv3CW z1?H1~Ja;y|YTm2oHfEpf*s-Y$XmKi)D(b+MXD7cq%qi2qSob6Ezg+7i=Gt%C#;WR$ z=c^h%t3GRHc0H{0+My zBL=Sl$blST1z3P@1xNPj8C>yx zcZd}Q!iM}^YD}nO;xHRdn=zyz6tEisL<`rCUVw=dWPgSg6TAy!X21!PEDCVOoYDSx z>t=j^+cxgq{&fbU3|(M55)+qCk&Ki5=P3~t>~><(Ys)B=x2^#3ZIEN-4QTese(5Y zNG#na<9RfY-xe3S>vN5w9<1Ri5ag>XqYggDyX{zkxmkIL(@`RRebVT zOKjS1#AQ~q>(U#~QxR;c?8+3ql79-0O=qXh-p_UDu=C;VAnt(xhfqMO1xExBLEs)d z06+y`1Vjh-!610{0g`D^fr2Z5jS)$P=92^iIGuz4%Y?i}PRptcU?dV<3Z2cX0^<}x zO)r}B2k_5h1PDwdwHrdve9CwTZH6qskuIyhgMOclR3`8pZ3b^-MDQ*>Uq)DTIXj2LxqbVAuDL$EtXG%F74@9lULsiu$Etf->dm|ug?hY> zo(;d34VjD1Nd)ojWSi6XqZZVkOUWP4Z9kjsWyy=Zh2a5SNp#G*q>dByIrf*r`<>+2UYdFcFT=ef zG*8tBqTTFBDu;FS!@}!L_FP3lb0FwEt4quD%r>OD6Jc{3jW!o|vb^twEx+e~G5(qV z&GFB|Nc+#@U$NI}j~2P(n4%+C?9x|{<9~esE}F;}&8lNktO!N&2(jLt&u{;G@G%iO*zj` zEUifXD3rS;mz5wRdYkW^m0zW5SK&0Nh|e=^DOyVYsbD`Z;< zT6(YE9IZKZ2CGhJj$WcY9r9B^ku-gCQckf_?oQVkeGQ|!_drQ$`>>|YMS1TRk)%wV zzC|fBL7_A>sg01`L0tzT=9dg?r3z>rL_nd0O{%S7m95gTt&yNjEif4Xbt8R{2|uS+ zS}ws$jSdUzZokUQ42GuMH=!ho_9a@(^$8AOx{0{KV9mp3wUJnPY`wTx;wwg;dn81% zjer{}#igO0`d}S&`3&W;yIaR_>2rn0pW^HB=Nbi3K}35CxbJy{S#gai-DicP_gCUw z&aoLG$ZZ44npYdP-Eui%bpSVaL6}Mp+0l-v-nbo=KVvoD6VbWbeMbt>~lLnO%;o`U9WB>DuYnBLzH9mwDfps?RgO5KUp5`Hf?KT&Gv;@|R?*qmYaqjd= z&UP;JUZL+;NHiN0424^|^ublkc$ve#+v8b$cs;=R;q46NxT+p5&)s5^KbWMdZ1R!IDjl_aW0>n; ze;Z6_+VuwR_P#{sU%4WTE}k_3DYs%CU>1_OZf`PX{&j~rn2&{ zsW@fFTAoBBozLuoNp(ecs3+a#>Z9ipR)@`}>Ye<{(zRzruDzUYrO&OoE?ru6qwMhs zst?1pDzh_i;w!e}rkaZJ2DTmvw1{cH6_=Qn^0PXway@kum;eJq#fRhAcWT%tg&LR7 zt;eI9GG|HJ?E2gA%!{|D&C?F(A!$p~wK6aL=Ip`M(Z^Gl4NM4KP8CWOQ>Uh4uHfOx z-kMt$DVmDq=X~9{NKjLXv^j@iN!>NcPa{9JV`%2-dqJJEyLk;hil%noG!^onqn`@1 z1S#V)dg%E*R861~L1|F(>Jawff5=s^CiHb}^E7(*bh32lMQ1~xA7oB)jgmDhs(5+n zv5`@{nJ-m2;EYvv&+fW^!B0pTFccOZ9(Yy>!Lc2a82?YCAd1Et6c&P9p$e&a^S z^JM8}yxNA{-i7hl+(k3p1l;5CWd!yE5M;0*^mgNEx9-OmFW4px#P%HYUs8Z>GCzomE~fyJ1nhDY zWI<)bxCQM5I0#|5<=KPS5F^+U*yItt1_qImXrG|l@A31;$zp#5yr91k7R+xJ?iC;% zmj+Bn#&NTdKeWms{c!WTQL=I@M8wS^_PRkj7UqZJ_;mG>IvwBk1B~*j56>jeKLJDX zPrxi3i%$PnV8s6`FeJ(U8<^#XyBn0^rbg>Lcf0=y%%LJTvv7qS?sEp*H^FbN!(JY@ zt*WJe0SxQE2@D(UfBm{hTCcOicbqHN1OuG*GVu_~QNsWi7yz?9088H7R7DLOK!zCd zH^IF=N7tLDTgLK7EZVeka9{;FXM1r^d31Y6G29D=Y2UW+NNZ*=Z8rt)T~%#5A8TSs zZ|h&^duwueq3{%YKL3{9>vA>09ol_hBjSnJTyKqDu85B3^S~a;@Z;Y5BKzVvcN%sk zGM+x(y=07F2t6p?eMpMq)f(vejz~DnIPdwQdFH1T4?%EWj`?eWUpPGNihmzb5b9H>@#(`U>mRi4M zLKP=d)@xm@2xEQnt~4E1&(f}HbsS5Se4BNXtqd!iBU1|USpy;kQ~+5)^a0%gaOnoz z0R-8~1I)=Xa}5Wt0jt690i0O?NNiO54Y1HdzXKq{MNp(>@Oyz)qu*b+R8AweIf0Bi z35A|~YNkXNKR~eqbbvCbeqmkYrY1*+0?Z6xrk@(1g$V#$YO40{$zILLjFLDN(hi_Y zHqk@M1_N9gQ4Vj7>b#Fz?o=As0tB}?hRmOe`Xazbj8rB|TIGD}w4(m5EVIh0;*HPd zOzNN+wcIELLKOg-QZg&Dqd&^X$pO}+NAcD@a%x-9=!D{VHjHsmYE4vndm5E=MH@9@ z2arcH1j4tmDhsj|ex~p=tl(|tqgp17wIcb%Auh3Cs+x8N#RM(&^ zokuRdDbr%U>A78VI@P*aqn%_%g`U(TRDHci(|#W)WK`=0hFw<=QKD$KV`NZeCj(2Lvx2dVdt#rhi(@Y| zY$Quqv|5YbrrlAD8CQx;>``|CfeWj-0^hfVE8RrvS2D7;#9f1Q9IPliylPIe%XsNT z??zzV)+X7hMcGnYP10!&{~F$r|2{&eDTUpZN&LKaeClRd{qCChdRBbuZeIP~GW>pL zf9Dyw_|B>O_MiHKBYx*eSpCK~_zot1@1}E2D(aXNY0j`>`fA-LYwN_^bWNL!=etJf zM0WWTM7NdI(EsJ5`5Ai-^Dkg#`%f?{xY`)v(Mao=$vas7?^7*5 z7FDcxG(x5p4u*C=rG>78p@5;jwZTtMDZHQc<4=>Fy#pQt-9N+LsG@F-#D?s(t!;}l zp6B3!tIj7@lYNpXK8>3j$xpc15g>HMT4rx`&FeQYDCA!u_!bI9XKlj(J!4&?-r5TQzYNZ7@R zXeVz%pI{b!h*LywOMQ_-&%sy=k>Lr7Nh`=~d|Q}+t3UuJea(HZMH2Dcsd#0=&Y=PZ z{bd5+u^PZ~D>49cTLB}YXeT~y&rk?IU#T%ImOu&PSA*ksFURA@PaC`=mEw52Hc?2n zkJKCdtVtcxE>YJ%YF8}i@PPQaeGl}spk)o>B%YlIyQ9$w89s2gjnkvgJ!)I00T|@R zrpGSF4v#;&UYdZ%C$BoaE_pFvgN|AL1Tfm(&H!Mo`R3=@D1byk^rLS`Y-xE2u_p7w zNdv$W&w>l&`3Qi(!vVKtYGroQ$UE%=5%>a#;=-ZGa?Q|4@*Lhx_Wi{cl#(ODvv5Coh6c2Xk+B>ztXQeszzD~Ukl+{prje6 z`#Hzq{GtzM0)+&B-8;G;y@1($sMh3UmkIb$nK6cu$OW)&`nd>MzwN7IW-(Zso%}^9 zDg}oymV=QdJQWMR?ZA!#Z_ckHbLb#xBl?Z2OF4%~{wv?r+uf1v_xhe~Pl!w~JsfP* z!|${a5P9;5BRhI@Z%%JEYzb;Ix)lOr^M=Ig$nLLY8@koLaLCQk$gGOG2Yy9GBNt zZgzB(aqgJ>0xZDO4tjdl)QkuaZS|1RI5l3Nz%g81XT^rEgmy9se zJQdcg%W)BmXm9iSTWAwxO(NcaOqdHfT78AR<{X?6H-i1rP`*6 z_jy8&IO}Mx#x~0}+3htcV;sARsmS(t{Zy`~q>yi(Ocmx)|K*zKh7l5Zy_shh0{m(4 z^+G+Kylr8qlX2ORnwOhz(51Cyc^ux&0CLl4(rH!cV8^3PU2hpzSqI*b$a!%7N$t9E z1h)zelA?&?wy@&9YSy*E>&bim%)$fj07v3Et)o@a30=&3*QN08kM&yD7JSiX@)h&? z9HL97eHhMiPBiv3mTn)*H{SQ99~4DQj~E+6xJ23Z4UH8vcvzZ{Qw@X7oNd zC@c^p*sx?e^mD00)F(6MoK0=3YZUaWA+@9E2M~JDuzIw;QFXZpnEyFp(5nS|@%43G z@6!wJ3Lb()WUYmq!5>ZL%ngStj_ygJcHF;vry=%2DfanYYiQ*jpZEF41l}Xi>$}3m z>4Mg36U{1-!qG394inlc1gQ1h*4}nC%+Yn%@2!z@bX-MFsqW)@DZBL5@Cr(mSag-3 z6tdeE*&lOnQBQ@?^~eYzwNf#Q*8LVwWX4qKbJPm`?Xn;BeiEI7h*D>iN`4cX^>zwa ze5)e1&<@_q9Z)&HGg zK^9FsBVjI*Jmzk!u)*w2nhlN=B|hc1{N4kQ$3| zCD`@Yi~*+|a4`(g4VeNyxu{I-Zf(Wq7=F11GI2ns+K|PH)2gbf_A)k!CB9G#0r*uY zO97`o^Vm)itpmJ>Q37FIePlLBYo8dwkiUvzgz-0!7X~+>JeH=uCxmLYd>qAqF1en4 z@lbri;Up-5QjpT*kolBZ3aCQHdAT;ElP14>Nc}1Fe@&_Y#2RJLO3g=r!`lRam1j-$ zR@_np0~kuvo65kV8l%g=B8Y<}i!BbJpuFZ%~9-&vuaob0J5p+C64}+gOHxXZkcJ*z|Ze>BPGtuIs$_SgqLNBI0dFQ z29V=?nP4-)`EUXx>m<}7Lcjry_w(Fh35J{uDnMQr!HIT=9t42>QV|e_3-LHNQ2V$_ z9V=@rKp_|CMKfza`1_ap9ULFDErfEM1ka$0nOL}>U(h}im%MCzvFtu}1nfJAM#EJA zW2>`2Z<_~$?@25QOlmv_W^kXH0rCV9M)*rK00ev%kUE)QDojj(-z-#Z074IAD+bFI zNrRqZL?CU_mvkP?5W6xqUocM+W9Gt|E>@q2fOl%IH&`m{1HAaOU{rI*m%Ua#CK|pf z^q@~*)IhpCOCs}AdE1Mk>)ncNto**d{PeZ={`g&OKMh={EX}eE-7c9{}oOa zq$}P5KC?b^A=pG5876SG&oooi#jzrA=;_V*{_AkL(g<$wK2Lzh;7$Ln3;p&^@#npp z%&kL(n2r{?0xdOHtIJz4InWU<7ZP&Gj1cY z2+>VWo6x-iE8lHg&i{}&I$%l)6&vzfm2k8It2@{3_)*owj}+dBs@2)JB|96O&l)hM z;%NSoQZvhGjp2Ev^>$;#ouJD%H_eVXp7`p@ol_#2y?liQtPF0(j%XTnro|v0rWIXo zL~M<7Vav?GYP7$i$GP_Je(L`?I@)_oZywa2Wi{M3NQk<9GiyNLACD#{+E5!>c1fku0>~yHaAZ}&eH3)%!hx?o0>*zGBr!OY<|w&A-*ZBM-UgAso^!os z-u9hakQi)f8?w&7!bJ=StnEmLJ<;#J7@@ke8$+EI`*-K?x(Yj+zcrc#dJ57_{_AJyl&si*Zvj6=P!eak2P1LvK zV7vf(%R=6mjg9Gm-$@e8Q+I{ z45?B8RsdK?Zw&iQ59)g%vO|I+301hwv|(*^8}#8swzcU8)N|;dCNJKZ+k>0nd{p;I zvLkXV^3R#fWQxxkPUl|diaLjBW6<@iLZC9w6ChJ zS~iQy?`dj%#NgR)Q@XpQTokoR(q)D0%9WmWTAl%mnMKE^pz!lrmXub0+TE`HrW?k{*72xBOBo?wR z#@%A3yY!1)wIqL9m)kNlncp`~wXG^?W^bVNmbsRgH;XVe7uwW#rd=#KX)75)35pGeMxUB2Ph3L23ZA}=oIpc z4R&Qu&!=f3nqU=V9fKSzI@P7oBv}rjMPebW(cP3)WNpT~WzJ0q{k=SZdfsnZ(=z>3 z(bXRIQ8J8GWP|FzG;bp-@EE9!=;f<5lu=YADDpb?bQO*G{b&Us&7f?F><~uLv@W-N z>oLMacg)-xm|JRWyL9w&yF4c$i$K<5$NAP0M3=qNS31V{Y_nAEV;02-X>dUuO%n#R zCGDA9AAbDR?k|G02M!gJbz(~NSjbDVH^?jfqj#A@e8oIN8KTcVme}JG5y(EX0(0mt zJsx>JMNAHX2OVLTBQDHy;>K}-PW(_?v6-hQ37&y==vurbB#o#cWw4#l+Eq%Ab6CG^9@(f?)bx@Zi%%?x2g?HiYMbRiNNonGNEkpX zC+M$4D6a{MQN^65WYP+jXSeJyc-8PM5w&K5_VML~>I)RDO@eC3#75B-koiPw~a|uua)7*cZ5?tq=$0$J>|WO=w+6r4rV8{{^#N z_54%FGXAyGQnN>ShKMDKDbA(iJyyV!PI=5arl;ksN@RyZ+L+UGa>JaXDMZSDo3w7Z z?n?^CGVOFsW$ZRGew@Q32o}wfhw;S(sS8Gp$LT~AC}ic?GM7}VQ&SRTW`*r8ku$KaH7s)i!m2s8@j^h22yPu69JAFlFBRAwu~|^PvvY9U|YPsUfidVY-yz z#!RKw1wC2K_99;43z&qGkarw;)g60%m1u8aQ03BO_40JnyO%%QzbAJAN{bD=eSl0# z^-1_DK$mACxN0`fS=mB-C}J(yEfT%!7wR-cZmO!(ll_tnj|`|s2xS%$AbcGG^0*h-qiih#I{04Wn`_>_q?e!KF4UHVMb0tML1Z-;O!P%WM@2<|N1yl5}bz=T1!yPw$0C!jTq1qJ( z>`IR=IaHU(&lZ<#M_GOFp|{p#_q8mbHQv2`dVuNHuP(wfBjE1M$eInQyp?i!DajqO zJqVmV0L)*TTYp^QqP+ARoUe4!;xYK-VI$h@?0UbRuPpubcv9TCtUBWVs>8_X%E}F1 zg?MMOrS&z&(^z#KX^MMGi>)mLo_&oBn|U@~^%kcsNm9H_azDR&VaE7E zYP_7B{PAU?uearu@*F7iwN21q`!dcuE1iEDW~NjqbuP!_-ST{QIUVyhYF^nCa>-58 zxM(hCowD%+y6r!jJ>vO_9OO;y9os#&d{>DTQAG`Q*OD0z_t)+Ppx5|LBMa`tmGqnH z+lNP^aenteVd}vBHTk0^okc~ylee{D_ZM^Zx#9QZ?mVuyzm^xf%JMj{Mo76)&X)Vq zgbj&lLsj4JViwKyYUq1|@7rh^FGJlvCDpiZsdu{Ig9S?Nso(VtO+$sk&A`4 z0ry~<=Pj(-0n_%!IZyGA7(*`@Um^HZ&W}{inC)@gL+P1*Xery^I|$P&v{y{m4$h?E z`QB07OOJ)DNe&mWhC|WG073g=FdZmYkf==O4UEDUa)JC~o|d0CkG6^y-Yt7W1 zyn2{++=2P`rHax{@dnlGx0G=Aq^4|{rt;Z(J{ph5w3z38Xq69pSEk1!4`szK`TxGr zr~6O)e12;y2SY0ddp!D|N;y0lNkaouT|R3UJoTS@T0AB;CTe;XW;|9#I%-xnJWV_r z8C|=d{&-CPkP`g#mov1tcC^zsw8x{P|A)Hfr|LhV#WK3ahX05H7+M)v>zP6QHZ21aC;$0k4u)fL+6UiP+!^XJhf zT*PUhXgFtb_<6fvuY7EHATy_7s+Pt!^;g!%^P-$c?1zR`wM#74*ik5y%PlIdOCJMu zl~?x{I{Uur47xHqQ>t&R1<$gwV64I+7zPUYt9fVT*r%7Kr+uRWr}SAjw%1271%BM~ zw;zhZ_Idhs^|psce@?PRFKUs9YcHxA|FQ;^QaX$GH<$WG-?x{RK`H6P-t5u_CE@sd z2mDQk*2mqEwRN4%Qind7Q6tf1r2aWQ`O>o;=0FZX0Lfe|<*6?3b1G9$`S^R=CA`0Blq>(vFd4<~b zTr4x1C5!@d_xAOLZ^g~I_o9!EHnq9~o548P@CbR(Uv=i*Yrjku>XzH=BnO`*TfJSx zr=#H>*B-U2*0CMygBwdL8qYG`cvCg^HIK)0>yh37o%qW#h;5ts1NS*wIT&dX-U;G1 zaYUA(+U?qgwRJ7n>DIK{qw`g-W%z1`BW5=VURp`tA5(-NWDe zcPM$=+M24fRl;k{t8A^Rt2qNeojOv=Ywe<1Ac?VEx@)OBDLeTZ4!aXeO%286Xg0|)ht#V50hNA?dx;wW&o16bCso?qAFgxq<>Kag!dqcLOf_BzDiAZ zFxc|*)<-M~<^vQ^*a3P3dv}kw`>d04}HphB;wD`JLTe&`k#AlpxObe6g8Rjzbv_)%H6K>{XP`;OPqjHC6GodN*P`vMTRUG=ol7y6e{n# zxZYGOPwg947xo^@yAG-0@(5-(GLk(x(a0o5>Vi?<`@&vB0-~MnEdWoL1@L6Wal9 zK>3Hm8)e<0{}zpckwI+6a>X_R&|_MiLVCJen~HKzSQYTvJcMra7*QCQC>6|>2`V5m zjg!nR$QzR!0raNuro@BHJ>?)-hHw`Jo14KlICtip!dq7FMdU88bpsSARKbz5_HmN( z3iV9@{Ls_6V(AX4Nz=k=fpc3Q@|}w6ihc8TMkR!N#}1&s`4(JyQQ!EXx%WXHb2<&1 z`$@)+m^_*f!!?>PMszy|A48Gn_tt=t6ur+jE1YI5Y=0;dek3zi zA(NHlE%A?g-hOyM4q}}tZ=eV(j?(}%zi}SI?_dM8-t#cDnhwubgnZbV#oQ7$bg3>JI2@FtCgK zILb|>fRSCD|$WR+otLSyyV$5WjK0CCo?@$P7Z$^6}r9|OyUsE(7 z;1#j~4dOM;~lS9^mYprtED=!{w3oNf5w#uf5Qsl(DQo1O%XU_C@QQ2EF@Lbnw$KrkF?N ziUq}$0`K1Er6Sez9m69;scs7ea0rZ?g?XgFA6luPg+IeeC&r_+LAh?5uOVZh+zoPf zkx~$6`n|rA(cl@tVv@X#AX<@_S@w)3!YWio;doKp_pb|PAW!|ru#EdAtVP*xnYoAKF0%GayljT6IVlcvu0=7UY}f z7sB!!d;|EJR(cZ*Qi^p>GGa8>Bj&_*?kgV7B@E^z^diwSl4{aSv9ZWt;0APmMrOZr z(20HiS-PpWcXI(I42M|K{`7aAtXi$eI0hH}$roxmS9kw%Z7utHI2fp|`qaY)H*2AM z0gXM2R5)?V#^l1hEd)VBQ@6F-RtZKrPOaaw=QI%M;CVG@>EG(ZWzoBLqF=*D-EP`i zBUT8014e}iaVZRxpKc=-|0=N0E~%7RmyLDCC@(~x!Fp*XnLr16g8%B z&Ak#FSyIuRBVWo|$&9Egjz%gCmjXyZv6=-9!Bju$%3*LQV-5$Jq%IVos3L0*u6*e8Q_j>*eHHToqQ8X2)TjVI5W~{|khB zi`R9KWu#^M?srr+e#DQ=J|%^Kfe(({g3{L?`3Fy&vw&x|Vo97+SWwYK>|(kuQ$faB zk)m%)C}4Z0Xb=h_X{Z#zJa(X(cL+v&3kiWg!YV+Ey-BX-at&36QE@F7qwa4P1eZY5 zxTy#cp|1Q%a(_1Y-koy;mmC8DS!Fv)W5)HhI2|gG#eQUkjkF( zg0khlq>r&Dr83O&?8r2a`{@BUH;l}b8Az{U>?EOukqKu(*G@}@)+<*JJJ6Q12Z?8+ zybFYhDKuj@--j4AYu?Yr3f1p)ugLoGbj=u+2RpcTA6`2U?Hl}cuod06t(-GcT}N- z3PS+)^z+H5uFIkiG1C`P6#Uji^SilQ2gCtVnaJsLWuJtTs4q_OT0jYBxsNmIlmzy* zWcEXZH}=*`Yow;n_Dx=qu5XySG6ms)K61JtxFcO9e*9xZXb^ z^t&b-E;2As?YsK;mX`|L0wz}iXU`1NBp$qNa-{|2QuYjne`;s5T_e?#syfeuF zlAhYoDotvJloay{>z&p%JA7>FD5^`IS!gidL$rWQ=a(|ZVT{s%g}(gz8#>YoAX25U zBMzS<3l6T!*Y=c~Wj*03T(h@elHA5~4{B@BPMIg}7!k0X0-ROJgj?8X-9T>Zs>m}S zhq!3`rbFhdY;^P!2xTkSEYJM(bzfzANZy$ghA zTn2%7ljlSN8jv~U9ruCO8p_&3aI}o`fo9eZIFw#xO6t`1eI#ByS~O~`o<^3pua3rK zHkvEOH*8TXA>AFlVjaj9IXguHj$bRIdpGfI!_>P8!w?aN5=GON?RFZ(D;T#Su~^zI z=kn*6`uUw1*&W76Ol)#C^?2p~GIss@`VE(7wb6(5U|jw~;R^Gbh&&1jHDK-YHYl;Q=)>Wqov>QRXEja+( z-yK5D?t^^T(|={t>%9P>m0UbbnqS+Q+U1YaL4vM8QYLi1Tuc-cb6HR%G{)w&CwjungYpyo|zB$h{R-LAu@N_sXkpSl!V!bU|LO9>2^2 z2ne}aN;Q~qzWx2ffZtDjh%zLp{*P@&MUC-t5kC*tvalepkfR<1+yX-Pp z+GVX9%R}V#Gy`4#5B42;2S~K*RCfwN&`bWHEp(;5M#$1hb$&);eNPV#Hf)1Lqy2S2 zGz1ly0XhRoh^qRB4VtT2g=OjNQdEZ%6WqEUj6Lqlb0pJMnLa#@+3+xq8Wfaco5pIt zaA9=MX!kwv9cs=Ows-G_p)SPvI7UDm~ou;>KnI^ z6NX?u@0`y_paz#q&EDu8L0?c^(ChT`13)1C4;T#Q*SqBHxE{vR$xpOw-QueCoUa|f3hMu2xC?MOqa|g zXVnr%mWX#4D$KYXve7g~2;7m&eiSjhOI%>B*GWHQ0;Bo8!0SsC_4rDIDH`l+m}4YZ z$vgr_9c>5C3*EPE&yFNRy2z|^Glo3S8~iyvD!pKH|I-T;MoVHT2(42S_md`G?krQ^ zP=3Wyxywc>=xew(bDOD(4WOL%11r(Ag>$VH+16d3({zeMQ_Y-eTcJqR_8dY2`|+%I z678Vy%`l4l4&-C3xjunkMe`_f;4IBI;9;vTs`2y}xUdsvcBHT@WQUMJXLvDYmn|Fc z9?Ap(Efqbz_T0ub6BLa~sSWZYb%JwGDik`A%@pzYnT(Op08faWeD}zPI)s-_?J7DhJK|82F7m5Y<& zqQxRplswS<5y1S`);yEr2sA@)FD>u@epDhNA|kz`cz7YcmVcmQ03)QRxET1o+l|+a z*Gk87i}z1v!wmPunhB2ym&F&WDpM?YV_6TWq9CuJtSYK*zFs8_Ar%oIJSsBL{;sS5 zAD<~Y;@zLX;Bg?TTzFrIMI?MeNO%-fRDykgQUb0oIa)LoM&FIF6B~G4STH_aTw3H_ zYzPtVAhtH3!yIm}^3TN$5%{A5ve%NaKae1~T6q8_=-80541d(kuuOqknP4UX(q;c3 zgZKmca_h2ALga!u_!D;KaRQhSLjwGe0BJnYQl@ooD&0=E9RjspAgX8qK9?b-szf+6=- z1wY(lus5B~?yC&dqcm1pCjCe^0}0{_0JjT=15{|(SG5adT4Zm*}? zhp6MnsH~ju3kXE8u;}+Hm){S7U}p#68`)}l`xAF@7{JemaM}a&!!XhFwiEFu=$$Vs z6xBFR+CI)Ybr|i4;9Tec<<;|`AllfofpFD<2uFk&xmH^xbYKNI7)c@6QwQ<5j<&Xc z{k!~G3>b?HLHu`=utqbjTPN?;r*`%KEi`{yFWoI?UjK%l$=n_o1GphOM$f8ig@--F zL7f@js+zx}P|BS}4s)QgI2$I_abx0f3Z6ZzJIJ4G{QdJ2 zOuWZS5)H|ux+RWoj|aT7p(Kg68Pi|-Jo`O?^% zkUFvuSO~=~t9xb_j8Ie_0SXrwytWc)bpdR;y=M~h(btf}&BElZkf;mt)6gmComyM; ziYNY!rQ8v`2q$G^SE&KlbQ_rT%C+|nYHk5lf?RnyO4q-mSvs|fJ+@<-fwPEKzZm- z5d9%c+v&8;4myToA%DHeS0q1@N=NT+Gp%~DNbq^AE}2qwVMhLVnc-5a+oYm^&MAaA z9$#tM)*9GYi?o9bM~dCGDYECzpd|Gk)+8ih=;)9o zorg-%?jW*ihrU@L4vVSw~x8qSDG))JwsJT**e=|(bl2AdX&}Lbg(=THq2){FYwPM%iN&hD zs43L&kZ-(wi4Yc|2a^#I;FX)&NQ-G!AJZWt(+zEnD3xT1;J0$X4tfRM@CnSO^%oS_ zOcLrgg(%`_qzK2bO6JaWF@aI}Jayj*(DUp|g5q%q#;Bo52GlXo8V8oUdc21&?{Gbg z*|;TN<)oq4ZpCap@TRo}O@@Ch<1yMgm9~QCY}!%%@@RSScb12x6Dj-jI1X{1SR`%7 zuqsM56LD7djN$+TlgmOdbS$^9E6R=kw!7RYq`pnI5f$L(~=9t2EPI2D- zqEQOzQ!t2zOXER=Dh)2y!i0L$#BkB%1Vq_Wl{$B>{bA>jq#Z@SoQxZJlSmM7t>YBx!@(1>Y;mSZgdO zM$ha4g!QOCiNj#hn+sA>}TPb}OLjkk zj4Jr^C-W|g-aEw=8O1wrm!(O&To##bg+LZCiN`#&2tlnSy|}=FNa%hp(Siw6WWt91 zJJ$dOj0mE?Ht|p1lgpoUzntmY@vHI-bfNNI5H2 zRhM3sFLh^D@r{Q$!`k3(w;Jo?)Nr!Za*D^YRvE}qr#i@WfyFjs($N7Q_9GFdghlvx zj72^=X2WA}f`Z=i^N^C?SKCzmVkhE;6BH}$!T6R``<^;LS{$B=9}6nw9pf+qS6USlDF?QFDga z4|rKGoDlrzztE!1nu1w`cm5sIk0+z4acds-^}cC;h*e@iB@!Otl8TQgebR`-bIW3h z<#3t!#@(uH7FX7E4yO?3(w9nR>m?n_E)AN)aCC9yOdHD&VBpGJLJQxl!MSr|V0d z_&49#c00QrCv4o;2uu8k?d<7XXojr5`zts@gKCJtB+4d1aL%@9_iprlfOd?VS?g@! zvCAqAY*7lRYD9;Teo-;}^R-9G9PZkDD%fha97!=5+HqPGm+SOaHWdVLvO*@1gGMbfpGjpV|suY<_O+)0u| zkRFJCum||hCoBMm5}i#do098`9iUOQzPE`njrMukdn_^U3A+jcaQigZCt{I6 zN}75;4CcBx0wKq!MDYu>Pe;_#)G+HCzEBdM$;d;t`_7!uZ76l8R9-sG$RE1gui-O4 zf~~k{tJy5Bn*1(6&cFnE%K8kG+ohtkE&CqX>cX*%WjWIqMuX(ydDtt@mtYd8u73Ee z+2O&NZcIf{_M$73URaJ3o>KSETYBRCvY)errsCJx;ESAu-NRVIF7)#2jh4s@-eLEC}wTbBix|LD@Y?1vC<*_Fxs4&g}KbE_usyry5f4V%y}VrnuCcp3l?g^h1OaPeT|{*yBn`|k84dA@Fblgg?16r zWP(sR20A!zRh8-Ts%4xd7t9C5a-jEDyBb{co*)qA_d&?Xaf4ME#|wm16Ahn(QZL{) zGm1}Le?FH|w$@V|>y%`)k77eK0_uw-eSCJ?W_yO~wtAbTF#y$30tGrb05>qyGxdQHG+|KIK~}O!fU1 z-&~XD-AW9-!@uiIvo3FC*-et#GOVmMEmJVA&kwR#lP#w%{r^}v4lFh#%z?wbs0>gL zoJpMY(b=Qza&!7XFa&F&-w-gcRmXY zSaWC@f5|mNH9nSA5XQ51DZaV9n+Z9sPh!4sanh|;wAz`ENP+__tjGJuz@#iG5DhB%B3&24H0V5RhCSE#}bpN3~dW%4L z(<7@{ISa?yBn~2kP(mDvYNeuMdC$Wqbdn_f;63-5Yav&Yz^zrri?Ulfto32y1ATK@ zA=B~HI6EH;*cmR0XZ7-5CMMo4SFY*H!NC(lu#u=a(c|#Zb#C36I_JJg9R9`SN51OC zn+dOb0|y&LP$zpZZi%Tmt8)Z3+G_{eDv>EosFENFxPLZmM$XFmm!TBNf#WYL+3*+`#}=5{UqOC!dU`T+fI&w!TZ~LQZeC)rUI8A!)+?2`U9 z^9C%T6>tvAJ_FyDFNz^u%=eHpoQM7n!M|&j(QpL$cjV=R{7F6;l{)q>6ea>UU1Nan zJpxesUml1K@|VO#JJ8BFZEuqBVYj6OS74PHvP)Kj8cWLQ`(?E8u(9D{8ws7YC8l6j zkkdD+Oi>`dtM4?li@LKk0RN#OrDbgmyPOAAkg~DbXiX9{-PLb?YKi(M6dDR22p`X} zB;I=)wev~b^Go_oBRf7>b7F-(|ATray4h<%Z0|6UlOVS&@QNRkjHd_e1Og>a2brd` za&oVf00y1Hv|*xgoog_-;hy(Bp~9xCvtStD0EU%_omT4x+hy*PjV{3a&d7HjY7tkX zl8nel&?;|7Zh?Tt6V%oWy77wqu8+eFS(2cbj4FB3zgJ0@`)F+Jw2eyh8~Vma)#%L@ z5l|bQxz8}M0%B8|r*}XwocN1~FD%0$OXC6)?qWm8jJ@EYjd973Ws)~u3PNlYm!AGt zRd$Xu3^;NbX}S2#%C&@%g9*y#WvnjJU;J*V^Qi%~bU<|d)&wxMk!KYs7@1vx)?x{d zS|;*^D+;)KD4qp`L@XN=Vap4mi!!zWh%R;C$K&i#%f@Tr$}LFLrJ}_}f*qB!Bvk1R zMp57MOfx$svWd|1ctqmP4{v#oEo%20Y{5Bgz&Ygx%7rTH7aB)o%DTnog!%*nRTe+JCS8?yfH5Xn~LU7g~ zQO#ltlvQ{V{%|E-`**O~4qV3?&t9qa-R+Da_Ug-iO9K2J~zHF`;)Q4Q-!MRtdDzAh0P$)B;naBIrmV)$$M5$zb$`k-M`lcoC zD3Py66Z$}E8#pNHy!+07z|w>uL4aKBH_;-^7$G<*=cQl#<ZpV-3?lZBvCe{yCG<X1D1dlH^LO(b7VCxNF;x|>< z>m-eT68XL}XAWvS6>)9RP~xE4SnI*)lB21-HEOWz3w0;z=C&f{YLHXne`_cvCW%bz zwB@>6Lil~0k-r$s1~#nL0&nEy+!0WHE|zXDN$!oAcP~=gjwY9@F;(VYuFU?e8e75S zm1A;O4@JY>g-qxF#0T7!^=hr}9E@4}v(nOVMT}>P^w1`499C)MxOUEr@ZQTZDki*+ zmi-N;27TzB73n5Qp>BP4V(5Gpbxl=X5Qj~8tA!;$oLbzhJ7=!jPJ!wmzas972i_~- z{$?l^j35FaMtx{`qEQ`Ji?i``L8JaNR`2altDwzZ|0a%V)cbH;sMrn2j+bf@IbsPu z#_Ht^+2ORU8#53uK{`-pJqu;jYCq8^x5=2?@-A<@*+(ffLW#$R_ysTk-k?8t2O3+P z#tu}0!r1O*qBVP}jpFSR2^LU^c@n*0&m$@eMZ$U94Qk?^A|@uRyKbI00C_RXi*>NLp+$bOS8OTR>E%o@Av&s>?_CZx+R<_Ou$c-J1hI z_d-8|eJGe)%!`x}xuv9I{8i8C;UFpdeD)m=wrOk47f%vqW0jQ7s(G2#|00mv59|Kj zdSUJWpQY~1_;TF$J5yVuXX6s0Ir3k1X|Vi&*DDfQhFT~@RwJp%1|d7aDpq$g=T@tJ z|3;nv1N%aFe_*L|KNkZ-r|+dWlRzGFGcDnedJU9EwK1Fe9GHRxi8Watfy@eHVYJKo%IOjtrq0Yli!epOT<`L znSE!SGfLf*d<-u{<1SSv;-4vhUZ`E0geqhBhe{m%So}xb=VLk?do>Jx5JBMI$!f{@ zDbN}OuIL*eY8BIs%d!Q|6_2L>%)_OFQ&sLkm7}t~<$l7F)yMh5D>TOisL4tpp!weK zZy0wc$cy(ahb?v-ifm*UPRkrzq=Q~5-(W4Gu-VR&f=+EpzHsI!i^c)?9yxfw)F%U}!*C(E@_%yk)BgNx(C8?omutZRHQB=@zoN9N;@U+ytd z^tXQ|(OMDyDE;6N&*cfOx{jF}pih1gUdIx$rrnx0D&RN>nJg*uY>`K68)XB+v0mwY z>YpRlwhafhs!mVDZoJO&QFdC%Ezo$^*84JE$kH*}l5sCf?J`F4D8psb9PaMOdsN-4 zt4U@)PI!jXT`iQ+dmH6QPJ$6}Zyyh5t*3h!9N>LJ``-W!C~)h;30H*N&d?Z=iTaSg&ShKHWCz@GFyO&Vd zw{Kni{|L%ZFa$=|d$*L;b~7uHmZg++nK%rQb5EN}ms4l$-WQCI;xr9-FnW4pOB>J@ z-8Bmj;x#LqCjZR6bT37ll1TGIz6MJ9taV%i17kX7(Ma}J*>J&&<9?gi6GWJzKqQu?(nF4NfRt9 z=a!{1MZF?+s(93{<-FMM8h?;If!~G+SPlFgE9roEZwQowafY$^yU(QeXknCtdm}SJ z)_iLr|K54p!)ePk%+h(;F8}5Fxc3c3qYV0kK!v{a+zBAgY%XHS%dsS2r4FtuScgt4=9N!R^Yk4s&_@z?K z-^OgT4a_%UK>#?dSZZ`I6+YX}$~N+`&_8AHFkkgn1UVMJ;1Vxrx5Z|+N^`EQ_z3+G z@tvE+C5xSJv~;deqf!Gi{&W>t{}B0(UY?UHba}iMftVNzY*3?v^MWYY8O~bS*Q8_x zNvrOa!DE9Yxpwk$rUFja8G`Tl6-=#$lgE<0*RnQ4j7Xe8KZmeDQ_x98h?QLO zFP<%9xMrws2P|Koki&1{P3k`CJd2CZUZH_B)33?+rt1wCDd5=I{fZ^^Uz`YTv&wbUQE4J$Xh zj_3Zp0tTF`ZQ)JkN~DR2_`7F3Zs!)Bb|c*G5SyC2=`o;n802vL$fv4uU6w}@{bL`k4f}ikXSE5L*!AU`IIDD>pa_W)TxXqYI5n@nAa9nG zEDYnJWYYHjxSNWJ$w{?r*b!)41!gvE=XrW>Q>Tx5LO<;pYk37L6fKsuM9;3k?I!4E z3Usukq?dc12Mo~lIyaM7k{By}PbVFc{=F1#=!F7f@N4k=2*EI%2uJ4T2Ky@&O;nF7 z#}G6&v3qfs)stQMRoW91dDD%QN0Ba`-G{l)hXNCJ zQe=v^)8mMO4VVvR5>4F0x+Gro2aZ%L)7?>eE@ICmEwk1K{$f|+JV`mR-nGnpB43O5;VIQ&Yt`+?jyWdJiQ?tGyLf|=`XeXyY#tN{y6Q&z65orJ`tbt zWOMOPr9S;B#dyH^HF?j-fgTY{21~T}*IY8yBr%gghSo&BtzILMGVS_3**_e&p)ltY zXHdS28@z8HLhT)HC5Dg8zb#H_`h23&9MiCu%+NPw^ZJAYfDZD^u8f+Wv|^~-P06xF z7`n5?Z)oHmBVYf|aq+*Zy#F(g^k4a+|37)8{}5LHw>;AStAxtH#QMMIk*d_y5;m9- zy>oQ>M5L{PB{mO>KVuEE2G=IEWv=2_;Ti|yQj-ML3OTbEm%pE{gn^Oy_(BYNM2SNS z=3Z8Kv#H`a->#1@J~DQECQ`-1D;L#CUf{&W81jVlA+zf?iC-QLOCEb#T=>HuL(Cl} zCLDFHvP=C^basJd+@^=FW?p!D4LR|ohLgs^JAIojIbT|g(w3JnL6a!F)-2D>JG7R3 zTDuf9OQtHmUUaq~}eC9-P^$r!Zj2hmg0D-4^v-_A}r(*|1b z;yICw;yBl{F9hkc&g6R^DBQdr&PniY(o-NN8t6mHd}Wi5Jn4C2r|si5Yy582I<~Jr z%5B!Az#7exmv3y^#4d2U?;6z=r$AfcDjx0JpmJ<(RNM2aWmX%u7AErZ{2rUDw|*a6 zs92>8ju66)Iy6Fn1o|ri?ROU-kg^afrj_vr2gurz$W$zaCwub+F51|WoU7fGYI4o3 z7zNcBjDIA5pZtTdWG^Hf79poEBCb-mu?_!f-&XRHQlF){3Xtyj+R&H*+5nIo*|xzl z-B$GKuqa3Iaw|2yUC%l~p5c2Snc!(hn9WQgX#wVqP_-YS|HnvvwvWgWG)hdSP0LWL zKp%TxEREb>&D_{y&Ro%9ZCW&ZRZWsqev)k^iSwEqFoqsC(35|*vqO<;)>MO&qNOry zG%Q!|Zz8lO`lb{4&qa5szPG18v2i8@oB{dKev|g3jV^XV*UA$1)GMLlGt)73R=3QU zJ(Qf5Aj=zKxPYm9BBFwF*LP8*f??4{yAZ`5*K--_{o>r5r6cJ1ZS!+vJxGJJdQH8wNr3{G7O*E^Q=yZQmJXqJ?_L0mmWSdSgREuLi_FpyDxLiczZh(ERn0@JWm>WyU{I2}n zsByn26XG62$ZK#qYPx85iIVO#ChpfK=D))Eh)v;N87bz;;1h??2v#Ir9U^B@hqedm z$yH=M#fT@8cZO#YE*7w)L(-lAvP=$E?nqzVv=%)BvF~waZg}Wadjk{oaa4z)0NWx^ zYfRHW5pH?(8LjYy1$cnz41ygPU)oUO!lf*^llGmrIqpu-xP&(NVg> z$x7+Nr{tZO|5^sQOx~uPorz-5j$2>};qPU&7zc`+;M?1%zJB4T$ zjFzuzPtK;@0<4!^CgXO!7^yDL*RC*cxwVE($N&2c;toV@dno7q2w%uXS^&7K3B$^Q z&utD?03#8L<~wf-zwQTEd;WZmvcR@DVkCge_{bCO;1+iTFNVW<_eMc>pvc8{kTF!u zr^8y&Z#!pc%n=dK)j35F(eKo&n1I6=rTz1bgRdh;4E7=%YUw`jy6ch6{Zk9VHNXnu#YjxDyNEA5yP;DK=d$Cg4I-!|h8+NnC7&iw zo)0?@2H}M+_Z%!CK;JKg-F_AsF|UGwk31*}TAu#oEtT=V$Ak%yRsMZ9f} zwVFp*0Z*MKycj^nAVvhmLjLc7wfkB1HUv{ATuy?!ik4?e7wJrkma*p@66Buc z)6NXMLCDVzmoS2JVVo^y<>P8ue%9I9I9jR1zg*h?oMkA_`@qOUXejJ~egQzve@Pmo z*^i$(P3qELZdvZU!j`$eM)#6u7-R1tVgd_z+KWDD0!(iqhFgXW13T5P^ENaPssdf~{2BZ2|!m?{i}U~|lvfhULQgxLaoxos55_C<~06=iYg!d2ejX*Q~%F@X5| zEq{2lI#KjTQa~ozlef}{bwYK_3znJeq*S5Z=JYUSFTxUwFssFola z6%-Vqe;phhVjo^vA0AU3TU5|u^#~1G=yByJdIH`E?sVNUy`GE#%!H;P5*j;0XK3vi zv=3{)5wlvHh*@A!u;#%;1IMx7(3D zhXwR@?1d>Kd*W>$tl*v9J477M0@6iYGt`8#)=8|p!V~i~ZvoWb*EOUP{EAH`=DJR3 zgTns(=8841&_L-)dqr86nELc*_Vb~#=O_5BTK`8wR;uuFy7bsbuI@-Fpm7qgJz*4v zR3eJ+URf(8kz$(tb(O}Ir`yJGcl|FQj-opBYp%S_roprI&Te zoV4`Uwri^#-D3_l1n&Ajge?cR=nKwYDvjr*Frh&X7yp1jmXQD@Y*7!qf1)M9)OzTH zKqw`X@{kn*Vue9b)Qw;{(KEkXVF5{~NXOwP2^idL`xnKcd%PGVP z-37OT8ep5%ah?q&)f{w-;(TVjRPMZ$a#h83SWjc|7~UvDP&e3Ai{ap zX|h>u4f@M+gz6jkMC|`e2XWafZ{ono1+limyPSe0gRnETA&~m@?g?jt5PfrJc7dUh z1bb8X<+eae9zLGoGdieAqUR9{lBA9;Rq4%))bA; z{E>I`qR}Ni5oaW51@0%LuF=4_%L>Lg2YN_y6FZ?H5r>eRn%YIX^u@aglHjdM>48aV zV=@t#%0SkqGlb?mD@*y`l0|VBiUi}t5Hcjikk8`Lu#f1d}R7s|7ZF7zwQ(8 zKg-u&_4vOPpCa})PPV@`#(!+||9`v&!++S0|64ixztZdcW{wWBM)m?WR<<_Q|FJrL z%}xOuOB;IyTRnqcomtSx+04L5UWEVuB5{ZsnVFb6;?ptxwo{PObFjdt`>(DQob(<4 z8wD+9^&j2izoZYgA@F>7h-Ag zzi$sR^gi5iW1($q7(Cgn9SQk_^II@k&}9+J)O2wb#eRSow7XIZ^ZVZP&Qxr+0PKW_ z)eQ-*?(um7J7s4cQQsTB0M!aaQhXj2F>rGWAF66PXfGc(c?X2szcJhH?(_O?YHM$9 zNBzN=s((B6&y8#jxkyB~;}c4n+B}v5!LjY^r<MMy9zUsYXBNkZ#dfMU0JTo=boig~nUn10 zCuJS=1-*e$o*&*4L31-}5<5G?L2&Cw39w0a_D!CrN8|v|rJrYwmxq(tx7iXoini~J zba6yPQFY9>kDF@Zq z%C)j8Kbb2lQwY!?C@@e&L_`2kotTs~W>jabl`P_DCR{F2dl-z!NDOQK=@}S zzkdeCt*W9sAqwp*RVqF@Jp5;Z^Shakjedy||m*|oou zkt2JuRG;GDN{S4O_XcopZPAL!N3Zh?^@BbW&nP$84h?NA(SN(JgV54if4y7+ma%#_Mc(m9#B&NlE`KmhP{$b6(5q%fv!* z@33o!$3|qTjurolhE>< zocj9vwMGj_1Ux7N1ZQVwHWn5+#kH5I^GS%5E~BtnwP?P9H_hV`khqJsVj9usiBe0B~#p**vFP+P-!S@Zb#*l<5I zFwoN89*xaBG%{kgRG}^?DER(-U0qU=quqrVbNu? zo6num@=kBrcv-P{60Op8u7HDsgO1Kt6h617rzeG628ZK`0wpD-4pTexuDf4E3>ib9GHc$ zm~=Da2I}hAKj|sAy~pt{*Bvk)tdqU>xW&*>t@IN2v^O$tI+%1=)U4*R$McmSq((Wv1ieA;$ra_fxVr(o3=_eR2?O|%*@TDN=<;gNLpK4%gD@Rx84Z74>6cqTs*wG zy4v3l(3L_*U6Wj{(&h$i?+EZ-T7K@x1O!(H2Z8q?B=r`{bQTsC8?b6d0B)tBp#jY6 zp8@S19PGXnJOP513}qA`7XRu0e@Gz*dwW0w{VH8bZ*QYHGA4VnXPClp*w_7N_H$1b z78W%PjiSOrKNFF@gQK|7_|{}HNO<>SUNvE1YxTwviMfRZ0}BgWTwK^pH0T~f!E|fT zfOKGBeGZ=z!IRO%>1CkCM(*ynGTh=c7Vu6&^oAUGURu&fBova1_NRxm_2zIi5~qe{ zSZ%qK_fNy&90yXBKzg)ER(I+^K8JP}*p`tlYbI<*>jEiHp56M53y;Y@5WofhcCtG~=VV0YqDBeDNPgOgrZ=m%A#{`~z;M?nTGryq$@7YD$}-2nv8QE8 z(1a%Z(^kh+`oSedP|9^$?|DN#V{{sm9KjZ8DZ$oGn zHkSXKi}ErPR!w>Mu?Ml_MQ>RY%u@_4KlB&U`FcqhNZ8<#0bj)5*oSICMk(Cdp_lLc z-w|e_5y1vHk!XZF++sZ?xhlx0x{K9(vpGvt$O^#7hm#-E8!B4P*IgT{o#Ra1Hhf*1 zoyn;V*R9MBQyZzwfwmlY2qFEu|M8Q)ccoothJ3o2?sy@=gUCnZ=B5}v!k85SS0<^!2mRV+MwK%mv61V_abjj9Lm3H z_e5pyB~#6T`M_LZcT$gjd3Y#lQa7I9W%78HO~z+JGhpq6nK@l8N}IQGLNGW`SZSZ1 zU-1hF_K)6*uKjjVrXURq1I&Zb*J4>>Jn0QGN165gB6UH?0dBv!d-438M}EaoTwI!# zZdk9T`SEtPT1)x7Kyt&`TrVLhZZ`jqG_~5`8JE>uV42eto}v24h~vcTLFMZnieXAv9`9B(CZ;~LD6>Q{wUq1sJK{~7CeOU_4O4dD6gVI z#$1piVztF?e;^FCFv-6^3n1tY4vb0*cNmHa3Pk9VG4BU~*oLdL+qc|~@d4E}reg^| zaoH?mG++=6si>&d8vewOn|`n3g&-0VFd2pZGY~2PL6`lZ)W13@Dk=iVpHnZi0*7E@PF<&hIuW12x)boW>CHU+uBZq;3fr%_$P4k}|7uYNIfK~cT~k7pAX5)zV-_#Zb<1yvs<(nHD)&~8(`r;B$ z+QwSCVZ=a}zz0CQKx}0MeMfI6zn+)?2+qyJqkg&>SxK1;hjFJ4DLnxS`DP6`qnz8w zRNVX1;>kcnOpH#aBgLyLGNpxMQ$MgiXslgnGRJ^Bzox0F2_W&0Utye!;P6Uhi+6!& zgOFsp%zGPa1h+a;3*nOKwC!D7st@%=QucOp^ZR~-W&nl$hP7X*z*g^E3nU2-AANgd zIl@WXU(so4+d7#g_3i^BAPT14Y&&HQGX<$I%wLT|xqIK9U+VaJ0%8SHF>`h~6KS$C z^mL0%0S0|AcjgiZJflZIKo7_Gw0xjm=-`>l4|yXXNaMRN&b}KP4_r}`g{2}S5GDU9Puv;c=E z8r3LKK93@}fugi05KmYJY32Hr*pLv-FTNE5mn)>8yfvgo17jR^IeB(9W#xplG#qSf zPQ4zWg}am4{BC%dvN@F32Om+^@(WvOX<8>x%On8Hx3xhuSgPl~M*>lqo+ub7)5PrU z?Ex5S9iQ8LT)Euj(7w(zdbO(Mm+kG|AOb#@5v=~OTr0j z!oca;qS>TD?Cos?eIuhCKnn!`-0PKE;aBwZRRG>XrI=yAE-|QJSCe0FAP&cj*Y#%1 z#d1`RT%?ie**@u{0zeo$2Z!}`m+B*87Pp%FPUpytZh0(`!TUQVjrs|323+`)z_zxw zJVA@FzN3lUBWtfs72pJ58n6^9&yu-|h1=detkK*3;a`>8KHr@|V*o8mHrow)!7wb% z1QMYk#*z)dsKMdkuwRX4rTxLD&!svAl+J)N5!XJIehaG~o^A4UPk&BN9p_?|N%Pg@ zYnu!*8y$PiQn6c7#p_L2b#&~?fA8*NA|u}d*ibs$9IK>vLgp@gduB-@m#9*6zS|7n z)itKNiv%MJHoB9l>`}a9G_J-f-TTnMB_gr*GJ5hR6=_ z*PqW(qXC0*=vfFcX{<|q*hESxb1HnTIkpf`n~-QkbLB^VI_+9>&)6}G-qW8s* zN=-7RxTk4e4-^|4jdTP8mT{Js5X7){Zl`fa{(={@@K*c?Nl8h;?#I3$SQC0l`k){( zx~iVuT$F0ObcO|rCWDo{*Vox%Eg94j1!Za~On?PoiD&mflF1xxQuxx^aO-j{w)-RK zN?;OZqD+_n(_DqZGjKY~_;&*ZpkI70N2E^5xSN|@VSs#azQDrg-)KwxeenIIdhMeh z5HZQbHdSvjNu^M_92Vxj=GxI|(>Z8~^tNups%!m22}Xc^H?kN~z-04Uts!-#;g3?W zTxP}C)JB`r`OEFT?xoLcj!->JWcgybYI1V&^+u_O`__HnA~rQ^d>Xe=s2Q?&ApD6B zN>RuL>fCsq%{E(IL>*I|F)TJuN*Z2OmE+QQ!q0;Z&P63aG!Y$-%SK#wYlapwXD~=e zpZiJnq61$a4lKI#BKlwRJbSvxgus3&km$<~bp0}a^Nnw+#uP>`7s`LZR&CRXIl+{=&DpNak zXfgwg;a3WhJxER?gWcOJv8kz2`Q_21IciHnDNYWy0Gxn}uN)9zxmEOfd$WFPes839 z%hlzcMiUR0vn9Z2bG^}OIG32>*B^q2h|jg~;5h?tZ$H=Zptwt+>vQWw)l=*werUfY zoz|Den%AUM#qjru+E*8d00<6Lt-u|msr0RP?d;ql)c9#(s>*f{CZ4XJ$MfTMn30jO z=s18Na;0nTIEZu3Nmms#LWy_xvRRhuVVqu+@&p|w?ejgn+5_mVG;8O|+V{NCHrLFm zli0EaH}982SR$>j&^P$|C$(x-O4g#PZdlqtYM(}8TeU7|gd#6+B(l;#2Fn;dshwqs8v&VzoaQ zK7P~)pr@xZ=nFYII+~lGb$UFT$H$9m|9r^z4{{+tOH(^9i61pc&j8p%9bX+^|Sv zTSgiQ35gUgC#rt9+4cpd8OkiUN9spE6Csg6g2O!M%|_~0m+2ZjRuj}pbb?7|A$u@0 z;);+87X&u7->8Adn=ad%K||!+HQz$v5)Zs-CPJc~&-nd)qszMUvHY@1*y)mvx?4Wm zDV@>%eG5y2Jm4+gB%&Z4lr-xK-C5z7>N?Zqii(Q@nhO8ocEWS?krUUfVsmAGL7{3!g8*wlg;9< zv$N|oPS3}0&?J#AnH6aDNgcnF;^A~F6OOi2GfIQ*VATpo`&x)y(}ka0Kg}lDfWBVk zg{`bT)p&U(usTMuW(cg;n<`r&YZFo9m#P3Z(i!74&1S_&b}}~082|__4~K=nH^MhE zF?l*)mN);21G3)C-`pdz`1c5B>38`rY9^mAPXgo-1$zfcWi+qoAa{{-;6|GG#RfCG zT*-Kth4#eBhx66?)Ae1kW>kK zdq7CB?ghmK!^JX{T~FZlQ67NFb9HsKtVj`#kZ;2tHqS-B+1a6O0G4M{US8fps?Dabh=>H+@&^F+2ZzOwP-(Mr zc)c^WL@dV+bZ|%S=im1(-Q!RsL{2t-fYv})+Y6+zzPA_i2VZsXmzjN z9?$tdZiL5^*Ij>5Q3(w{<<2^s$_!3V+iZ7vVbC?yGP>OvRR|{0)V8#wTq9TlN8xeq zou6BDeOOqGmMXDC`9~wVeLA(7c?^VV_6LimREtERuo$*Eo*ERn3a&TLZ}Mm~mNi2c zWokDD2pd=H7#+(wB#gR2wObo?gS?c?;pc!Pl4=nM`Nb*3x>g=`etE zIL2upn4FFMIF*MBKP+K3Unt?d=)21guc%$?`$fJAI`ONr6$4>>twcgf3I-0&C=uXh z&vkZ+D%d)#;)BN=tTKw{Bqc4KnUP_yenFcSpU-VHyA9k1yioQPdaOC0!L4cd_HatA zej(Ll7He|gy7DsDevy?p2nBY&7l^e@lEPj*UW+_n?7_v!a_O9cZf-T5d5PE0ysEhD^wH*U_WOznP6ayk3qsuy9B<8JjtzLpiu2WhNS(` z+M(;}Dtf)ef~B`y#ZqKpK(d)RY`eEV8(WI3v@J<&DHe7_oI2s2XS_nh|0&Xm?(u#{ zAzQX+&0Q1<^?4pz%ggWm@iGv`90-M-mIjYXqV^Y2>~<4&av%!dJxPh(Ms7d-&pJsZ z0M@XvVYL6Dr>|~lX_1T{gWFyN2z4%mQAWtqQ-~k|0rZY9_s$VzR#sMQY;06YIprT{ zxw*OO>grPST-@t9xuO7dzJQJ)gmZ8(&rVegdR8Sdz>inOqH2z})#v-`FFG|34-bIF z_V@Q$`#p*Zu^$?CI71MnZ5Jc`oX$ngG0mOxOX%?M%0NMdGcqz}{_=UfH6VOH&k(N( zTHr>b{N4?}pqtbODJyg^o#n1psegKs4+yA-)8h31v{y#k98#w9A*h1<-aBrx8qNNe zQ4>ix4s|$+Xc`GDQOERc5;A+pHy8JKV5mwcqq5%tiY#h${0Yw;0ngh1X~&Uwv0hBO z^!T&)mIf2z#u$jRO#D`tFc6d>eprX}9 ze!-a*gyX>=|H!H@X2)p}wStBNUOdAWNOlqfY8`tdu;n=*D6?CKKs5Y3gs=c3%@7D1 zdkFmMYGsy&+rvI3fUdH-`br&%Ua9@7u|EoC7__}ueBVn8B${sKK>~Kk+*;iX8GAf>Ok64@nHu^$-rd#sh*xE&uV9S zH|p_!SY`fYqoEo528HU0N5sVVe@V_=sV@DGzjN1g^-gSABN7jE z&riY*bxNJ%8fT`)c64sYsNgJpDHKYQL%Xu4;cG}Xfmjsrw8}|i3ExQX=Vf^K=_{tJ zPus`k^KzRm%s!K-*Swk4$KwgD{uqB=e+-Cmsv zRNq&_0y&UXsy0>C-rXoWeax|((*>BRje4}QO>0_SABm>TFHdy)GH%JdPYLNV;r{44 zyIz@}o{zhK#mhq|>nUQGYF70v8a{r$ieaSgOgKmc@=CHzplHSZ$}VU!YPUDk=!Yqd zJG7;U@1&J0*qiIF_uaQnlHw62?#blttOkdWG+ zy}EdcS&SLjshWM}@;zwYtv+B{CD!HHN!rG|)e1xU&;9yewkzku{?Bj`40b|i*jRS< zL)p%%_8`Ys!iH_nETps!(<2Cz$EOoOY6A@$kbuwNt_`+ycTMNVr>G^X#o2L6YgZS< zT9q3OhG~5DVoqi{4fdpQ-qAz4vBB}OHHcE}Mo?Wr5BAU4zaoaRAs@R6>xtT;f-dG4 z=LrRM3==T?Du?V`b}0Dlc=i)#`NDe@SmoH_wv?1-(gqoN;CH6(CFJ8*=k4$2$)3sx z!OvG$+l0;`w(oo!M3?=%PYUz!mcdXD>RHf3hrc=sjI~}%Mv{nvIDn1b8Vth=ote6e zWI2EJJxS@+tAb41jnr0fyKg77{H4FQd%M>j?dO!}3PZ`peeWyC~3jXayLJ+>ZngLlD`y9s0)}r*EE2ivOgY zGYZL=8VPUxU$!P-&XBp2?#EI7qOcOPd)`p?26kXEPnaGozZt~DL%pm~G)TT1wLRk2 zW(?IA#uiSCR#1h+;J48(m?*AQuaNVl|5wPvz?or#Oo*@df!q zat4`>q0K8D(&4c0=-Jr)$Tqx}4~UR0`{{5J4GlSrfAbSBA&c2+h{J3H*!?yuXU2Du zSnxLYO~aZ&B8Z13&ek&iF9&~>C#uryif6|73dTdq4q1so(7E#NO4<%t6q4Lt;qWMS zU|f?PF<5UMqdy2a6zv0#hS~7nJ{_=d5xvduP{lxhE^wjApmQL<_+7G+yJLaOSYNMi z%ge?zlFipw7P#Ucki8v@Of^FF;J&$r0u~r^CyrdaNSHEZg3O%!>0P=%4nBo$Juy4f zSG2m|yg0}R+0s9)U$yJ4K^Eya{#XZhTJ{_D=)~zrhs_S8fB)$j3gxu`+v}=gEBH>o zEQ1!7^!BK@##3woP0=uBf_{cUkAKnCH;a<6)%1eqRH;md97{>TBj;snIT*m3W88np zt+4xI=8fPD*#*WX+9S2$a)9;&PgImb7m!@6O7W*es!NfnJy+(8$f=#CFKft07LUcIoSRfu|(4y;C8lXmj80AQ)h|5DZGOM*2HKs}n z{aLQ=qfQ3GTDjLt7|q(TV&mhA4{{TIbIi)!g|6U&8I`|4rv7sOTxH+`DFSkq{vGL?s*@aOki@tW{1mJT3TnCYyfAOdUlws_+-gq}Hkw$W zy7My?^gsOv_H^BerUWq@u@0l8IDCh|n%R|FINcKs=e?g;GH8q?*4Jfh8-_qq0*Hyj z(7Ux)>6BZ+4GyQ8+YN;83k8we&+JZ^^e4vait8GSrNrpMvS@B9Reh%|BvtKIZ#YC+ z9&Z(dF6L{Rs2kt-uF`Rt?geSk^AXGwy7sUBeA^Z zCxy(;rM+~LC&eVnMN6JB0urPS{?U32mBPfME6b3v)hD@O1*WU=6c=+=a(cEIDevQO zCK?4TloMThCccgKth!&go__Om?6odesgI=Nb$aF49iF^Y zXq!E}Uk!_u40P5+I z5&xBba>4O}^%b~KBaq)U_u+oxV@Qf7R1m-Nw!UrB;zof`@3K8DH&0u`84<&5&tRD6 zA>zNyQo1BjS63| z*z>DqO&{3idsMt<2pwJF#5a=%KejF(9Z*Up+FC-ikgTlYp<9QE5A@6q`EZBO0UeG( zY6E3b#@=6(;B(WRzi{WwM>tvrWYis>^Wa&xqY`>!NAc^wn;b_#e)wY`Ix6Qsq`Y7E z`2eGO<3Row=;PlrPW|`Zt%=*~yZv|k)Bblo(pUiJ2l!wd9PN$utzcX;E_;FDfq;Pe za=rk8_1SX(#sBj21%Gn;gXX^=?BCN`{r`%ve-ASJA5M+`oM8Qb>Baa@$NzU;jEw)? z6SB;VjQ{zi=qAp3)PB>WSC>#UQ=5rvaS93IYTlnT3<>sB5=2P?mL?M#fx3>kj(XIG zeUB00u{fIbc6G8&J>Oc1Se|EU(fHy(3ZGUFFQ4aC)reFw(%%-T8~hYWsDM*>OmbMP zqn~WAjGxQqv;`8~qtDdV^M+epJ7CS#8=&%>hX#-LpX|0+#rgd$Ol0}kJ$J_&)fKYg z9l^4{3%`Fni+Xb?4<45{?s3s><8^=8lZ(6+cejGub39&6KfBmmV`T`TCK)B!j-wdv zm{rBedOhz?v#j>D+n`7VPR5yb*U6F1i)aE*tK5BVrgP(z5O|0Evi|93sF8vL-yPnu z%cY;727~061%*3epiK0O-|kP0b8O@?RbFdof&++8RuUA?t6e3UY&UhA;i5~tYPQ$l z{hvf!{zP{iJ z$x?cmrw7f5Ic=iM_5Med=Nh_pbbxTX!JqpW{sfiPYS*N$9na-sFSYNBqI;-@^Rz`A z3N~_@m0)z=pnR6p@i+&AL{W45kSvMq$^?*waax4-BCaR$J-WFryKbf#AXEWiCE&z& zN<6}~qg*O;{~4%5V4{4YtpNpTGGW{8t4(A9m-`cM6%JI2vN}3HE}*qt+-ZfwoFiU7 z;L#xmf~~7?gLCL0wXhiawO2l`kmE~G3#Q(O4B7a->K*IP`D0Qptd^a z^(d9CenD8vh2OCh2YGTg<@T*n{9v{#~S~ zj~&)*W)N{urLC%4fS3<~yJk=}Q8|h~#H|!-jZn6`7Z7i7SQ@F=TM%A>5pngzyH+cg zdeHd`1$);fYcFoSG%eHK6n^Visz#a@py?^4Hilv7E%p(;&%i_&YP>36-NT66bUBi| zEPcMCn2x;xai|0dm(o2&rIxVlK5kV$-dUHqTvh6>?yfi4#sRB9vF#O$p#>W2P~EJH z7x=qRH*%i=V~QC2AsOLcl#V}(hDWz|(3N-DxvL%l&-M%fA*-Mh%)qVJaXR;dotT0f zI2!KT-cQlzqh3Ko1hOE(O`sKK|4?c<&65Zm3kBQu5F2Av!zP!??2l{KGY*EjIg0n9 zt5JuTbM>IfJQtn@d4LtA;R6qL)ja@n*${WjfCd9niWTh_LG^fVn;frnXj2q4nh;sr zfxY26M0Hm=KFbStFt-y~yjz1(Qi-=Ic3#J4ms@n^NIRRO&hSK#!rCyhh1X7j=E-Wu zFlLQaznQt3>A=6S2nWdoKeM0rfESnkL0UHJ>4qhaE7Jn^(T;OQ#7p zQEZ$BaB$}fi>y1e0AKW zy^q)Pj?3=VVCiP05e-W+hbV`~a}{{xxngWWU=ETOicuXT*q-T`^HLkl7-ByEEx2~N z=q@NGgi{}WZ^0f#H&XCE``wxiNr26J8y&ry$>#Cg>@5TtsY%ol~$Oa@l54&fkp zrI%T@!)}tCJ*fcYBRL(9!Iu+qS z05l8%5N>D|@m9?}iWC$^LO*!~px`fI01X~HdzR~aM?MR7XNwY&Hx2gdt_KeZL#AzY zSj2x`1sY9oZ7=T*<5uwn##HFzzRE1XSgbYtP}!GW(sx|6)^CUzA5^H-v5JBMw`^se z6EikBB7ilP4q(E#7IX-|FLJ{tPv6Ek*Z%K~y z62ib{n*exd2>4uE-+yuL2TX|N^dWc3%_|Dguo{6yV9L+9lV6twEsDy*b)?Ai%YzjB z2G+TxSn=NYck;=e26S-oem^cH!z4#BiWxd*L%BMtYN$Y%U@GiC=qilf6u>|_@+uk6 zXY(t>h2PF0u7j~r$1A|Qq{oSGe@Vz{D!-OM4KmH#(<}eE(ds}Pxeix{VF@Qs!RU3{ z+#f#&7Oi7@Zw{@klnKt&4l&kf%=orcSOD>8B7s5&#O6`+FK|D z5mt+VJ>HBCyTF&rh(Q-q!KSN^BLtshcZ_z~&b3to7kgy0F_plX9GGu6M(_)a&!F!1 zH@pxzvT`z7q|3Uktp1LT0p~myN_2hR&V)CM;7`)zu%^ zHNWJ5wNH!Sq3j1eueeuTrA-uU7!9X_0M6Ko=u|L>CMY7<;#3w}x-K%CImUf?Goe@mg5-`hg47 z0`GR3;{$byWxv|?Qh>0@757U0<`}+g`n{1H9ci<$xKhGh0VZ1;4vGenS|tJXxsJOG zJTY-F&f0&(?gDHCp*273$GqqeHnaS?$j4w@PK6MEKE20aFB zup=$YtKQE5ozb%ExK3M4&)*-fm+h!$Wpt>j5e1x7v1B_CzN%WU@`Zy9D%Fpf#niLq z1P;Hb7DW-7Z^n7*dV>I6PmAkzvuI=|>Ize; z3-LFxgNec2h@WLu|086TC9p3h0z5XE(ians_ZdX`*Vw)i`nBB*zP$|B>&>qKO)b7l z9uyAGP%D<+hZCY~twUrzf+vuWH#Yj`k*IlVAWa&!?Ur#}^%k}2zt$M)_ejOPo5$&2 zj+)8ME8TIq(Clp!*jF(- zcCpPCy_z!I+z7#8a{g!eaZ4dxEY*Qr>5R%TnVs;*VV4b%GH+`^df= zca@?IJa~2@o?(9LBI0Wa1of|?9T}Wp<&J_wX-=});Ui&}fnxDA$>P`CGJ!dY>2~xq zD8RORYH?mNezm92cw?d(`lXbik8`vXAR(N6d>)-V4rC?vI9qnIy$HgN0y(jF#1$c( zuWfAW1y1AW$?a;YEnniWSa1*6;00MtexXMNXx8Wm*#`E`a{Fj+JR$iS-0~KS1k~sG z#TB#hUwj1dz`K0ZY$mHC^e*wYn!{H53tiB%-6}OHQS6o{;rJ_JLQLL{Zc^p+&i4FK z+itzT4o^i_0(D)KR#G8M8xj2`D)u(%WM7jlBPz)X1dgYtI87;IrvPOmM-Yy zW?K#$n()8S;r>1R$p1rXVn!lHW)9Z>Gj9qYp$a2Fm;9euRQ^*!6$Z}#teZqSf-BG4 zyt5Y;vpbC-R~ zGyVPCam{({;XLK?ytwS7n>{@_op1A_$iHWWh!~4S4h{}%6m%g+ffgGGiVPaekF4b7 zHBy0t@<5jry&D?kJh(6C@H;sG2Lrkv+3}14uNU#JAZWv8CXk*akeV0)4K*SN009xT z`fwW5+yObIK*9j~f&i~!vCKvO)rH^Rixgd5-G?&%asq?u4FcBVFnHM4e#QH+All8dHIN?B%l7G)*tb-m&^JPG?=F@pCe|8mP!s4%UPg>BHF%X+Ei5-d%K9n7*|7Pz8iz z7?LmfcTNFrM8F&s+;h{km)dJ0{@)#C5m>&3UDlIeU0O|@%GeDUm0#Xx#fr}x> z`}j%~B@BLB2S4G@)iBe91A=>-r`=8aTC5$`1%mn{4`JBJ9(`Z{TOa`z`UY+#m%ss| z^z8ZGR`|xh^AUcjrun9i`F0UTa-l5VHp$(7`tFBw5aV?Fb|Ug!!WSn3LKDsbe(Tnj zjrEa$6(v!)n)lbW@)a^=1ObhC( zU&~-a)prIR#{vuu=1&r%(;W+s1ewRkAq3^iP*2!{5m5NnXu=?YLlpH^nExiO)547* z{o?}{Au#Vd&L>_Mon)TEfvHV7%?EGB9HnCc?SpuGPtrt^H%B-uc4HeXK9qgjL| zEhUzT>E!7Sas8&=2xy2iugda%#G?61Q(`rap`QwK2}H&HiO{bj=u`FDkyHVcYbCEs0ak>A`6qScp+_onJ?GI;hB z>(nlGk!+u0<#X>e{;kwgwY`LSH2q4COjV~pnlcs0U4Ltx1M6c{lnO3~6JGE9uxXhg8_U ziE^Lfi$X}3nBL9VrX$Q87w8@5xU?!Z@QNwvT5&1N4 zQ2!DBoa^;k-zolOqYOuiKS#BDWFRolbHL)|&A#a*&k_1o@(VSi>?Cpi-jTkNR(Weh zXXcIvb9!^c7IScvGo&^*EWHkC4dTKrb0EGs4x&h2vS?36Lua3`QC6wv@01#SNXs>= zEvJ1f6*ILm+O@h@yi9KEOXjQ-S@N2JW5B??f7SggiF3J%Hb)DK$qv_OQSX+-J@;QX zzQ}4CZc$j#={!&!gn+2ELh6Llo7C&MnKc&M^ykz}#Id2DD2x#2*av?ad;LK%^sE-& z8<$P?TdKgybNX^!^UfcH>VTtIz@vHDinnlFOU!I>+5F$tOcy-C6*0OKraMm&Ycs;p zkct&sKih;BllH#w8M>5L$!hiVoWVf>sWoaj3e5w!J;k=zs7kBlYrid(|uO;hacLV!jEyBqCXr$)_;nODLiIp$S^D zrG>W{0#^bx4qG0*NE;ZlbQo}m^I((n$jV$p)%2pDuB#se*Q-qAD+pKB%*$WLzf(-} z4*W~*3MEbn4Aq?0x>ywgY1$>7cm8yq6cfJU% zLkk0V-sx_4TZ_1>bm@X{!MZ;;KPOs-_95TP7rx_@U?9U*D2W@a0+o86q@F;h>MEPp zK7LlZOf$Yc64rk@5s8_hD058IC+_CAqnA=Uj(hzR(&vssHRe9VrB1{_dNzy1Uv{$= zXW=f6v9p!@Ok!bT+Zf7ksy_(UrZRo5hn)M;c8Ri7@AnM!Uh2XKY}^pumm`vFw5(F`*3gUOv$3CC%h&A%>sgVjvk^OT{%yk; zt)hCc>b$_YOHWiapV*!y%KuzJm(&sO&bY+Cj}A8Sp)SKMVZhdtaD)yHwHI)D5g(C+ zSmenrTwjlAt;b_+3b$sWH{^TZH`}B}=-*?R~8H#c{Tu*zI6>-kY^iUb-buvd7PT zP7PsmDk%dy54V{H=&3PYRepTA)Fn>w4AaFUO0}j8(cKcCf;gSm=L)dm%Un=8o8oZH zA$*!t$Z;D&+VkJ|LzlhGP44NEE&!y=hva7+X^_`d9CTyKEE@cCSDG%uq4*pktJcff z$i+t)Hd)P~IGypUbujI^q@EpIqvYo;j5Kz~z+y+r)DCk*@lT*$9ztF&C;obL+2ZuBm4GzJweOwkC1pB^xkt?91lP<*s97V*%zo#b<0$7T;K$kf8l5^m z+08l7ZOewYG_OO!rT7h1B+z~08m*|{V z*m&Pe-=NFATLxf}Es?dV9vAoe3=gK#?4=Sp?lTNS4siG2<0zQ7;VB5G!q?UAb&Eg_ z2I)t-Tef-}U3wl=kq+xE!WzSAjtc0>Qo5Dhrejuh^SX%yN1X=SMa`CqAE0}j)83@N ziVkeXt&m0TR3;240CJ9dY~F5^d{Oqw_$wieZs3Nfq5aR}NaJ=*c}i0NdlibN=W5hN z8NCfgvQ?IB{~GtwD2h-052s3_FMBr&x#L1P8f8y0i&6cS=m(}F6&V|8qd9@nXO~Uh zW5&u^t~w68`pNZxbCgO{T4@kd9u?g)wV?KCniz6}FN%Fu*>rNx<}JE=eJ)pQSw280 z8+N0}&iJBM8=IS$#7l9W)lJOTx+_5F>8oEXiO^@fRqF;izy4kXdu&H$bXS~RkK$Qe z24eobn0AyOW=cE=ncvi5y1+x%du1y!0ENqtbM4a<1oq3sA3F(*{P`z%2VPw5Y^;P? zl}q7KMf$qhrJG2$KHK7v04>s@^*!>-aC7*OBnpLlKmE`63esMI7;Zu{L;uWjk8 z_hwjeKFxx#tjN;+z$$foqDqL{9s8LzK@QdQu>$09K&juu4J)h+OYxdU1xi;sATl`2J z4gE`54P!4XhKK5*Hc0)M6bRo&a~MijhK=0?d4JdUMv{%*hMyb%k)===Gp%8A$y$KDY78TEuFjc7;pAJ77$20<(A4* zk5^VGDEKiu4-k;L69YJqxD(5w@9d^auZ}gB@fSAGJ9Ds_sZp#yE>^(?;e65>avge> zf%ylgC?i}-YJrR8$JY|F3BttO# z4R*R80sQf0CbjU!w&>omjC1EO@H^JFYSuQu`tVYwK!|Q#&7x9D-f?t|tudiLo`KHZ z5Jp^MJ1>JPc~uxbMK50nvLvDPYfjK0w8CQG80uhU@r_g5s$}z7Xehz!wv}%6R-Kg$ zHUm!=^x0zH1LG|hWG@i~Bf91+LOc{I3an>I=e0~w-mJUIoz};j{KI)5`T6uVP|!p* zL$~96K+?@)JxM%G9(3B%6~e}I>P7*VdAl(_+fADa*YII5wJ3lD(+-K7Q@nXY-L7*F z%~a+54og2@9x*oh5XEGd3|b$A?UGT{vIrcz>sEB=;sacKh%S0bYLV%Wq|DCXEOp)uAWFcXUdor;qoh1GbXYIjx|YIabAOvUf`x)8^g&|r9{=`dEe%M1@< z189|j#z~LCk3NyDUNyNuy*9S6RmlPdvxS0%wVh8<9=Yv8?mb67$<)iC7SJR zBewD^-cZ&LqGVmTHQ7st5wqfHMCLc#3JQbz!$v?<0 zrno5ad3k-KkP&m9+ep`&qp<0y^rWTm%OMIU!`g+ysV>A~IPl!tLwtyy2zE4Oz>%|% zOdE{^tuSy)X-g}(3_tjrK;!b;(-sphU8M-UaBr}&egNH?| zWzY`h_`ExUUcu=Zn4vOO!z1fKLEJM>-wx_x)e;ZLX_X)ZBoASMJU*c zzJD$f9f8#ibt7RAvWoTyacU#j>PI(W_B*MB9}bjf>LjwJdc34O*sD2YwDKw3%<5U@ zb9+w}&XCe;P?dZBv0Vv|0yhC za6Am%rKY!%w^d$-M9+Z^){0YYN25Yt-7`!ywX9QUw8|)^brA-)-7E5ohz}=Yf5?>huz6&b4B5LR z+pf@ik}sV?-y{cKM!e0X1IY85V0##&R=fR>fv~g@boM>oh-Q`7k2> z{auDcE9P20Lm=wyz7e~@QLYLv6d&Zo` zhfMzmW9QVQS=6Q5H*MQyWmej@ZQHhO+g7DrY1_7K+nHTA9npQ_i;i=#*Du)fV$J7S zV|3Sh*pU&O2rNKEpxWW)J`B9PZR@-vX*>oDdH4KU1J7GIVVKx>@1bC2T%(NJv7-4|?z#kmIT7tBNv=lS^X9QE9q}JDu>} zD5k3x8!wQvM7Kgq*FtO)b^_*`RQLb`*Vo}R^BC?dEk)KEClD#?`m)0?{uHlWcIeS2 zusZK6hFCd)F={4CMS~=uDftrZSEqdgy5VLv09e&hGQwz|Zeqercc|u#rJfyuUEGlP zJsu~<5l3Kuz~2m;nSMXpV?%U(&LVw)TT6FFPZ~y;t`U}^p>V*YNk487{=@Ny=@_^brv|N zZdWVbW=+M?V#~0#gL3SSxL{b9kF5K8X<)Iv(l$AE1LyOMSV1T=hbL8e96SH*RyD~2 zPsUid1@XG17!`w`?Gho=4>G{m#vK_}QgK5`0Mp9FYN(|$rYYG6E~ zDBlU)WOoW9G8^oZPtBCxp2ail)v~MnOY8BKVz5e%z6G(6|I0J3Lg{#6MR+6q9F2>@ zF64c+ri8Lu>uXPX*1pAj6Bn^tj)M4?2C+I|+B*BsSxR=(AvcjL$|s*p!wm zym+nn0a4Dbg33hKN5oyVGdRTXkq_gZgX_Z+-Ur^uU?E`%M9mb))2wbRS8 z!31V$TM>iE1M-=p`}^$QB@M-z+M(@9{vd^~KLQx!oju4;_g^n(@I_jT$}?7q&QpfTNZt=?8 zA>LHEaFpxT>{1k6P}pT!<+Y*+StT0+)fYeNM@Y;j9>1K9Yj^ikH+W&f&ct%jN+swW}CH=IIKsNwHNuPBcf#a^tc`So0D}n3;1v<$&qY{&At+Ev?Sx-P>LAStDPhv zxgBXf-@mEIwba|f(w3y!jZ2 zq$DZNr$7lPVJ4(2!{R5P zAv1pMnhoK63GjIPNJ=c(URxMU|B2Mh&COMgB50Ke=+{*Wu+Go5ZdDyhxu&v6kb6kZ z@k5PA?!Hf!3MMuG?aO^+)>-&O6Q^pRcAV9B_3ISqn4m;2V90JewF1XMfZ9%M$E4sQ zABE*7{!vDt0)~g8q7%oVNlrwNvc`%ro~%1>ABF=#*Ddi+{M}IY5nc!XiQ1fsPaX08 zqSWI{*JLqYhhT)dGCH;rTqzK9;=Yz}iV0I4nv~K}t3ySph;m^@vG1XxC|6uu3idtn zPF`IHL*-3VQn?nh`#Za_$Vmby*`<$_i0(4*c0n{DQVOY6GC7yAeUEqM1Cog<;=DF% zk2ll9u=vB*N)*P@ltBIAffyr8_e-oE!*xV;*Kvo&wOEhF+OdXB@;FKTyM5b79SQsW zrJ2%m$ASj3$eB$o`mh%BgbVsUdNIPbBE4OwY%MpsEX}EBtcRYp`4p-wfY^yx|Z*I#A=o2 zyWCvsi%K>8Jw@xd4b3;ZCeG)(@*+~U^ae0K47j}W!@8*GV)`Cv^o~j84<1LB6Q;6b zjwl67nQ2g)J*73P%;YMfPi=10Z^Y7xX0f#4JTI432=QMrXJkvt)e43WI~I+1wA3w3 zC3lvV*9iQBdWl$@c+q@~Jtz04iEJbnYP^Mqt29m!WyQQ1hpmVU2x#T=@4i++d0bk` zQ)FV@s-?f-sQv^V!N_H8^A)>6KC@o;)A&cQS#0gup90I|TQjT~n+PZI7tbJce^_w| zXlMQ1)NrcdcJX(aHNqUk+3?^>;toX5Sf;%bMj*M#wo(b!)GqMzfL| z*8$8VhT!w-Q{y{Yg~nCkA6$xKHwQOIBxBY>)`uOy~J00Q;N zc3`F5P|YmOz0Z0^`>vF4klTeHK#hE0=0D_w|G&xr*8eB}v-zj**#D>RI8k#)NLdFN zA|MTbCR&3^V7Jyvv20Qkmu5qjkcSNW{&>PcsZ!-Zl*!$h?7V|;9W``ErfAwRNQ9VPVb1t);bQ$<4!8zta7y#Z~`hjeO_t)9vnPRx`IQHCKZ# zIo5|lOF$s+<@eTiPO^*=MbcLZFT4xa-fs8Gz?_3GrzyOV9=#})pS532$8$u4*mN7n zvQ3H$oGH85LM1#aUJBlM^Lee|D*ik%k%mgzz*9`F$-!@sv5lDr{VW-;)54=fnVro& zk5fL0Jt1bFvtJu4R}dXPg_AkfbfpV(f?x-8mP6ED_F!9=GabVXXL2Chls9=46Qo@* zwH24tUc6V58#n6+IJ6vk^(G2c#2czR)1)s{9|NN@cxf|t@|?OHy@a|b`oSQe6%nf- zP=I2{JVQqS3?S1#8iXG%!HXY=Qky0OLJ>l|cmk||9K_$*0x};P+6E0X`xk(zcw{kT zhL8rFOB5r6bT+|1!BZ4CR1~8Na=>EJL>P0L67WEuEzr(jz+O5HpbDSAmeJG+}m`G<4mjWW$v zLA*i(QCHtqz}uGcdHXoLff=L&}}EsdUHYU>TqtfpZ_NsPD4s}1nYG? zi>N>ki(tSe#Y2y3nn#yV*DL!~SxoT@>%}dko8d_jxp5>UE`VYX3D{k-D>yJT*;4|{ z#^RczwKDnq7WehjlEQwf3xBf_y^oGINKX^2=aJ^M4wOx7H*B|+ z-I_jZ^S=cSaOj)BL;<_DeNgZMfgK&7aELUm5Wh1rn3zsF)m-dcR9uc{y)e?a~Ac_s~nFJ@dSWhne(Ai%r(K=%J;5DL=C5xA9uBjno%(gh8CG?4qM3Q&OyAS**z zg^SSzKfgS%G&8#R&OYXg1CUFZ0@C8+0UHF@04lM%${ey$sC;P07BDVev%jDMfOUB( zuDXsHzYu-oCKoq1ba3FV&Q5mzSX*3qH5><1R{yk|4qASgOK{gGP%R)|HduKOj=-PG zXpk8Ed?Txq=TdDP%d2ZJM=+3FFhnk?x}=T9u&^YwRkYh|-2Cb?V0kxit}lzK`%)mB z-P$!kD|_oV{7c%)4Zo|bAA1lDZ9(ibAq4>!1&)6c9w@AQn%bWIi>n!ke|D8GP9UM} zteIat#V9;*gFEYMks~6%t|SV;)AqLZd6P!xDtl{-ee;sAM+@{D{(;+sgW?xfSrN(V z*cRNCn@@vljsC<*{RiNOTLXfkEG=nAuXlZVZ2a8~MHPRVUx$JV1EH?)QjdIw_^+Qa ztG*k6fP$hF&;tNm0t39X)`9)PR_+|Ye+mxYX??GIcV@88Ve5QtfiLaM;C#OY9-Kft z0)eh;@b&$A{C<7o6gW5lRbA3-0io;Ta8dmAE98snTlU*O8E|WQ0Po!QKE}uJe|R~$ zp-3|G)DXxakp6Y{~r<5=e7`qrYLg?j>jt$%<5UTu402h!FS^acc+K>Yl` z7XdYVRKiaCd86f26#xqODt+)5{HUKlqX5!=v=B_YJx1jMc^WX_^j|`bMzXxJ6DM>v zKV}s_d-p#hw>t{ocBDT$frmVV@qCNYey2ZtmhnY+gC}%BX7iq{e02WQj~;N@-z&-l zpC|K@LPV-Rl}gSKJhcJINpOcZMC)y18y-Q`%$J+AHa~~sd5&8d=d(9rX*1KH;x~HQA z1#o_YwB=5`s!`UQMCSaAJ>jlyEu($P-JVbZZ*}GWIJ*CyKCm18$ezHsd@ud(8MZ## zJAe0{`K$+@F}o%B94P?@_X?t&LqEw+B`$c*6YAMimP+ub_ai{b`twth*FSmPa=L!( z5Eha>sGV|WI`t$;ZBYkfW+D}Prsx=Pp0*?4gy$$c;Wf4Vv4UWF^OwA*rI1z{@i_(q zSA6MNF+Z{KLj1b(`{-ViZWX8-t63<5cVtKiQHliNXSh+qTNV{tnisM&y`=0WOh?3k(`&JA&*Er$_#WX`SU+PyiyiM_0Iv_nfcba>Jc+z#pj z8h!(*9D_H1i3-u{wxj(@?|^uBkNO05ZuWeL`VzyQ6sM4SMUyI+q>CB1Cb$HE}H6oo#+UmOl!L0rkzD_B3%_9fn=Pk zrkwLw%oK4AzT8Zmxb&c-%0Md&N%!mA&qs69{}9ofNc7Z*;AxNg3bNS!_jcC&!UVJ4 zsFf$FKuEe;$XHot_{Cp8%m{PdKCapfVpQzV=>Ue-Mzd~7w9p}tCb-p9JBPPqcoc*U zLgb@L;o-23?RN3;x7=Il*t(Csm4M+d?H-_Ocqu*2IPznqzU7f*qA+7gU6fhiP34-# z3i)IQ&_k7FnFWPvB=knH9SA%l*)UG~TbbQluzJIooj(gxD3>o& zunSmVVOBU(0}8SO&cpm7HX2Cf_vN;^ZV-Z)0?i2{kjRxHx2*)Xx`-OERA=BlyIN0A zf-=4x>teQfmsO-Zq9s@^I#Qim;O9kc~kVOS881rHuoq_vR7Yz({Oo>Lcl+BbS`Qu>^tW~!O)=-P%p{CT;>m1Ba`hrQmpJ92 z2p8zSf_VYn9eQdQM9pq`%F}Fx-4Ar2!h0am951slcVy_xpt@Y4WW9R}*JR>3}91>cs7fXX4*0M2z zp6DV70S1cw5j*J~V6~3JK0EMHzf37OyD^bACt2eKG^6Dc?0E4kBeZ_?M~b>%*c%L( z=LAf{L4Jd?UH#evK2D(I+ZZ)8+nrac2|@*481ksxODC5LghD7Kcr!%I=@D(XBBb)s zjnj2GVvDnNmi@z>DRGf^bxzQj8Ml?A!yy#wW!}rw^gi55srW6SXior-za6|kFg#vW z6C`0%AyaO@n{c<1Xt^sNFYabF)5oWVX!`pT9PPjz4iE34- zTS!@847CSQ6;Q_FxKC`qmP7&B)K_-SmF85BbQ0pG`?Tea@lCI^5J`|!ng{7H-?A;S9 zwP{IQVoPtcxfiv4WH=IyCd3d1fEJfqIHMl3RMs7q@jO7h%sqZy0UO;urTE`U z$KNkM!3S@VB#ia+3IBoaLJ?iC;+ZU1kd;HJ>f#-Lb{h@~3uOb{bpK;qJ*AcQu@kaf zdjlcP#}pyU7^LLRMHBI#zUY?_`$j7>@vO66zu0GHY%`tf<7=5Pg4*QURO~U9rV(4i z#{$ypc_;A|QY&~K{lP_%1DThHp7pY(Ywh~@=j88w%!94e7H`^@gf5Wpl__*RsL*y) zsz%j+)-M(j-3Dxp41&K6E4XR6#$^}OSLkU2(_k|v&B%6QKWpZj@lRW+-J_o*@)5%a z6RQ&KqeE`l(MYf5x*9klG|qMfa?Hjxx$PXc=9SNB_+h6EKKD4l`ZCM zT0p6CtQ=7qrkxecJ8wB2k@g;gBf=ctnVN|gY3ESn%_A02)Ev$b0$rsM3hr;Vc{~m# zN-$<>bvXHF!zdvHE0jc5>R-FOt@*kOt(vYm?_RajkB}YFr0rNK4p3ukxmUR4-*>a? zWwp*diZV6+VKhY;n+9XLq9qosgdzo=sm64z=EA4AiVDp7U8Hs8NmP?1cn|wOH&y_L zzF)CA`Afb<(F@u?VlT-IF$upI@29VO>(*H>>XkBW5*bA)Qq-|-0g1?Yh(U6Xj+E)A z|B`KWpO5-n>*H>f`jWf__701fMdhMmlih}Bc@Lg%2hoDw^G?-7uQE~=vuh%ZAMR#y zV&r*d#zKT(0!J2Tp~$$ITn2c5c~(t{BBr^0fiE#V>^2WHH2IS5U|HhY;1>i(SNwS) zE606=Uq`$VWHmN3JA~{IHb|OOMaB^o?+{}1Mz`SwC80I;pfp zZdLaIaI6SVUZEhGwdx9>Wpg|1OH|*2kCxfU!kn}sc#1KV31-5+0N-`i6SE&=UAvTD zi<%`jygkP)hOv~fPZ}h&5gFHeV$Er-W9zv)Y1E52Ok^clYPAoQeu2K^`czl4$>ZUi z+ruq@1}WoO`6;>hAau?hySyRaIH(D0*azg^hrZ2L2$XHP;<0TT@rUU@VNchjZ7xyo zMY~!`7j9q=D@4CIdbyCa#-6E*^}Wv-V4=$5KOP_3OcxYA+BpDgS)Pk=mrJ9`#0vOY zMtWc2WJu5%VDVI{v=u%Qd%P`N@~cMoftpEtGWimW^pP6Z8*fznN=z|4AgeT&0+zV=;&;ZBCc zGUTjV)q&a8!Zr`F-aFWr5!DKRnX+8XP+xyk7Bezp_IoQ>LE>5tCJhxFqj{?#mBp-$-CZ78o0B zC%0CynfFuKaeiy}M1XK`1wKSSo5%bRnPhP0#4-l1TA#Zb+GN6*4Ml};oWFhX%lk*SDUzLf-!~b3K+FtCabd+areb#K4wRhpXh^n4u(lu|7IA zl}^c9z?lS%;^)-Lw_v28K2r;|opH0a)dZijmb$N(c@06}dB*PFYb`;WG&D~`k6t>@ zr|LXs$m;T;my;KFZMU23Nle^iY}5ME1J#l2-gK20mHOEC$KP&5N*gIOgGVO`-Wg1C zwo0g6;dktjO*z#~w(^2q$~flzr@po-KXEe4T)=Hl-SE{|K%-E>aJjBYEt1MzIUZwS zHn3)@(x3*UuU$40R)?=tOC{h)?WHOFp7=sHtc@NmEmr(IvR$xZPW2z7)`{vFs|>YZ zEj1){q{^3xnqU+RhDmNhF0W%uyi*HJqr$|F3pn+tgEmNkr? z)S9M5#&#mdB1!(qz>~N+j(Wd6VNS%piD~KULqA9)U2^@S1e>{tZb?=}7~xvo`H?UC~K$3X2K-xshe z^S9}7c{K@f_Jy5cmtna+K+#5GKoB6r*W8nfp>%EbM<97hc#Hh49&w&DF-WpBH0_Hr zZsj*n(PU+r>}^O2(aD%B|K=L21+Q6%x`DuGr^pE`oeZQ5JC{}Qg1^x1!rjmmFl{+5 zdGhbl+WiE9yJ6v#B!q;Zp378WT=`^9$m%av!(D`ngOUd;w@)wHP&- zgfdbxsV2c^3#=(Q-R<*veJQm);_D<75BNOMEa(Zp``4HtywBVM$E-6OtO-=iTkLp7 z{7@u=&hq4)S4^3rbdDm+UfM6Ls8-YABUAZ^1Lu=(k~g*oZK0Um1BHY@@LYVTu5fSo z9+nF04e6K%7K%jK@O(6F?f=#IY;s58jsA|n5qfTXAkz$wu;GL-$k8Sf;~N36|j zMj!?u@RlJ_w>|i@7n|}ER4A&uA*$;=aUM451D=Y^syrQc&zfWAY$AvE$4%Er(gjo@ z5Fr7dUS8z;wbWc7^xY$YLE911_4f%zcdX7`dyqR~I>xGt10_kO<1R1%BB?#Sd^?vb zTH!<8KN0)(Y!kSBg1}2Vt{1#NNrVNh_Yp&dDNSdby*rx}b`akuXFu>=KZ}Q-2X#4(N-0NI?<3T0RKR)9>d@0I zBt=RQ=oH90zMtNLw6J=q`W#)*SBV%%#TC)2^pf1p`Aen(e*jVUgA83yz5z zT;F^*DLj~Okh#S+#0e4zgA^=JJ#22+4PFg5c)bs!&f}|(+S-o0NXuY^{!nt3sX>`; z@zqH?ZeqDnTAjJRw7>mlr<~OQjqhr%=H%NF-3I142i>eRBPKI1k|6UZs#NWDviAFt z&~zqx&Wt}&V4UXAqcyW~LTLf|4c%`%w`W&(xUA@yhGm-pQUiH$hHV7}e3rl$*#0`g z_>CJOXgT1&!$w_QRr(O34ZeLx*L&J&7Q6Gd%~YH}60RR} zP%eTi%a(2j!_0bD_1)`b`D1NAkwqaa>&hvuCvF$&kr-X8NJc+|wJHuJXG)wj$RwA~ zS4A`z`tFOuF8eQ#Yy0h2fqe@Ua?7WMaA3=S1P#b_$#yvJ%pKC)rG12)2KP?mK=$6p zot_jEjUNlFau;?|<62JDp}kw>B6rOC;}airRd66x+n;{b+a z3z{?>rCfC~PaL!?nqH@md|}^RoY%#O=A6r$JYWgGPHIB4 zdGGMc1Df{@dm5G1lsI$EJ&dO;^=f0~jad344ast)n6ithOxgEp)u>-016OnIo020; z8~ioBumh}fdi?jFO5H23WHNjRoGn!{Tqk#r$ezOOkPU|UIn1b5+d*Z!jlRJL;usqI zMdPT)E%;L->nDd*J{148aouJJ>S|=4c`{(aGu-I)QCnoSKy|= zgxlq>{b@|9oV=4r{Hc$6;(>JQajkA`obGjvH`Xf7ALl?M1jo1o<%LL8L$vP+5;23V zsDM;cIRorCf|LhY#dqJYPi>i5-y@ME$gL8qf2fOb1u^8x)D;`1Yq%BgT$1hspY4CH!K7X$jC3oKt9Esm^P*e!klICv zr0?K^hr4K*KgXDv>neQPyJL5ARvnc0BFoiCFh@!w(<`eOqO(W7DJAk!e?*)-;xZ4_ z$^X!tHQMmFTQ%0dkh7wbP6uDO_(2-j5~b?ITPDTyothDxmi9jcleFMS zwK>iTC#Ww0lqe#%)? zj((9}jwFN9?Z&A#S&lHj6x^8`N_v-4%Rt|c3 z_pjzZI^XoNXmDS|L$IavS**l-Cw010z|zdO9IV&K$bWkJHS3MgFG`iz{U#i-TLZ*@ z?myK7TPB=Z$zqiWrs*enbwqB6GkN3Hma+vDCysLqKBqn%k0K-sWn_T@%DQe{E=F#a z;aRdaAK-jK)1J{{HD8|XqR^l{pl`9Z!y8`KI?Kgs_C?pC+Y$3MP4V#9qUo7SC^K1f zL?8HXk?lJDhmCGSF;5$V35*Wo#J>2~w$?XR$VwJVEJP*o&Jr4uJ~AZkyJc)oAq&@R z>%;FK63a!bJSA4p4IM}B`2}B4mjkYEtBFdAHWm?WCy~3Gn|Y_K)jWkbpILoyFT9>j z`c}#gvyz8dPtQRn{Qoiup0isErBw5)<}Z-8HF7P-OKYJ8Yt!l-MXdnth(g~H_68?B z#%kEo4Qt5dpSYZ#7^ z!MT4OL(04+49b8C@4e%`i01jqFN($!z;j^|%DSw=~~TdPOn5BQ>pG=k0>AZ?4Ihi+E4%D8Ap z(`eQ*4TR%Op!kwF+cIARhGtnKZX$SWJWsKRZu%iKUwP}OQ6+w7Cm&qL_NdHKJJFoh z%CZ0;P$%zLZ9`^nSO(c^OaSIb!IF*8!YKfDCxT3w(V{A!ZNnCj`?h*nH+4>D3iNFa zWA@`ldNdG_JpfDgrolG>BgMfvrMSMYfX;@AnDhhw+JpNq-A?Y!OuQbZY4NgzJgzc9 zq7Lonh^zg$&8bo-xb~;1+4T!G-8{A|XoHP{LBjMPn9$66pBNeq7Y4WYGwtz_N8S=( zVvGF@J~F0}(QbXlSD6O*4CZ!EtIJ;|vd6`$C$GUQTx!9KMJ142*?!Ta?ckegi)bP{ zh5M``9eu2Pe_L7)_DMhOjqn`@hUsG)kB^rLWodzx1&>r4U0F>naiE6svt)w0%hP0O zq`O9%m=nnEB?at3YlC4`d1e(=9}_8rB0-g>llv_$8|+!#!$^|1LJ#G}#k_JV zY+qspN>`4+M7P6YCiYY#*vn>N%}|ebWmSmk3I=;s-Q!{AKJLMZ!|HDFP{-pWwHauW zjaw#BnT+UyR0z@4m{*FayPuzrf7Q;A939zZSh_A+h-a9JEtRGJn`x4Tdu8Gkna$eL#d?Fj{G$SaqaQN z^3T9XK)m;9>olN?Gpx92OKN_FieRzjxT1Z>8c~U&&Av1KHE9vm4q>?YMx59Pvwrl< zv*A*ap@4IszKpy~1XF4*<^t@Y6!F-i^n<;=R7VMBUOn7dwJQO7Ie$5O&&p+JwVa%L zB&e(8f3&D?xn0XbPIkicO=8ff>F2VZw|So{@%63>xcL`z zSD#j2CdOIcv41Zwqo5v$|5^L3Fn&lcS6H>lmwXN@4bl;L?uCBwde;3u##Q>TU}l?y zq`6lm`vK^m@jZczoOsVTsd_2q#RG#Vik-x&rm3|@${@I=P}I?Us3J!(L4)-R)CS3W zg$)k6u0Z27SQ>H`S$|a7Yo3S15#y= z3^bksVeF0`iMyX>J?U$wzVHr%2;%`Fs^cr#Cy4i!9@_iWk!p(!72C9pcG%l2J~=6K zJwmqZ+(mK|W+5>6j?9GuFCXxctW&eST3rYrQhTuk_M96@uq(wks{!ED^umuyBm|6Ul}HqfDqXc|J= z7A##g`Ntw~Q;&|+ByNsKV9`2H6`ex=vsnp0(Vkh5EsyoM!2RZDs8Aic#?y#@FZR$h zWJRR-XCnSZF~C|gEp+3A__C$W3x6N_!7DMy_ZjM_MM#d-GG$>$MF9;gq%x?H{`eOM zF?B`MglQ4qOH_Bt6DRegSXU&cm}4k-2lW~Ge2&~jLCFox2y9aI~*EH zmpRF$&J|2B0JOQ~T$TE81^yw5>%Nv~;ICbeUNBi(4hEH3G11XW7Ij)&p{j9~{#48a zYC}$e#e?97ZnMYo=O}hBO*N{mxIzmTHL8t)4*F6RvR8eC4drHL2h}+8iO^)fWC`>e zQIEZlteAr(hug|b#!}}J>y6s4<|Sf$PU~*d%f>o|^FI3a+xah@&j#&>2*8-yTUrtx zmRZN9seJ;zT2O689J14CPZi=iLY^*{7B z|EC-N|L$!vGt>WfQ}Z9+h>`U_^Nkpp8U7bTH^v!48D+hh7Ei!aOcP)+kL-CPQvC8e z7?Cg;RIsez1)f->ghc&R=ZsKB0TB@~nHuyg@bP=@pzS61;~VoPCOW~mmSg4Lpzxd= z8?w=(E4vD_^Rpn@CliW8Qi8}Ysk8uqfcW#v5D_T_Cx=Xch1!IEVo{tj1QNFCLA8(h zFe}6RM9MEVq=00gvH%~0Sbz>uFApg0 zxy)oqvPHKYh|jT;1})fwQCr{K0{l+zCh6yOIB z0YC=+s@%-G)CpIx>ISDRd zLfeAyYM^?wAV8Rt;ed88pnfJ#-~{@)6}APp>0k7ipns^Hd?wHB#Z-dBAW&oP$-kHK zuwkJ>wDY|DZ}TQxf=E7hPkYp4>065yY8h~SxI<+2=;;W`Qr8KlUBX{?7|bZ43E`8` z6O!Wr{9OQfzwoHrS~zK7?t&hH+1lGD*gkW)V2a)|PgryMNhr^Mx58)e4?!TxVgzQ) zue@G9wLwC}UL{Y2z8L!BM4xCpU?Nx%(JFJEM%)! zZ_imzt-89L#!&Bg{Ljqj53q_d;y2)LemEw-ys#!PBp@Op3W$_U1km?GV+;uWvN+^R zY}%ED^ncX*(j{2j;raMR0=gjxy9N5zkV0^v)uHr%*^z7kiUc8A(aZm7-1aN|{4xHn z9RI0!{J9n%7}@$_oBqJq^V`)&NcZX`7;bX*kzZk*717QD`rc7?I@Q}=3gPVc=KjW6 z5)7!l%7=Ax{aF#{?_|;cmKOuTgxJ+mi!r5qJ+2SX@v_fm9r~GS|x47x-Uhk5Th&r3aT(vbk!Rk;`G^dz5T> z+V~EfKFA<|)06ln`IK?4lt~#hP%o()44bT} z)Dyxl`N?cjp>#eo z+qa57Q3DB`VI?Ae3h1J5OovJ%A0}x(4fNj*xDrdydAoh(JSCEH zZYxzXf2BRsPR6Y?+Sbz`NMjzpP4FHyh#V_Wr_ku5=$4?$qgx=Gs?rAA7zk#|-b9Gl zh|A>U`!F#(zeL3e#r1UUk3yBd#^!ZjzYMnQZ}hrflF^nq95lEI!N5cf9^{5>&=RwC zqGm=k@j4(@Yx+8F;tKUVc{v4_e$4x9R}(b+HS$G@ay-U(M`uD6raR>xpveOiLUzx; zp}~3UDtm^*jQNfgiEy>2IIK&k;NDVqHpkgbZ;M?}l{g+#7BCqmMco2&LnMw4In8z# z7|Lpp3!=QPZZ~a{`dD#n$?1JPg{N@Wt}S_Fy;^KLw`nxlww44coW=Q^sX<-zO9DOm zy*i<_Xk5n8tYPf_vJ%eI>|MZfrH(X`d?$1wnlrE0_cM(iS5)zv775U|{pkL>J+*zD z$n@V>8)`{-C54k-5bSUIt`Sl!MaI-mh zSiX*zs!E%)8%R!foM}hb&H3u5%FbzgM+9RlSGlj7gtZ;-){>*Y<;@)#@9|VYqg{!aFfthj8&L{-s%KsCzQ zaqA)-ZyuQChbS=sr`Is$IwnFnS9>{lc&FGn=F=A|HEjUBAGZgSOMmJ|AVt#u)v%nv zGBE+-$UD2i2Wl8=<)HphE=jn)FRjN9QZP+$bw3-}J88&Y#mtV? z+ULm#&CLv@x{P-i;oQN}M(s|2Lwx47i|ZnSwXFY1daGm5u3pbBOvQHp?srt@%7ED* zyfZcJw?nVjqSFN{CU>Qhv;>XdsX6K99yi4`i36RlMEt_<< zuDYAGGh-J*wvG_S^ro<4nQWx8i{`aJclmP)>~7k#N}cL{HoL*^Q#tRQfnPGsIWo%G zr8itn!e1vzNe@+pXa$UZ45gyhway%hb^f|fbtYT$9vOT0#?xL?oFTl*l)la{S z8T>49Zf(5FHuvY8HvS-Vzo{hQ2dj#0l!V-fJ65bsA8t%dY153g#r&R2xg;*oGh0{n zV10~7rn#|H!b^nNlDs6w>h8qVX|Gpxl2GH{dAeVo-3OOTQ^X}H%X3xuizL%rRLPTt zZtCW4%C=PrmCJIbJnYhoFO3PT*(EPPmxh|aDQmb6C47x%szUoK8;CT9cPpG=xh7s( zbI|LNgXL=Y6xF8%D&%q_b7@M_*Q%a5rHe~_G9!nrb5PKj4CZ19u-`g&9LYW`R=t@g z!lV~HeWiJ!-z+-KSb}&cnrsHou21q1&CsU^e&tcO5y7X}W9s5mWb4zGG&5 zRt<^A%j~9!1^*UAwa%>c=P!tyW6W_@4XanFJ6!DxXHe2+KIg6Ig-#DgB^=mE=t-B5 z8C-#em4WGnio;x8_MI04Ck$+!Y}-5& z)*K2@W1Ky69p(&&ad_n){$-{#9=`k0YKgt1?YY@c5iJ3hX!+$Cu{K217M)bfovY6h zZd$FTaOm9Z4|-Qfr94cGwuY0 zLXCW(=mV$+sVkKbI_gRF<0i4)&4$sV+IRK_T_q28^ev>FIobnZJzIhD4W32`Rn$JI zCvH#?#QnU*j&=l(K0Q-EjC=jHv`~^XKhQLvArC6Bw4t0pfz$~bm)4AACgQV*8*&JR zL93eDcDkKis!}QG;nRZuV(cD*MG2w=4PV=~ZQI7Xwr$(CZR=gzwr$(C)o*5ECZ?l% z(aT!qq9U^DKbfC!(XL~&@dg=lSz@s1JOr)SW;eE>bR7$ipb(FbwmzOG< zVQWY=5~JK4vJnpQl*Sun9jYiqO#5XXAGRr~HMbjQweyv6wy)L>^g@W+O zz#xRJv)RXKANb+N2!ux-ryp>`G$P>rgM{x{IK`U>;k zAI`zJW&e+`r$u&KJ;L(SV=Vb-PDlo5YkRr<6>%(}1fce)k1FT0zEyHW1L6B}&B^(q zVtRDGMKV$YYe@ATh9zg{J`%o7z!R8OJ=^TO-B-4?#_m$I}EiMwBrB1(N2gIn(X0@L8?ppyeJe zcQW=oMnx0X4SBk-5=Jlxqw49a>MRc#qAB2Nf?c7ZpmjC;thr{E)k{{SZFxC*>5Mju zlXngqqctNtJ^KvvdmjT+Yorm_?Sh!% zV*iQpa0Mzm`N(-1$%GY=Rk4+&8tkGZ+>KU`#bq=`-0LaDttgVU9}d@2lC!qP>6Ehw zCosu2YryC{_CAXM&&^>e*eDRIQN}LLO3=2!`sM|xgGZKGg}s2*{xo!1@0m@hdPI)Q zkBtEEj3I+bYMp73k>OW2Cb*FW(6wl?>;<+gy5-%qBV`@b{yHlTZ@o;@-n5kduR69Z z){o$XTtnAE$E$G8`^yQOrf;~%qFm!IvT+zD^WL&!XYbe=i*q(U?0fS5<0Gf zR>XYr=ca}f&*gQcE$wq~hgPNDW=@x#XHSkl$YDw6M~`o%8#nAS%9kl}M>e#iE!LT-ZWt?0b+5bE7?1uBjKEg7EP=wYku92 z6`+uWNf8jE`>1^#ns;E&le3A(g(?FP_!`Fnoj;6yfa?IF%#Do5<=yzI{<+jDvLu*b zneIXqI&6Otv{(ewPc}_*Hgw2x0LDgJ&_}78M zd5o1{IEy|O2Pia0KbL%bP3(~D{~E;9@&F7s1cMWiz~DssTn@FoxHkX0>=OVcSP`sh zjm>KC(>KoXeISFlq`erL^8D2irzo0KXcUt+5jDst@h$DaWk;i@?e*T*AL-24J|!Bq zuKzNSt-8~N52)JciDDON4#8F1cPNozX23!1A@u-TEm6C1FMN;&@c`A$@EgnxTo+cl zoKR+B@qL4~9;<*)v5avYwu);L-Lcu_oCQwm4E|OsdA%+q`cPt*lahq61I{J)1zpk@ zde--L>g>E|rB@47MVBUG7<&!>q&VJTdjx@9Vu$8B(VWDrMf(P;-R@{I&{|z-$S!}C zJC_A}5i17{gq82HH_t4;i;c&D6<@L5F}pTrH1sw|ioM5E-ww4s-@x-mO^PJTSLGe&@Bjz2#A?p4@d(DS;JGFjFaTY}8|#?&6cMPtey+MX zr1T6qw)mFAlid~4?DqSOiL|MuGc2yNmto*(VY{!6tFL2-)N)<_;3fsEiKm-R;e z;TZnv+uS&L(Y23-U3i#*LN&5gT3Advg3U->>8oc6SFdHzGHLSMc*)y5=gt*`me%FAfZxsP;c~0x4 zrLz)NG*}NLd7?tK8}jX@MpqV=uI=@jz{efMtk;J?`TOo}Lo12$T_j-oZ_}K0lKmH= z+meB3g6u}Sw3;j!>GZJtsP1<77{?m#G^+(4op0;&ARXIB%;mR8e~JR0l{+Mlzv}Kq zdGyc2aa*B2DO>LPKGe>%`Yt*V|eS)$h#ez7yo z4m^K=A6zkkksp0D54((KDD%CwR&?#G=&wo#T|te}ErRHyl;_zo$vBwARleZb0nJYe zds`^rSba>Xc8|h5hdqEOpRTo(n_R!jJh2>w2%5xk%*=|qFT5a_1bGL^3uTS4_TR_G zHMycSf+3bv_uZtz=Ol`a-drK6GC0$~?lJD6d+3Hn>rB~3cP${YwR1)K-0fes?tsb4 z$F6fS32o<%Wp+0ET~dQ+4?`KxYZWn-0V%emBa-IjfQn;6KsK^=zN+^i-&diGXn@bk zCupTi^W{yqo;G!>(BAz4G-=)Cxb@q;BYH^pbkcstLVaTr3Ch9u8KJPsMW(zKj_VxF zE+dZ;|7V_;zXi6IFav(7(|#6q3~Y>QysxGL>V%O?ZJ)INPd zg~ZvcCMpG#HWaK^lSi>U%WV%=*!16AbOa{3;p=0zTw8PIKV=FCKW7GM`34ak9-HBr zo;rJFZEk#}@sI&n;R6sDtXc93)K0EmZ0Y<+9%j`GJj5*grwIJkH4{q(%&Q}+-yyZ^ z2J&%*vDk$*B%-|)#$QNm`3X3AdwHBg)TsCnnmh$A(N~-)55y!$6P?Y62qOtvgC#zP ze1CX4#5=TD&&E=ZcV10!JnM<%lCAWFW`UQZ#qErk2av4jBh<093o| zXYyD?9;L4IHFa7r!tySf`?e=;aIzVNl!h&_`wD|h#!Fvf)`+XekmCBUfC(!Az5GV< zzLb^_;YGWujPJD5Ec2=hrd%*LtePf`KT9e;^C(Xf-R&H`ayALNbeoFP+YhjT+VoWl zZTHXBTlc}ez+re;cpoG$vfVtxr>CbRHlUl)U|>qvFa}=I=q= zqhaBjTF8ar#c}v!sjY>-k_}qn+N0g_+7Qht*iK zQfH%;WM?CTr)js&pH>yeE37-`>9rTbJ1uh>m=CWGc!QW2E+14sIDxzP-zMp<*l&;! zTf>t=dB$-~Vp5!)+wajzof@`QuBgil40$Y>)r!*{MPl66wmQVq!Ac~p;l}oCNVZ{U zXy*7vDs%tnUjL;*ZZ?!NR#=mp_sHe2`@#J4_g=e&YM>T_qZQ`7O3y@LreZujVhtyA zz92ZbwIawQ%~IkhUTNg@ehlxhnliBA4m8iF0U|pH>y4nowH9}lytjD2LbB7lZPv4Z*toKjb z)$9CQn?}nMm{(jE-BPAaS={Yk)d%quWkDPh+c1=-NVl{(te>fD59?X%r|qtGfCPld zmWb=q6#P!JU@|$LMXt=6I(U94{wtqHiC|DuatOt3mFu0Wd3m`fTnIedEATKri49-U z`{+h#$gH5`@LcJEx8^LjrHT;qyVhF6ZSb#(}up-ykVPDXNFDClayFYbyawY<{X0vOu^h@X$CX#PO3#FiE+pt>$@!=kJ>4%mcJWT*{-}`V9X%lQx;Z z;Pmo2PY?(5`|mY_rzvAWA^kSLe68>WQ+e&AwrgB5aiX(xXOVQ!^5{Ez%2==&wD}_P z!`T*#`vNH$0?;8|Fw=2H*htU^@*R7`udnR&Gz4man~~cHV(e56qQDWOHU)|=)@t~} z`Jw9C?{<25D72e$F->q!8I(|%*tRz}EcL^RM&0V;W%K?#2~M#Zz3lhZ3(zga8r_x4(jSb4d+-@r*EcPlrD|kgudY= zu4MIzRqFe_L>>M=6VH~#nm)Ip#8X!lm3I@(zl%{9C#RTTa>N?XU)6ayJ70_sNIm#c z7I*K^;USCJ_Cu{K;u@AUN`+&Lcl($BM*eh?Pg;W7`aN><{N;7Ms7jrv1wEV>j>AKz zoLAXyV%I{V;hQ7Z6Oht1@RKMNvED#tc6=6h8kg6H;BiVgi9IqHspT%}(AsWz`4ks) z6HUsMbGJ~Uq5lX-=T%xuZ{bbh`O%H$#y2cCH8Bw65q2Vs>*D~8W3Q;`<~FC-@+>ah zZs2;NSckrLiRL0rPOBM^C=__d!_kq+jbc6x91|TG(oY%)?7R}qs$7ubmzNi{X63q&3eT9p5WsP+?5cbYw&v4ycD9luI$vK(&+AuUuhS z^(mdJKJ;wkQZ7}w3M%<@yQv{9XuBNhnn|3c`hAs%AtQT`VdtC9)5?11nmOuwdqS3L zn(}OrOVH?LO)dwuK0rSTHKWHGUdsF;$F3MeM#zOxbkcp4;9eV5S{lGMwsiv zh%W37In_d?~to02xh3dGst$1KueAmbs0-tcoz`=f2aZAF`E z>d>hO=wbd@EJKheP+s%9q(?d-(Y{^l`b@pfML(81e@*+cu=yeX&x@}5s4d`xBEyX% z&(EsZS8WqYu+EvK?^J_q!-|&bND>;v6uB`mZi!wyWTcw63x^&GF(fuFoE6s zCxm{pAuxcbNHB+ACvY*YpnY8mC`!Inr3HY1?VjJj_whG10>;PY z`oIL#$(b?WGl;MaAe%k}M1FbxNX(spJrGU)N-qp80UbkeZ%7s>hM_?O%UezxsDPj* zwthg>ZS942)t)|iFmx+4#zUo0uAV`B91VPPY6vG+U_JzTm)`q$z&-)>QKi?zmu)35 z$_d=_k5dbvaJ7wZivIP*P!T*RcV}So@lS(*ko&KG3jv6Le_EQF1PBBGC$IpXsw+=# z;H3vwfG@S*;MkW>caFX+0JbqCfnFUf#CzE3wc$P(5W!vzf!^(J^;>H&I0#Txzbb@3 z=@=T!@FzJJ64?4zLPAbh5HG+;m&5@eU{|m2FJ}f(y9sQN5YI2;@3uA`DzS_UC~fR6 z=&v{_G4LaRyAv-Wi2Xg}9gu&QP!|BqkD~9zypk~3J5EB}x?nl@jSr<^3`Uw2(SLSh-?w8&5H}c_^;LY!}Xb&pjYo*~w z@fTkcTAX3%k)AiPwg!Uab=hDH(*LLRoOv$KK?PhRNC)>c;m;5_zR&K4m z<8;TiDlK$n+)^=>HhITqte+F4wIfNA#Xl*I=nJMIP>2L{tyhITwPa5m#2=qD)nkD6t|IEACMoL`un1q zl7G>C*#KE%{!Nk8cR=}}*a>GHfKH+r(A(U*>9=x;DJ*U$xG?QjvReTs8ws@P+Z9f#&?DN|I`F_Mh*PgR~D6l`kT3b=Er zu@o$|Oyo#w%EI7qY3Z$T1+3?4C&v2I)j^clw6SD3&z!DO{Y8}*nUiZjxUaq- z441UyxXqcaCaj`B<;3?1Gqb|H1-%@5Vv+gVRT!XMo_=&2Eqq9mUbM zDLj-T=j6%e;sICpT8fh{8`=vH^R#84kH6a*UkpR6S+YxIRn~r%)!my;QRp6}4C(tW zlKmoI4Oisj)bX=2>84P##m5Hns4nK8r!kr@_0PuMU?wW@M%^#Zzv*OjEil1pHQJ^en4H+ zy?hrnAu|B)DZ*xOVtNl^lv+x+d^AfG*x~I;0TiiOrJ}o>^1Uu+Mqh>@7r?hs_S<5h zIxnzVsyfOLt^DQ3DcPdGO(pA9DP0;0zJM`fj-iHK2N%^j8Rqe#0dOPb@}FI0Tc3++ z_5*SL)(@^WmZ@*@9SVz>nyoUfbNet`j=vSj0Uxq?BgU);?S{;X81A-Wj{Lix>WmSZeDRdb}oe=Y;de0 z#e_$R0QL{-t4Vu#Ka%OD)cJIxH$NN=)L26ySD8F?@Q~>sQ~h}q9(|d&Vr*Yo4Pse0 z8uGrcqQVgj8s&33%;AX4h#2Nx1kcbLSHlrGu`&%DixbTCfS0h9a{mzJ;Ap4GYh#b# ziTb1rKFMP3Yy}`7;e5Mb?atg4*;IGu=F#{N*nJe6J#PSJ^jgM1{@MQG%82VV-W0MQ zC?O$q&PoKdl41tFGl$^8es(WkF&6z;gZ$x`(IF@w3O1jEL`ube!GUt7wQpeK!{PDg za5iKTaDHLm@&yrj5YO-eNou)C=lA{snCyGoL{%+JoR@iNw_HZu8v1^cu?p;^UM%pC z=>Q5??>2S5|AI|^!+kg^ulhk)N62bXCaYNw359RwLaMex+&D8Q7J(>F>hHNJl__Yr z>#(Xw5w88JjuC0U-&0m?V2-z2&ZR(&{i290_7<@JET<*y;TU%~{esIm#-um8Q*Um} zC95dMN|hAg#%q6)ADO*}s*13E-XBtWPCwFD=k$pU({%DOehbdK>=RzhM|-@#f42cr zc1&Qr31BK84-GqKN$}yR%PZ?%pNO-Fe(d2nRfdWnptZhL$W7am&KorQ%=FsU{&@Kb z8|c8}ua$_S=!X~miH+z_UJEsY0z;HEYk0`SqasXme}Re>t-V?+g9YE1+ntk*3lW1_ z1%I9wow@CK(RCZXAqt0SnK0W$p~eJ}oYAtSdo2)vp|bUv5tk^2>KJX8crd^2mD;R| z=(1yPYvJ)wijt;^{_EDPuVW-PJX>cqw~^feSiu=0j?pfI=@1ALNhZWV;&C56hX$Yf zOo67a)3!}3a547f3h#9~P!R*VXIaoQ!{I4z8~f70oOPUfv0Yr)vR(d}B;nfGwQDL(px?~c}oDZoo*Y9q_Wa~V>6-9_a*ZIw@GDQdUQyr zzSQ{-9sMq&{XS|9ECjYGj1vdrW8QkHg0=i=o<(Le&@So)XS?VmXjaKkf}5MsqId~C zLbf}PtdC!x0WjzKokV!4ZzJiF25FBN>=J5nK4+kkcEw__C*Ye}s)x)igyKUO>|&rv zR4Q2ST++46!Gpr5(F3QIbuj$}SIY3B5nENDQoF?F+5?wN_I7UyyCJdpvAIJH4Yl4EpIac*xLn zLBT(B&GQmO()X@xg~Qc`f@v38^&@YPA#<#ry9^bslQ~BPJI}?3Gk3&jPr0K=+vt+L z%umOyz!rzXT+<=Ni4xJ~&z;hn9#AFKnd_rt@=_(-GH>TYEM(o6b!YFla68&Y5ZS8M z&SfetGZD-f5ca!PvkxIf6*ao^3TRxtTXQnPW@hv4D6?cR2sZcv6#1E-V3t_+3b=~k zQ;568)I(8zdQk<)M(h(75x&h!8Q6kV5dU=T!|~Cn2?r_u9q?$pQdylVTm(X`#bx1c zv8Q_K90mw+PJyE+3Lo2)0dx03V7$NR*|EvT&3jiq2ejKMtmp(%ksTmM?(PoMbiWJc zHe6vyR=YR_i7K-DTWKp1)sBhZWaItKdLxY|h~gS9l=2pO(+8Euq?XH0PBv>rF+Hrq?$4YxP00t^q??;S((Nh)Heq3T6X^UfDYatgHv@XH+5&g5D#u zI}@y4lg|)776r)XJVgcykm?hB_?umxAUv3$8>Qi~!kn^qa%6T z(a4|I-eP~wnZ`lbQp4^0$1)A4lDCzS@x+F`zhW3~vs!~SJw!Ex9>8Q)U83@oj=Fk$6tJ~A z9J{26B^^QKddl+u0QS>KKa)Rt);RN;!iZ}ivzMxLcFHL}uxNX%eU6;SpWmeUSXHW!=Nb+`aD7oJagrbvV-sn4>TYF@oLb@V?hA z$`2QLIC6=IR~!RAPqwIFn|qTidHq=1+%lI88W)W5mL;!d?j9l?lbGSf-n3>s-fTIZ zF&^g`X#&j{&yeJtt;h0i_Hlvac^93*^Q|n*kj>NS0`IvGHV977I!N1GK6)O+LrJX& z^Ii=zuSQfe%?dM}ond?`feqgAH2(~sz{8!Wgjv6X$iKKlJ=`>-c}8535iFTQ3IDs0 zl0jMJlbOUB4?Vp=W1O#16wE4(&TuQ>nA!83@pVq)GE_+r80mlFED-X@0Z--tY%;Kb zJiflRF0lR{h>axoaS7Wg2g1vdl=brn+B{+mc`oaOoa) zG*rFIvg8VSg4FwlbB%ICMaf@xO16obbIMHnTbb7qF-#jaqlk%A8F=+Gz z6E(U2ps$IVz5#JqV^}4w2iF^~$$ljBqmU}(Q3=CT@>)su*0x| z?rrr<+78BY!L|P7WFcXWZb%QoEjDT$7e$%=o{Q}gq1k|w?nYSoY#*qgN;Q9~8a+%* z`GMFHME!RXHsL_XsBGSa_MN$ZUATKtDVyUSX~|TO*T#?7lg>_P_U{>YNzbP7gYdlX6;N2y|1rhS@-r=b&WARZK zrFK=`Z0WmxeVf^!md?q66l#gow#wX5WnC>SeAaSnNOW=~T*!K6 zCgyyQ=xAe=_@8J~->+@0`-3_P)d$ex7>?4)Xj%%X==D)rk(~Gn%uh3MwU%)Wwt^bE zSZ}@ptgA7DuurloFKyy1vP_K&P^$Z2ThHV%N(#Tbrkm&2i};`Wd5MYS597)ym|szQ zt(R^-iXTZ3OKwZAO+sSa&vP5d4s^~+Fsm1dRTWInji^CqRivua2FTAL)Y7tNdkR* z{UmCV)0~Q%HNCBZT&2sKm{Ll{aVfV11$?$hUe_G4e z&=kHc=>l}u1}{z=c3;MZ`&PP*>|T=EvOU49Wf}nkbb#s$;rfqv%59JP-^y6TYjoku zjhe$~PHFT?9gl)qzqFVhIKT>hQ)h)GwSCkY91C~wL~%ES zHOG?@k9MNq(~Haw-$G|ueGI_GcoMXcDRKRw|KO;Q@-07m+ZmSg>qqy%uUOu)Ud$mq zMOw^F=g4osZ2^kYwW8kTx_3QCEOKA|&Glwk=tW>H{f=mnTEN+>P;8?6EGko&yFVL- z2OQ#{cuAZhNewOd5q|c#yq2V{ah<~jZ6+%wqOoq=Y!J|B?2WXxPPlFa9@_~}(>wz_ z!mf{JpPj1o`nRr#wYe#JO*yj;E<%qK@`UIPZZlKw`HGtYTP5@b!wG3*r-SF(4!ryT z6lrg>PIUXAlNVaDCEYltB&iW_SVzLUWp-Pp_IfI%M}QmzZ2Z8W<|dVlQ4I>~zv&sp z7~J?&F;>)@u0x0bNJ3HC?$q9i$1T`piCPcer280w8It!(yk zIk9#wg1YTYDU{DZeIcklHe{AD+Xvk(az2y2v@iHhZ1$n+)k!$}B+6;fP+$Z{&zeT3 z1GkxMDT@Zab$^FesvjlY2(!&ZrlQjui`;?Q@QVq!M5Oz`hoUSof$RzB4dzs#N!BZr z^i-H|(aN}b_>w)28$=7(%-S>A3J`$T!Lpv6CEY6Sm9O1}N7zz{sOVN4ATRn<oN)-)4CygO|lSM^?5 zNwZ7Z@vx~q;6u}!odn(@XaPxgz>les!`7@7HS37!(!}i=<&qPCw=XQ3z1b;{6~JIL zoOb;eZ|Z4qoa6_NvwRxpVU?8TZB>^MDwZM@pCT_Q`7_azmY37qyFcjt8zHLppzss*e%n*SffQ z>!hFAY&K0s6Sm5S_^uZpI%GNUn^_pf$>`j4d4fEa`SDg5y4q1fQT0lNBNkhK`;!Xx zPheL!;8&bxIw-Q7)w^iwE}YCxE?jMV4K`KJ@>1_&H4_99<+Q1!nQFMFb1{Dhl?j5& z!V2VQ8-PU}En(y$KV~W{JYt@)pTPa!M(uwy(t#@rCNeKIB(SVBbD#3H6Ak8?JLxeM zI7ytmbXIK|$gqb|B=;fh@+V4tZo*&!?5}K;(4Bc#prNd0jDAs6ePuFEo3+O&jUYjOzyMo_~xJF=K1Mq*yy8n!q6Gif@@=?G4WsSz&GX0v6VxUqsK-grFz5Piu8rzQZzm8zskP^(`Pfmv>e13Ck!=G z$Qi~`Co-0FoY|mf)#=6gL8#X$Z;}hY**d16PV#(PIc>(PB#8IBORAlP``aMi_B5r|^EJXNgQNdp=}MHx zCzO(v`Lb2;9uDP$9%rnE+(ZdkZ$0x(%Z}opq4rgDOuBkPG8;_V45)s`^jL@T8TRF8 z^iwJN+*coYPLA8OKV&8dIGT|r3##*J3P}mK<1om#gPwSK@x^DiaxVe~nofPy-keCy zo`r|H(g0Kc!VJD`stal~h*}*;v#u9D*cCTwCe!qv`Fcf?oekDeGvwz-AQhkt8Z0ufiJ*^?f!2|Z0ndg=N zP>*|AJ~eNut~jT8o}NPWpHDhpM9p+#dZ#=Mk7Juw`ZrDQLv%RH}Ri-yJP3sXc#?w}a6}|?FQ&i92j-$$(@v1~y zcndg#M&?jTyEkZVJAJ?P((eL(Dg)%Z868=j#EFR{x9mo{C_RUObq|ylFZ8d|FjY&0uFX&#{aG)bF#Cs{^v8WEuhNS z8%T7~S`Mp7`SLh{S`L&qx+DVr1dt%Did)T~k)3E^M4*vc^#`^k?hcfSd-J(Yx9zV# zznZtzRVi2RJsIoFjb^4H39`aj!V^%YfT>}EI-LI5TSNeuDzpXw?CkX9?CkJp#6@sJ z%Ya|#k;7%+p`8Ny@(I6tCVTqvm&9byjy}ptA%cKXwr~Ih^Z*nDKqx5tCt!E>PSC&7 zh+yb|V}V-ONc#s5cXxXroE`Q9du#_ZR{-$gmH!Jb z0SfI5ss`v?1T71|>GwlA95MtsTNBd$32Zi4slg-Qz_^3p5TNOoPZI}bFGIzEbMM0b zKXwU_@UNokyL15Vo!h^dEW6jc{cZETi3svBieYR4>EsL~*i9gh?aw*{_`m5A=VxaV zaQ}SOUQ|Iix;k;Mcy5RTfChKvH)IY70{Rk20N#^VH&?n;`|zYn=u+sReYa5U-fbQ< z4LD0uU?*n~VI7@1-%)btfFN4@%A4WmQ;q8a2KcgBJu@qarGIh>l&Y<)c87d;BeuH2 zi(QO3#3lX|*cH^?>B$Ki$_b!<4xqlAv{udTj7wK`pP$5@-5aAXKR$Una^D9dXdV6# z*4JCm@ga~SII#AA12geYy{?zxH zy8yuJ?QE|cSzNaXXb_kCchS$OL;F(nl5T}X!?)zyZgLaL6!P9+KQ+wW-u@{VK)VMh zKwunr@9#??VBi-n=qrCqq`Vb|z+0_8e&tiG|Msu1&q*(M5a``*&ys!|E;Ja!@8Vu< z+j~1Ley{)Utj*8p(Qj?1pVxaY%iHe=@$JdpU6{#_%&(t%Jn>NfrQJ`x-nKTrmmca1 z2jJYV$};#bYfXhdb$Hg{Z$o5F{wQXA;0DK6XE*}7M>zSK6!3wi#iv^3SIFfL9s@W8 zN)@0}z?Uus02~4P>#u#Bl8MD{8;dsH=RG{AFHYufk0P8UWa9^~4$l`500Iu&!+@vv zfp`S|9H&9vqmxgOEW@9GU;<(-*)B1INnkE6NeDJ>_@kkHkPA0Nq?KX^;4g zgE#K4pg&I>!rDC4k>Mvi*b$h$;4ke1e}_L`=nwu^5$qQ}9>ktwb4bvyg8QGC$$xqU zK3E*x*3aRLICQOFAQF(hN6@}s`L7x!&Gz2isOVj(3jXC2{rl_+U=VMAs`?`{gY>+9 z=f>Vjr6na5eC+f*dQx=O$E^m3_sPDEEqmLUB#jDYK;@lud2v78R|zcV3G_JV26x`~ ziRV+DoE@u{t&d*@sdT3W?rNq_OlT*B5vx6{iqbe*`Zn6;YWl!Ghs z!15Sz$HSSzUDYM677kp_`qEYflDzLjrF9^&82g8cz&(o5Ka_-plQ)wZ92Sgvzn*+& zY517L;AIWCS`i34bvF)UM+m=&HFxdO;`Z1P7cUJi(hNoHh-C~tc<}HK-valzlyM^; zX^6CsQ|`23NYgsU6{R%JTQ)b(xe7uxg}ISi%;(*g+1_h5iNKvx1z+KW%2yev4gD9xK(^wQL6vQrei#>Q^)*I);Q|bWRHr+w|R3Za#kY5u)S`Rw4cr zvfctL+ir(9DMpElS2s)404iNE)V~h{gGb5qdy-MF5zXJh*1Lbp%O!2B*L*n<|0Q6n zof0|fl-NFEBeG=Ch%2}}+-}vr-U;6pDA_P>Fv5X-E1Ps-lOf`HhX=}BEMZG zRk53VAk{5_FJM$EM-b2VrjC&ryfd8=%lNCTs`T-^(se4_AG{mgBcP-!2iJ}w77d2l z!EL_8)mAiX2kd?Ygop|cQ+AONM@s~5CI0;J_UrEs50ljniY${LBY$b73 z?|^BK%`F)WoE|xiz6CsOT9P@AT9LUx+7;2*&L-Ns^f_uz-H-mD@tic|u4-K22#S>9 z;2piUaNLlHdr{2`o;PoZUHhh`e;k;t`*Nqu`AQl;t$n8*mtE0`0E)fsofIt)nUBh| zAeK{xt&OKBqIu&lX1dDa(FYf$Hl0{b47Y*rQiPEyUiJk=N8c$Ld;^L2eX!bGGrdun zgwdpP(@5w1VJKoe_2kX4<=$Z8s1|K)_wbbq&V~^Q1=EVmnQfYq8Tv4GmKxj5XWqyZ zE665D?_?fKy%(V@Y}LJA=^2H$u$iybP;zCKv_PRvdI2X0FtRn=lHp9tt-cdAN(AtY zSUvf7G4MK)M#tB7lTBR}FnOPP`r z@_`g47AE%a7$1c@pc0xh9@-rT`}enWs*uPFh5tnF8l<6r2O61x=U@*0OOeAva^$|O zhhD0*^l8a%voE4FZEzPPfT87zddYV3;oeo!Cu(}V=vCRp-w_@$^>n%Y3mOwVVI0vi zvQ_I*nDYiy0*h4yyeoY~!nQf{rwH=~i%$nuKXgJ*Iy!NF9{c1~zT{v;?b-3)YoT%u z;|yXDM||Zn;^A0DlQ}sFM%uMKpf!J}WlxMx$`7 zZsXL@w!7ZlG%O6V8Gg`zt(o-KLUhynLWKuoW z%4r;pDYF^)XOrzOV6FJtl%nZSc4-c=o_;su+C{3Qzj-@;+bva zzPTgl-_F@$Ol*^i>#I@6O@ruTr-lPJMsg+@qt(_SqicC${mG;6Jv|BL>;PFva_^%F zeAfxw7YK3gtNtet^VuZ$NVAF_6yp+pAC~~shIdsU!)YGq|3bKTOk^x88G-)=rwPfS ztZ|Jd02}7bzY&xL<=i9=z?pKs>@wW&9k%d0k!f)g-Qa4?uFsmgXxMfy63+KRNfCC} zGo&1o-4|zxD))64gBw=G0$cMQeNC>Ga!lf+LZ=g8PhfM5;;4G6Go5;a-;51tjapM(CsZc(CJEh% z^^*cUXj=4yO_fw9qOX7;E`NW!#jrn9I&z^Iu$=82=Q#N`_4r$syF*7S>E-_SAT(TxDk z@p(K8gMmGqS7WB-x8)61z)0=2qnsQnMFo#HkW^O~8Ntjjz~e@P8x_82L;R(ZQA;%{ zlXPTZg2y(kjT4)@ckw_q3aU{vETpRm*mxv0klU+E<1bnMo$=8{EECnI&)NL-s~nYX?X^63rKjKigEWcG;IOK0|^eme+)MT)M!Sm=1xeX)J> z@&GY6r1Ji>lV_od{xI0l8A)*fVb*oj-S+M8$-hRj9Z%E400NT%O`Nc-5xpbNIXDeh@ga^<<4B6x0W-|Wa$qT`{x^WN0-7~_T=UB8SW_R`)T zkx0!j3x9=t179}-glH5K_(#25TS;jY4oKAyfR&7tm@n(j!nElAb-7@o&SB4Phiu94 zseb|8NnV@8vR6DY_AzG6-y z@i;fS!K{nHKlMxLdaO{ZpJzRYXX_?oqsrc`4`ams^Szk%nID7|GMT3aesFyc zOnUYSSkbtfb|lmsRegEz+1%kZL}MvRSvMe;jXrAxYaA~>>L4B>RrqQ!PlmME`!!kE zpM^(RJ{4PaFv6<_HNgG69F~)sjTY!w_DCq)t)nw$zhTkLdGnxQAUHp{tyc^KgkC8u zv8-cg$)515(g04!?3=0TYzSki73jDiN9`9VK89}im?#cp$h^uDPxvc0doPTmQ+f8Y z-wgG}vL8ZTJV$a#bIHjBObq(yKoR}m@K2yr!g3+BM%!w}{wPvOY zrE|+!_mV5TCLU$W4!WUf&p-Q`*mKG1-%aA_#f;JnEG-2$%+bmCdV~BeX*a=Bjr!Pq&3XBGw6wqo11@yDsywr#6o+qP}nPAax- z+jjEm4PN)_{(8{EJHCT`?%n&W6^zEV#f#;|n}@Y$xVIf}B#Fkmy|w-zy?Jpv#5=;i zb2aL)=CWR#I!|!T2ghfFyT5<_-qVE@X32d0+cBCre@lqmw^}wBumXjab*b}~--(S= z{^2s?;lp9uq5_X`Q+c8jY-AwyaxxoC)wn3XXt)MUH_Q8UxkQ~*;F#q6K7@um-%9G>98IDRVXo zytr-pqbW3yQ+I|)=N!d$vsux;6K#3UFxDH*#HTb4-U~}DCaJx^5Zm2oZw}IZEN`O- z0yau^zOz^1g~s@P=6Ywj%As-em?b4&(qlqc*#KB-0tsYf3aj0R;|&&Zs_Y1rI zRUqAEZ21;hf3nkISGyYAq;=Donp4Wg5wBb~UcIi*d*yex!8nSg&AgD~9_(jQa0f63 z=_4g>X()|U{WgHi5xL<2Na=)JWhK=jGcEI~$O2*h3mUnoS@7}c@tdp$rQbnq{g4(U z2&H>|het#|@2MN{0xzn9QlkWwnY!N76t^!j)T!Ax`6L&UV#=@eigWZL8MuE`SN1+$ zrj%#j>UE@6HFv^|xK~xd${_ueXMRI4TFc#4!Szu&+cW*Ug_He?+b}^8`j)!9^$~N% zH*bXG%Ex%+qF*aI=fy@|kRE6BRy;ljf8lq5@=GH`uHcHbI@81HyNBwQHrg8)K|*qx z4-RzE_82N_(htV!@*Da}VpQQ8NT*kuC6tqo7kv!49;7!RwH9SQSaEJc$N{nyQlrL| zQ=KR2(WCDIjmu!=Ukkb~V({2e{4<`f=#UbNyr5ha?c~4mQ{?r_U zt;TV#p#E3n>lSG{xidf0x&U+IkQD1)U^lR!NYLB^CjN=QQXB2N9hqWju5zVwP<7m1 z8-22d+@3e#14^epft(VYL{#KjVL4Qw3672Gd0;B|7$057U+MT_P|9Gl7E#l4vP>|K z3|I|M$pW4uRFlB4uGeW`$8m6=jOAjz5Jq3P^8M7XrOmFN=E%}H_5$x*4bVRPh zAr^mAS%c?pXK%xK18-?7CK#xSW8oKq-vMpx?3MeJ*1}V@hPZsZKnNorf5N01?MKS@ z6~%J8BEm(FTH~ALY_O0r!h|Oh^3$CU2?Q9_cD5DR z-`#ftFS2KJCo}~5Yn!nX>_l|u7<<$+pByosGitRmkq*qafI(I-H<>w@aVRMu%9)cPQ>1T*QqT?6qd+uqb>|J@_dmpqZ>0Tjv^pW_(( z;gy3ohlIIi_46rWPD6Ac$HV=Y=I$`^B(b}=#h@fj_;{a6mxmmkTO)9tCaO-ShmJL? z{(j~4?`U0R$YzM9tQ!K`0u*b~hbW7*NE%3ICW|P_PzL0Rl-S1eWN#kqpC1Tg??kpx z0ePs{uB_4~icpcEqa?RtncMxCtBROAsI)|#wUB2U;utVum6zxmiayy}9-1~OTmb|p z#B+kr+;l!?11#ngV9!pIT(sRIQQpofia_%neVI_p1fEAwMKXj@snGl^9z}qy)bu?V zq8!=ZmZG2c-pP)Rxh1pm3pNk{4j`$}Pz4lnq5c{ycvoh62g1;(@-)>IE!jv?(@Qy2 zYf1Ur{3_Z#AL3j%K8*E+;_v3(wv^q!c4DKsA$xuYdyx}x9@IL|$B2H+QYoor9?%A$ zh0)SpLbV7p&t*K`rIZW6e~|7Ke@l3VI7ZsYg!X-=B3pSAT1gahdKs%8Ld6xfr~n1Y z0c`c>BBmdD)O2!WVCw`5kxqm+YX=O&{=z~pddd%bM98Zz82&4&xNse5u<(06HFQWD zpSik*SzM%qo5fd)VLy0DJvTL&(p1>)hHtyEdVY#90}6uMCZSee8Co>%t?HqS2xaE} z;!uN|^ii%)mUm}n1JQK`!FuACJKf2UpA#;uAK^jM-P~a;gCcc~(WV1z$k}pE^C%QZl^LK_R_)E#h+v-zdgOD`UYhY6b(IZu`j89_ zl%N|o%l%B@3F!V(x+b1`4MPFAI?apA(8;Gnm=;=PE~jLXa_*$2+^V~4W%&|EB<5lQ_Ai?0(52t zSGa@23`4rf-HXb}nSGTm%sd4A25DNDT?HQ{O}||yM$vtW%5*Z;Jgq&RKPsp*BnsXoxe+fT`-OH_AgU|fBYJ>_Dui%&df#txV&C&+lE1l;$MkX|DC;!H38hzCnk zA3m`3DTun(C^RW7JmpxDEVMDrn>RZb^I2Kan!SdGAE1(sQ@#+ zl+TjwbEWgV2K3fEV6k;GjcYcF^#47LAaW}EO_P+|;@JqWSdin#yeht)69u>sZ`iNM z?r%%Vq%NTuQnD0HEt&ZEGLqMumi&=BlULa*H1-mWzz#>@x+_GIdybJPF|CAW1E0A9kR`&-QS=QqTcKciHA7b9d|%I zaa+3FP#UIMa^jK;Cxd+>;1F;|+`--_e)aTiUw`Z?u^bJH-=(^ws}Z#CJb-f;U{N1s zRq#dr&?kh>vNu)^x+2MDiYHs-Dn|eI?nd+~jNVi7dV_;$PpFIh@UCX6^54Hcl|^(6 zc6~k=sMG3}DpM<62HQap_kiQNIa{U)N>TzxpU7qMyy-xtD3IvIrCI%v=S7YA_Xh?Z z(lyN;UJwH}K{n)gC#;lSxJb5eu~d#Xf9biVuS;9-@AO_K4M&j;32Yj}W}{_@x$5JK zMEs_^nEhLk7A|sLj(h2`ku{)eOf0I8TVL*tl2TdEGq1H*covs=x;m%i18i#ZNt5Hw?FM6A$o;TCO%W_rbvz4jR!mMW<(?r3Dw1Kg!V;0? zRn<9IK9BJH+Qt{&BT%6Xh4^&{xiDEJ!^x6wz**i4uj`A*Ek%kS_t9lwHUBW&wmVhe z)X_At62Q)}ngNlj-u-q8s_D;NBhpdRb2A3fdWKW~PCD~|fLo8uWtiMu^B%6L2jZF) z$6ywMTC{b)073;>IBJLeb#03th>jQjayVPK@SB3UcBF9dBpS!WD{vyECHiKaX$;as zMvz5^_}s?!x$Et`%NRlg)txmiz~udz_Y3u^>ZfSR+Pv&$afUe;Or8Tf;gyi?8!kM7 z1Xej7KVjE^w334Ty2QXqYK;pUOc+%%rQCWI+C2m(&EH2cy53LRvfSgS&!~I|k__?Z zP@!TT5W4+1pMo(1NbJCk(IuK#*cNX2E4w#n9WJ+;xUhRnEQ8Mu^k(n_y_D{G|EOG3 z3=Tu%qmE6u&=d-RGCxKewF3q2L!9HyTfjk2GjB{#7-`Yrnncxu*I?A1?(;y8fikA> z0P78A)A4lvEdlfL@PV+{MtjkE?`>dP+{TLe!Z&ozjq|FRa9)EIY+uPkiUGs$By&@U zBEXjJ{#R7LF{kj*R!q?(L-PtvlJ>xzP`r4_oCP!(;_u~i-NoMrRr}ja2O@~7GbhA{&p|RtlU^c zk>L_3KqSu73C2rl2&gMP@YB+EdYghide6!2pm3C4$<$*AcIbBRc~7ium9_p9p4Y@m z_1o?eBvK?ZGysN~x!U5X^k?&hiL1T!=7UWs(p9qWXQ^7b<<% zQ>Hp6{Yw6|e_n9X4ZrIbbI;-n0zn3~%7ClYbw0aeOQqv1EJol$Xg7X?!}M9=*JEQ1 zVl>*Mu3Kp67o2-c7a}n@v(l!=0*b`*lx4|bt@+9}l)NC&X{gKGh=f0IS_-9(>D`xS>5QC?j+NY-7K*q?<0lSB)N7-W>xTw zU5YbcU#Ps@=$JjUBAL{8W(LgSgZst^wy@(ure9S2-xnfDz#8x@&&ddW>-Jr3`OWGC z_+|bWn~GFVdwFO9vHQ9p2s6qn3wqHOAJ1su+*HNIiJ%G9qEBJc}KUKt~0RsuVm zBej|g;y9wqXokz4zVjwS*PZ5dv?cf4D^uLQkOR@PK%H@I4xkbl8^wGP8s2961)c?6h5k z&ZEXUX?mYnj&rYYGqugJtI@wb;f3y!tU1h~5Oj}dR94;!vy}sKi$)1S`0e78!!RPz z#w>(P_vCPulrFzUGojzg;v+((pEzfL$_rxVprd}MZZ>|xye_ot5OtEHpZ}LK+|5(>f6X=m-%8+CWl%(YJl79pMU$W`poE! zFqG~An!6U-6~ftNMQID5+pq2Quh{AfiKIC(TxDXKeYcMRjx+KYUa>MNS}O8hqz`xy z{Z5XuXZ3e`3+NeY_5r4oTLUmwAoM)10GqVkjfhEwjJ=r4@Ju{Wk#QN`Ov}QGXTru= zjCJb(c2)(szFKYvPFGxk8(|w(%+k>{rX^`-anKA<3@4#D&wsdVM1gOb2m3{xqUS#| zU4Qtx#cr%x+UXe7H%*yJELW+Vh-pGW2~EiTnr`wVb+%MW~!TVFAA)cdWywv^}YtBalo#u;5pgu|n9?L!IRP+$Hz zl2Lf#{n}XJuMsl^^R_nf1afH%{8<{-$2Oqj{tRuL{05A-tnZ!dL~XPyht2FS*41HV zu@jp|VGJ`p170%RsJ4Ag8+6chIV4QJmwK;cNUO%nI5wjM8_iS~s;dM!^^a!)jWq>H zyu$4yWIivOe`L4Nt*8Kr%#0El5RqFcz=KQjn*}?OF{>11; zu$smkBu@jL9B192O((@DfJnP3t;)ZRNM5ipf6Xarfc2*tWXH!Z0WM6rgf1wX)Z7BP zIlQ$Qjt~`Wy+{eV3sdxy)x54+!p0tae|gp}q5Ti5G{*n+Dvjkg+yC34{WCMLvHb__ zTj8F_G45XVo) zPLWqfDX%Uls;(&dPwzlXO8SL?6r2K75wL|MpGOZ_7A)A$@CzO-DG~!4sC8t&K4=nqy!V5)ufp!*vwKx-O5(m5Up_3`%h zmwz@RAu2Zg%mBh8zy6hf2m>ta6?`DDFFI@&j7!K@4J_#HFYFBxhF*J;B)nyis1P7~ zKNMhKAwxU-KjM_IaDz7REc1&%=k0&vddE0>p+5iebpt^M2K~UljC`08g5IYxV*(3s zbo#~XLXzT|huQ@IJzbyr)#a%B5Mn}oNq}-0$p7}O$G?N>Q z2MpExp#i!$B{B;dZs#0mQSqI>OZb-$6E_4b0!BhgJWK+_poTw+i%*_aZu?i@> zmBUo?&y9r{2Qv?)0X`0`3*6KFMF6{s2R>M^rSHT0WAXX|O-KtHL`JbSM4H#NHG7=;>xOmV%Az_}s*Ee(yg5$Sw={uXQM#k6V@>}fJrf*0f z#OsZ^tHST4e!tD1uuVyEZODKRq;Ec{uhfYjxjnwZPg~-jo1p794vsG-$Df8DKGQnp z{;>-LAPP-(+CRUX6xta1zuA{ypFPc;4djC|AAGe~>-9GYDT(%eGr~Yd`UegA96(Ou z1yR6O#Qqh$^p!eh|8wuSn1v{w#tR+z>fXBB6%_P65t0cABf0+myX*8e0Xh&p)BB<# zBq%?d>qt&a4+L5`rw{N$l$9lJdw50~h9gBiev=yG7eGV~9%}z(&-xB@C2#(B#t3cr zhze4)-)2rfj0DydZr#8a`FnNnXW{wd_YYeHBnVi({%_os+Fl0jga8JL)tSCeoB@Gp z$ReC$TYhP1%F_VRUF>g^H#J5?b{6cD4=Kks$sf(14gq}zIZRLn=J0^gkl$U97Q9u8 zhL4D^Ov0acN>;`J?yf<B#qW6LcG1^Bqy(jE#7q-Q^Aqq2XwW9W z%&ODSV9uQLnCt9vv&fQ>a4M4)I${WHru)C4K880VxMPrQ(yvXcESMZZ2%^Kd) z9^(#k$o;y$&ZhbMC#4^}H_ zcNS6vi0wx){p9P2V4sP^)`P|wzs*zi1}RZRAy|Y4b2|_#ROMK~j)|=sM6Nh_s)<7x zVID>AC1I=a*Vfikm8WdHC3X$T$^N;QBf>sX<2n>G;iKUf?wb21po4cJsufqP?1Uo5 zm>Ih69I+&NgW6uv8B-q-ej7k-C3mi2v*-10QdT;8?jl|IktKB8*!E5!KT_^LIupxQ>VFje^?xrTRO+oZA*T8QPhZ~DUNij_Il2<&f(2^ILEf$>G0KgQT!1Q5U0U0 zKU^-<^Jd0qEcCL~cM@?t2XiCxx+0AY9L8DM{kexHnIuxZw>dtj;ab04{|Z2ke1`D| z8ur`H6}o5PybS$4n9jlO`v{uyCWZvIMiJ&TF(F|Cy`LI+8Qtq%eCH%)lJ{=(<9(bF z$U2-+2N223V<-Re3K|$K2$ye>rWM(ooFkUu?pfzF2`}D2zt^C5*l=3Zh0)Wbja$9}#~e9zb%^=qEN+A9$9l?kvGj7I?Ey?(qQ;UYJA*n4 z&7Ti;*sbuF{BY%tVQ55h;!D@~C z13R|+!Ois4QtC4P!RSu>rT|jx%fKN7m@!>$%n9`)fy4mWlQ1FgW*nK01>Bb8G*r$E z668o$n{UgSB6dH5EARdA@`w1Z#Jm*bwC)3|yy`#^g45xmT;D`IH7VP4DwXwE@ufiw z01Tts)aGILs(Ftk!jB!6lpY)UQn!!Q6Z{=Wr(p6{iIS7zP%D5pF>26gD{{mpwODAU z+$o*uqtdJCHWmeV?H@yXFm5#SynEurFb8 zqZ^(R2t!bc!;0S^rwy*xl)N3>qNK{Tf* z{xXq+hhb}f?X;kez{``{9}pacg3WYgVl@{1_vK?YNh5668$DYRF+@C_0klvow-Q?EpgfuOvr-qH1t}mSv66KW* z)Nu(>R-E^CDIqj$UOtoyx%;~F3TjnG)wX>NocQ?ylCeHEf7d@6E9hB8>%-VG-5OGs zhU*_sgEugGa2?T6xDg5tiL&Ftdd@T}>9}9Ax%=1X(tEvTSY=pB%D9u-&p#EmMwDQsOfk~JSZ(VZ=Y>kD;y$DfFx$!`0{Hi!Uk8T5{rSsYpIn* z1Epn88Km4`!79&*sSW9_>adUs=-g_re84t9#ty?F!82+0_+|{Z&EXZ9GSIJbvZiHWHncnvMQIk zkZAbQu_~EAZh~Xm%v*d~@r~7zG&hV!ZrH0h`bh9T$wFTu6;|~+1WMdA1CE#j@5(ZU z;sMotg@u^gpSKL5TehnE$|wWs(&w9WCZC#IMUmNQ6cz?uBxxU?6>sSAq5CJ(stTSH z^ofT#!znb@1~#2U|86Q<6Jb65%27q1?XM;eS#mWp&3{7R6^R!J3IA9~I_3&kh2oAt z{bQ{vGEcn)de}&inlz-4bm5G+LRG_mID)b$Tr(qUX{y=FqJ3_2a3OWNDAAhOoIWZ4ec(Tq;*t2gWnwq{f@v}fOSV9K!HPd1>$11P5owr9oU0tfTPdD+)^_5;*7Mk9`Q{wxx`nr# z*(g)hG}AULEdtilK^O(U4*JS0I`ihcs2&Q+SRx8*4?rG=>AYaJkNAzY8MW?`k2Y7- zUF@AwImvpFkH0y9_??HJU6tO@C56Xl>E58xQFw40gR-#gT8lehY2f zoX{QA{s)LswrGQ_{?D_8ICZKPKG9P*m|n5oN)P*Z5VZ@`R$9b(?Y%F|-E`Jn{v``Z zk15py?Py&XnFx)oS{cL+7;zTFnCdmt5;=p(7%3zDjk*i;H8iWQhImc5oINt$-s62G zhHcSka(Jqdraytc!R)a!RPvnrbrE!A;DH?HJjx3i)#;SZQSSSKrwh_H@}z{ul+?lp zVX}(GxbP(P&+Eh8AAXJU`0T$h-M{E7aI!j_j?+U*ZSzb^(O5lcqd0a%(O$sVsWgah z37*?{jcIyT=w{DLa<(wJV!mDvx%MH5e7OQp5S(jO-ysOp@r}s3Y!Shu#$?jkxLWU2 zs%V@rQ;3TcUfvKh*IIAsILohqo+7~g7<}|v91iVTom38U9FiGp1{`hjlxad07NJ9*n zjxC9Iul~Wo@%4O4i1#X=aEeoILjO}xkV{53>K#*K+qa-Sn%kXi;D?P554a0Puf%ipI*8CXl%Z}6;lsRD z@~Qv`qY}tl;(EPlO1jsha__cPO*J3GzG3GToSaLH2rxW?pbktc*cy0NIFj zSnR3NJiRHFHOHxg_dP$Day{{Uln*V31)bvt`fdJJ9Cs7UctF?&yDtR+gbJ~&C*WgT zY7qy95wIeqEj=Pnr=0K&miY}cqgG1CWL7%km4olx@dV#^!S1-0X@ubHmhUdL6VjOu zRP&;Hs;%YSik%OQ97=2QEkq~Bjxok#uOFuGe&0@mBXS)Tt)GiIkJ)<76RWS#iY+}e zCE8rxy|K%(8oV)PCDDp=KL2gRQ*yV8tzMpBt2&Cz%66~Vc2`)CElxDM%$JAs#K5RJ zDfH#n$5P*#&^~Li5+378z?HB$fDD%7W@Dc5eu8gH9TZM0jeEf@*6}IpZmSMeN3424 zK1tLZOPFPA43Dz|Y$^78>6)hD%Ak2|udS*j=}wrRt`St+l(m&pKip=s%}ssqhvQ}= zu1X(nxG{muYn$BoxMYVRtMNG}ma)7NH{77!mVX;N-xOxtg>1e6y(Dgo%f&5po)Yt^ z{_7KBWJVjCENl2zu zP{>2!O3BsbxI`p?zJq6?;H)?n`{1|`R(1Ow!+=oO+YZ^)dt5^Pc_XNG_jn{>ap|R_ z*ZZ5&!=6|(8>dp(f*Yzw*Ww_V+$i*(Y45>}gi92?SKE!X3J=c|*VuhCiAdCu-}!+T z4`=^%a!dPdnP+Xx))miTvlFj&EC?Gg4Uf93*P9oez*u+wkWHo&JQ<+fx-*g5^DW@OaWF?zEicy_%g?`?4t zRDtb|JR1?UxezK-V-qrnI=zHUTmcY|NAMN&D&*{9qSgB=bK)hZ&lb%>vv`qz9E}w{ zAp@o742JRH@r6Vi*ie-XI`#Nc(P&v50att#IWaSf+e=aMQLJoI{-1uMy$^JaVVY+M z|JzG(Ip(Wz)ao#aQd$1E6(MG&7z_+KLI@pD#iu1>6=C1^3S^A7gx-RICyPAJ~9n&OOPr8c68F8^{OxQGsVh=S3+Z_ZWc2BIh?ws z3-r(22MKA8c2kge%kftu^c*8GZH*1|Ngi(GN56GDq=EaBO*_bG>=eFR*pI}23DB4= z)Ei3Gl+J0PHI2r_?dY#@88&HK-*Fgb3m~1TLr?j-m}%u-Bq_kwvYJqffqw@cG6?V{ z7(Tcxy&c$2!?;hr1%gOq9_4?110&Cno#j6)QDi->?^e-I{NaJWTVnXwt7{n(7=YuY z!$Lf(dJ^zr0Vr2H5fPWwvPmQfGDv~-+zcSr?uPNuN@Yn!e9L}aKv0e8|&r;8eh4l_eh0< zR|itnuRXa5W%sC7BcMt}C>h%h=Pp#!-K@3rcHX(vQO-$&`*{D1MqWOTo^&`eH4#dI zf~3;nJ-iXx16Oru9{Vo7zH^0}@lBd2}wvi$dZ#s$72tU)hn5F)tk@Efns{uSg<+W*Q z?)8@IIq2Lef@R5PWu1MA6@`enyQsMc)%L_wszkmqQZd~$?q!%I-h(29GF8{vD<;=( z?VQM*OWs5B$)eZ<1I?TIknH0kQ`oCZj4LbgZzz6X7wL-t=O6T18bGv_?CnWR<@0>X zys@`c3}k#J1gM_xwNk&0OOCcAbRtR_V{E3hb0vubTdO^oXte zO^;P+Z@sUK>!|PMtLli`SH_@8CQ-85SLY^8-Rw537MnG6UuJbPG8p|y7e77ba=5t6 zVqvEY1&^j83ueVa$<^plN*#0fPx|neSRtsy-F1D;Q?X`%vDjHCbd}E(Zj?%bpH%Y4 zyre!O_j|oiz~>nuU+o5kY3l^~<|&{D7lrvqMgbSDp--*B^z8S>W&`8UaYkC$EBueT zJxl8xc_!gtTDZDNz1K6@gZR%CPx-TyipLAd{3K5x#pc;y;#y?QRSC#u5;3UU${|E# zC(U1TP`Xu7vu)y=>l$+RY_E73IgP)XoO+;d91`kJ%{)HDI{_#6+@up%11%+ZwU)h> z=T7bAzKLhz_rOQtV-G;&GvysSZzkji?khHI7uH+66yfWS;yvhjd@tTt4b_SdvN}kN zy2C0%yPkAal)2~Y7`1X9!qJaY=p`>jGI*TFqjVUHF195raVoEY#k!dUuDlU=otkb! z5gB#cdQ#V+awB)q_;cDNU9mTR8Wgz8V%p0wf13Wy^WrJkKEJS1hCSPYfMB|IIz zz~gvh5i2R^I7VW{jC95cva2{?gOp0OK5Mqg1h#^li+;BAp7M2|yP-OmNehK8-x$wI zhWk%my{Q6+XH}`3rtlw^vm-Qd|Fe@u6lrHCj4V8O%Nj<7n^5pYt2ynOi-VD*noNu( zIKJ>7SfdFv-;8*^Tki3;h){ya&F!v8bUPk@P`AQAsJ7JF?4&Tbd^4RIa>bWaA|+j5 zX&!Y}t6a}wa@BWum(!IR28THFr{?(>buZKJL8xYiNwAa^af zs))0DkB@^5$Po65%G$IuRPdQA+n2ic%5N!BNz_)$Tc7kNZqZ_wbvjX8B7V0k`*%5> z-^0r(8(Bt;h?ny+vjWr%P{yc!W+v%rPs8$Yg%kTigVQ4>@Su_ z$nWOHGg;8C&%N>jjD{vMWfl4QEpsp|pOZyUs8sVz6HhBOBY$a{qgGF5pA50ubXYu(qA!S^Ohy0Fb_V}4L#rNW z!>^)s5oVLm1`LZu#@38YP4ulP!B3h9b4`c3)p!#uJ-+7Gz93ulnk6!g+~MMFPM|BB zpv`oBArBYvxjtSYk^82PyHWL1*9lQYQB*gDMSKl6T^EVvly9~sO4h7S+;iP@QGq9s^FRwFo^_NFcWoRZ^1Q&?0r|HGTwUqg&h-4Zqb z79NC=MEtyKJy<*Az@=2w?2@8)CmjE>jJSs$y0Z!ygQKDD4dMCXe7JXNkYsFDei}=U!@G<>7W8Av)3&h4D4g)vM>I z>j>tEoIa_|Z{3T}>5Sb$9O6VQ=7n^aRYIA>L3Gk=`cx3Zx|m8sy>LI;cEJaoqDpRR zAPPOq$LO$B=7e2z+tV~9&no*};vER?pq3_X`jAXA4Bq^x#A+RGU% zaJjM&l*ZY=E@U^ok)E779`oiTp)0+9b9f%Bp6x-JTa!odeID-3t!2C~aDs4PDsmjN z67KXHO#Ni+o^=;gYciCV-{f*s8xe;Vr$@atgrAG!AwMdV%zHI3^4dy^#|T4JP%&pz z8_84ztWNO(l0DG7Z@NM^B{TnRiR|zRwd$XSd3(=_nRW6EFhu! zri@>nLqt~cr+iz@4jd46c2wG;b544ZS9?+Uh*ZzhKuaEcb5yxf2)j?a>3nVK;qG`Z z^lCN>;(4HGa>q+7+LvGZE^9R@)6vhmH{VHe7O z-TLJYGgA|y6Qp5#79*v25c^OAnPk2uhml~5o+uv44NMEJF%jNd+~eWO|4=nE{co#g zcIMyz*)%gU{{D}r|G#NwWM^ahFHN(JqJ^^32|69LAP`br)cdIz8YE#HXdhYyLv~|f!AT0dR&oq`6NM&eEYIJP? ze}1Kvv$yYa>kP-mW#deJeMzKzR&vs>#4Pb?VT8X$%p~H%5jcdLo#*STvkYm0B*c&2 z@bI2~c9_7@zk%XL{iI0~oNRu{B*g_01^mWEbbFp4)ra9gM2^+>qeG4;f&{={#!D9S zD%KBTCAx7`My4^q-u{D=AQ8cu6XnMP!TR#wnq7i?Ge8^R501w$f$5^-aq4Lth+ z`u*&VK-`E?1yfkUvs1zH6fp;u`d`y1@j*Z8%N`NIVP5C7)mi=u5FtMLci;{U;h$Tl zQKSH5T0wTL#78xRHd&j{hYo2*HByCv5&H*#FwhChY9KtA^CMuR-In}+?+m$2930U!~q*j+_vt`D^})Wla3IorrNw{UaYwVU8V*b zE^jce2e;%%*Xo!b%J9+vjJrZ_$Z;8ZFN_!f{R>4cbD}Sg)sO>sTtIc&LS_8i9cX^% zM;|_h$e}Lxw95%FSlk)`|CxPsL6bni6+ec$dw4DhUZivV$4_uQ{T-p58!DuavZo8^ ziMI0RXd=LXV{+l@2Iyp!#bv&!rHxIS=(bq)QF zJLK5u8rH`p@8>{1G?YsUAgv7}-F0elC^sJ4t^CuSvS(+Yw<5K;^X->?XQp8LxHl4` z2FJA@qso2a(Tjbdm#XAqtn9l!OiW%=K+P zBc0KGf_(Wxy48zlqey?%af@Re2_<*h%tKay!pvg?ZeIry)OsSvG}z2EPsYWxctt1k zZB4eo?9XmBRZH>#rWLu~`w_Xy^a?zB9g=tIrBB4nbM;wB4hCxa6+%m;G=2iO=eZX# z{?oszo8fECwX_3la6`l9ZtC*8H9N3HxIU+|DV^1f-S&Bbx%+*8VYzmm&-ZJ8rnBwd zyFRbLkCUDs7siUNkf2=;A0XG2WKQ;T9ctXvWLY%hp`UpVR1QXjfFJ3Wa$l^q>bTMp zC82pnp%9VSt?&h71K`3Vo)YcvOMXt6D@WHTPJh+?*|O#9P;I=9E^+DES|BhK+kwld zrf=IKW1qH~pIj}su5!vs=PujWK}?aaS*lFWH1*c5EhQyngyJ;%u8h~aL$Mq*a2@uq z$J0seCJYpDk-Rg{wDzvyFSHqup38H{w4TPf%dUeRw15Glm*Zi+K5PHTxmI8CxzI5h zYG+ra25v67D?A91_7%N1>KOP@pZ_YwnZBI34Y}l_vfFc216TI7vq#}F&z06tak^=4 z?lTHRAsGQok!ia2U}n9JIo+YX(Tboyd6pYivPA{jUaXGS`Xcm)Z$1uOPk=<&Br;9qP19D# zi@E2_z1a{2vX>rdOUW^;Q_j-?aB_}#IWcL-NDcG{o2>>Q?b?6AcGfiT#z@C_Ao!vS zTz}TlFJR)z(~LYl&6ek+OGR)HO6j|iB-)a!&&5AMYHobvUsT{O!=W*L=|kR zJ;UQ`RHylUNb`|N+d6HD(RyDHGr_wN=6Zhb+~Jc6$5=ZT+3PIm+_cb51n>q_))iA- z^madho_ns)Y=UU5@D;;$k3FQZbi5hq+ACE|GINeYCd-u9Om-F*tGlPNzB9LlgqH4b z5=ghM+HAOHY2{jTnO*#{<*B6lv$VS9Q&c-_0%7njDM9Ccs`A7|-ZJx7Kc;WLWVMLi zHabZBBP4zwg$dYkbzqXz4HqVwE&tyMsP|F|P{&+RyCP6XVo7I}g$d(G47iZNFZD2T z^!^;6phX~Woi^3xeDr0BW%U0aQuY64;{Qre_1{wUKN(~HHB}k^d#ZXWqqw4rA}XMx znWKqpeGwtLCxZG1P-5a!DT~LwkVGb?L&1_VGo%-V>xh_BiYIH<_-~@Pa)P=wE*P!;L@+5N znh+#;pE#mq7!(Ki2oQU__BB!J_@($7K350Tzu^U1C@>Pas6Rz4!5+?EF!W77#J?i; zNkM~t0F($u%*z3N)YO6$e&IO&u2&!if09*hit;UBAnlk0R2gYuWaQl&ysni{3`E#2 zo~u9}pdb?colqw(SqU8r7HBE7hmEygmK?}J6Y+K&nl%X#L!+{(L%@*WO8jBNhHW)p zU4MGo!hXp{S_r4KDHlLVSor)6Se`{DEDIBz7~KCQ9smp@CzwE4D3AP#0x7vq2-#oU zL`+H!j4K%R%N8tnA2NcLRS;Ra>a(}nm(YtUEX5RnFBLhaEp4DkAni}=6;-f=Az-N4 z9PEYJ;a2e`5V`e8$)Af!WLJM5>;I?=b8sotu1f^;y*v@4PU(5T;IHpS3t3=pPlT)? zOPlnD*kWEvMlJOWT*deEjVNLWjX2bl`2yqkO(zn-r+^Ee|2mj*^%uMa-WubtgNp+= zJ?)6lj}S&mJZXdy3`U--#yj9Qj0hTKRpm9|u1>{kR>X`XyeCFWlBHHF3m#?eWoL_$-U=tkH@BN?(nkxoL)5Aj1T*hnrKt;g}s7;ZH9d5g#R!Z=vF(oUWR3nEIpP_H^>b#ikx=PU>Vm)~>zuu+K*}v%+$Y=&c4J z^T4!>qw$^4FJ2ndJhFq}(_3ytKGNNDD$??GJ^CV=DYLnQ@7e_<^ONHJiU$a5!7b9R)Yg$?Lwx zX}?2$qJf9)P^`)KB%TDb&=kosdi*}T)7xUZyeiJMcZ{xL=wQ~l80WcN{J4L@f!}ol zyP(W@YCX6h(_+d+0q%kUi?Cs=A}h!PTe@uIX!KPXY1R>9y*a!$?2jFjO3Cna;%wA= zH*qrT)~!kNIax@sS?Pq%P~yqzfa!ht8J_K5F(E@2?_M=V#8W8csXmZS8(UUh(^ycH z;c$_o*eW<3m14g!fIcOsH0xZwUa1woN1l zMKS+c54L$n;sq)@8VZ~JiKVKt^}-!v%Mz2Q#%liVU_)`Nv<4$d7kZ7MfA5?^MAJGv zVtNmaJlJ|h>ck!({8McEC%U743Qeje%Zp5!x2(()8e%5m)1(C!q}EfVJYfCoU618P ze`T~+cS64+IrN;+r3f4<$;rY_^;9CW^F?2`n zMo!mLfE82eQpH7V@aOb`$tsf9^uD+#Jl3Sp;5oIq)KNAUyM0)kz~v?CkG`AA1n1AVmU-^sXRXBE2_hB3(eFBS;ev1SHae0i>6g zd+)n%Zu`yLKi->pnPf7P-S64+-PzCC^Ua<)=a_NX()LpKoHNO~cv4wO(3T21@SE@S z9I9H2i>G;p>>F0c@+ZR?(6G%rbiciR&$A}Om%%r07DNxqr$aO`?rkF5-zUnrAFkJx zd6FXb+mfX*t6H2!w;8fdonLKyQaFB$alwDBs+d(RJ1pTfbom*GW*D*_WSY};(wr^X z;I1^e*IrqOYb&Pm9EprPvN$Sbp+4}5hVoYb!yYO9@AgQ5++T__y4~w=UzA{M#)>qD z-`;#;tHAe!if5Yg8OW7zyz*IuuYjGBo-w%g^!Voi{~OmwM6sBjVW~YETwrsBR*CCF zdq#-op8e2ZzUYA9X`>REkB_<0gSY}*R;-W?cpwWinQ=QYU zE?(^H)nxB9SuI}>#gY{TJ8j?IJq$gSQQ@`L|J`G;65%uiwbW5M=x8!8KUi!u-)AcP6 zxrVA@a;uXR$&-!4Nx0}I+8N&6S%`SJ&<=!77S2zXhw2LDt!rOjWZ{l6QqF>A9(qLK zw;6&KmK$V#gzNy+GD9CzJbF%9#V58)iG8w8S+xT&>ha)$k(UQosD4e*Q1d2J%&&`E zYQ_(Ee5XnNaV=BsN=F;Ox^XG7@RLV!*R%HJ&P@@rIoaJi+LNio0wG@&^0KHh6a2## zLcBED{Bs~Apu`B!70}1$Cu-_RiQ>C4V0<=DZxKzP+R0@!{pc#r&|@@m$M_vqQyat1 zbTnHOIUE}m;BLHu%B9D!=Lfhm!ZlRm*IE<;S9bCsSkfiE>Bq{0h@HIdNkyka89n)3 zzflH^0Oz6N>J(O60HWu=wv*=o(Yt@B=(M?$XM_=WNodL+P8>pK8RB-5s4#`bM~eB0 z>n|IvTaWXX+}YI}j34_BP< z546bqOIoDCe-8C`OVmN+O3;OEoltG@82Z0TjSskYF|tdw4?0s4Y0`3ik57Y&oHarA zJWz@2*7!Xd)p&<5tZk%;y_Nedn9`#QfhPmg6t&(6zJrYUp7$AdZ;BpMdF@lZQi+}3 z3vJ1`kIS|j8`RzKnpQH$>-M`;+88TcE&pn`hM@e?SwL~H3nvRw$6=1PKfm~l6@(>MnUAvB)|{S4I!x?fX_o|iUNVUKxa{+=<@ zO-tc?y_)2zVkW)X->n*j9QLZv{+7E6j=^Q1^OW(`kJOHUl6c8J2@_YM9;yZkgVNph(4oo~Gv==kK$~~Dcbz5(%68I0W5e0wi(t%3=Ohxr-NuKT zLu~AvneL)Up4-&>r*3QHrL)7LX9s$nV-{aeNiW>x2>*v=Bl|CxjhwW^pZ~Y} zPeyj5UU=NOG9lHS?^X^U$I<>eo;TI~k4Dy2pu~00o}OT2osU*#ne3mR&DM3ySxzuw z6N|&G-zODtI2;S?jmmUST;71p!7|>maozAUV(vjXX-@3(xqT`9Y*a&~Hl@-%&uD6nCnVfCn_7?bL|oH_IEt=QPg1yZy`ON7ms!9;dR zKQ1R^Gh2l2`HOqN2b#Dh&@`bU=cbl&>R16py2G=#pz`5s?zgmsTRf={pZwL5qnC5@ zR5c7Us2MKmn-W}QCS}qTGs8z`bqcJqr|;)p;P*bVU7s^cD991gna5F$ZLaw++yGlw z!?P+$j8e`A`D<;1Sc)U_x52GyOy$A(mqn9-RI|1g?XaR^iH1;#22f6LcZcNFs{(yY zH)xV6uO~9bzEPnK<#P6z>t17H;@dGW!23*E*6tvmz&T>`mw{Dz@{B(cs>rjhSdnVg zl2XJ`HbGKe&fWi>r1mxob}bIy0s6T__CAffkfjoFz$xR@Ht)_&XaTjX9sOX*=rvI%tS}m?Io#LoNQ!kKxM6rR^6A5Wm}; z4muo^cOkQ_h9hq3ZAo6StVlJMR`s>wcFJOhi@LWQ^0Ecq-XwCMzal^)a6i%7F~V~@ zGz%yIk>+C^@6e0DWb3KP&shrV%6nwpKA06;Mdhkt*kyJa4W1FqEZW_85tW-X9Gg=n z_}zecD-Lt0SUeM86Oc%KFm{5-5N%u04kuVug7xJknAu~+)h?{|Fgk1Z9adWe zBT$ac@*)^qDU3kNp5JKWuu&hu%zoWTx{WFHde|bh-|y4r)vV*IQ5kRLfs;SxdRsW5 zXZyP8Q+TWUb&gLBZGzCvD%5uUt*9+Fj`CTb2pCpu(^arvuZf!g2kwnXJ zW4~}r4z^N{Ch1sjE;nvLGF!uKj%M!_lxFxm3=$d8brmZd>rlC{M8HY7rs1?~%bMVj zj3H(%SrOaoDwM^=OVPZ-W*m9dRUm^38;^wRsdpu%7fF;D{foN2nM+-a69%+2 zzRkPIIby$(^n=*$^xD~IdkZe`K&cgZn@QpvDQGwt9-_nk49gAymPT#|mP+>n-ok_b z3=4_?%gWzj;UvI9_B$;1KoGw^4hKSpwm-rG{yQve*B(nnMld{KDE}ZXeUt1^Z8(*I zo9%h#+JZpW@J9ijmpCydftMgX{s8x+-A04#;n?)U*`g0v&2EUCFuu{C536Zl!nj-1 z(X@nx=&i|ev&_Rt&!o>Y1w>m{wEHXlMze<#vj`r?2ds7vL{A>?H;N*#@xyPl53B9+ zn=>+t)vgT4@*+^;fhoLupa>tu3T0Ss4V-SziE| zmsID+kBYdiWy%P+dOhvoeteBfhTAjsm~mvIf&xdF4<-;Y6wnqFM>sK#vc|tr*0ao% znXeCD#8u4sU@bZH=Iu7@f-IE+nUo9B`z(5kt$vQ&@4xPX`ITelW*Xxs%i%1gNvv_pP zJT%M>*!F{NN2DeNx>0zE6@S?|bTo(i?bx^Iz$Qz2(hTnT_`)}jSgiNDJ%v`LgG8I?M zMdPt3u^AD~<9&7_E|mpQHlnrS#VioEeq%=h1ytXA8VXD-f zGK#)Q!re^%chVMZ&3SScFUPW7RWs|hP#LfV-D!!vKzoU*-u4wakq2c#r=sTX#|IO#eOYDv-~6 z0ZbZ}x{Z`l%*_jst?bzd+lmi)a(Tw;%1|cLK}uPqs&4lon@Q2Zne%`lzOJ-mdfN~D zqc+YCSu;DC-P-a=Ri_`_+m(D=&sZtcmJ={h(scv3D1t=hy^xcrY;q(!2Tk05`c&jl zxBX5WS|eqCyo~f4#U9Jhhb!DJLWSR0u!|EMW8SmK%aEUlEd2AeAJq4z&#fHJA0?h{ z^=|}O!_OaOoNig}wN=)fKOH!u6+Tw}zHx5z`dmHjlv`~t$no_#d!mC=-%N~G|EkFn zMu975rsm_zLZKGH-TNQ!Jdv|yS=v-p*r1)#2->B$nzsx%onkyEMMbU}`~%G3e+jdk zB=ApeBHH-Zr;C=I-=4+a%Z8*1M|Bk@b=KcAD&I>F9@B6pB7RnX9(Zbh%c#7BOC=tk zfzNP|GF9gC2{iN(pP(gFy?AZs!zR4$puFGWka6WDRQt|Eq_@BqEI#F){b9<2**g!_mjiEpbxaP; z9QMvc&U8&FNi>gK801}(aryb00AgMP#)~Nz9WT(|_Lw503Lj&lpkgM3{lddK#S(b* zkpNyx2QmXM6XVlq+M0(#ysn~54k7J4lXC3|0^V7qW3BQQ#3*iU%1lo&ywplzJJ>si zKKzCKQ-Q-(nZnk+io5!HMjI_(%P4$d0&if+oSbKz0 zEI&?}q6X<2i9zxsRpKAO%s-z7FO6^;J}@{<@JwO#e^3G9BJK=-d~CTA6KRALr+Ne9 z0CAwVm9ObC@=V^^qYGs7#?OB5H&1z6Yih)4C{1V9Hm6iT%Sb#_kAF|Lw_736 zN-UM9ZOW$;o1)Sn#L~&z`GtQ*Q-0c-qO=$^FhJgB*TCVF{3Y#7wRDlkx3qlayI#iMih;44CYokBTYP>!Mv_Ml>= zE$oc`WHMEoJ26+D`YF4x^c%-pHj2{ar>Sn}N#1BKwkYh!n9A_cV~VG@Vx|91hSa|- z5CiysONNus>Du@B!Y?#u(!$o)u#IV7IQA9NkuHnjx7H9zJb}9(9 z;;+)GyM-5^nI^4;y<+Byx8`qry142ln^R9=I^~CIQ@&q)P=Tji+j)ctEkJY&msZr< zwN-9ZA*{2-bH3iHA+`@t+n$FVAP7Y)!7=-X=%wqxfC)@yP^S`=)1WMFJgpgxl0NIgoVgxe4& zsUF|Y)Wd6YK!V$_%N5IFM}sdhRGq)M4I*Wz zZX1D48MWGlRWcs|H;TKyTyOMs80{yMT4p|WKRBWPE=y+T3!7@X@TfbWf^w~kXX_Fg zxUM}Cr1&T#9k@=ZFSVkOWXL&cbm2R{ZlqpISIrivCRO^zrKpG8!_R6=Fg_M~7@sr6B>)>-XsZ~2q<3cD>J(Qf8nldK5ppLtye9Is9 zQC%Icn2!Ic?|)8YI1+R44`lo?NrkGnmm|UxASeV7SNDWNy_^v4H=$l|fZ$DeNeM|Q z37{kxC?f%s0N?+;$1lC_LXF{O03RnWM}VUr67J~RePp@4_~eW|RNl$bO@D}7G{%-imlL4Fhd zy9`2;k+-cg+|KJ)eT|*GTnV>L_|@1GibTR;0C7#ID+>P0t_gRC{cjl46cq_mjd1mLb4LLP zg{kyC;V>sVFT$(>B?)5z#7zMf03bk$@UbLl=;RLvNJ#<2wQm9}6z%NgKro;kSXxd} zN(KZ5!(eb}sJ%T*0tke{B*0*ZB3u#%lYrX7;ZT?)7$yytfrH^PQb0+d1khg2PDTo1 z`6n;H&X$Pyx~As7-sQWOFURl$45!#{_HABxHb4(}PJCmC_Ns#;@iWCCfZ=zsh~+ZU z^_EBgYo7`qLMS5XBT)uvZRisN6h(w+(3T`7rws>B8`{XG!fIheL}50xI)7i3fdA_k70L_h>E%mUsZ^3cSt@>h4Lwb&{{ry~ Bc>VwY From b44ee7119d6357dbaf74c112ea332ba33c76e87c Mon Sep 17 00:00:00 2001 From: Rishab Parthasarathy <56666587+rishab-partha@users.noreply.github.com> Date: Sun, 29 Jan 2023 10:13:57 -0500 Subject: [PATCH 6/7] Add files via upload --- team_solutions/pineapple/Team_Pineapple.pdf | Bin 0 -> 176141 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 team_solutions/pineapple/Team_Pineapple.pdf diff --git a/team_solutions/pineapple/Team_Pineapple.pdf b/team_solutions/pineapple/Team_Pineapple.pdf new file mode 100644 index 0000000000000000000000000000000000000000..edc2d6bcbba3803b597eb6e1b4c8adad678da393 GIT binary patch literal 176141 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 literal 0 HcmV?d00001 From 7f50154430d8d209cf6fa66454847677f3b0f381 Mon Sep 17 00:00:00 2001 From: Tarushii Goel Date: Sun, 29 Jan 2023 10:15:06 -0500 Subject: [PATCH 7/7] Update team_solutions.md --- team_solutions/pineapple/team_solutions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/team_solutions/pineapple/team_solutions.md b/team_solutions/pineapple/team_solutions.md index c8f7b33..945188c 100644 --- a/team_solutions/pineapple/team_solutions.md +++ b/team_solutions/pineapple/team_solutions.md @@ -12,4 +12,5 @@ Code: * [Symbolic Compiler](maxcut_symbolic_compiler.ipynb) * [Binary Lifting](maxcut_notebook-optimizecompilation-binarylifting.ipynb) * [Precomputation](maxcut_notebook_precompute_all.ipynb) -5. Other open-ended investigation +4. Other open-ended investigation +* [Interpolation](maxcut_interpolate.py)