{ "cells": [ { "cell_type": "markdown", "id": "0", "metadata": {}, "source": [ "# Q2D Cross-Section Impedance of a Coplanar Waveguide\n", "\n", "This notebook demonstrates how to extract the characteristic impedance\n", ":math:`Z_0` of a coplanar waveguide (CPW) cross-section using the\n", "Ansys 2D Extractor (Q2D) quasi-static field solver via PyAEDT.\n", "\n", "The Q2D solver computes per-unit-length RLGC parameters from the\n", "cross-sectional geometry, from which the characteristic impedance\n", "can be obtained as a function of frequency. We compare the\n", "full-wave Q2D result against the analytical conformal-mapping estimate\n", "from :func:`~qpdk.models.cpw.cpw_parameters`.\n", "\n", "**Prerequisites:**\n", "- Ansys Electronics Desktop installed (requires license)\n", "- Install hfss extras: `uv sync --extra hfss` or `pip install qpdk[hfss]`\n", "\n", "**References:**\n", "- PyAEDT Documentation: https://aedt.docs.pyansys.com/\n", "- Q2D Coplanar Waveguide Example: https://examples.aedt.docs.pyansys.com/version/dev/examples/high_frequency/radiofrequency_mmwave/coplanar_waveguide.html\n", "- Simons, *Coplanar Waveguide Circuits, Components, and Systems* {cite:p}`simonsCoplanarWaveguideCircuits2001`" ] }, { "cell_type": "markdown", "id": "1", "metadata": {}, "source": [ "## Setup and Imports" ] }, { "cell_type": "code", "execution_count": 1, "id": "2", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:41:10.576258Z", "iopub.status.busy": "2026-04-29T08:41:10.576136Z", "iopub.status.idle": "2026-04-29T08:41:10.578897Z", "shell.execute_reply": "2026-04-29T08:41:10.578612Z" }, "tags": [ "hide-input", "hide-output" ] }, "outputs": [], "source": [ "import sys\n", "\n", "if \"google.colab\" in sys.modules:\n", " import subprocess\n", "\n", " print(\"Running in Google Colab. Installing QPDK...\")\n", " subprocess.check_call([\n", " sys.executable,\n", " \"-m\",\n", " \"pip\",\n", " \"install\",\n", " \"-q\",\n", " \"qpdk[models] @ git+https://github.com/gdsfactory/quantum-rf-pdk.git\",\n", " ])" ] }, { "cell_type": "code", "execution_count": 2, "id": "3", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:41:10.579951Z", "iopub.status.busy": "2026-04-29T08:41:10.579865Z", "iopub.status.idle": "2026-04-29T08:41:10.581498Z", "shell.execute_reply": "2026-04-29T08:41:10.581163Z" }, "tags": [ "hide-input", "hide-output" ] }, "outputs": [], "source": [ "import os\n", "import tempfile\n", "import time\n", "from pathlib import Path\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from ansys.aedt.core import Q2d, settings\n", "from IPython.display import Image, display\n", "\n", "from qpdk import PDK\n", "from qpdk.config import PATH\n", "from qpdk.models.cpw import cpw_parameters\n", "from qpdk.simulation import Q2D\n", "from qpdk.tech import coplanar_waveguide\n", "\n", "PDK.activate()\n", "\n", "# CPW dimensions\n", "cpw_width = 10 # µm\n", "cpw_gap = 6 # µm\n", "cross_section = coplanar_waveguide(width=cpw_width, gap=cpw_gap)\n", "\n", "# Analytical impedance estimate\n", "ep_eff_analytical, z0_analytical = cpw_parameters(cpw_width, cpw_gap)\n", "\n", "print(f\"CPW dimensions: width = {cpw_width} µm, gap = {cpw_gap} µm\")\n", "print(\n", " f\"Analytical estimate: Z₀ = {z0_analytical:.2f} Ω, ε_eff = {ep_eff_analytical:.4f}\"\n", ")" ] }, { "cell_type": "markdown", "id": "6", "metadata": {}, "source": [ "## Initialize Q2D Project\n", "\n", "Set up an Ansys 2D Extractor project. The Q2D solver uses a quasi-static\n", "approach to compute per-unit-length transmission-line parameters from the\n", "2D cross-section.\n", "\n", "**Note:** This section requires Ansys Electronics Desktop to be installed\n", "and licensed." ] }, { "cell_type": "code", "execution_count": 4, "id": "7", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:41:12.901196Z", "iopub.status.busy": "2026-04-29T08:41:12.900914Z", "iopub.status.idle": "2026-04-29T08:41:12.902688Z", "shell.execute_reply": "2026-04-29T08:41:12.902469Z" } }, "outputs": [], "source": [ "# Configuration for Q2D simulation\n", "Q2D_CONFIG = {\n", " \"sweep_start_ghz\": 1.0, # Sweep from 1 GHz\n", " \"sweep_stop_ghz\": 10.0, # to 10 GHz\n", " \"sweep_step_ghz\": 0.1, # 100 MHz step\n", "}" ] }, { "cell_type": "code", "execution_count": 5, "id": "8", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:41:12.903325Z", "iopub.status.busy": "2026-04-29T08:41:12.903260Z", "iopub.status.idle": "2026-04-29T08:42:39.653585Z", "shell.execute_reply": "2026-04-29T08:42:39.653210Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Python version 3.12.13 (main, Mar 3 2026, 14:59:34) [Clang 21.1.4 ].\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: PyAEDT version 0.26.2.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Initializing new Desktop session.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: AEDT version 2025.2.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: New AEDT session is starting on gRPC port 57449.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Starting new AEDT gRPC session on port 57449.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Launching AEDT server with gRPC transport mode: TransportMode.UDS\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Electronics Desktop started on gRPC port 57449 after 9.2 seconds.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: AEDT installation Path /usr/ansys_inc/v252/AnsysEM\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Connected to AEDT gRPC session on port 57449.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT WARNING: Service Pack is not detected. PyAEDT is currently connecting in Insecure Mode.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT WARNING: Please download and install latest Service Pack to use connect to AEDT in Secure Mode.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Project cpw_q2d has been created.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Added design 'CPW_Impedance' of type 2D Extractor.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: AEDT objects correctly read\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Q2D project created: /tmp/tmp70dmm41z.ansys_qpdk/cpw_q2d.aedt\n", "Design name: CPW_Impedance\n" ] } ], "source": [ "# Ensure Ansys path is set so PyAEDT can find it\n", "ansys_default_path = \"/usr/ansys_inc/v252/AnsysEM\"\n", "if \"ANSYSEM_ROOT252\" not in os.environ and Path(ansys_default_path).exists():\n", " os.environ[\"ANSYSEM_ROOT252\"] = ansys_default_path\n", "\n", "settings.use_grpc_uds = False\n", "\n", "# Create temporary directory for project\n", "temp_dir = tempfile.TemporaryDirectory(suffix=\".ansys_qpdk\")\n", "project_path = Path(temp_dir.name) / \"cpw_q2d.aedt\"\n", "\n", "# Initialize Q2D\n", "q2d = Q2d(\n", " project=str(project_path),\n", " design=\"CPW_Impedance\",\n", " non_graphical=False,\n", " new_desktop=True,\n", " version=\"2025.2\",\n", ")\n", "\n", "print(f\"Q2D project created: {q2d.project_file}\")\n", "print(f\"Design name: {q2d.design_name}\")" ] }, { "cell_type": "markdown", "id": "9", "metadata": {}, "source": [ "## Build CPW Cross-Section Geometry\n", "\n", "Use :meth:`~qpdk.simulation.q3d.Q2D.create_2d_from_cross_section` to automatically\n", "build the CPW geometry (signal conductor, ground planes, substrate) from the\n", "gdsfactory cross-section and QPDK layer stack." ] }, { "cell_type": "code", "execution_count": 6, "id": "10", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:42:39.654519Z", "iopub.status.busy": "2026-04-29T08:42:39.654420Z", "iopub.status.idle": "2026-04-29T08:42:40.030154Z", "shell.execute_reply": "2026-04-29T08:42:40.029814Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[32m2026-04-29 08:42:39.698\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[36mqpdk.simulation.q3d\u001b[0m:\u001b[36mcreate_2d_from_cross_section\u001b[0m:\u001b[36m282\u001b[0m - \u001b[33m\u001b[1mSetting conductor_thickness to 2.0 um for Q2D stability.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Materials class has been initialized! Elapsed time: 0m 0sec\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Adding new material to the Project Library: Nb\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Material has been added in Desktop.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Adding new material to the Project Library: Si\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Material has been added in Desktop.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Adding new material to the Project Library: AlOx/Al\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Material has been added in Desktop.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Adding new material to the Project Library: In\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Material has been added in Desktop.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Modeler2D class has been initialized!\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Modeler class has been initialized! Elapsed time: 0m 0sec\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Boundary SignalLine signal has been created.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Boundary ReferenceGround gnd has been created.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Mesh class has been initialized! Elapsed time: 0m 0sec\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Mesh class has been initialized! Elapsed time: 0m 0sec\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Created Q2D geometry:\n", " signal: signal\n", " gnd_left: gnd_left\n", " gnd_right: gnd_right\n", " substrate: substrate\n" ] } ], "source": [ "\n", "# Create the Q2D wrapper\n", "q2d_sim = Q2D(q2d)\n", "\n", "# Create the 2D cross-section geometry\n", "object_names = q2d_sim.create_2d_from_cross_section(cross_section, ground_width=30)\n", "\n", "print(\"Created Q2D geometry:\")\n", "for role, name in object_names.items():\n", " print(f\" {role}: {name}\")" ] }, { "cell_type": "markdown", "id": "b729cc72", "metadata": {}, "source": [ "### Q2D Cross-Section Geometry\n", "Here is the 2D geometry of the CPW cross-section in Ansys 2D Extractor.\n", "\n", "![Q2D geometry](../docs/_static/images/q2d_cpw_impedance_geom.jpg)" ] }, { "cell_type": "code", "execution_count": 7, "id": "5580c0f2", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:42:40.031020Z", "iopub.status.busy": "2026-04-29T08:42:40.030907Z", "iopub.status.idle": "2026-04-29T08:42:40.230886Z", "shell.execute_reply": "2026-04-29T08:42:40.230535Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Parsing /tmp/tmp70dmm41z.ansys_qpdk/cpw_q2d.aedt.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: File /tmp/tmp70dmm41z.ansys_qpdk/cpw_q2d.aedt correctly loaded. Elapsed time: 0m 0sec\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: aedt file load time 0.002233743667602539\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: PostProcessor class has been initialized! Elapsed time: 0m 0sec\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Post class has been initialized! Elapsed time: 0m 0sec\n" ] }, { "data": { "image/jpeg": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Ensure Q2D model fits the screen\n", "q2d.modeler.fit_all()\n", "\n", "# Save screenshot\n", "img_dir = PATH.repo / \"docs\" / \"_static\" / \"images\"\n", "img_dir.mkdir(parents=True, exist_ok=True)\n", "q2d_img_path = img_dir / \"q2d_cpw_impedance_geom.jpg\"\n", "q2d.post.export_model_picture(\n", " full_name=str(q2d_img_path), show_axis=True, show_grid=False, show_ruler=True\n", ")\n", "\n", "# Display in notebook\n", "display(Image(filename=str(q2d_img_path)))" ] }, { "cell_type": "markdown", "id": "11", "metadata": {}, "source": [ "## Configure Q2D Analysis\n", "\n", "Set up the solution with a frequency sweep from 1 GHz to 10 GHz to compute\n", "the characteristic impedance across the frequency range." ] }, { "cell_type": "code", "execution_count": 8, "id": "12", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:42:40.232052Z", "iopub.status.busy": "2026-04-29T08:42:40.231953Z", "iopub.status.idle": "2026-04-29T08:42:40.347931Z", "shell.execute_reply": "2026-04-29T08:42:40.347614Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Q2D setup configured:\n", " - Sweep range: 1.0 – 10.0 GHz\n", " - Step size: 0.1 GHz\n" ] } ], "source": [ "# Create setup\n", "setup = q2d.create_setup(name=\"Q2DSetup\")\n", "\n", "# Add frequency sweep\n", "sweep = setup.add_sweep(name=\"FrequencySweep\")\n", "sweep.props[\"RangeType\"] = \"LinearStep\"\n", "sweep.props[\"RangeStart\"] = f\"{Q2D_CONFIG['sweep_start_ghz']}GHz\"\n", "sweep.props[\"RangeStep\"] = f\"{Q2D_CONFIG['sweep_step_ghz']}GHz\"\n", "sweep.props[\"RangeEnd\"] = f\"{Q2D_CONFIG['sweep_stop_ghz']}GHz\"\n", "sweep.props[\"Type\"] = \"Interpolating\"\n", "sweep.update()\n", "\n", "print(\"Q2D setup configured:\")\n", "print(\n", " f\" - Sweep range: {Q2D_CONFIG['sweep_start_ghz']} – {Q2D_CONFIG['sweep_stop_ghz']} GHz\"\n", ")\n", "print(f\" - Step size: {Q2D_CONFIG['sweep_step_ghz']} GHz\")" ] }, { "cell_type": "markdown", "id": "13", "metadata": {}, "source": [ "## Run Simulation\n", "\n", "Execute the Q2D analysis." ] }, { "cell_type": "code", "execution_count": 9, "id": "14", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:42:40.348873Z", "iopub.status.busy": "2026-04-29T08:42:40.348784Z", "iopub.status.idle": "2026-04-29T08:42:48.832238Z", "shell.execute_reply": "2026-04-29T08:42:48.831963Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting Q2D analysis...\n", "(This may take a few minutes)\n", "PyAEDT INFO: Project cpw_q2d Saved correctly\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Project cpw_q2d Saved correctly\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Key Desktop/ActiveDSOConfigurations/2D Extractor correctly changed.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Solving all design setups. Analysis started...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Design setup None solved correctly in 0.0h 0.0m 8.0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Key Desktop/ActiveDSOConfigurations/2D Extractor correctly changed.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Analysis completed in 8.4 seconds\n" ] } ], "source": [ "print(\"Starting Q2D analysis...\")\n", "print(\"(This may take a few minutes)\")\n", "\n", "# Save project before analysis\n", "q2d.save_project()\n", "\n", "# Run the analysis\n", "start_time = time.time()\n", "success = q2d.analyze(cores=4)\n", "elapsed = time.time() - start_time\n", "\n", "if not success:\n", " raise RuntimeError(\"Q2D simulation failed. Check the AEDT log for details.\")\n", "else:\n", " print(f\"Analysis completed in {elapsed:.1f} seconds\")" ] }, { "cell_type": "markdown", "id": "15", "metadata": {}, "source": [ "## Extract and Plot Impedance\n", "\n", "Extract the characteristic impedance :math:`Z_0` from Q2D and compare it\n", "with the analytical conformal-mapping estimate. The analytical value is\n", "shown as a horizontal dashed line." ] }, { "cell_type": "code", "execution_count": 10, "id": "16", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:42:48.833161Z", "iopub.status.busy": "2026-04-29T08:42:48.833087Z", "iopub.status.idle": "2026-04-29T08:42:48.994937Z", "shell.execute_reply": "2026-04-29T08:42:48.994584Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT WARNING: No report category provided. Automatically identified Matrix\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Solution Correctly loaded. Elapsed time: 0m 0sec\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Solution Correctly parsed. Elapsed time: 0m 0sec\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "~/dev/quantum-rf-pdk/.venv/lib/python3.12/site-packages/ansys/aedt/core/visualization/post/solution_data.py:648: UserWarning: Method `data_real` is deprecated. Use :func:`get_expression_data` property instead.\n", " warnings.warn(\"Method `data_real` is deprecated. Use :func:`get_expression_data` property instead.\")\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAHqCAYAAADyGZa5AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAiOJJREFUeJzs3Xd4U+X7x/FPujejLbRllEKRvZdsvkzZIIoCyhJURGQLfGWjDEUEF+vLUARZKi4UkCFDRLbsJUuoMoRCKbSlPb8/+DUS0pY2TWig79d15bqa5zx5zp3cyWnunPGYDMMwBAAAAAAAHMIlqwMAAAAAAOBRRuENAAAAAIADUXgDAAAAAOBAFN4AAAAAADgQhTcAAAAAAA5E4Q0AAAAAgANReAMAAAAA4EAU3gAAAAAAOBCFNwAAAAAADkThDQCSunbtKj8/v6wOw+mcOnVKJpNJ8+fPt8t4GzZskMlk0oYNG+wy3sNs9OjRMplMWR0GsiGTyaTRo0c7/ZjJ7L0dyqyuXbuqUKFCWR0GgIcMhTeADDtx4oReeuklFS5cWF5eXgoICFDNmjU1bdo03bx509yvUKFCMplM5luePHlUu3ZtffXVV+Y+zZo1U65cuWQYhsU6du/eLZPJpPDwcKv1r1u3TiaTSbNmzbpvrLdu3dJ7772natWqKUeOHPLy8tJjjz2mV199VUePHs3Eq+A8Pv74Y6f5QprsQcSUXMQvX77coeuB7RISEvT++++rSpUq8vf3l5+fn6pUqaIPPvhAt2/ftugbGxurjz76SI0bN1ZoaKj8/f1VoUIFTZ8+XYmJiRZ9k3OffPP09FTevHlVr149jR8/XhcvXnyQT9NmV69elZeXl0wmkw4dOpTV4dzXypUrHVZc28O974t7b4sXL073WOfPn9fo0aO1Z88exwVsg0WLFmnq1KlZHQYAG7hldQAAHi7ff/+9nn76aXl6eqpz584qXbq04uPjtXnzZg0ePFgHDhywKIjLly+vgQMHSrrzRWbmzJl68sknNX36dL388suqVauWfvjhB+3fv19lypQxP27Lli1yc3PTmTNn9Oeffyp//vwWyySpVq1aacZ66dIlPfHEE9q5c6datGihjh07ys/PT0eOHNHixYs1a9YsxcfH2/PlyRIff/yxgoKC1LVrV7uPHR4erps3b8rd3d0uMdWpU0c3b96Uh4eHHaOEM7px44aaN2+un3/+WS1atFDXrl3l4uKiH3/8Ua+99ppWrFihb7/9Vj4+PpKkP/74Q3369FGDBg00YMAABQQEaNWqVXrllVf066+/6pNPPrFax2uvvaYqVaooMTFRFy9e1C+//KJRo0ZpypQpWrp0qerXr/+gn3aGLFu2TCaTSSEhIVq4cKHefPPNrA4pTStXrtRHH32UYvF98+ZNubk5x9fK5PfFvapXr57uMc6fP68xY8aoUKFCKl++vMWy2bNnKykpKbNh2mTRokXav3+/+vXrlyXrB2A759hCAngonDx5Us8++6zCw8O1bt06hYaGmpf17t1bx48f1/fff2/xmHz58um5554z3+/cubMiIyP13nvvmQtvSdq8ebNV4d2sWTOtW7dOmzdv1rPPPmtetnnzZgUGBqpEiRJpxtu1a1ft3r1by5cvV7t27SyWjRs3Tm+88UbGX4RMSEpKUnx8vLy8vB7oem1x+/ZtJSUlycPDw67xuri4PBTPH5k3YMAA/fzzz/rggw/06quvmtt79eqljz76SK+++qoGDx6sjz76SJIUEhKiffv2qVSpUua+L730krp376558+ZpxIgRioyMtFhH7dq19dRTT1m07d27V40bN1a7du108OBBi+2Us/nss8/UrFkzhYeHa9GiRU5feKfFmT7XKb0v7CmjP0QCgMSh5gAy4O2331ZMTIzmzJmT4pfZyMhI9e3bN80xQkJCVKJECZ08eVKSVLVqVXl4eJj3YifbsmWL6tSpo6pVq1osS0pK0q+//qoaNWqkeX7stm3b9P333+uFF16wKrolydPTU5MnT7ZqP3funNq0aSM/Pz8FBwdr0KBBVoe5Tp48WTVq1FBgYKC8vb1VqVKlFA93NplMevXVV7Vw4UKVKlVKnp6e+vHHHzM0hnTny3nVqlXl4+OjXLlyqU6dOlq9erWkO4fzHzhwQD///LP5cMp69eqZH3v16lX169dPBQoUkKenpyIjIzVp0iSLvTXJ509OnjxZU6dOVZEiReTp6amDBw+meG7lX3/9pW7duil//vzy9PRUaGioWrdurVOnTt03ptTO8d62bZv5tANfX1+VLVtW06ZNS/H1SEvyedNHjx7Vc889pxw5cig4OFgjRoyQYRg6e/asWrdurYCAAIWEhOjdd9+1eHxyfEuWLNF///tfhYSEyNfXV61atdLZs2et1rdt2zY98cQTypEjh3x8fFS3bl2r97J058eiKlWqyMvLS0WKFNHMmTNTjH/evHmqX7++8uTJI09PT5UsWVLTp0+36leoUCG1aNFCmzdvVtWqVeXl5aXChQvr008/tep79epV9e/fX4UKFZKnp6fy58+vzp0769KlS+Y+cXFxGjVqlCIjI+Xp6akCBQro9ddfV1xcnMVYly5d0uHDhxUbG5tyAv7fn3/+qTlz5qh+/foWRXey3r176z//+Y9mzZqlc+fOSZKCgoIsiu5kbdu2laR0H4pdrlw5TZ06VVevXtWHH36Yar+///5bbm5uGjNmjNWyI0eOyGQymR+fkJCgMWPGqGjRovLy8lJgYKBq1aqlNWvWpCumlJw5c0abNm3Ss88+q2effVYnT57UL7/8YtWvXr16Kl26tA4ePKj//Oc/8vHxUb58+fT2229b9IuPj9fIkSNVqVIl5ciRQ76+vqpdu7bWr1+fZhzr16+XyWSyOAUo2aJFi2QymbR161Z17drV/CPJ3YdvJ0vpHO9z587phRdeUFhYmDw9PRUREaFevXqZjzT6559/NGjQIJUpU0Z+fn4KCAhQ06ZNtXfv3nS9hpmxZs0a1apVSzlz5pSfn5+KFSum//73v5LubAeS95h369bN/FyTt4P3nuN99zb0o48+UuHCheXj46PGjRvr7NmzMgxD48aNU/78+eXt7a3WrVvrn3/+sYjn66+/VvPmzc2vVZEiRTRu3DiL/z/16tXT999/r9OnT5tjujuO9H6OAWQN9ngDSLdvv/1WhQsXVo0aNWweIyEhQWfPnlVgYKCkO3tJKlWqpM2bN5v7nD17VmfPnlWNGjV09epVi73o+/bt07Vr1+57mPk333wjSXr++efTHVtiYqKaNGmiatWqafLkyfrpp5/07rvvqkiRIurVq5e537Rp09SqVSt16tRJ8fHxWrx4sZ5++ml99913at68ucWY69at09KlS/Xqq68qKCjI/CUpvWOMGTNGo0ePVo0aNTR27Fh5eHho27ZtWrdunRo3bqypU6eqT58+8vPzM+/Bz5s3r6Q758zWrVtX586d00svvaSCBQvql19+0bBhwxQVFWV1nuC8efN069Ytvfjii/L09FTu3LlTPJyyXbt2OnDggPr06aNChQrpwoULWrNmjc6cOaNChQqlGVNK1qxZoxYtWig0NFR9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6+urwoUL6/jx45LubH8KFSqkhQsXWp2ykj9/fqvtS65cufT7779btH3yySd69913dfjwYSUkJJjb7/fZLl68uKpUqaKFCxeaf5xauHChHn/8casL2qXHxYsXde3atft+rpOSkjRt2jR9/PHHOnnypMX5zMmnI9miTJkyatiwYarLn3nmGf3vf/9Tjx49NHToUDVo0EBPPvmknnrqKasfOTMipe2OJBUoUCDF9rs/qwcOHNDw4cO1bt068w/Hye790S0ljvgcA7AvCm8A6RIQEKCwsDDt378/Q48LCgpK8wuQdOcLVvHixbV582bFxMTo999/tzjnskaNGtq8ebP+/PNPnTlzRp06dbrveosXLy7pzvm1d+8VTIurq+t9+2zatEmtWrVSnTp19PHHHys0NFTu7u6aN2+eFi1aZNX/7r0Yto5hq6SkJDVq1Eivv/56issfe+yx+8aakn79+qlly5ZasWKFVq1apREjRmjChAlat26dKlSokOm47SGlXKaWX+OeOeTTI3kv2TvvvJPqubN+fn4ZuqjRiRMn1KBBAxUvXlxTpkxRgQIF5OHhoZUrV+q9996z2jNnr+eTlJSkMmXKaMqUKSkuv7doSI/kH4t+//33VF+f5KKxcOHCVsvmz5+vIUOG6OWXX9bw4cMzvP6EhAQdPXo0XT/oPPvss+rWrZv27Nmj8uXLa+nSpWrQoIHFjzR16tTRiRMn9PXXX2v16tX63//+p/fee08zZsywOLoiPQzD0Oeff64bN26k+KPahQsXFBMTYz53V0pfrj/77DN17dpVbdq00eDBg5UnTx65urpqwoQJ5h+40tK5c2f17dtXf/75p+Li4vTrr7+meXE6exg/frxGjBih7t27a9y4ccqdO7dcXFzUr18/h07X5e3trY0bN2r9+vX6/vvv9eOPP2rJkiWqX7++Vq9ena7/BSlJ7XH3y9/Vq1dVt25dBQQEaOzYsSpSpIi8vLy0a9cuDRkyJF2vhSM+xwDsi8IbQLq1aNFCs2bN0tatWzM0H2p61KpVS3PnztXq1auVmJhocRGbGjVq6PPPPzdfCft+F1aTpJYtW2rChAn67LPP0l14p8cXX3whLy8vrVq1Sp6enub2efPm2X2MIkWKKCkpSQcPHky1eJFSPyS7SJEiiomJue8PH7YoUqSIBg4cqIEDB+rYsWMqX7683n33XX322WdpxpTSONKdw3sdEaet7j2k2DAMHT9+3LyHMznugICANOMODg6Wt7d3iocoHzlyxOL+t99+q7i4OH3zzTcWe84yc4hokSJF7vtjWZEiRbR37141aNAgU4f3361p06ZydXXVggULUr3A2qeffioPDw+1bt3aov3rr79Wjx499OSTT5qvop1Ry5cv182bN1M8nP9ebdq00UsvvWQ+3Pzo0aMaNmyYVb/cuXOrW7du6tatm2JiYlSnTh2NHj06w4X3zz//rD///FNjx461mhLxypUrevHFF7VixYoMH+K9fPlyFS5cWF9++aVFHu+9cFxqnn32WQ0YMECff/65bt68KXd3d4vD7aX0f66Dg4MVEBBw3/fe8uXL9Z///Edz5syxaL969WqGLqZnCxcXFzVo0EANGjTQlClTNH78eL3xxhtav369GjZsaLfPQnps2LBBly9f1pdffmlxocfk2T/ultb23t6fYwD2xTneANLt9ddfl6+vr3r06KG///7bavmJEydsmgJKulNMJyYmavLkySpatKjF4XI1atRQTEyMPv74Y7m4uKTrqurVq1fXE088of/9738pXs01Pj5egwYNynCcrq6uMplMFodEnjp1KkNXjE3vGG3atJGLi4vGjh1rtcfj7j1dvr6+unr1qtV62rdvr61bt6Z4zujVq1d1+/btdMecLDY2Vrdu3bJoK1KkiPz9/S327qYW070qVqyoiIgI8/RPd7NlT7S9fPrppxaHSS9fvlxRUVHmK0hXqlRJRYoU0eTJkxUTE2P1+IsXL0q6k+smTZpoxYoVOnPmjHn5oUOHrPKSvFfs7ucdHR2doR917tWuXTvt3bs3xamiktfTvn17nTt3TrNnz7bqc/PmTd24ccN8P73TieXPn18vvPCCfvrppxSnQ5sxY4bWrVunl156yeKQ4o0bN+rZZ59VnTp1tHDhQpsO+927d6/69eunXLlyWV0JPiU5c+ZUkyZNtHTpUi1evFgeHh5q06aNRZ97T0fw8/NTZGSkxXs+Ojpahw8fvu9hwcmHmQ8ePFhPPfWUxa1nz54qWrSoFi5cmP4n/P9Sev9s27ZNW7duTdfjg4KC1LRpU3322WdauHChnnjiCavi19fXV5Lu+9l2cXFRmzZt9O2332rHjh1Wy5NjdHV1tfqcL1u2zOLcZ0e4dyovSeYfN5Nzmt7nag8p5S4+Pl4ff/yxVV9fX98U32MZ+RwDyBrs8QaQbkWKFNGiRYvMUzV17txZpUuXVnx8vH755RctW7ZMXbt2tWns5L3YyfPF3u2xxx5TUFCQtm7dqjJlyqT7nO1PP/1UjRs31pNPPqmWLVuqQYMG8vX11bFjx7R48WJFRUWlOJd3Wpo3b64pU6boiSeeUMeOHXXhwgV99NFHioyMtDrfMrNjREZG6o033tC4ceNUu3ZtPfnkk/L09NT27dsVFhamCRMmSLpTBE6fPl1vvvmmIiMjlSdPHtWvX1+DBw/WN998oxYtWpinmbpx44b27dun5cuX69SpUxneq3T06FE1aNBA7du3V8mSJeXm5qavvvpKf//9t5599llzv9RiupeLi4umT5+uli1bqnz58urWrZtCQ0N1+PBhHThwIMUfDR6E3Llzq1atWurWrZv+/vtvTZ06VZGRkerZs6c57v/9739q2rSpSpUqpW7duilfvnw6d+6c1q9fr4CAAH377beS7kwJ9+OPP6p27dp65ZVXdPv2bX3wwQcqVaqURb4bN24sDw8PtWzZUi+99JJiYmI0e/Zs5cmTR1FRUTY9j8GDB2v58uV6+umn1b17d1WqVEn//POPvvnmG82YMUPlypXT888/r6VLl+rll1/W+vXrVbNmTSUmJurw4cNaunSpVq1aZb5AVnqnE5OkKVOm6PDhw3rllVf0448/6oknnpAkrVq1Sl9//bXq169vniZJkk6fPq1WrVrJZDLpqaee0rJlyyzGK1u2rNU51Zs2bdKtW7fMF+basmWLvvnmG+XIkUNfffVVuq878Mwzz+i5557Txx9/rCZNmlhtY0qWLKl69eqpUqVKyp07t3bs2KHly5dbzFH+1VdfqVu3bpo3b16q28G4uDh98cUXatSokby8vFLs06pVK02bNk0XLlxI9fz3lLRo0UJffvml2rZtq+bNm+vkyZOaMWOGSpYsmeKPQynp3LmznnrqKUkyn/N+t0qVKkmSXnvtNTVp0kSurq4Wn/u7jR8/XqtXr1bdunXN01tFRUVp2bJl2rx5s3LmzKkWLVpo7Nix6tatm2rUqKF9+/Zp4cKFKZ5+kBHJ74t7Jb+Hxo4dq40bN6p58+YKDw/XhQsX9PHHHyt//vzm/0VFihRRzpw5NWPGDPn7+8vX11fVqlVL17UwMqpGjRrKlSuXunTpotdee00mk0kLFixI8cfHSpUqacmSJRowYICqVKkiPz8/tWzZMkOfYwBZ5IFfRx3AQ+/o0aNGz549jUKFChkeHh6Gv7+/UbNmTeODDz6wmPYkPDw8Q1PwhIWFGZKMWbNmWS1r1aqVIcno1atXhmKNjY01Jk+ebFSpUsXw8/MzPDw8jKJFixp9+vQxjh8/bu7XpUsXw9fX1+rxydMn3W3OnDlG0aJFDU9PT6N48eLGvHnzUuwnyejdu3eKcaV3DMMwjLlz5xoVKlQwPD09jVy5chl169Y11qxZY17+119/Gc2bNzf8/f0NSRbTeF2/ft0YNmyYERkZaXh4eBhBQUFGjRo1jMmTJxvx8fGGYfw7FU5KU4TdO43PpUuXjN69exvFixc3fH19jRw5chjVqlUzli5davG41GK6dzqxZJs3bzYaNWpk+Pv7G76+vkbZsmWNDz74IMXXLlla04ndO01QavmtW7euUapUKasxP//8c2PYsGFGnjx5DG9vb6N58+YW04El2717t/Hkk08agYGBhqenpxEeHm60b9/eWLt2rUW/n3/+2ahUqZLh4eFhFC5c2JgxY0aK+f7mm2+MsmXLGl5eXkahQoWMSZMmGXPnzjUkGSdPnjT3S+2zVbduXatp3C5fvmy8+uqrRr58+QwPDw8jf/78RpcuXYxLly6Z+8THxxuTJk0ySpUqZX6fVapUyRgzZowRHR1t9frebzqxu8edOnWqUalSJcPHx8c8rVOXLl2sppG631RQd09VdW9fd3d3Izg42KhTp47x1ltvWU2Ldz/Xrl0zvL29DUnGZ599ZrX8zTffNKpWrWrkzJnT8Pb2NooXL2689dZb5s+QYRjGvHnz7jvl1RdffGFIMubMmZNqnw0bNlhMXXfvezTZvVNaJSUlGePHjzfCw8MNT09Po0KFCsZ3331n1c8wrKf+ShYXF2fkypXLyJEjh3Hz5k2r5bdv3zb69OljBAcHGyaTyeL9m9KYp0+fNjp37mwEBwcbnp6eRuHChY3evXubpz27deuWMXDgQCM0NNTw9vY2atasaWzdutXqfWyv6cSS41u7dq3RunVrIywszPDw8DDCwsKMDh06WE29+PXXXxslS5Y03NzcLNaf2nRi925DU5v2Lvm9cvdUa1u2bDEef/xxw9vb2wgLCzNef/11Y9WqVVaft5iYGKNjx45Gzpw5DUkWcaT3cwwga5gMIwuP5QMAwIls2LBB//nPf7Rs2TLznj/Yz7Vr11S3bl2dOHFCGzduTPPaBXjwbt++rbCwMLVs2dLqvGsAQOZwjjcAAHggAgIC9MMPPygoKEjNmjXT6dOnszok3GXFihW6ePFiqhfEAwDYjnO8AQDAAxMSEqI//vgjq8PAXbZt26bff/9d48aNU4UKFVS3bt2sDgkAHjns8QYAAMjGpk+frl69eilPnjz69NNPszocAHgkcY43AAAAAAAOxB5vAAAAAAAciMIbAAAAAAAHynYXV0tKStL58+fl7+8vk8mU1eEAAAAAAJyMYRi6fv26wsLC5OKS+f3V2a7wPn/+vAoUKJDVYQAAAAAAnNzZs2eVP3/+TI+T7Qpvf39/SdLJkyeVO3fuLI4GkpSQkKDVq1ercePGcnd3z+pwIHLijMiJ8yEnzom8OB9y4nzIifMhJ87nn3/+UUREhLl+zKxsV3gnH17u7++vgICALI4G0p0NjY+PjwICAtjQOAly4nzIifMhJ86JvDgfcuJ8yInzISfOJyEhQZLsdnoyF1cDAAAAAMCBKLwBAAAAAHAgCm8AAAAAAByIwhsAAAAAAAei8AYAAAAAwIEovAEAAAAAcCAKbwAAAAAAHIjCGwAAAAAAB6LwBgAAAADAgSi8AQAAAABwIApvAAAAAAAciMIbAAAAAAAHovAGAAAAAMCBKLwBAAAAAHAgt6wOIMvcuCF5eVm3u7patt+4kfoYLi6St7dtfWNjJcNIua/JJPn42Nb35k0pKSn1OHx9bet765aUmGifvj4+d+KWpLg46eZNud66def1c3dPu+/t26mP6+1953WWpPh4KSHBPn29vO68LzLaNyHhTv/UeHpKbm4Z73v79p3XIjUeHv++jhnpm5h4J3f/H49VTtzd7/S/t29K7u6blHTnvWaPvm5ud14L6c5nIjbWPn0z8rnPqm3E3Tnx8Mhe24i0PvdZuY1Izkli4r+fk+yyjUiJs2wjkvNmGGl/5h61bcTdnPB7hEt8fMr/51Ma91HZRiRzxu8RN26k/t3rUd9GOOv3iJS+e2WjbYRTfo9I6/W2hZHNREdHG5KM6DtvL+tbs2aWD/DxSbmfZBh161r2DQpKvW/lypZ9w8NT71uypGXfkiVT7xsebtm3cuXU+wYFWfatWzf1vj4+ln2bNUu9771vo6eeSrtvTMy/fbt0SbvvhQv/9n3llbT7njz5b99Bg9Luu3//v31HjUq772+//dv37bfT7rt+/b99P/ww7b7fffdv33nz0u67dOm/fZcuTbvvvHn/9v3uu7T7fvjhv33Xr0+779tv/9v3t9/S7jtq1L999+9Pu++gQf/2PXky7b6vvPJv3wsX0u7bpcu/fWNi0u771FOGhbT6so24c2MbYb4l/PLLv33ZRtyRhduI+Ph4Y8WKFUb8uXNp92Ubcef2ALYR8fHxRlSlSmm/bnd7xLYRfI/4/5uTbCPM+B7xL75H3HHPNiJaMiQZ0dHRhj1wqDkAAAAAAA5kMgzDyOogHqRr164pR44cunT6tAIDA607cIhYyn0dePhHws2bWrVqlZo0aSJ3DjW/f98HcBhpQkKCdU44RCzjfe24jbDICYea29bXztsIc05at5Z78nsim2wjUuQk24gEFxetXLlSzZo2lXtauXjEthEWnOx7REJCgn5csUJPNGpk/X8+pXEfkW2EmRN+j0iIiUn9u9cjvo1w1u8RKX73yibbCElO+T3i8uXLCgoPV3R0tAICAlIfI52y7znevr6WCUyrX0bGTK+738D27Hv3B86efVM6H94efT09JRcXJXp53Xn9UvuHnNw3eQN4Px4e/26Es6qvu3vaz8fWvm5u//7ztGdfV9d/38MJCWnn5O6+9+Pi4pi+JpNj+krO0ffez31aOXnUtxHp/dw/6G1Eck6SvyRndNyHeRthz7723kYkFzXZbRthr74O2kYkeXjc//98skdlG5HZvo7cRvj6pu+716O4jUjmbNuI+333yui4D9k2wim/R6T145ANONQcAAAAAAAHovAGAAAAAMCBKLwBAAAAAHAgCm8AAAAAAByIwhsAAAAAAAei8AYAAAAAwIEovAEAAAAAcCAKbwAAAAAAHIjCGwAAAAAAB6LwBgAAAADAgSi8AQAAAABwIApvAAAAAAAciMIbAAAAAAAHovAGAAAAAMCBKLwBAAAAAHAgCm8AAAAAAByIwhsAAAAAAAdy2sJ74sSJMplM6tevn7ntxIkTatu2rYKDgxUQEKD27dvr77//zrogAQAAAAC4D6csvLdv366ZM2eqbNmy5rYbN26ocePGMplMWrdunbZs2aL4+Hi1bNlSSUlJWRgtAAAAAACpc7rCOyYmRp06ddLs2bOVK1cuc/uWLVt06tQpzZ8/X2XKlFGZMmX0ySefaMeOHVq3bl0WRgwAAAAAQOqcrvDu3bu3mjdvroYNG1q0x8XFyWQyydPT09zm5eUlFxcXbd68+UGHCQAAAABAurhldQB3W7x4sXbt2qXt27dbLXv88cfl6+urIUOGaPz48TIMQ0OHDlViYqKioqJSHTMuLk5xcXHm+9euXZMkJSQkKCEhwf5PAhmWnAfy4TzIifMhJ86HnDgn8uJ8yInzISfOh5w4H3vnwmQYhmHXEW109uxZVa5cWWvWrDGf212vXj2VL19eU6dOlSStXr1avXr10smTJ+Xi4qIOHTro4MGDqlq1qqZPn57iuKNHj9aYMWOs2hctWiQfHx+HPR8AAAAAwMMpNjZWHTt2VHR0tAICAjI9ntMU3itWrFDbtm3l6upqbktMTJTJZJKLi4vi4uLMyy5duiQ3NzflzJlTISEhGjhwoAYPHpziuCnt8S5QoICioqIUGBjo2CeFdElISNCaNWvUqFEjubu7Z3U4EDlxRuTE+ZAT50RenA85cT7kxPmQE+dz+fJlhYaG2q3wdppDzRs0aKB9+/ZZtHXr1k3FixfXkCFDLAryoKAgSdK6det04cIFtWrVKtVxPT09Lc4LT+bu7s6b2smQE+dDTpwPOXE+5MQ5kRfnQ06cDzlxPuTEedg7D05TePv7+6t06dIWbb6+vgoMDDS3z5s3TyVKlFBwcLC2bt2qvn37qn///ipWrFhWhAwAAAAAwH05TeGdHkeOHNGwYcP0zz//qFChQnrjjTfUv3//rA4LAAAAAIBUOXXhvWHDBov7EydO1MSJE7MmGAAAAAAAbOB083gDAAAAAPAoofAGAAAAAMCBKLwBAAAAAHAgCm8AAAAAAByIwhsAAAAAAAei8AYAAAAAwIEovAEAAAAAcCAKbwAAAAAAHIjCGwAAAAAAB6LwBgAAAADAgSi8AQAAAABwIApvAAAAAAAciMIbAAAAAAAHovAGAAAAAMCBKLwBAAAAAHAgCm8AAAAAAByIwhsAAAAAAAei8AYAAAAAwIEovAEAAAAAcCAKbwAAAAAAHIjCGwAAAAAAB6LwBgAAAADAgSi8AQAAAABwIApvAAAAAAAciMIbAAAAAAAHovAGAAAAAMCBKLwBAAAAAHAgCm8AAAAAAByIwhsAAAAAAAei8AYAAAAAwIEovAEAAAAAcCAKbwAAAAAAHIjCGwAAAAAAB6LwBgAAAADAgSi8AQAAAABwIApvAAAAAAAciMIbAAAAAAAHovAGAAAAAMCBKLwBAAAAAHAgCm8AAAAAAByIwhsAAAAAAAei8AYAAAAAwIHcMvPghIQE/fXXX4qNjVVwcLBy585tr7gAAAAAAHgkZHiP9/Xr1zV9+nTVrVtXAQEBKlSokEqUKKHg4GCFh4erZ8+e2r59uyNiBQAAAADgoZOhwnvKlCkqVKiQ5s2bp4YNG2rFihXas2ePjh49qq1bt2rUqFG6ffu2GjdurCeeeELHjh1zVNwAAAAAADwUMnSo+fbt27Vx40aVKlUqxeVVq1ZV9+7dNWPGDM2bN0+bNm1S0aJF7RIoAAAAAAAPowwV3p9//nm6+nl6eurll1+2KSAAAAAAAB4ldr+qeVJSks6cOWPvYQEAAAAAeCjZfFXzefPmacmSJTp9+rQCAgJUu3Zt9e/fX25uboqIiFBiYqI94wQAAAAA4KGU4T3eiYmJat26tV5++WX5+PioVatWKleunJYtW6YSJUroxx9/dEScAAAAAAA8lDK8x/u9997T9u3b9fvvv6tYsWLm9qSkJE2ZMkUvvviiXQMEAAAAAOBhluHCe/78+Xr77bctim5JcnFx0aBBg2QYhoYMGWK3AAEAAAAAeJhl+FDzEydOqFq1aqkuHzx4sJKSkjIVFAAAAAAAj4oMF96+vr66ePFiqsv37Nmj7t27ZyooAAAAAAAeFRkuvOvWrasZM2akuOyvv/7Ss88+q08++STTgQEAAAAA8CjIcOE9atQoffHFF+rSpYv279+vW7du6fz585o5c6aqVKmioKAgR8QJAAAAAMBDKcOFd9myZfXDDz9oy5YtKleunHx9fVWgQAG99tpr6tChgz7//HMZhuGIWAEAAAAAeOhk+KrmklSnTh0dPXpUv/32m06ePKmAgABVr15duXPn1o0bNzRq1Ch7xwkAAAAAwEMpQ4X3mTNnVLBgQUl3pg97/PHH9fjjj1v08fX1NRfe586dU758+ewUKgAAAAAAD58MHWpepUoVvfTSS9q+fXuqfaKjozV79myVLl1aX3zxRaYDBAAAAADgYZahPd4HDx7UW2+9pUaNGsnLy0uVKlVSWFiYvLy8dOXKFR08eFAHDhxQxYoV9fbbb6tZs2aOihsAAAAAgIdChvZ4BwYGasqUKYqKitKHH36ookWL6tKlSzp27JgkqVOnTtq5c6e2bt1K0Q0AAAAAgGy8uJq3t7eeeuopPfXUU/aOBwAAAACAR0qGpxMDAAAAAADpR+ENAAAAAIADUXgDAAAAAOBAFN4AAAAAADgQhTcAAAAAAA5k01XN73XlyhWtXr1a586dkySFhYWpSZMmypUrlz2GBwAAAADgoZXpPd5z5sxR9erVtW3bNiUlJSkpKUnbtm1TjRo1NGfOHJvHnThxokwmk/r162du++uvv/T8888rJCREvr6+qlixor744ovMPgUAAAAAABwm03u83377be3atUu+vr4W7ePGjVPFihX1wgsvZHjM7du3a+bMmSpbtqxFe+fOnXX16lV98803CgoK0qJFi9S+fXvt2LFDFSpUyNTzAAAAAADAETK9x9tkMun69etW7devX5fJZMrweDExMerUqZNmz55tdaj6L7/8oj59+qhq1aoqXLiwhg8frpw5c2rnzp02xw8AAAAAgCNleo/35MmTVbduXZUuXVr58uWTJP355586cOCA3n333QyP17t3bzVv3lwNGzbUm2++abGsRo0aWrJkiZo3b66cOXNq6dKlunXrlurVq5fZpwEAAAAAgENkuPDu0KGD3njjDZUuXVqS1KJFCzVt2lS//fabzp8/L+nOxdWqVq0qV1fXDI29ePFi7dq1S9u3b09x+dKlS/XMM88oMDBQbm5u8vHx0VdffaXIyMhUx4yLi1NcXJz5/rVr1yRJCQkJSkhIyFB8cIzkPJAP50FOnA85cT7kxDmRF+dDTpwPOXE+5MT52DsXJsMwjIw8wMXFRcHBwVq7dq25+L5bUlKSYmNj5efnl6FAzp49q8qVK2vNmjXmc7vr1aun8uXLa+rUqZKkPn366LffftP48eMVFBSkFStW6L333tOmTZtUpkyZFMcdPXq0xowZY9W+aNEi+fj4ZChGAAAAAMCjLzY2Vh07dlR0dLQCAgIyPZ5NhXejRo20e/durVu3zqr4/vvvv5UvXz7dvn07Q4GsWLFCbdu2tdhLnpiYKJPJJBcXFx05ckSRkZHav3+/SpUqZe7TsGFDRUZGasaMGSmOm9Ie7wIFCigqKkqBgYEZihGOkZCQoDVr1qhRo0Zyd3fP6nAgcuKMyInzISfOibw4H3LifMiJ8yEnzufy5csKDQ21W+Gd4UPNTSaT5s+fr/79+6t+/fpau3at1d7mpKSkDAfSoEED7du3z6KtW7duKl68uIYMGaLY2FhJdwr/u7m6uqa5Pk9PT3l6elq1u7u786Z2MuTE+ZAT50NOnA85cU7kxfmQE+dDTpwPOXEe9s5DhgtvwzDk6uqqRYsWqVOnTqpfv77WrVtnUXzbcjVzf39/q73nvr6+CgwMVOnSpZWQkKDIyEi99NJLmjx5sgIDA7VixQqtWbNG3333XYbXBwAAAADAg2DzdGIuLi5auHChGjZsqPr16+v333+3Z1xW3N3dtXLlSgUHB6tly5YqW7asPv30U33yySdq1qyZQ9cNAAAAAICtbDrUPFly8f3cc8+pQYMGWrt2rfLmzWu34DZs2GBxv2jRovriiy/sNj4AAAAAAI6W4T3e916LzcXFRZ999pkaNWqkBg0aaM+ePfaKDQAAAACAh16GC+/vv/9eOXLksBzk/4vvxo0bq127dnYLDgAAAACAh12GC++mTZumeJVwFxcXLViwQK1bt7ZLYAAAAAAAPApsvrhaioP9/57vrVu32nNYAAAAAAAeWnYtvKU7F1+rWrWqvYcFAAAAAOChZPfCGwAAAAAA/IvCGwAAAAAAB6LwBgAAAADAgTJVeG/atEnPPfecqlevrnPnzkmSFixYoM2bN9slOAAAAAAAHnY2F95ffPGFmjRpIm9vb+3evVtxcXGSpOjoaI0fP95uAQIAAAAA8DCzufB+8803NWPGDM2ePVvu7u7m9po1a2rXrl12CQ4AAAAAgIedzYX3kSNHVKdOHav2HDly6OrVq5mJCQAAAACAR4bNhXdISIiOHz9u1b5582YVLlw4U0EBAAAAAPCosLnw7tmzp/r27att27bJZDLp/PnzWrhwoQYNGqRevXrZM0YAAAAAAB5abrY+cOjQoUpKSlKDBg0UGxurOnXqyNPTU4MGDVKfPn3sGSMAAAAAAA8tmwtvk8mkN954Q4MHD9bx48cVExOjkiVLys/Pz57xAQAAAADwULO58E7m4eGhkiVL2iMWAAAAAAAeOTaf4z1hwgTNnTvXqn3u3LmaNGlSpoICAAAAAOBRYXPhPXPmTBUvXtyqvVSpUpoxY0amggIAAAAA4FFhc+H9119/KTQ01Ko9ODhYUVFRmQoKAAAAAIBHhc2Fd4ECBbRlyxar9i1btigsLCxTQQEAAAAA8Kiw+eJqPXv2VL9+/ZSQkKD69etLktauXavXX39dAwcOtFuAAAAAAAA8zGwuvAcPHqzLly/rlVdeUXx8vCTJy8tLQ4YM0bBhw+wWIAAAAAAAD7NMzeM9adIkjRgxQocOHZK3t7eKFi0qT09Pe8YHAAAAAMBDLdPzePv5+alKlSr2iAUAAAAAgEdOpgrvtWvXau3atbpw4YKSkpIslqU0xzcAAAAAANmNzYX3mDFjNHbsWFWuXFmhoaEymUz2jAsAAAAAgEeCzYX3jBkzNH/+fD3//PP2jAcAAAAAgEeKzfN4x8fHq0aNGvaMBQAAAACAR47NhXePHj20aNEie8YCAAAAAMAjx+ZDzW/duqVZs2bpp59+UtmyZeXu7m6xfMqUKZkODgAAAACAh53Nhffvv/+u8uXLS5L2799vsYwLrQEAAAAAcIfNhff69evtGQcAAAAAAI+kTM3jLUkHDx7UmTNnFB8fb24zmUxq2bJlZocGAAAAAOChZ3Ph/ccff6ht27bat2+fTCaTDMOQ9O9h5omJifaJEAAAAACAh5jNVzXv27evIiIidOHCBfn4+OjAgQPauHGjKleurA0bNtgxRAAAAAAAHl427/HeunWr1q1bp6CgILm4uMjFxUW1atXShAkT9Nprr2n37t32jBMAAAAAgIeSzXu8ExMT5e/vL0kKCgrS+fPnJUnh4eE6cuSIfaIDAAAAAOAhZ/Me79KlS2vv3r2KiIhQtWrV9Pbbb8vDw0OzZs1S4cKF7RkjAAAAAAAPLZsL7+HDh+vGjRuSpLFjx6pFixaqXbu2AgMDtWTJErsFCAAAAADAw8zmwrtJkybmvyMjI3X48GH9888/ypUrl/nK5gAAAAAAZHeZnsf7brlz57bncAAAAAAAPPQyVHgPGDAg3X2nTJmS4WAAAAAAAHjUZKjwvneKsF27dun27dsqVqyYJOno0aNydXVVpUqV7BchAAAAAAAPsQwV3uvXrzf/PWXKFPn7++uTTz5Rrly5JElXrlxRt27dVLt2bftGCQAAAADAQ8rmebzfffddTZgwwVx0S1KuXLn05ptv6t1337VLcAAAAAAAPOxsLryvXbumixcvWrVfvHhR169fz1RQAAAAAAA8KmwuvNu2batu3brpyy+/1J9//qk///xTX3zxhV544QU9+eST9owRAAAAAICHls3Tic2YMUODBg1Sx44dlZCQcGcwNze98MILeuedd+wWIAAAAAAADzObC28fHx99/PHHeuedd3TixAlJUpEiReTr62u34AAAAJBxhmHo9u3bSkxMzOpQlJCQIDc3N926dcsp4gE5cUbk5MFzdXWVm5ubTCbTA1mfzYV3Ml9fX5UtW9YesQAAACCT4uPjFRUVpdjY2KwORdKdHwFCQkJ09uzZB/YFF2kjJ86HnGQNHx8fhYaGysPDw+HrylThvWnTJs2cOVMnTpzQ8uXLlS9fPi1YsEARERGqVauWvWIEAABAOiQlJenkyZNydXVVWFiYPDw8svxLfFJSkmJiYuTn5ycXF5svLwQ7IifOh5w8WIZhKD4+XhcvXtTJkydVtGhRh7/uNhfeX3zxhZ5//nl16tRJu3fvVlxcnCQpOjpa48eP18qVK+0WJAAAAO4vPj5eSUlJKlCggHx8fLI6HEl3Cor4+Hh5eXlRUDgJcuJ8yMmD5+3tLXd3d50+fdr82juSzVl98803NWPGDM2ePVvu7u7m9po1a2rXrl12CQ4AAAAZxxd3ALi/B7mttHlNR44cUZ06dazac+TIoatXr2YmJgAAAAAAHhk2F94hISE6fvy4VfvmzZtVuHDhTAUFAAAAZKW1a9eqRIkSTnWF6VOnTslkMmnPnj1ZHYokqWvXrmrTpk26+l66dEl58uTRn3/+6digACdlc+Hds2dP9e3bV9u2bZPJZNL58+e1cOFCDRo0SL169bJnjAAAAMgGzp49q+7du5svDBceHq6+ffvq8uXL5j4JCQkaMmSIypQpI19fX4WFhalz5846f/68xVgmk8l88/X1VdGiRdW1a1ft3LkzXbG8/vrrGj58uFxdXe36HDOjQIECioqKUunSpW16/IYNG2QymTJ8dGpqBf+0adM0f/78dI0RFBSkzp07a9SoURlaN/CosLnwHjp0qDp27KgGDRooJiZGderUUY8ePfTSSy+pT58+9owRAAAAj7g//vhDlStX1rFjx/T555/r+PHjmjFjhtauXavq1avrn3/+kSTFxsZq165dGjFihHbt2qUvv/xSR44cUatWrazGnDdvnqKionTgwAF99NFHiomJUbVq1fTpp5+mGcvmzZt14sQJtWvXziHP1Vaurq4KCQmRm1umZwS2ixw5cihnzpzp7t+tWzctXLjQnEsgO7G58DaZTHrjjTf0zz//aP/+/dq2bZsuXryocePG2TM+AAAAZAO9e/eWh4eHVq9erbp166pgwYJq2rSpfvrpJ507d05vvPGGpDvF3po1a9S+fXsVK1ZMjz/+uD788EPt3LlTZ86csRgzZ86cCgkJUaFChdS4cWMtX75cnTp10quvvqorV66kGsvixYvVqFEjq6scT5w4UXnz5pW/v79eeOEFDR06VOXLlzcvr1evnvr162fxmDZt2qhr167m+wsWLFDlypXl7++vkJAQdezYURcuXDAvv3Llijp16qTg4GB5e3uraNGimjdvnqT0HWp++vRptWzZUrly5ZKvr69KlSqllStX6tSpU/rPf/4jSQoMDFSuXLnUrVs3SdKPP/6oWrVqKWfOnAoMDFSLFi104sQJ85gRERGSpAoVKshkMqlevXqSrA81T0pK0ttvv63IyEh5enqqYMGCeuutt8zLS5UqpbCwMH311Vepxg88qjJ1Gbc5c+aoYsWKqlChgmrVqqXHH39c//vf/+wVGwAAALKBf/75R6tWrdIrr7wib29vi2UhISHq1KmTlixZIsMwUnx8dHS0TCZTuva+9u/fX9evX9eaNWtS7bNp0yZVrlzZom3p0qUaPXq0xo8frx07dig0NFQff/zx/Z/cPRISEjRu3Djt3btXK1as0KlTpywK8xEjRujgwYP64YcfdOjQIU2fPl1BQUHpHr93796Ki4vTxo0btW/fPk2aNEl+fn4qUKCAvvjiC0nSoUOHdPjwYU2dOlWSdOPGDQ0YMEA7duzQ2rVr5eLiorZt2yopKUmS9Ntvv0mSfvrpJ0VFRenLL79Mcd3Dhg3TxIkTzc9h0aJFyps3r0WfqlWratOmTel+PsCjwubjVEaOHKkpU6aoT58+ql69uiRp69at6t+/v86cOaOxY8faLUgAAADYrnJl6a+/Hvx6Q0Kk/6/Z0nTs2DEZhqESJUqkuLxEiRK6cuWKLl68qDx58lgsu3XrloYMGaIOHTooICDgvusqXry4pDt7j1Nz+vRphYWFWbRNnTpVL7zwgl544QVJd6bW/emnn3Tr1q37rvNu3bt3N/9duHBhvf/++6pSpYpiYmLk5+enM2fOqEKFCubCv1ChQhka/8yZM2rXrp3KlCljXkey3LlzS5Ly5MkjFxcX8+t17yH1c+fOVXBwsA4ePKjSpUsrODhY0p095SEhISmu9/r165o2bZo+/PBDdenSRZJUpEgR1apVy6JfWFiYdu/enaHnBDwKbC68p0+frtmzZ6tDhw7mtlatWqls2bLq06cPhTcAAICT+Osv6dy5rI7i/lLbo53Mw8PD4n5CQoLat28vwzA0ffr0DK3DZDKl2ufmzZtWh5kfOnRIL7/8skVb9erVtX79+nStN9nOnTs1evRo7d27V1euXDHvVT5z5oxKliypXr16qV27dtq1a5caN26sNm3aqEaNGimOVapUKZ0+fVqSVLt2bf3www967bXX1KtXL61evVoNGzZUu3btVLZs2TRjOnbsmEaOHKlt27bp0qVLFjGl90Juhw4dUlxcnBo0aJBmP29vb8XGxqZrTOBRYnPhnZCQYHUIjiRVqlRJt2/fzlRQAAAAsJ9UdlI6zXojIyNlMpl06NAhtW3b1mr5oUOHFBwcbHEoeXLRffr0aa1bty5de7uTx5L+PW85JUFBQWmeA54aFxcXqx8PEhISzH/fuHFDTZo0UZMmTbRw4UIFBwfrzJkzatKkieLj4yVJTZs21enTp7Vy5UqtWbNGDRo0UO/evTV58mSr9a1cudI8fvIh+j169FCTJk30/fffa/Xq1ZowYYLefffdNC9+3LJlS4WHh2v27NkKCwtTUlKSSpcubY4pPe49RSA1//zzj3kPOpCd2Fx4P//885o+fbqmTJli0T5r1ix16tQp04EBAADAPnbsyLp1///O0zQFBgaqUaNG+vjjj9W/f3+LIu6vv/7SwoUL1bt3b3NbctF97NgxrV+/XoGBgemOZ+rUqQoICFDDhg1T7VOhQgUdPHjQoq1EiRLatm2bOnfubG779ddfLfoEBwcrKirKfD8xMVH79+83X9Ts8OHDunz5siZOnKgCBQpIknakkJzg4GB16dJFXbp0Ue3atTV48OAUC+/w8PAU4y9QoIBefvllvfzyyxo2bJhmz56tPn36mI8YSExMlIvLnUs9Xb58WUeOHNHs2bNVu3ZtSXeu6n63ux+XmqJFi8rb21tr165Vjx49Uu23f/9+88XZgOwkU3MRzJkzR6tXr9bjjz8uSdq2bZvOnDmjzp07a8CAAeZ+9xbnAAAAwN0+/PBD1ahRQ02aNNGbb76piIgIHThwQIMHD9Zjjz2mkSNHSrpTdD/11FPatWuXvvvuOyUmJuqv/z+BPXfu3BaHo1+9elV//fWX4uLidPToUc2cOVMrVqzQp59+muaF2Jo0aaJPPvnEoq1v377q2rWrKleurJo1a2rhwoU6cOCAxTnU9evX14ABA/T999+rSJEimjJlisWc2QULFpSHh4c++OADvfzyy9q/f7/VjEAjR45UpUqVVKpUKcXFxem7775L9dz3lPTr109NmzbVY489pitXrmj9+vXmx4eHh8tkMum7775T7dq15eLioly5cikwMFCzZs1SaGiozpw5o6FDh1qMmSdPHnl7e+vHH39U/vz55eXlpRw5clj08fLy0pAhQ/T666/Lw8NDNWvW1MWLF3XgwAHzefGxsbHauXOnxo8fn+7nAzwqbL6q+f79+1WxYkUFBwfrxIkTOnHihIKCglSxYkXt379fu3fv1u7du9Oc7gAAAACQ7uwx3b59uwoXLqz27dsrPDzcXEBu2bJFfn5+kqRz587pm2++0Z9//qny5csrNDTUfPvll18sxuzWrZtCQ0NVvHhx9erVS35+fvrtt9/UsWPHNGPp1KmTDhw4oCNHjpjbnnnmGY0YMUKvv/66KlWqpNOnT6tXr14Wj+vevbu6dOmizp07q27duipcuLB5b7d0Z0/2/PnztWzZMpUsWVITJ0602pPt4eGhYcOGqWzZsqpTp45cXV21ePHidL+OiYmJ6t27t0qUKKEnnnhCjz32mPnq6/ny5dOYMWP03//+V4899pj69OkjFxcXLV68WDt37lTp0qXVv39/vfPOOxZjurm56f3339fMmTMVFham1q1bp7juESNGaODAgRo5cqRKlCihZ555xmKqtK+//loFCxY071kHshOTcb+rWDxirl27phw5cujSpUsZOiwJjpOQkKCVK1eqWbNmcnd3z+pwIHLijMiJ8yEnzim75+XWrVs6efKkIiIirC4OllWSkpJ07do1BQQEmA9vTq9Ro0ZpypQpWrNmjfkIywdl8ODBunbtmmbOnJlqn9GjR2vFihUP3Y6mzOQkMx5//HG99tpr9/3hIzvKqpxkd2ltMy9fvqygoCBFR0en+xoSaSGrAAAAcEpjxozR+++/r19//dV8pe0H5Y033lB4ePgDX++j6tKlS3ryySctZkQCspNMneN969Yt/f7777pw4YLVRqlVq1aZCgwAAADo1q1blqw3Z86c+u9//5sl634UBQUF6fXXX8/qMIAsY/Me7x9//FEFCxbU448/rlatWqlNmzbmW0rTQGTUxIkTZTKZ1K9fP0nSqVOn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6pRMJpOWLl2q2rVry9vbW1WqVNHRo0e1fft2Va5cWX5+fmratKkuXrxoftz27dvVqFEjBQUFKUeOHKpbt6527dqV4vNs2rSpvL29VbhwYS1fvtxq3YsXL1aNGjXk5eWl0qVL6+eff7bIQ65cuczvp/nz5ytnzpxatWqVSpQoIT8/Pz3xxBOKiooyP+b27dt67bXXzO+pIUOGqEuXLmrTpo1FfC1bttTixYvT/Vrdbfjw4SpevLjat29vtWzBggX673//q2bNmqlw4cLq1auXmjVrpnfffTfV8QoXLqxu3bqpXLlyCg8PV6tWrdSpUydt2rTJ3KdKlSp655139Oyzz6Z4ynBKJk2apBMnTmjr1q166qmnFBkZqf/85z/64YcfVLJkSfXs2TPjT97ObK5e169fn+pt3bp19owRAAAAmXXjRuq3W7fS3/fmzfT1tcHSpUtVvHhxFStWTM8995zmzp2rlK4D/MYbb+jdd9/Vjh075Obmpu7du5uXxcTEqFmzZlq7dq12796tJ554Qi1bttSZM2dSXGePHj30448/WhQ03333nWJjY/XMM89o2rRpql69unr27KmoqChFRUWpQIECVuPs2bNHDRo0UMmSJbV161Zt3rxZLVu2VGJi4v+/TDc0YMAA7dixQ2vXrpWLi4vatm2boamjNm3apMqVK2dova+//rq++OILffLJJ9q1a5ciIyPVtGlTc2F+v9f0mWeeMf9w8dtvv5mf/1dffaW+fftq4MCB2r9/v1566SV169ZN69evtxh39OjRatu2rfbt22ce88SJE/rhhx/0448/6vPPP9ecOXPUvHlz/fnnn/r55581adIkDR8+XNu2bTOP4+Liovfff18HDhzQJ598onXr1un1119P92uXbNSoURo+fLh27dolNzc3dezYUa+//rqmTZumTZs26fjx4xo5cqS5//Xr19WlSxdt3rxZv/76q4oWLapmzZrp+vXrFuOOGDFC7dq10969e9WpUyc9++yzOnTokEWfwYMHa+DAgdq9e7eqV6+uli1b6vLly6nGGhsbq8mTJ2vBggXauHGjzpw5o0GDBpmXT5o0SQsXLtS8efO0ZcsWXbt2TStWrLAap2rVqvrtt98sLjhtMpmsfti617p167Rs2TJ99NFHKS6Pi4uzuiCZt7e3Nm/enOa4dzt+/Lh+/PFH1a1bN92PScni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3rhxo1q2bKmwsDCZTCatWLEiq0PK9iZMmKAqVarI399fefLkUZs2bXTkyJGsDitbmz59usqWLWueQ7J69er64Ycfsjos3GXixIkymUzq169fVoeSbY0ePVomk8niVrx48awOK9s7d+6cnnvuOQUGBsrb21tlypTRjh07sjqsbK1QoUJWnxWTyaTevXtndWjZUmJiokaMGKGIiAh5e3urSJEiGjdunLjcU9a6fv26+vXrp/DwcHl7e6tGjRravn17VoeVrdyvTjQMQyNHjlRoaKi8vb3VsGFDHTt2LMPryTaF940bN1SuXDl99NFHWR0K/t/PP/+s3r1769dff9WaNWuUkJCgxo0b68aNG1kdWraVP39+TZw4UTt37tSOHTtUv359tW7dWgcOHMjq0CBp+/btmjlzpsqWLZvVoWR7pUqVUlRUlPm2efPmrA4pW7ty5Ypq1qwpd3d3/fDDDzp48KDeffdd5cqVK6tDy9a2b99u8TlZs2aNJOnpp5/O4siyp0mTJmn69On68MMPdejQIU2aNElvv/22Pvjgg6wOLVvr0aOH1qxZowULFmjfvn1q3LixGjZsqHPnzmV1aNnG/erEt99+W++//75mzJihbdu2ydfXV02aNNGtW7cytJ5seVVzk8mkr776Sm3atMnqUHCXixcvKk+ePPr5559Vp06drA4H/y937tx655139MILL2R1KNlaTEyMKlasqI8//lhvvvmmypcvr6lTp2Z1WNnS6NGjtWLFCu3ZsyerQ8H/Gzp0qLZs2aJNmzZldShIQ79+/fTdd9/p2LFjMplMWR1OttOiRQvlzZtXc+bMMbe1a9dO3t7e+uyzz7Iwsuzr5s2b8vf319dff63mzZub2ytVqqSmTZvqzTffzMLosqd760TDMBQWFqaBAwdq0KBBkqTo6GjlzZtX8+fP17PPPpvusbPNHm84v+joaEl3Cj1kvcTERC1evFg3btxQ9erVszqcbK93795q3ry5GjZsmNWhQNKxY8cUFhamwoULq1OnTjpz5kxWh5StffPNN6pcubKefvpp5cmTRxUqVNDs2bOzOizcJT4+Xp999pm6d+9O0Z1FatSoobVr1+ro0aOSpL1792rz5s1q2rRpFkeWfd2+fVuJiYny8vKyaPf29uZIKidx8uRJ/fXXXxbfv3LkyKFq1app69atGRrLzd7BAbZISkpS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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "=== Impedance Comparison ===\n", "---------------------------------------------\n", "Analytical Z₀ (conformal mapping): 49.31 Ω\n", "Q2D Z₀ (mean over frequency): 44.72 Ω\n", "Relative difference: -9.32%\n", "---------------------------------------------\n" ] } ], "source": [ "# Extract Z0 from Q2D\n", "data = q2d.post.get_solution_data(\n", " expressions=\"Z0(signal,signal)\",\n", " context=\"Original\",\n", " setup_sweep_name=\"Q2DSetup : FrequencySweep\",\n", ")\n", "\n", "frequencies_ghz = np.array(data.primary_sweep_values)\n", "z0_q2d = np.array(data.data_real())\n", "\n", "# --- Plot ---\n", "fig, ax = plt.subplots(figsize=(10, 5))\n", "\n", "# Q2D result\n", "ax.plot(frequencies_ghz, z0_q2d, \"b-\", linewidth=2, label=\"Q2D (quasi-static)\")\n", "\n", "# Analytical estimate as a horizontal line\n", "ax.axhline(\n", " y=z0_analytical,\n", " color=\"r\",\n", " linestyle=\"--\",\n", " linewidth=1.5,\n", " label=f\"Analytical (conformal mapping): {z0_analytical:.2f} Ω\",\n", ")\n", "\n", "ax.set_xlabel(\"Frequency (GHz)\")\n", "ax.set_ylabel(\"Characteristic Impedance $Z_0$ (Ω)\")\n", "ax.set_title(\"CPW Characteristic Impedance: Q2D vs. Analytical Estimate\")\n", "ax.legend()\n", "ax.grid(True)\n", "ax.set_xlim(Q2D_CONFIG[\"sweep_start_ghz\"], Q2D_CONFIG[\"sweep_stop_ghz\"])\n", "\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "# --- Numerical comparison ---\n", "z0_mean_q2d = np.mean(z0_q2d)\n", "relative_diff = (z0_mean_q2d - z0_analytical) / z0_analytical * 100\n", "\n", "print(\"\\n=== Impedance Comparison ===\")\n", "print(\"-\" * 45)\n", "print(f\"Analytical Z₀ (conformal mapping): {z0_analytical:.2f} Ω\")\n", "print(f\"Q2D Z₀ (mean over frequency): {z0_mean_q2d:.2f} Ω\")\n", "print(f\"Relative difference: {relative_diff:+.2f}%\")\n", "print(\"-\" * 45)" ] }, { "cell_type": "markdown", "id": "17", "metadata": {}, "source": [ "## Cleanup\n", "\n", "Close the Q2D session and clean up temporary files." ] }, { "cell_type": "code", "execution_count": 11, "id": "18", "metadata": { "execution": { "iopub.execute_input": "2026-04-29T08:42:48.995845Z", "iopub.status.busy": "2026-04-29T08:42:48.995770Z", "iopub.status.idle": "2026-04-29T08:42:51.071788Z", "shell.execute_reply": "2026-04-29T08:42:51.071482Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PyAEDT INFO: Project cpw_q2d Saved correctly\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Q2D session closed and temporary files cleaned up\n" ] } ], "source": [ "# Save and close\n", "q2d.save_project()\n", "# q2d.release_desktop() # Uncomment to close the AEDT desktop session\n", "time.sleep(2)\n", "\n", "# Clean up temp directory\n", "temp_dir.cleanup()\n", "print(\"Q2D session closed and temporary files cleaned up\")" ] }, { "cell_type": "markdown", "id": "19", "metadata": { "lines_to_next_cell": 0 }, "source": [ "## Summary\n", "\n", "This notebook demonstrated:\n", "\n", "1. **Cross-Section Definition**: Using QPDK's `coplanar_waveguide` cross-section\n", " to define CPW geometry (10 µm width, 6 µm gap)\n", "\n", "2. **Q2D Setup**: Initializing Ansys 2D Extractor via PyAEDT and building the\n", " cross-sectional geometry using\n", " :meth:`~qpdk.simulation.q3d.Q2D.create_2d_from_cross_section`\n", "\n", "3. **Impedance Extraction**: Running the Q2D quasi-static solver to compute\n", " :math:`Z_0` as a function of frequency from 1 to 10 GHz\n", "\n", "4. **Analytical Validation**: Comparing the Q2D result with the conformal-mapping\n", " analytical estimate from :func:`~qpdk.models.cpw.cpw_parameters`\n", "\n", "**Key Points for CPW Design:**\n", "- The Q2D solver gives frequency-dependent impedance including dispersion effects\n", "- The analytical conformal-mapping model provides a good quasi-static estimate\n", "- For superconducting CPWs (PEC conductors), the impedance is nearly\n", " frequency-independent in the low-GHz range\n", "- No backplate metallisation is used, matching typical superconducting fabrication\n", "\n", "**Next Steps:**\n", "- Vary CPW dimensions to study impedance sensitivity\n", "- Compare with HFSS 3D driven-modal simulations\n", "- Study the effect of conductor thickness on impedance\n" ] }, { "cell_type": "markdown", "id": "20", "metadata": {}, "source": [ "## References\n", "\n", "```{bibliography}\n", ":filter: docname in docnames\n", "```" ] } ], "metadata": { "jupytext": { "main_language": "python" }, "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.12.13" } }, "nbformat": 4, "nbformat_minor": 5 }