a b/Code/All Qiskit, PennyLane QML Nov 23/10a1 Eff. Dimension .985Local kkawchak.ipynb
1
{
2
 "cells": [
3
  {
4
   "cell_type": "markdown",
5
   "metadata": {},
6
   "source": [
7
    "# Effective Dimension of Qiskit Neural Networks\n",
8
    "In this tutorial, we will take advantage of the `EffectiveDimension` and `LocalEffectiveDimension` classes to evaluate the power of Quantum Neural Network models. These are metrics based on information geometry that connect to notions such as trainability, expressibility or ability to generalize.\n",
9
    "\n",
10
    "Before diving into the code example, we will briefly explain what is the difference between these two metrics, and why are they relevant to the study of Quantum Neural Networks. More information about global effective dimension can be found in [this paper](https://arxiv.org/pdf/2011.00027.pdf), while the local effective dimension was introduced in a [later work](https://arxiv.org/abs/2112.04807)."
11
   ]
12
  },
13
  {
14
   "cell_type": "markdown",
15
   "metadata": {
16
    "pycharm": {
17
     "name": "#%% md\n"
18
    }
19
   },
20
   "source": [
21
    "## 1. Global vs. Local Effective Dimension\n",
22
    "Both classical and quantum machine learning models share a common goal: being good at **generalizing**, i.e. learning insights from data and applying them on unseen data.\n",
23
    "\n",
24
    "Finding a good metric to assess this ability is a non-trivial matter. In [The Power of Quantum Neural Networks](https://arxiv.org/pdf/2011.00027.pdf), the authors introduce the **global** effective dimension as a useful indicator of how well a particular model will be able to perform on new data. In [Effective Dimension of Machine Learning Models](https://arxiv.org/pdf/2112.04807.pdf), the **local** effective dimension is proposed as a new capacity measure that bounds the generalization error of machine learning models.\n",
25
    "\n",
26
    "The key difference between global (`EffectiveDimension` class) and **local** effective dimension (`LocalEffectiveDimension` class) is actually not in the way they are computed, but in the nature of the parameter space that is analyzed. The global effective dimension incorporates the **full parameter space** of the model, and is calculated from a **large number of parameter (weight) sets**. On the other hand, the local effective dimension focuses on how well the **trained** model can generalize to new data, and how **expressive** it can be. Therefore, the local effective dimension is calculated from **a single** set of weight samples (training result). This difference is small in terms of practical implementation, but quite relevant at a conceptual level."
27
   ]
28
  },
29
  {
30
   "cell_type": "markdown",
31
   "metadata": {},
32
   "source": [
33
    "## 2. The Effective Dimension Algorithm\n",
34
    "\n",
35
    "Both the global and local effective dimension algorithms use the Fisher Information matrix to provide a measure of complexity. The details on how this matrix is calculated are provided in the [reference paper](https://arxiv.org/pdf/2011.00027.pdf), but in general terms, this matrix captures how sensitive a neural network's output is to changes in the network's parameter space.\n",
36
    "\n",
37
    "In particular, this algorithm follows 4 main steps:\n",
38
    "\n",
39
    "1. **Monte Carlo simulation:** the forward and backward passes (gradients) of the neural network are computed for each pair of input and weight samples.\n",
40
    "2. **Fisher Matrix Computation:** these outputs and gradients are used to compute the Fisher Information Matrix.\n",
41
    "3. **Fisher Matrix Normalization:** averaging over all input samples and dividing by the matrix trace\n",
42
    "4. **Effective Dimension Calculation:** according to the formula from [*Abbas et al.*](https://arxiv.org/pdf/2011.00027.pdf)"
43
   ]
44
  },
45
  {
46
   "cell_type": "markdown",
47
   "metadata": {
48
    "slideshow": {
49
     "slide_type": "slide"
50
    }
51
   },
52
   "source": [
53
    "## 3. Basic Example (SamplerQNN)\n",
54
    "\n",
55
    "This example shows how to set up a QNN model problem and run the global effective dimension algorithm. Both Qiskit `SamplerQNN` (shown in this example) and `EstimatorQNN` (shown in a later example) can be used with the `EffectiveDimension` class.\n",
56
    "\n",
57
    "We start off from the required imports and a fixed seed for the random number generator for reproducibility purposes."
58
   ]
59
  },
60
  {
61
   "cell_type": "code",
62
   "execution_count": 1,
63
   "metadata": {
64
    "slideshow": {
65
     "slide_type": "skip"
66
    }
67
   },
68
   "outputs": [
69
    {
70
     "name": "stderr",
71
     "output_type": "stream",
72
     "text": [
73
      "/tmp/ipykernel_1202/2968235742.py:6: DeprecationWarning: ``qiskit.algorithms`` has been migrated to an independent package: https://github.com/qiskit-community/qiskit-algorithms. The ``qiskit.algorithms`` import path is deprecated as of qiskit-terra 0.25.0 and will be removed no earlier than 3 months after the release date. Please run ``pip install qiskit_algorithms`` and use ``import qiskit_algorithms`` instead.\n",
74
      "  from qiskit.algorithms.optimizers import COBYLA\n"
75
     ]
76
    }
77
   ],
78
   "source": [
79
    "# Necessary imports\n",
80
    "import matplotlib.pyplot as plt\n",
81
    "import numpy as np\n",
82
    "from IPython.display import clear_output\n",
83
    "from qiskit import QuantumCircuit\n",
84
    "from qiskit.algorithms.optimizers import COBYLA\n",
85
    "from qiskit.circuit.library import ZFeatureMap, RealAmplitudes, ZZFeatureMap\n",
86
    "from qiskit.utils import algorithm_globals\n",
87
    "from sklearn.datasets import make_classification\n",
88
    "from sklearn.preprocessing import MinMaxScaler\n",
89
    "\n",
90
    "from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier\n",
91
    "from qiskit_machine_learning.neural_networks import EffectiveDimension, LocalEffectiveDimension\n",
92
    "from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN\n",
93
    "\n",
94
    "# set random seed\n",
95
    "algorithm_globals.random_seed = 42"
96
   ]
97
  },
98
  {
99
   "cell_type": "markdown",
100
   "metadata": {
101
    "pycharm": {
102
     "name": "#%% md\n"
103
    },
104
    "slideshow": {
105
     "slide_type": "skip"
106
    }
107
   },
108
   "source": [
109
    "### 3.1 Define QNN\n",
110
    "\n",
111
    "The first step to create a `SamplerQNN` is to define a parametrized feature map and ansatz. In this toy example, we will use 3 qubits, and we will define the circuit used in the `SamplerQNN` class."
112
   ]
113
  },
114
  {
115
   "cell_type": "code",
116
   "execution_count": 2,
117
   "metadata": {
118
    "pycharm": {
119
     "name": "#%%\n"
120
    },
121
    "slideshow": {
122
     "slide_type": "-"
123
    }
124
   },
125
   "outputs": [
126
    {
127
     "data": {
128
      "image/png": "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\n",
129
      "text/plain": [
130
       "<Figure size 621.941x284.278 with 1 Axes>"
131
      ]
132
     },
133
     "execution_count": 2,
134
     "metadata": {},
135
     "output_type": "execute_result"
136
    }
137
   ],
138
   "source": [
139
    "num_qubits = 3\n",
140
    "# create a feature map\n",
141
    "feature_map = ZZFeatureMap(feature_dimension=num_qubits, reps=1)\n",
142
    "# create a variational circuit\n",
143
    "ansatz = RealAmplitudes(num_qubits, reps=1)\n",
144
    "\n",
145
    "# combine feature map and ansatz into a single circuit\n",
146
    "qc = QuantumCircuit(num_qubits)\n",
147
    "qc.append(feature_map, range(num_qubits))\n",
148
    "qc.append(ansatz, range(num_qubits))\n",
149
    "qc.decompose().draw(\"mpl\")"
150
   ]
151
  },
152
  {
153
   "cell_type": "markdown",
154
   "metadata": {},
155
   "source": [
156
    "The parametrized circuit can then be sent together with an optional interpret map (parity in this case) to the `SamplerQNN` constructor."
157
   ]
158
  },
159
  {
160
   "cell_type": "code",
161
   "execution_count": 3,
162
   "metadata": {
163
    "pycharm": {
164
     "name": "#%%\n"
165
    }
166
   },
167
   "outputs": [],
168
   "source": [
169
    "# parity maps bitstrings to 0 or 1\n",
170
    "def parity(x):\n",
171
    "    return \"{:b}\".format(x).count(\"1\") % 2\n",
172
    "\n",
173
    "\n",
174
    "output_shape = 2  # corresponds to the number of classes, possible outcomes of the (parity) mapping."
175
   ]
176
  },
177
  {
178
   "cell_type": "code",
179
   "execution_count": 4,
180
   "metadata": {
181
    "pycharm": {
182
     "name": "#%%\n"
183
    }
184
   },
185
   "outputs": [],
186
   "source": [
187
    "# construct QNN\n",
188
    "qnn = SamplerQNN(\n",
189
    "    circuit=qc,\n",
190
    "    input_params=feature_map.parameters,\n",
191
    "    weight_params=ansatz.parameters,\n",
192
    "    interpret=parity,\n",
193
    "    output_shape=output_shape,\n",
194
    "    sparse=False,\n",
195
    ")"
196
   ]
197
  },
198
  {
199
   "cell_type": "markdown",
200
   "metadata": {},
201
   "source": [
202
    "### 3.2 Set up Effective Dimension calculation\n",
203
    "\n",
204
    "In order to compute the effective dimension of our QNN using the `EffectiveDimension` class, we need a series of sets of input samples and weights, as well as the total number of data samples available in a dataset. The `input_samples` and `weight_samples` are set in the class constructor, while the number of data samples is given during the call to the effective dimension computation, to be able to test and compare how this measure changes with different dataset sizes."
205
   ]
206
  },
207
  {
208
   "cell_type": "markdown",
209
   "metadata": {},
210
   "source": [
211
    "We can define the number of input samples and weight samples and the class will randomly sample a corresponding array from a normal (for `input_samples`) or a uniform (for `weight_samples`) distribution. Instead of passing a number of samples we can pass an array, sampled manually."
212
   ]
213
  },
214
  {
215
   "cell_type": "code",
216
   "execution_count": 5,
217
   "metadata": {
218
    "pycharm": {
219
     "name": "#%%\n"
220
    }
221
   },
222
   "outputs": [],
223
   "source": [
224
    "# we can set the total number of input samples and weight samples for random selection\n",
225
    "num_input_samples = 10\n",
226
    "num_weight_samples = 10\n",
227
    "\n",
228
    "global_ed = EffectiveDimension(\n",
229
    "    qnn=qnn, weight_samples=num_weight_samples, input_samples=num_input_samples\n",
230
    ")"
231
   ]
232
  },
233
  {
234
   "cell_type": "markdown",
235
   "metadata": {},
236
   "source": [
237
    "If we want to test a specific set of input samples and weight samples, we can provide it directly to the `EffectiveDimension` class as shown in the following snippet:"
238
   ]
239
  },
240
  {
241
   "cell_type": "code",
242
   "execution_count": 6,
243
   "metadata": {
244
    "pycharm": {
245
     "name": "#%%\n"
246
    }
247
   },
248
   "outputs": [],
249
   "source": [
250
    "# we can also provide user-defined samples and parameters\n",
251
    "input_samples = algorithm_globals.random.normal(0, 1, size=(10, qnn.num_inputs))\n",
252
    "weight_samples = algorithm_globals.random.uniform(0, 1, size=(10, qnn.num_weights))\n",
253
    "\n",
254
    "global_ed = EffectiveDimension(qnn=qnn, weight_samples=weight_samples, input_samples=input_samples)"
255
   ]
256
  },
257
  {
258
   "cell_type": "markdown",
259
   "metadata": {},
260
   "source": [
261
    "The effective dimension algorithm also requires a dataset size. In this example, we will define an array of sizes to later see how this input affects the result."
262
   ]
263
  },
264
  {
265
   "cell_type": "code",
266
   "execution_count": 7,
267
   "metadata": {
268
    "pycharm": {
269
     "name": "#%%\n"
270
    }
271
   },
272
   "outputs": [],
273
   "source": [
274
    "# finally, we will define ranges to test different numbers of data, n\n",
275
    "n = [5000, 8000, 10000, 40000, 60000, 100000, 150000, 200000, 500000, 1000000]"
276
   ]
277
  },
278
  {
279
   "cell_type": "markdown",
280
   "metadata": {},
281
   "source": [
282
    "### 3.3 Compute Global Effective Dimension\n",
283
    "Let's now calculate the effective dimension of our network for the previously defined set of input samples, weights, and a dataset size of 5000."
284
   ]
285
  },
286
  {
287
   "cell_type": "code",
288
   "execution_count": 8,
289
   "metadata": {
290
    "pycharm": {
291
     "name": "#%%\n"
292
    }
293
   },
294
   "outputs": [],
295
   "source": [
296
    "global_eff_dim_0 = global_ed.get_effective_dimension(dataset_size=n[0])"
297
   ]
298
  },
299
  {
300
   "cell_type": "markdown",
301
   "metadata": {},
302
   "source": [
303
    "The effective dimension values will range between 0 and `d`, where `d` represents the dimension of the model, and it's practically obtained from the number of weights of the QNN. By dividing the result by `d`, we can obtain the normalized effective dimension, which correlates directly with the capacity of the model."
304
   ]
305
  },
306
  {
307
   "cell_type": "code",
308
   "execution_count": 9,
309
   "metadata": {
310
    "pycharm": {
311
     "name": "#%%\n"
312
    }
313
   },
314
   "outputs": [
315
    {
316
     "name": "stdout",
317
     "output_type": "stream",
318
     "text": [
319
      "Data size: 5000, global effective dimension: 5.2939\n",
320
      "Number of weights: 6, normalized effective dimension: 0.8823\n"
321
     ]
322
    }
323
   ],
324
   "source": [
325
    "d = qnn.num_weights\n",
326
    "\n",
327
    "print(\"Data size: {}, global effective dimension: {:.4f}\".format(n[0], global_eff_dim_0))\n",
328
    "print(\n",
329
    "    \"Number of weights: {}, normalized effective dimension: {:.4f}\".format(d, global_eff_dim_0 / d)\n",
330
    ")"
331
   ]
332
  },
333
  {
334
   "cell_type": "markdown",
335
   "metadata": {},
336
   "source": [
337
    "By calling the `EffectiveDimension` class with an array if input sizes `n`, we can monitor how the effective dimension changes with the dataset size."
338
   ]
339
  },
340
  {
341
   "cell_type": "code",
342
   "execution_count": 10,
343
   "metadata": {
344
    "pycharm": {
345
     "name": "#%%\n"
346
    },
347
    "slideshow": {
348
     "slide_type": "-"
349
    }
350
   },
351
   "outputs": [],
352
   "source": [
353
    "global_eff_dim_1 = global_ed.get_effective_dimension(dataset_size=n)"
354
   ]
355
  },
356
  {
357
   "cell_type": "code",
358
   "execution_count": 11,
359
   "metadata": {
360
    "pycharm": {
361
     "name": "#%%\n"
362
    }
363
   },
364
   "outputs": [
365
    {
366
     "name": "stdout",
367
     "output_type": "stream",
368
     "text": [
369
      "Effective dimension: [5.29390229 5.33597126 5.35545289 5.46354885 5.49042841 5.52135717\n",
370
      " 5.54374079 5.55854944 5.60045031 5.62756494]\n",
371
      "Number of weights: 6\n"
372
     ]
373
    }
374
   ],
375
   "source": [
376
    "print(\"Effective dimension: {}\".format(global_eff_dim_1))\n",
377
    "print(\"Number of weights: {}\".format(d))"
378
   ]
379
  },
380
  {
381
   "cell_type": "code",
382
   "execution_count": 12,
383
   "metadata": {
384
    "pycharm": {
385
     "name": "#%%\n"
386
    },
387
    "slideshow": {
388
     "slide_type": "slide"
389
    }
390
   },
391
   "outputs": [
392
    {
393
     "data": {
394
      "image/png": "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+sEEzgEiIo3NnTsXW7duxZEjR9TamzZtivT0dLUkSJu1e/7++2/Vz2VlZYiPj1f9X1+XLl1w9uxZuLm5oXXr1movMUmPtbU1nJ2dcejQIbX2Q4cOPbZH5lHu7u4wMzPD0aNHVW137txR/ZIGyid137p1C3PnzkWfPn3g6elZqder4ik1hUKhart16xaSkpIQGRmJ559/Hu3atcOdO3c0jo3I0PLz83Hy5EnV74crV67g5MmTSElJQdu2bTF8+HAEBwcjNjYWV65cwbFjxxAdHY3t27cDKH8oo0uXLnj33XeRkJCA+Ph4fPDBB3jhhRfUeoU0wQSIiDTWqVMnDB8+HN9++61a+7PPPousrCx88cUXuHz5MhYvXow///xTa9+7ePFibNq0CYmJiQgLC8OdO3fw7rvvAgDCwsJw+/ZtvP322/jnn39w+fJl7Ny5E6GhoWrJgyYmTpyIefPmYf369UhKSkJERAROnjyJ8ePHa3wMS0tLvPfee5g4cSL27NmDf//9FyNHjlQb+mvevDnMzc2xcOFCJCcn4/fff8esWbPUjtOiRQtIJBJs27YNWVlZyM/PR6NGjdCkSRN8//33uHTpEvbs2YPw8HBR50hkSMePH4ePjw98fHwAAOHh4fDx8cH06dMBAMuXL0dwcDA++eQTeHh4YODAgfjnn3/QvHlzAOW9zVu3boWdnR369u2LV155Be3atcO6devEB6OFeUxEVE89PAm6wpUrVwRzc3Ph0V8fS5YsEVxdXYWGDRsKwcHBwuzZsytNgn70WP369as0MbhFixbCN998o/ouAMKaNWsEX19fwdzcXGjfvr2wZ88etX0uXLggDBo0SLC1tRXkcrng6ekpTJgwQVAqldV+T1UUCoUwY8YMwcXFRTAzMxO8vLyEP//8U22bJ02CFoTyidDvvPOO0KBBA8HBwUH44osvKsWwZs0awc3NTbCwsBB69Ogh/P777wIAISEhQbXNzJkzBUdHR0EikQghISGCIAjC7t27hXbt2gkWFhZC586dhX379lWaTEpETyYRhEcG7omIiIjqOQ6BERERkdFhAkRERERGhwkQERERGR0mQERERGR0mAARERGR0WECREREREaHCRAREREZHSZAREREZHSYABEREZHRYQJERERERocJEBERERkdJkBERERkdP4fzksyO9XWIyMAAAAASUVORK5CYII=\n",
395
      "text/plain": [
396
       "<Figure size 640x480 with 1 Axes>"
397
      ]
398
     },
399
     "metadata": {},
400
     "output_type": "display_data"
401
    }
402
   ],
403
   "source": [
404
    "# plot the normalized effective dimension for the model\n",
405
    "plt.plot(n, np.array(global_eff_dim_1) / d)\n",
406
    "plt.xlabel(\"Number of data\")\n",
407
    "plt.ylabel(\"Normalized GLOBAL effective dimension\")\n",
408
    "plt.show()"
409
   ]
410
  },
411
  {
412
   "cell_type": "markdown",
413
   "metadata": {
414
    "pycharm": {
415
     "name": "#%% md\n"
416
    }
417
   },
418
   "source": [
419
    "## 4. Local Effective Dimension Example\n",
420
    "As explained in the introduction, the local effective dimension algorithm only uses **one** set of weights, and it can be used to monitor how training affects the expressiveness of a neural network. The `LocalEffectiveDimension` class enforces this constraint to ensure that these calculations are conceptually separate, but the rest of the implementation is shared with `EffectiveDimension`.\n",
421
    "\n",
422
    "This example shows how to leverage the `LocalEffectiveDimension` class to analyze the effect of training on QNN expressiveness."
423
   ]
424
  },
425
  {
426
   "cell_type": "markdown",
427
   "metadata": {},
428
   "source": [
429
    "### 4.1 Define Dataset and QNN\n",
430
    "\n",
431
    "We start by creating a 3D binary classification dataset using `make_classification` function from scikit-learn."
432
   ]
433
  },
434
  {
435
   "cell_type": "code",
436
   "execution_count": 13,
437
   "metadata": {
438
    "pycharm": {
439
     "name": "#%%\n"
440
    }
441
   },
442
   "outputs": [],
443
   "source": [
444
    "num_inputs = 3\n",
445
    "num_samples = 50\n",
446
    "\n",
447
    "X, y = make_classification(\n",
448
    "    n_samples=num_samples,\n",
449
    "    n_features=num_inputs,\n",
450
    "    n_informative=3,\n",
451
    "    n_redundant=0,\n",
452
    "    n_clusters_per_class=1,\n",
453
    "    class_sep=2.0,\n",
454
    ")\n",
455
    "X = MinMaxScaler().fit_transform(X)\n",
456
    "y = 2 * y - 1  # labels in {-1, 1}"
457
   ]
458
  },
459
  {
460
   "cell_type": "markdown",
461
   "metadata": {},
462
   "source": [
463
    "The next step is to create a QNN, an instance of `EstimatorQNN` in our case in the same fashion we created an instance of `SamplerQNN`."
464
   ]
465
  },
466
  {
467
   "cell_type": "code",
468
   "execution_count": 14,
469
   "metadata": {
470
    "pycharm": {
471
     "name": "#%%\n"
472
    }
473
   },
474
   "outputs": [],
475
   "source": [
476
    "estimator_qnn = EstimatorQNN(\n",
477
    "    circuit=qc, input_params=feature_map.parameters, weight_params=ansatz.parameters\n",
478
    ")"
479
   ]
480
  },
481
  {
482
   "cell_type": "markdown",
483
   "metadata": {},
484
   "source": [
485
    "### 4.2 Train QNN\n",
486
    "\n",
487
    "We can now proceed to train the QNN. The training step may take some time, be patient. You can pass a callback to the classifier to observe how the training process is going on. We fix `initial_point` for reproducibility purposes as usual."
488
   ]
489
  },
490
  {
491
   "cell_type": "code",
492
   "execution_count": 15,
493
   "metadata": {
494
    "pycharm": {
495
     "name": "#%%\n"
496
    }
497
   },
498
   "outputs": [],
499
   "source": [
500
    "# callback function that draws a live plot when the .fit() method is called\n",
501
    "def callback_graph(weights, obj_func_eval):\n",
502
    "    clear_output(wait=True)\n",
503
    "    objective_func_vals.append(obj_func_eval)\n",
504
    "    plt.title(\"Objective function value against iteration\")\n",
505
    "    plt.xlabel(\"Iteration\")\n",
506
    "    plt.ylabel(\"Objective function value\")\n",
507
    "    plt.plot(range(len(objective_func_vals)), objective_func_vals)\n",
508
    "    plt.show()"
509
   ]
510
  },
511
  {
512
   "cell_type": "code",
513
   "execution_count": 16,
514
   "metadata": {
515
    "pycharm": {
516
     "name": "#%%\n"
517
    }
518
   },
519
   "outputs": [],
520
   "source": [
521
    "# construct classifier\n",
522
    "initial_point = algorithm_globals.random.random(estimator_qnn.num_weights)\n",
523
    "\n",
524
    "estimator_classifier = NeuralNetworkClassifier(\n",
525
    "    neural_network=estimator_qnn,\n",
526
    "    optimizer=COBYLA(maxiter=80, rhobeg=1.14),\n",
527
    "    initial_point=initial_point,\n",
528
    "    callback=callback_graph,\n",
529
    ")"
530
   ]
531
  },
532
  {
533
   "cell_type": "code",
534
   "execution_count": 17,
535
   "metadata": {
536
    "pycharm": {
537
     "name": "#%%\n"
538
    }
539
   },
540
   "outputs": [
541
    {
542
     "data": {
543
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+kAAAIjCAYAAAB/OVoZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAACasUlEQVR4nOzdd3hUZfrG8Xtmkpn0hBRCCySE3pEmCGJBUUTXjmUVsbt2LCtr11VW3bXt4mLHtaLYfvaCBVCKgvReQg2ppPeZ8/sjmYGQQiZMMiXfz3XlIjk5c84zk6Dc877v85oMwzAEAAAAAAC8zuztAgAAAAAAQDVCOgAAAAAAPoKQDgAAAACAjyCkAwAAAADgIwjpAAAAAAD4CEI6AAAAAAA+gpAOAAAAAICPIKQDAAAAAOAjCOkAAAAAAPgIQjoA+KmHHnpIJpNJ2dnZRzw3OTlZV1xxRcsXdZg5c+bIZDIpLS2t1e/922+/acyYMQoPD5fJZNLKlStbvYam8NbPxtO8+bP2JpPJpIceesjbZUjyz5+B879jAICDCOkA4EPWrVunP//5z+rcubNsNps6deqkSy+9VOvWrfN2aY16/PHH9cknn3i7DJfKykpdcMEFys3N1TPPPKM333xT3bp181o9v/76qx566CHl5eV5rQb4n3379umhhx46qjeYXnjhBc2ZM8djNTVHSUmJHnroIf30009erQMA/IXJMAzD20UAAKSPPvpIF198sWJjY3XVVVcpJSVFaWlpevXVV5WTk6P33ntP55xzjuv8hx56SA8//LCysrIUHx/f6LXLy8tlNpsVHBzcIrVHRETo/PPPrxMG7Ha7KisrZbPZWnW0bOPGjerbt69efvllXX311a1234b885//1F133aUdO3YoOTm51vda+mfTWubMmaNp06bV+xwDWVlZmYKCghQUFOTxa//+++8aMWKEXn/99SbNtqjv79uAAQMUHx/v1YCcnZ2thIQEPfjgg3VmHVRVVamqqkohISHeKQ4AfJDn/48CAHDbtm3bdNlll6l79+5asGCBEhISXN+79dZbNW7cOF122WVavXq1unfv7vb1bTabJ8ttMovFIovF0ur3zczMlCTFxMS0+r3d5a2fDTzDl8Jla/19q6qqksPhkNVqPeprtdQbHADgz5juDgA+4KmnnlJJSYleeumlWgFdkuLj4/Xiiy+quLhYTz75ZJ3HZmdn68ILL1RUVJTi4uJ06623qqysrNY59a17zsvL02233aakpCTZbDb16NFDTzzxhBwOR63zHA6HnnvuOQ0cOFAhISFKSEjQaaedpt9//11S9Zrc4uJivfHGGzKZTDKZTK57Hb5GdvLkyQ2+yTB69GgNHz681rG33npLw4YNU2hoqGJjY3XRRRdp9+7djb6WV1xxhcaPHy9JuuCCC2QymXTCCSdIkk444QTX54c/5tDR37S0NJlMJv3zn//USy+9pNTUVNlsNo0YMUK//fZbncdv3LhRF154oRISEhQaGqrevXvr3nvvlVQ94+Guu+6SJKWkpLheI+drUt/PZvv27brgggsUGxursLAwHXvssfriiy9qnfPTTz/JZDLp/fff12OPPaYuXbooJCREJ598srZu3droazRv3jyZTCb9/PPPdb734osvymQyae3atZKk1atX64orrlD37t0VEhKiDh066Morr1ROTk6j95AaXq99NL+P9fn00091xhlnqFOnTrLZbEpNTdWjjz4qu91e59xZs2ape/fuCg0N1ciRI7Vw4cI6vxcVFRV64IEHNGzYMEVHRys8PFzjxo3Tjz/+eMTn6FxjvXXrVl1xxRWKiYlRdHS0pk2bppKSklqP/e677zR27FjFxMQoIiJCvXv31t/+9jdJ1T/fESNGSJKmTZvm+r1pbOr64X/fkpOTtW7dOv3888+uxx/6PJvymh/6d+HZZ591/V1Yv359k16ntLQ013/THn74YVcdztesvjXpVVVVevTRR133Sk5O1t/+9jeVl5fXOi85OVmTJ0/WokWLNHLkSIWEhKh79+763//+1+BrBAD+gLcuAcAHfPbZZ0pOTta4cePq/f7xxx+v5OTkOkFNki688EIlJydr5syZWrJkiZ5//nkdOHCg0X+olpSUaPz48dq7d6+uu+46de3aVb/++qtmzJih9PR0Pfvss65zr7rqKs2ZM0enn366rr76alVVVWnhwoVasmSJhg8frjfffFNXX321Ro4cqWuvvVaSlJqaWu99p0yZossvv1y//fabK4BI0s6dO7VkyRI99dRTrmOPPfaY7r//fl144YW6+uqrlZWVpX//+986/vjj9ccffzQ4Sn7dddepc+fOevzxx3XLLbdoxIgRSkxMbPC1aMw777yjwsJCXXfddTKZTHryySd17rnn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iomJcf0cnQ5/naXq1/pIv/8A4MsI6QDgZdHR0erYsaNWr17d6HmrV69W586dFRUV1eh5TRnBdTgcOuWUU3T33XfX+/1DQ5qnnXnmmQoLC9P777+vMWPG6P3335fZbNYFF1xQqz6TyaSvvvqq3m7VERERzbq3yWSqNYLvVF+DMUkNdsqu7xre0twabTabzj77bH388cd64YUXlJGRoV9++UWPP/54rfMuvPBC/frrr7rrrrs0ZMgQRUREyOFw6LTTTmv2CPDhr/fR/D7m5eVp/PjxioqK0iOPPKLU1FSFhIRoxYoV+utf/9qsGt966y1dccUVOvvss3XXXXepffv2slgsmjlzprZt29akaxzp5xIaGqoFCxboxx9/1BdffKGvv/5ac+fO1UknnaRvv/22xbu0u/uaHzpbwckTr1NDmjoTxR/+jgKAuwjpAOADJk+erJdfflmLFi2qNc3ZaeHChUpLS9N1111X53tbtmypNWq1detWORyORveqTk1NVVFRkSZMmNBoXampqfrmm2+Um5vb6Gi6O1O7w8PDNXnyZH3wwQd6+umnNXfuXI0bN06dOnWqdV/DMJSSkuLRNwzatWtX7zTYw0fnmsrZqd7ZCb0h7rw+3bp106ZNm+ocd07b7tatmxsVNm7KlCl64403NH/+fG3YsEGGYdSa6n7gwAHNnz9fDz/8sB544AHX8S1btjTp+u3atVNeXl6tYxUVFUpPT691rKm/j/X56aeflJOTo48++kjHH3+86/iOHTtqned83bZu3aoTTzzRdbyqqkppaWm1GpnNmzdP3bt310cffVTrZ1ffso+jYTabdfLJJ+vkk0/W008/rccff1z33nuvfvzxR02YMMEjTfkausbRvOZOTX2d3P39dzgc2rJli2v2iFTdUDEvL8+jv/8A4KtYkw4APuCuu+5SaGiorrvuujpbW+Xm5ur6669XWFiYayuvQ82aNavW1//+978lSaeffnqD97vwwgu1ePFiffPNN3W+l5eXp6qqKknV61ANw9DDDz9c57xDR6rCw8PrhLHGTJkyRfv27dMrr7yiVatW1QqGknTuuefKYrHo4YcfrjMiZhhGk7b/qk9qaqo2btyorKws17FVq1a5Omq7KyEhQccff7xee+017dq1q06dTuHh4ZLUpNdo0qRJWrZsmRYvXuw6VlxcrJdeeknJycnq169fs2qtz4QJExQbG6u5c+dq7ty5GjlyZK03fJyjlIf/DI7Ubd0pNTW1ztrml156qc5IelN/H+tTX40VFRV64YUXap03fPhwxcXF6eWXX651vbfffrvO1Oj6rrl06dJaP5OjlZubW+eYs2u8c6sxd35vGtLQ382jec2dmvo6hYWFua57JJMmTZJU93fs6aefllS9MwEABDpG0gHAB/Ts2VNvvPGGLr30Ug0cOFBXXXWVUlJSlJaWpldffVXZ2dl69913693abMeOHTrrrLN02mmnafHixXrrrbd0ySWXaPDgwQ3e76677tL//d//afLkya7tioqLi7VmzRrNmzdPaWlpio+P14knnqjLLrtMzz//vLZs2eKa4rxw4UKdeOKJuummmyRJw4YN0/fff6+nn35anTp1UkpKSr3rqp0mTZqkyMhI3XnnnbJYLDrvvPNqfT81NVV///vfNWPGDNc2WZGRkdqxY4c+/vhjXXvttbrzzjvdfp2vvPJKPf3005o4caKuuuoqZWZmavbs2erfv3+dtcxN9fzzz2vs2LE65phjdO2117p+bl988YVWrlwpqfr1kaR7771XF110kYKDg3XmmWe6Qtih7rnnHr377rs6/fTTdcsttyg2NlZvvPGGduzYoQ8//NCj65WDg4N17rnn6r333lNxcbH++c9/1vp+VFSUjj/+eD355JOqrKxU586d9e2339YZpW7I1Vdfreuvv17nnXeeTjnlFK1atUrffPONaxs6p6b+PtZnzJgxateunaZOnapbbrlFJpNJb775Zp03FqxWqx566CHdfPPNOumkk3ThhRcqLS1Nc+bMUWpqaq3R3smTJ+ujjz7SOeecozPOOEM7duzQ7Nmz1a9fPxUVFTXpuR/JI488ogULFuiMM85Qt27dlJmZqRdeeEFdunRxzaZJTU1VTEyMZs+ercjISIWHh2vUqFFurfceNmyY/vvf/+rvf/+7evToofbt2+ukk046qtfcqamvU2hoqPr166e5c+eqV69eio2N1YABA+rt5TB48GBNnTpVL730kmspw7Jly/TGG2/o7LPPrjULAgACVit3kwcANGL16tXGxRdfbHTs2NEIDg42OnToYFx88cX1bqfl3Lpo/fr1xvnnn29ERkYa7dq1M2666SajtLS01rmHb3llGNXbes2YMcPo0aOHYbVajfj4eGPMmDHGP//5T6OiosJ1XlVVlfHUU08Zffr0MaxWq5GQkGCcfvrpxvLly13nbNy40Tj++OON0NBQQ5LrXvVtCeV06aWXGpKMCRMmNPh6fPjhh8bYsWON8PBwIzw83OjTp49x4403Gps2bWr0dWxoCzbDMIy33nrL6N69u2G1Wo0hQ4YY33zzTYNbsD311FN1Hq96tpJau3atcc455xgxMTFGSEiI0bt3b+P++++vdc6jjz5qdO7c2TCbzbVek/p+Ntu2bTPOP/981/VGjhxpfP755016js7am7pt13fffWdIMkwmk7F79+4639+zZ4/ruUVHRxsXXHCBsW/fvjqvQ30/a7vdbvz1r3814uPjjbCwMGPixInG1q1bj+r3sT6//PKLceyxxxqhoaFGp06djLvvvtv45ptvDEnGjz/+WOvc559/3ujWrZths9mMkSNHGr/88osxbNgw47TTTnOd43A4jMcff9x13tChQ43PP/+8zu+JYTS8BdvhW6sd/vrMnz/f+NOf/mR06tTJsFqtRqdOnYyLL764zpZon376qdGvXz8jKCjoiD/X+n4G+/fvN8444wwjMjKyzlZzTXnNG/u74M7r9OuvvxrDhg0zrFZrrdfs8C3YDMMwKisrjYcffthISUkxgoODjaSkJGPGjBmu7fScunXrZpxxxhl16mpoq0UA8Bcmw6CzBgAEuqSkJE2cOFGvvPKKt0sBfIrD4VBCQoLOPfdcvfzyy94uBwAA1qQDQKCrrKxUTk7OEaeuAoGurKyszjT4//3vf8rNzdUJJ5zgnaIAADgMa9IBIIB98803eu+991RaWuraCxtoq5YsWaLbb79dF1xwgeLi4rRixQq9+uqrGjBgQK0tAAEA8CZCOgAEsH/84x/aunWrHnvsMZ1yyineLgfwquTkZCUlJen55593bSt4+eWX6x//+IesVqu3ywMAQJLEmnQAAAAAAHwEa9IBAAAAAPARhHQAAAAAAHxEm1uT7nA4tG/fPkVGRspkMnm7HAAAAABAgDMMQ4WFherUqZPM5sbHyttcSN+3b5+SkpK8XQYAAAAAoI3ZvXu3unTp0ug5bS6kR0ZGSqp+caKiorxcDQAAAAAg0BUUFCgpKcmVRxvT5kK6c4p7VFQUIR0AAAAA0GqasuSaxnEAAAAAAPgIQjoAAAAAAD6CkA4AAAAAgI8gpAMAAAAA4CMI6QAAAAAA+AhCOgAAAAAAPoKQDgAAAACAjyCkAwAAAADgIwjpAAAAAAD4CEI6AAAAAAA+gpAOAAAAAICPIKQDAAAAAOAjCOkAAAAAAPgIQjoAAAAAAD6CkA4AAAAAgI8gpAMAAAAA4CMI6fBZWzIKlVlQ5u0yAAAAAKDVENLhk7KLyjXp+YX686tLvV0KAAAAALQaQjp80s6cYlXaDaXllHi7FAAAAABoNYR0+KTsogpJUkWVQ5V2h5erAQAAAIDW4dWQvmDBAp155pnq1KmTTCaTPvnkk0bPT09P1yWXXKJevXrJbDbrtttua5U60fpyakK6JBWXV3mxEgAAAABoPV4N6cXFxRo8eLBmzZrVpPPLy8uVkJCg++67T4MHD27h6uBNucXlrs+LK+xerAQAAAAAWk+QN29++umn6/TTT2/y+cnJyXruueckSa+99lpLlQUfkM1IOgAAAIA2yKshvTWUl5ervPzgqGxBQYEXq0FT5RQfDOlFhHQAAAAAbUTAN46bOXOmoqOjXR9JSUneLglNUGu6OyEdAAAAQBsR8CF9xowZys/Pd33s3r3b2yWhCWgcBwAAAKAtCvjp7jabTTabzdtlwE2HrkkvKqdxHAAAAIC2IeBH0uF/HA5DB0oYSQcAAADQ9nh1JL2oqEhbt251fb1jxw6tXLlSsbGx6tq1q2bMmKG9e/fqf//7n+uclStXuh6blZWllStXymq1ql+/fq1dfov6Zt1+Pff9Fg3r1k6Pnj3A2+W0qvzSStkdhutrGscBAAAAaCu8GtJ///13nXjiia6vp0+fLkmaOnWq5syZo/T0dO3atavWY4YOHer6fPny5XrnnXfUrVs3paWltUrNraWs0q716QWKCQv2dimtLueQpnESI+kAAAAA2g6vhvQTTjhBhmE0+P05c+bUOdbY+YEkKrQ6nOeXVnq5ktZ3aNM4iZAOAAAAoO1gTbqPim7LIb24dkincRwAAACAtoKQ7qNcIb2kDYb0Iqa7AwAAAGibCOk+KqYmpBeWV9VqotYWOEfSQ4MtkqTiCkI6AAAAgLaBkO6jnGvSJamgjU15d65J7xobJomRdAAAAABtByHdRwVbzAq3Vo8kt7V16c7u7l3jnCGdNekAAAAA2gZCug+LCbNKkvLaWkivGUnvVjOSzj7pAAAAANoKQroPa6vbsDnXpLtG0lmTDgAAAKCNIKT7sOjQ6m3s21pIzy1mTToAAACAtomQ7sMObsNWcYQzA0eV3aEDJbVDeqXdUHkV69IBAAAABD5Cug+LCa1ek96WRtIPlFTKMCSTSerSLsx1nOZxAAAAANoCQroPiw5re2vSnVPdY0KDZQ0yKyS4+leUKe8AAAAA2gJCug+LboON43KKqrdfi4uwSZIibNXr8unwDgAAAKAtIKT7MGdIzytpOyE9u2YkPS68eqp/eE1IZyQdAAAAQFtASPdhbXEkPdc1kl4T0q2MpAMAAABoOwjpPqwthvQc10h67enuNI4DAAAA0BYQ0n2YM6QXtKGQnl1UE9KdI+k2iySpuIKRdAAAAACBj5Duw2JqurvntaGQnltcM92dNekAAAAA2iBCug9zjqSXVNhVaXd4uZrWkeMaST98ujshHQAAAEDgI6T7sMiQYNfnbWVdek4D3d2LWJMOAAAAoA0gpPswi9mkyJDqkNpWtmHLOby7OyPpAAAAANoQQrqPc65Lbwsj6RVVDhWUVYfxg93daxrHEdIBAAAAtAGEdB/Xljq859ZMdbeYTa7nfXC6OyEdAAAAQOAjpPu4trRXek5NZ/d2YVaZzSZJUri1Zro7W7ABAAAAaAMI6T4uJrR6bXZeSYWXK2l5zs7u8TXr0SUaxwEAAABoWwjpPi7KNZIe+CPJzpH0uFohnTXpAAAAANoOQrqPa1PT3WtG0mNrmsZJ7JMOAAAAoG0hpPu4NhXSD9sjXaJxHAAAAIC2hZDu4w5uwRb4a9Jz61mT7hxJL6mwyzAMr9QFAAAAAK2FkO7j2tZIevWa9EOnuztH0u0OQ+VVDq/UBQAAAACthZDu49pSSM+uGUk/tHFcWLDF9TlT3gEAAAAEOkK6j3OG9LySwA/pucV1p7ubzSaFW+nwDgAAAKBtIKT7uLY0kp5TVHe6u0TzOAAAAABtByHdx0XXNI4rr3KorNLu5WpaTlmlXcUV1c/v0Onu0qHbsAXu8wcAAAAAiZDu8yKsQTKbqj8vCODRdOf2a1aLWZE1odwpnL3SAQAAALQRhHQfZzabDq5LD+SQ7prqbpXJZKr1vbCaNelMdwcAAAAQ6AjpfqAtrEvPqaezu1MEI+kAAAAA2ghCuh9whfQA7vDunO4eF2Gr8z0axwEAAABoKwjpfiA6rHp0uS1Md48LrzuSHk7jOAAAAABtBCHdD7SJ6e7OkfR6QnqErWaf9ApG0gEAAAAENkK6H4gOrR5JDuiQXsR0dwAAAAAgpPsB50h6YG/B1vB0d2fjuBJCOgAAAIAAR0j3AzGhNWvSSyq8XEnLaay7+8GRdNakAwAAAAhshHQ/0BbWpOc2obs7W7ABAAAACHSEdD8QFeAh3TAMZTfS3Z3GcQAAAADaCkK6H4gJC+yQXlxhV3mVQ1ID092tNI4DAAAA0DYQ0v1AoE93z61Zjx4abFFYTSA/FNPdAQAAALQVhHQ/cGhINwzDy9V4XnZNZ/fYeqa6S4eGdBrHAQAAAAhshHQ/4AzplXZDpZWBF1Sdnd3j65nqLknhh6xJD8Q3KQAAAADAiZDuB8KsFgVbTJKkvJLAm/Ke69wjvZ7O7tLBfdINQyqpCLw3KQAAAADAiZDuB0wmU0CvS8+uGUlvaLp7aLBF5ur3KFiXDgAAACCgEdL9RCBvw3Zwj/T6Q7rJZKLDOwAAAIA2gZDuJwJ5JD2nZo/0+PD6p7tLNI8DAAAA0DYQ0v1EjDOkB+Ca9Jzixqe7S7WbxwEAAABAoCKk+4nAHklvfLq7dLB5HGvSAQAAAAQyQrqfCOiQXtPdPb6B7u7SwenurEkHAAAAEMgI6X4iOqx6lDnQQrphGK7GcY1Pd2dNOgAAAIDAR0j3E86R9LwAC+kFZVWqtBuSGg/pTHcHAAAA0BYQ0v1EoE53d3Z2j7QFKSTY0uB5zsZxTHcHAAAAEMi8GtIXLFigM888U506dZLJZNInn3xyxMf89NNPOuaYY2Sz2dSjRw/NmTOnxev0BQEb0p1T3RtpGicdOt2dkA4AAAAgcHk1pBcXF2vw4MGaNWtWk87fsWOHzjjjDJ144olauXKlbrvtNl199dX65ptvWrhS74sJc27BVuHlSjzL1dm9kanukhRurQnpbMEGAAAAIIAFefPmp59+uk4//fQmnz979mylpKToX//6lySpb9++WrRokZ555hlNnDixpcr0CYE7kl493T2ukc7u0qHd3WkcBwAAACBw+dWa9MWLF2vChAm1jk2cOFGLFy9u8DHl5eUqKCio9eGPnCG9oKxKhmF4uRrPaepIekTNmnSmuwMAAAAIZH4V0vfv36/ExMRaxxITE1VQUKDS0tJ6HzNz5kxFR0e7PpKSklqjVI9zhnS7wwio5mnO7dfimrgmPZCeOwAAAAAczq9CenPMmDFD+fn5ro/du3d7u6RmCQm2yBZU/ePKKwmcKe/ZNd3d48KbNt2dkXQAAAAAgcyra9Ld1aFDB2VkZNQ6lpGRoaioKIWGhtb7GJvNJput8QDoL6JDg5VZWK780kr553yAulzT3Y8wks4+6QAAAADaAr8aSR89erTmz59f69h3332n0aNHe6mi1uValx5AzeNc092PNJLu6u5O4zgAAAAAgcurIb2oqEgrV67UypUrJVVvsbZy5Urt2rVLUvVU9csvv9x1/vXXX6/t27fr7rvv1saNG/XCCy/o/fff1+233+6N8ludcxu2vAAK6Qe7uzOSDgAAAABeDem///67hg4dqqFDh0qSpk+frqFDh+qBBx6QJKWnp7sCuySlpKToiy++0HfffafBgwfrX//6l1555ZWA337NKdC2YXM4jENG0o/UOK66u3tJhV0OR+B0twcAAACAQ3l1TfoJJ5zQ6HZic+bMqfcxf/zxRwtW5buiAiyk55VWypm32x0xpB/8VS2uqFJkSHBLlgYAAAAAXuFXa9LbupjQ6iAbKCE9p6aze0xYsIItjf8q2oLMCjKbJEnF5axLBwAAABCYCOl+xDndPVC2YMupmeoee4RRdEkymUzslQ4AAAAg4BHS/Uh0aHVIDZTu7s7t1+KP0NndKdxavS6d5nEAAAAAAhUh3Y9EhwXWmvSmdnZ3CqfDOwAAAIAAR0j3I4G3Jr3p090lMd0dAAAAQMAjpPsRZ3f3vNIKL1fiGQdH0ps23d21V3oFIR0AAABAYCKk+xHXPumB0jiuqGl7pDs590ovors7AAAAgABFSPcjzpBeWF4lu6Ph/eX9hbO7O2vSAQAAAKAaId2POEO6YUiFZf4/mu7cJz2uid3dndPdSwjpAAAAAAIUId2PWIPMCqvZhiwQmsc1dySd6e4AAAAAAhUh3c+41qX7eUivsjuUV7O2vqlr0iOY7g4AAAAgwBHS/UyghPTckupRdLNJiglr4kh6zSyCIrq7AwAAAAhQhHQ/4wzpeX7e4d3Z2b1dmFUWs6lJj6FxHAAAAIBAR0j3MwEzku7menSJ6e4AAAAAAh8h3c8ESkjPdrOzuySF0TgOAAAAQIAjpPuZmLDqkF7g5yHdOd091q2R9Oo16YykAwAAAAhUhHQ/Eyhr0p3T3eOb2NldYk06AAAAgMBHSPczgTLdPae4Zrp7RNOnu4dbndPdCekAAAAAAhMh3c9E12xX5u8hPds53d2NkXRn47jyKoeq7I4WqQsAAAAAvImQ7mdc0939PKS7pru7sSbdOd1dkoppHgcAAAAgABHS/YwzpPt/4zj3p7tbg8yyWqp/ZYsqmPIOAAAAIPAQ0v1M4KxJd3+6uySF13R4L2FdOgAAAIAAREj3MzE1Ib2ovEqVfrouu7zKrsKy6pAd78Y+6dLBKe80jwMAAAAQiAjpfiaqJqRL/jvl3bkePchsUlRo0BHOri3CtQ0ba9IBAAAABB5Cup+xmE2KrAmq/jrlPeeQzu4mk8mtxzKSDgAAACCQEdL9UHSYf69Ld65Hd6dpnFO4aySdkA4AAAAg8BDS/ZC/b8Pm7OzuzvZrTuHW6sZxxXR3BwAAABCACOl+yN+3YcttZmd3ienuAAAAAAIbId0P+fs2bNk1a9Lj3OzsLh3aOI6QDgAAACDwENL9UIxzTXqJf4Z053T3uOZMd6/ZJ53u7gAAAAACESHdD0X5+Zp053T3OKa7AwAAAEAthHQ/5PfT3Y+iuzvT3QEAAAAEMkK6H4oJrR6B9teQflTT3a2MpAMAAAAIXIR0P+TvI+memO5eUsGadAAAAACBh5Duh1wh3Q8bx5VUVLkCNtPdAQAAAKA2Qrof8ueR9Jya7ddsQWaFWy1uP97Z3Z3p7gAAAAACESHdD7m2YPPDkH7oVHeTyeT24xlJBwAAABDICOl+yLkFW2mlXeVV/rU2O6fY2TTO/anu0sE16eyTDgAAACAQEdL9UKQtSM5BaH8bTc8ucm6/5n7TOOlgd/cKu0MVVQ6P1QUAAAAAvoCQ7ofMZpOiQqpH0wv8LKQ7p7vHNqOzu3RwTbrElHcAAAAAgYeQ7qf8dV26c4/0+GZOdw+ymGULqv61pXkcAAAAgEBDSPdTzg7veX62DZuzu3tz9kh3cjWPqyCkAwAAAAgshHQ/5a/bsOUc5XR36dDmcYR0AAAAAIGFkO6n/DekH910d+lgSC+iwzsAAACAAENI91P+GtIPFFfX2+6oprtXN49jJB0AAABAoGlWSF+4cKH+/Oc/a/To0dq7d68k6c0339SiRYs8Whwa5q9r0p1vKsTU1N8cTHcHAAAAEKjcDukffvihJk6cqNDQUP3xxx8qL6+evpyfn6/HH3/c4wWifs6Q7k9bsFXZHa6O7NGEdAAAAACow+2Q/ve//12zZ8/Wyy+/rODgg0HruOOO04oVKzxaHBrmj1uwFZQdDNVRRxHSI6zO7u6sSQcAAAAQWNwO6Zs2bdLxxx9f53h0dLTy8vI8UROawDXd3Y9Cel5JdWf3SFuQLGZTs69zsHEcI+kAAAAAAovbIb1Dhw7aunVrneOLFi1S9+7dPVIUjizKDxvHOWs9mlF0icZxAAAAAAKX2yH9mmuu0a233qqlS5fKZDJp3759evvtt3XnnXfqhhtuaIkaUY+Y0Oru6P4Y0o9mPbokhTGSDgAAACBABbn7gHvuuUcOh0Mnn3yySkpKdPzxx8tms+nOO+/UzTff3BI1oh7Rh6xJNwxDJlPzp4+3Fk+FdBrHAQAAAAhUbod0k8mke++9V3fddZe2bt2qoqIi9evXTxERES1RHxrgDLoVVQ6VVToUarV4uaIjK/BQSD843Z3GcQAAAAACi9sh3clqtapfv36erAVuCLdaZDGbZHcYyi+t9IuQ7tojPewoR9KtTHcHAAAAEJjcDuknnnhio1Orf/jhh6MqCE1jMpkUExqsnOIK5ZdWqkN0iLdLOiJPTXePYLo7AAAAgADldkgfMmRIra8rKyu1cuVKrV27VlOnTvVUXWiC6ENCuj/wVHd31qQDAAAACFRuh/Rnnnmm3uMPPfSQioqKjrogNJ0z7Dr3H/d1eSWebRzHdHcAAAAAgcbtLdga8uc//1mvvfaapy6HJogJ86+90j0+3b3CLsMwjrouAAAAAPAVHgvpixcvVkhI89ZFz5o1S8nJyQoJCdGoUaO0bNmyBs+trKzUI488otTUVIWEhGjw4MH6+uuvm1u2X3OG3bYW0sNrurvbHYbKqxxHXRcAAAAA+Aq3p7ufe+65tb42DEPp6en6/fffdf/997tdwNy5czV9+nTNnj1bo0aN0rPPPquJEydq06ZNat++fZ3z77vvPr311lt6+eWX1adPH33zzTc655xz9Ouvv2ro0KFu39+f+VtI99QWbM7u7lL1uvSQYN/vbA8AAAAATeH2SHp0dHStj9jYWJ1wwgn68ssv9eCDD7pdwNNPP61rrrlG06ZNU79+/TR79myFhYU1OHX+zTff1N/+9jdNmjRJ3bt31w033KBJkybpX//6l9v39nf+FtI9NZJuNpsUZmWvdAAAAACBx+2R9Ndff91jN6+oqNDy5cs1Y8YM1zGz2awJEyZo8eLF9T6mvLy8zrT60NBQLVq0qMHzy8vLXV8XFBR4oHLf4E8hvdLuUHFFdaA+2pAuVTePK6mw0zwOAAAAQEDx2Jr05sjOzpbdbldiYmKt44mJidq/f3+9j5k4caKefvppbdmyRQ6HQ999950++ugjpaen13v+zJkza438JyUlefx5eIs/hfSCQ2o82i3YJCncOZJeQUgHAAAAEDiaFNLbtWun2NjYJn20tOeee049e/ZUnz59ZLVaddNNN2natGkym+t/KjNmzFB+fr7rY/fu3S1eY2uJdm3B5vsh3flGQmRIkCxm01Ffj23YAAAAAASiJk13f/bZZ1vk5vHx8bJYLMrIyKh1PCMjQx06dKj3MQkJCfrkk09UVlamnJwcderUSffcc4+6d+9e7/k2m002m83jtfsCZ0gv8IOR9DwPrUd3cob0YkI6AAAAgADSpJA+derUFrm51WrVsGHDNH/+fJ199tmSJIfDofnz5+umm25q9LEhISHq3LmzKisr9eGHH+rCCy9skRp9WUyYVZJ/THf3VNM4pwhCOgAAAIAA5HbjuEOVlZWpoqKi1rGoqCi3rjF9+nRNnTpVw4cP18iRI/Xss8+quLhY06ZNkyRdfvnl6ty5s2bOnClJWrp0qfbu3ashQ4Zo7969euihh+RwOHT33XcfzVPxS67p7qWVMgxDJtPRTyNvKZ7afs3p4HR3ursDAAAACBxuh/Ti4mL99a9/1fvvv6+cnJw637fb3QtNU6ZMUVZWlh544AHt379fQ4YM0ddff+1qJrdr165a683Lysp03333afv27YqIiNCkSZP05ptvKiYmxt2n4vecgdfuMFRcYXeNLvsiz4+kO7dgYyQdAAAAQOBwO9Xdfffd+vHHH/Xf//5Xl112mWbNmqW9e/fqxRdf1D/+8Y9mFXHTTTc1OL39p59+qvX1+PHjtX79+mbdJ9CEBJtlDTKrosqh/NJK3w7pJR4eSbcy3R0AAABA4HF7C7bPPvtML7zwgs477zwFBQVp3Lhxuu+++/T444/r7bffboka0QCTyXRwGzYf7/Du6ZF0ursDAAAACERuh/Tc3FxXJ/WoqCjl5uZKksaOHasFCxZ4tjoc0cF16RVHONO7nCHdE3ukSwcbx5VUsCYdAAAAQOBwO6R3795dO3bskCT16dNH77//vqTqEfa2uC7c2/xlGzZnSI8JYyQdAAAAABridkifNm2aVq1aJUm65557NGvWLIWEhOj222/XXXfd5fEC0bgY53R3Hw/pnt8nncZxAAAAAAKP253Gbr/9dtfnEyZM0MaNG7V8+XL16NFDgwYN8mhxOLJoPwnpnt6CjX3SAQAAAAQit0P67t27lZSU5Pq6W7du6tatm0eLQtM513jntbHGcWFWprsDAAAACDxuT3dPTk7W+PHj9fLLL+vAgQMtURPc4Fzj7esj6Z7fJ905kk7jOAAAAACBw+2Q/vvvv2vkyJF65JFH1LFjR5199tmaN2+eysvLW6I+HIE/THevtDtcXdhZkw4AAAAADXM7pA8dOlRPPfWUdu3apa+++koJCQm69tprlZiYqCuvvLIlakQj3AnphmHo/d9367VFO1q6rFoOrS0yxMMj6RVVMgzDI9cEAAAAAG9zO6Q7mUwmnXjiiXr55Zf1/fffKyUlRW+88YYna0MTNDWkV9kduu+Ttbp73mo98vl6bc0sao3yJB2sLTIkSBazySPXdG7B5jCk0kqmvAMAAAAIDM0O6Xv27NGTTz6pIUOGaOTIkYqIiNCsWbM8WRuaoClr0ovLq3Ttm8v19tJdrmMrd+e1dGkunt4jXZLCrBaZavI+zeMAAAAABAq3u7u/+OKLeuedd/TLL7+oT58+uvTSS/Xpp5/S4d1LjjSSnllYpqvm/K41e/NlCzJrQOdoLd95QKt25+n8YV1apcb8Es82jZOqZ3KEW4NUVF5V3Twu0mOXBgAAAACvcTuk//3vf9fFF1+s559/XoMHD26JmuCGqENCusNhyHzIdPKtmYW64vXftOdAqWLDrXpl6nCl55VVh/Q9ea1Wo6c7uzuF2yw1IZ2RdAAAAACBwe2QvmvXLplMnllXjKPnDL6GIRWWV7m+Xro9R9e+uVz5pZVKjgvTnGkjlRwfrj2RJZKkDekFKqu0KyTY0uI1tlxID5JUznR3AAAAAAHD7TXpBHTfYguyKLQmaBfUhOH/W7VPl726TPmllTqma4w++stxSo4PlyR1jglVfIRVlXZD69MLWqXGlgrpzg7vJRWEdAAAAACBodmN4+A7nOE3r6RSL/68Tbe8+4cq7A5N7J+od645VrHhVte5JpNJg7vESJJWtVLzOGdIj/L0SLq1OqQXldPdHQAAAEBgIKQHAGdIf+izdZr51UZJ0rTjkvXCpcPqnc4+OClGUuuH9JaZ7i7WpAMAAAAIGG6vSYfvia7Z2mz5zgMymaT7zuinq8amNHj+EGdI35PfGuW1aOM4iZAOAAAAIHAQ0gNATE34tQWZ9eyUITp9YMdGzx/UJVqStCO7WHklFYoJszZ6/tFq6ZF0GscBAAAACBRuT3fPyMjQZZddpk6dOikoKEgWi6XWB1rfJaO6amyPeL1zzagjBnRJigmzKqWmkVxrjKY7G9rFhHr2zYAIprsDAAAACDBuj6RfccUV2rVrl+6//3517NiRbu8+4ITe7XVC7/ZuPWZwl2jtyC7Wqt15Gt8roYUqq5ZX0kIj6TSOAwAAABBg3A7pixYt0sKFCzVkyJAWKAetZXBSjD5Zua9VmsexJh0AAAAAmsbt6e5JSUkyDKMlakErcnV435PXoj/PiiqHSiurR7pbap90QjoAAACAQOF2SH/22Wd1zz33KC0trQXKQWvp1zFKwRaTsosqtDevtMXu4xxFN5mkyBDP9imkcRwAAACAQON2apoyZYpKSkqUmpqqsLAwBQfXHh3Nzc31WHFoOSHBFvXtGKXVe/K1cneeurQLa5H7OEN6pC1IZrNn+xe4RtIrCOkAAAAAAoPbIf3ZZ59tgTLgDYO7xGj1nnyt2p2nyYM6tcg9XOvRwzw71V06OJJeTOM4AAAAAAHC7ZA+derUlqgDXjA4KUZvLtmpVbtbbhu2ghZqGifROA4AAABA4GnWImG73a5PPvlEGzZskCT1799fZ511Fvuk+5khSdGSpDV781VldyjI4naLgiNqqc7uEo3jAAAAAAQet0P61q1bNWnSJO3du1e9e/eWJM2cOVNJSUn64osvlJqa6vEi0TK6x0co0hakwvIqbcksUt+OUR6/R15JhSQpJtTq8Wu7prtX2OVwGB5f8w4AAAAArc3todNbbrlFqamp2r17t1asWKEVK1Zo165dSklJ0S233NISNaKFmM0mDaoZTV/ZQvul55dWj3JHteBIuiSVVLIuHQAAAID/czuk//zzz3ryyScVGxvrOhYXF6d//OMf+vnnnz1aHFre4C4xkqRVLRbSW266uy3ILOfgOVPeAQAAAAQCt0O6zWZTYWFhneNFRUWyWj0/pRkta3BSjKSWHElvuZBuMpnYKx0AAABAQHE7pE+ePFnXXnutli5dKsMwZBiGlixZouuvv15nnXVWS9SIFjSkJqRvzihUSQvsN96SIV2ieRwAAACAwOJ2SH/++eeVmpqq0aNHKyQkRCEhITruuOPUo0cPPffccy1RI1pQYlSIOkSFyGFIa/cWePz6LbkFmyRG0gEAAAAEFLe7u8fExOjTTz/Vli1btHHjRklS37591aNHD48Xh9YxOCla+9eVadXuPI1MiT3yA9zQ0iPprg7v5TSOAwAAAOD/mrVPuiT17NlTPXv29GQt8JIhSe30zbqMFlmX3vLT3S2SmO4OAAAAIDA0KaRPnz5djz76qMLDwzV9+vRGz3366ac9Uhhaz+AW3IYtr7Rmn/SwFhpJtzLdHQAAAEDgaFJI/+OPP1RZWen6HIFlYOdomUzS3rxSZRWWKyHS5pHrllfZVVbpkNQy+6RLNI4DAAAAEFiaFNJ//PHHej9HYIgMCVaPhAhtySzS6j15Orlvokeu65zqbjJJkbZmr6xoVDghHQAAAEAAcbu7+5VXXlnvPunFxcW68sorPVIUWp9zv/RVHpzy7uzsHhUSLLPZ5LHrHsoV0itoHAcAAADA/7kd0t944w2VlpbWOV5aWqr//e9/HikKrc8Z0v/wYEhv6aZxEo3jAAAAAASWJs9BLigokGEYMgxDhYWFCgkJcX3Pbrfryy+/VPv27VukSLS8oYeMpBuGIZPp6Ee+WyOks086AAAAgEDS5JAeExMjk8kkk8mkXr161fm+yWTSww8/7NHi0Hp6d4iUNcisgrIqpeWUKCU+/Kiv2Soh3cqadAAAAACBo8kh/ccff5RhGDrppJP04YcfKjY21vU9q9Wqbt26qVOnTi1SJFpesMWsAZ2itGJXnlbtzvNMSC9pvZH04nLWpAMAAADwf00O6ePHj5ck7dixQ127dvXIdGj4lsFJMVqxK08rd+fp7KGdj/p6ec7GcS0a0qvXpDPdHQAAAEAgcLtx3A8//KB58+bVOf7BBx/ojTfe8EhR8I4hNevSV3qoeZxzuntMWEs2jnN2dyekAwAAAPB/bof0mTNnKj4+vs7x9u3b6/HHH/dIUfCOwV1iJEnr9xWoospx1NdrzcZxrEkHAAAAEAjcDum7du1SSkpKnePdunXTrl27PFIUvKNbXJhiwoJVYXdo4/6Co75eQatswUZ3dwAAAACBw+2Q3r59e61evbrO8VWrVikuLs4jRcE7TCaTazR9lQemvLfmSHpZpUNV9qMf/QcAAAAAb3I7pF988cW65ZZb9OOPP8put8tut+uHH37QrbfeqosuuqglakQrGuxal55/1NdqnZBucX1eXEGHdwAAAAD+rcnd3Z0effRRpaWl6eSTT1ZQUPXDHQ6HLr/8ctakB4AhSdGSpFV78o76Wq0R0m1BFgVbTKq0Gyour2rRewEAAABAS3M7pFutVs2dO1ePPvqoVq1apdDQUA0cOFDdunVrifrQygbVTHffllWkgrJKRYU0P/S2RkiXqqe855VUqoQO7wAAAAD8nNsh3alXr17q1auXJ2uBD4iPsKlLu1DtOVCqNXvydVyPup38m6Ks0q6yyuo14i25T7okhVurQ3pROdPdAQAAAPg3t0O63W7XnDlzNH/+fGVmZsrhqN2s64cffvBYcfCOwUkx2nOgVCt35zU7pDs7u5tMUqSt2e8FNUkE27ABAAAACBBup6dbb71Vc+bM0RlnnKEBAwbIZDK1RF3woqFJMfpidfpRdXg/dKq72dyyvyNhNc3j2IYNAAAAgL9zO6S/9957ev/99zVp0qSWqAc+wNnh/Wiax7XWenSJkXQAAAAAgcPtLdisVqt69OjRErXAR/TvFCWL2aSMgnKl55c26xqtGdLDrYR0AAAAAIHB7ZB+xx136LnnnpNhGC1RD3xAmDVIvRIjJanZU95bNaTXjKTTOA4AAACAv3M7pC9atEhvv/22UlNTdeaZZ+rcc8+t9dEcs2bNUnJyskJCQjRq1CgtW7as0fOfffZZ9e7dW6GhoUpKStLtt9+usrKyZt0b9XPul75yd36zHu8M6S3d2V2SImrWpDOSDgAAAMDfub0mPSYmRuecc47HCpg7d66mT5+u2bNna9SoUXr22Wc1ceJEbdq0Se3bt69z/jvvvKN77rlHr732msaMGaPNmzfriiuukMlk0tNPP+2xutq6wV1i9O6y3X42kk5IBwAAAODf3A7pr7/+ukcLePrpp3XNNddo2rRpkqTZs2friy++0GuvvaZ77rmnzvm//vqrjjvuOF1yySWSpOTkZF188cVaunSpR+tq6/p1ipIkbcksatbj80paP6QXlFW2+L0AAAAAoCW5Pd3dkyoqKrR8+XJNmDDBdcxsNmvChAlavHhxvY8ZM2aMli9f7poSv337dn355ZcNdpsvLy9XQUFBrQ8cWbe4cElSdlF5s0aoC1pxJL1H+whJ0oqdB1r8XgAAAADQktweSU9JSWl0b/Tt27c3+VrZ2dmy2+1KTEysdTwxMVEbN26s9zGXXHKJsrOzNXbsWBmGoaqqKl1//fX629/+Vu/5M2fO1MMPP9zkmlAtOjRYseFW5RZXKC27WAM6R7v1eOd095hWCOljUuMUZDYpLadEu3JK1DUurMXvCQAAAAAtwe2Qftttt9X6urKyUn/88Ye+/vpr3XXXXZ6qq0E//fSTHn/8cb3wwgsaNWqUtm7dqltvvVWPPvqo7r///jrnz5gxQ9OnT3d9XVBQoKSkpBavMxAkx4Upt7hCO3NKmh3SW2MkPTIkWMd0badlabn6eUuWLovr1uL3BAAAAICW4HZIv/XWW+s9PmvWLP3+++9uXSs+Pl4Wi0UZGRm1jmdkZKhDhw71Pub+++/XZZddpquvvlqSNHDgQBUXF+vaa6/VvffeK7O59gx+m80mm83mVl2olhwXrhW78pSWU+z2Y1szpEvS+N4JWpaWqwWbs3TZsYR0AAAAAP7JY2vSTz/9dH344YduPcZqtWrYsGGaP3++65jD4dD8+fM1evToeh9TUlJSJ4hbLNVbcLF3u2clx1evS0/Lbn5Ib40t2CTp+J4JkqRft2arosrRKvcEAAAAAE9zeyS9IfPmzVNsbKzbj5s+fbqmTp2q4cOHa+TIkXr22WdVXFzs6vZ++eWXq3Pnzpo5c6Yk6cwzz9TTTz+toUOHuqa733///TrzzDNdYR2e0a1mbffOnBK3H9vaI+n9O0UpLtyqnOIKrdh1QMd2j2uV+wIAAACAJ7kd0ocOHVqrcZxhGNq/f7+ysrL0wgsvuF3AlClTlJWVpQceeED79+/XkCFD9PXXX7uaye3atavWyPl9990nk8mk++67T3v37lVCQoLOPPNMPfbYY27fG41LrunwvsPN6e5llXaV14xmR4e1Tkg3m00a2zNen67cpwWbswjpAAAAAPySyXBzjvjhndLNZrMSEhJ0wgknqE+fPh4triUUFBQoOjpa+fn5ioqK8nY5Pi2/pFKDH/lWkrTu4Ymu/ciPJLOgTCMfny+zSdr62CSZzQ3vBuBJHy7fozs+WKUBnaP0+c3jWuWeAAAAAHAk7uTQJqWu6dOn69FHH1V4eLhOPPFEjR49WsHBrTNCCu+JDgtWu7BgHSipVFpOsfp3alqH97xD1qO3VkCXpHG94iVJa/cWKLuoXPERNAwEAAAA4F+a1Dju3//+t4qKiiRJJ554og4cONCiRcF3OJvHubMuvbXXozu1jwxRv47V70ot2pLdqvcGAAAAAE9o0kh6cnKynn/+eZ166qkyDEOLFy9Wu3bt6j33+OOP92iB8K7kuHD94eY2bPkl1SE9ppVDuiQd3ytB69ML9PPmLJ09tHOr3x8AAAAAjkaTQvpTTz2l66+/XjNnzpTJZNI555xT73kmk0l2u92jBcK7nB3e3dmGrbW3XzvU8b3iNfvnbVq4JUsOh9Gq0+0BAAAA4Gg1abr72Wefrf3796ugoECGYWjTpk06cOBAnY/c3NyWrhetLMW5V7ofTHeXpOHdYhVmtSi7qELr0wta/f4AAAAAcDTc2oItIiJCP/74o1JSUhQU5LEt1uHDusU516S7P5LujZBuDTJrTGqcvt+QqQVbsjSgc9Oa3QEAAACAL2jSSPqhxo8fT0BvQ1JqQnpGQblKKqqa9BhvhnSpel26JC3YnOWV+wMAAABAc7kd0tG2RIcFKyasOmw3tcN7gbdDes/qkP572gEVlTftjQUAAAAA8AWEdByRc8p7U5vH5Xk5pCfHh6trbJiqHIYWb8vxSg0AAAAA0ByEdBxRirPDexNH0r093V2q7vIuMeUdAAAAgH9pdkjfunWrvvnmG5WWlkqSDMPwWFHwLe42j/OFkD6+V3tJ0oIthHQAAAAA/sPtkJ6Tk6MJEyaoV69emjRpktLT0yVJV111le644w6PFwjvc27DtqOJ091dIT3MeyF9dGqcgswm7cwpcaszPQAAAAB4k9sh/fbbb1dQUJB27dqlsLAw1/EpU6bo66+/9mhx8A3daqa7N7VxnC+MpEfYgjSsWztJTHkHAAAA4D/cDunffvutnnjiCXXp0qXW8Z49e2rnzp0eKwy+I7lmuvv+gjKVVtgbPbes0q6KKock74Z06eBWbD8T0gEAAAD4CbdDenFxca0RdKfc3FzZbDaPFAXf0i7c6grcO3MbnzruHEW3mE2KsAW1eG2NGV8T0hdvy3G9cQAAAAAAvsztkD5u3Dj973//c31tMpnkcDj05JNP6sQTT/RocfAdyc4O79mNT3l3hvSokCCZTKYWr6sx/TpGKT7CquIKu5bvPODVWgAAAACgKdwe6nzyySd18skn6/fff1dFRYXuvvturVu3Trm5ufrll19aokb4gOT4cK3ak6+0IzRhyyvx/np0J7PZpHE9E/TxH3u1YEuWRqfGebskAAAAAGiU2yPpAwYM0ObNmzV27Fj96U9/UnFxsc4991z98ccfSk1NbYka4QOaug2bLzSNOxT7pQMAAADwJ81aNBwdHa17773X07XAhzmnux9pGzbXdHcfCenjelavS1+3r0BZheVKiKRvAgAAAADf5fZIeo8ePfTQQw9py5YtLVEPfFRyvHMkvWlr0mPCrC1eU1PER9jUv1OUJGnhFkbTAQAAAPg2t0P6jTfeqC+++EK9e/fWiBEj9Nxzz2n//v0tURt8iHMbtvT8MpVVNrwN28Hp7t7t7H4o51ZsTHkHAAAA4OvcDum33367fvvtN23cuFGTJk3SrFmzlJSUpFNPPbVW13cElnZhwYoKqQ7ejY2mF/jYmnTp4FZsC7dky+EwvFwNAAAAADTM7ZDu1KtXLz388MPavHmzFi5cqKysLE2bNs2TtcGHmEwm15T3xjq8+1rjOEk6pms7hVstyimu0Pr0Am+XAwAAAAANanZIl6Rly5bptttu0znnnKPNmzfrggsu8FRd8EFN6fDuiyHdGmTW6NTqLu8/M+UdAAAAgA9zO6Rv3rxZDz74oHr16qXjjjtOGzZs0BNPPKGMjAy99957LVEjfESKq8N7w9Pd80oqJPlWSJek8b0I6QAAAAB8n9vdvfr06aMRI0boxhtv1EUXXaTExMSWqAs+yJ2RdF/Zgs3J2Txuxc4DKiyrVGSIb9UHAAAAAFIzQvqmTZvUs2fPlqgFPs61Jr2RvdLzS6sk+d5Iere4cCXHhSktp0SLt+Xo1P4dvF0SAAAAANTh9nR3AnrblVwz3X1fA9uwGYbhk93dnVxbsbFfOgAAAAAf1aSQHhsbq+zsbElSu3btFBsb2+AHAldsuFWRturJF7tz665LL6t0qMLukCTFhFlbtbamOL6nc7/0bC9XAgAAAAD1a9J092eeeUaRkZGuz00mU4sWBd/k3IZtzd587cguVs/EyFrfd65Ht5hNCrdavFFio0anxinYYtKu3BKlZRe7pu8DAAAAgK9oUkifOnWq6/MrrriipWqBH+gWF6Y1e/O1M6fuSPqh26/54hs54bYgDevWTku252rh1mxCOgAAAACf4/aadIvFoszMzDrHc3JyZLH43ugpPCulJtjuqKfDuy/ukX64MTX7pS/ZluPlSgAAAACgLrdDumEY9R4vLy+X1ep765DhWY1tw+bcI93Xtl871JjUOEnS4u05cjjq/10GAAAAAG9p8hZszz//vKTqdcmvvPKKIiIiXN+z2+1asGCB+vTp4/kK4VOcHd7Tshuf7u6rBnWJUWiwRbnFFdqcWag+HaK8XVKryios16uLdujKsclqHxni7XIAAAAAHKbJIf2ZZ56RVD2SPnv27FpT261Wq5KTkzV79mzPVwif4lzHvS+/VGWVdoUEH/w98IeQbg0ya0RKrBZsztLibTltLqT/54ctemPxTpVWVOnhPw3wdjkAAAAADtPkkL5jxw5J0oknnqiPPvpI7dq1a7Gi4Lviwq2KsAWpqLxKew6UqEf7gx3eD+6R3uRfK68Y3T1OCzZn6ddtOZp2XIq3y2lVK/fkV/+5O8+7hQAAAACol9tr0n/88UcCehtWvQ1b9ZT3HYdNefeHkXSpeis2SVq6PUf2NrQuvaLKoQ3pBZKkDemFqqhyeLkiAAAAAIdzO6Sfd955euKJJ+ocf/LJJ3XBBRd4pCj4toaaxzlDekyobzcQHNApSpG2IBWUVWn9vgJvl9NqNmccDOYVdoc2ZxR6uSIAAAAAh3M7pC9YsECTJk2qc/z000/XggULPFIUfJureVwDId3XR9KDLGaNTImVJC3enu3lalrPmr35tb5evSe/gTMBAAAAeIvbIb2oqKjerdaCg4NVUNB2RiXbsuSakfTDO7w7Q7ovb8Hm5JzyvrgN7ZfuDOVWS/Vf+zV787xYDQAAAID6uB3SBw4cqLlz59Y5/t5776lfv34eKQq+zdnh/fCR9Dw/GUmXDob0ZTtyVWlvG2uznaH89IEdJDGSDgAAAPgit9tw33///Tr33HO1bds2nXTSSZKk+fPn691339UHH3zg8QLhe5wj6fvySlVeZZctqHobtgI/Cul9O0QpJixYeSWVWrM3X8d0DexmiGWVdm3aX70G/ZKRXfXpyn3atL+wzjZ6AAAAALzL7ZH0M888U5988om2bt2qv/zlL7rjjju0Z88eff/99zr77LNboET4mvgIq8KtFjkMaXduqSTJMIyDa9LDfD+km80mHZvSdqa8b9pfqEq7oXZhwRqZEqu4cKuqHIar2zsAAAAA3+B2SJekM844Q7/88ouKi4uVnZ2tH374QePHj/d0bfBRJpOpTof30kq7Ku3V25n5w0i65Pvr0tfsydfPm7M8cq3VNU3jBnaJkclk0sAu0dX32MuUdwAAAMCXNCuk5+Xl6ZVXXtHf/vY35ebmSpJWrFihvXv3erQ4+K6UmnXpO7KrQ7pzFN1iNinc6h/Tp50h/feduSqvsnu5mtrKKu269JUluuL1Za7X+Gis2ZMnSRrUObrWn6xLBwAAAHyL2yF99erV6tWrl5544gk99dRTysvLkyR99NFHmjFjhqfrg4/qVrMN286c6g7vB/dID5bJZPJaXe7o2T5C8RFWlVU6tHJXnrfLqWXB5iwVlFXJMKRFW49+mzhnGHeOoA/qEiOperQeAAAAgO9wO6RPnz5dV1xxhbZs2aKQkBDX8UmTJrFPehtyeIf3/BL/aRrnZDKZdGz3minv231ryvvXa/e7Pl9ylLWVVti1JbNIkjSoJqQ7w/qWzEKVVFQd1fUBAAAAeI7bIf23337TddddV+d4586dtX///noegUDk2is9p/Z0d3/YI/1QY1LjJfnWuvTyKru+25Dh+nrp9hwZhtHs661PL5DdYSg+wqYOUdVvrCVGhSgxyiaHIa3bR/M4AAAAwFe4HdJtNpsKCur+o37z5s1KSEjwSFHwfck10933HihVRZXDr/ZIP5RzXfofu/JUVukb69J/3ZqjwrIqJUTaFBJsVnZRhbbWjIQ3x9qa5nCDukTXWoowsHOMJNalAwAAAL7E7ZB+1lln6ZFHHlFlZXUoM5lM2rVrl/7617/qvPPO83iB8E0JkTaFObdhO1DiV3ukHyo5LkwdokJUYXdo+c4D3i5HkvTV2nRJ0ukDOmhYt+r9249myrtrPXpNszgn59R3Z1M5AAAAAN7ndkj/17/+paKiIrVv316lpaUaP368evToocjISD322GMtUSN80OHbsOX7aUg3mUwa40NbsVXaHfp2ffVU99MHdHTt5b5ke26zr7lmb56kg6HcybkufTXbsAEAAAA+I8jdB0RHR+u7777TokWLtHr1ahUVFemYY47RhAkTWqI++LCU+DBtSC9QWnaJ34Z0STo2NU4f/bFXv27LltTbq7Us2Z6jvJJKxYVbNTIlVsEWk/Rd9XHDMNzunF9cXuWaKl9nJL3m6+1ZxSosq1RkiP/97AAAAIBA43ZIdxo7dqzGjh3ryVrgZ7od0jzOn0O6cyR99Z58FZVXKcLW7L8WR+2rmq7up/bvIIvZpEFdYhQSbFZOcYW2ZBapV2KkW9dbn14ghyF1iApR+6iQWt+Li7Cpc0yo9uaVau3eAtf6fAAAAADe06Q08vzzz+vaa69VSEiInn/++UbPjYiIUP/+/TVq1CiPFAjf5Wwel5ZTInPNAK8/hvQu7cKUFBuq3bml+i0tVyf2bu+VOuwOQ9/UhPRJAztIkqxBZg3vFqtFW7O1ZHuO2yH98P3RDzeoS7T25pVq9Z48QjoAAADgA5oU0p955hldeumlCgkJ0TPPPNPoueXl5crMzNTtt9+up556yiNFwje5tmHLLlZchFWSFB3mfyFdkkZ3j9Pu3D1asi3HayF92Y5c5RRXKCYs2LV/uyQd2706pC/elqPLRye7dU1nU7hBnesP6QO7ROurtftZlw4AAAD4iCaF9B07dtT7eUO+++47XXLJJYT0AJccXx3S9xwocR3zx5F0qXq/9Pd/36PFR9FF/Wg5u7qf0jdRwZaDPR2dI9xLd+TK4TBkNjd9XbozfDc4kl6zDdsatmEDAAAAfILb3d2bYuzYsbrvvvta4tLwIe0jbQoNrt6GbVdudVD315DuDMJr9+a71te3JofD0Neuqe4da31vYOcYhQZblFuzLr2pCssqtT2ruOYaDYyk1xzflVuivJKK5pQOAAAAwIOaFdLnz5+vyZMnKzU1VampqZo8ebK+//571/dDQ0N16623eqxI+KbqbdjCah3z15CeGBWi7vHhchjV085b24pdB5RZWK7IkCCN6VF7bbg1yKzhye7vl752b4EkqXNMqOIibPWeEx0W7OotsIYp7wAAAIDXuR3SX3jhBZ122mmKjIzUrbfeqltvvVVRUVGaNGmSZs2a1awiZs2apeTkZIWEhGjUqFFatmxZg+eecMIJMplMdT7OOOOMZt0bR8e5Lt3JX0O6dHA0vXorttb15ZrqUfQJfRNlC7LU+b5zjbo7e7k3tD/64QZ2iZF0sMkcAAAAAO9xO6Q//vjjeuaZZ/Tuu+/qlltu0S233KJ33nlHzzzzjB5//HG3C5g7d66mT5+uBx98UCtWrNDgwYM1ceJEZWZm1nv+Rx99pPT0dNfH2rVrZbFYdMEFF7h9bxw957p0SQoymxRmrRsw/YUzpLsThD3BMAx9XbMe/fQBHeo9xxnSl+7IkcNhNOm6ztA9oIGp7k7OpnKra5rMAQAAAPAet0N6Xl6eTjvttDrHTz31VOXnuz8S9/TTT+uaa67RtGnT1K9fP82ePVthYWF67bXX6j0/NjZWHTp0cH189913CgsLI6R7SfIh092jQ4NlMjW9qZmvcQbhjfsLlVvceuuzV+3J1778MoVbLTq+V0K95wzqEq0wq0UHSiq1ObOwSdd1Tl8/8kh69fdpHgcAAAB4n9sh/ayzztLHH39c5/inn36qyZMnu3WtiooKLV++XBMmTDhYkNmsCRMmaPHixU26xquvvqqLLrpI4eHh9X6/vLxcBQUFtT7gOYeOpPvzVHdJio+wqXfNPuTurP0+Wl+tqR5FP6lvokKC65+JEGwxa3hyrKSmjfTnl1RqZ051M7+GmsY59e8UJZNJ2pdfpqzCcndKBwAAAOBhTdqC7fnnn3d93q9fPz322GP66aefNHr0aEnSkiVL9Msvv+iOO+5w6+bZ2dmy2+1KTEysdTwxMVEbN2484uOXLVumtWvX6tVXX23wnJkzZ+rhhx92qy403aFr0qP8PKRL1VPeN2UUavG2nDpd1luCYRj6qqare0NT3Z2O7R6rBZuztGR7jqYdl9Louc5R9K6xYYoJszZ6bmRIsLrHh2tbVrHW7s3XiX28s088AAAAgCaG9GeeeabW1+3atdP69eu1fv1617GYmBi99tprrbr12quvvqqBAwdq5MiRDZ4zY8YMTZ8+3fV1QUGBkpKSWqO8NqF9pE0hwWaVVToUExYYIX3Or2mttl/6un0F2pVbopBgs07oXf9Ud6eD69KPvF/66pqmcQ3tj364wV1itC2rWKv3ENIBAAAAb2pSSN+xY0eL3Dw+Pl4Wi0UZGRm1jmdkZKhDh8ZHFYuLi/Xee+/pkUceafQ8m80mm63+7adw9Mxmk5LjwrVxf6HfT3eXpGNT4mQySVszi5RZUKb2USEter+vahrGndi7vcKsjf91HNg5WuFWi/JKKrVxf6H6dYpq8Ny1zvXoR5jq7rp2l2h99MdeV0d4AAAAAN7RrH3Speqp6tnZR7dVldVq1bBhwzR//nzXMYfDofnz57um0jfkgw8+UHl5uf785z8fVQ04es690gMhpEeHBat/Tfht6dF0wzD0Vc3Wa6cdYaq7VHtd+pHWzDs7uzd1JN3ZXG7VnnwZRtO6xwMAAADwPLdCel5enm688UbFx8crMTFRiYmJio+P10033aS8vLxmFTB9+nS9/PLLeuONN7RhwwbdcMMNKi4u1rRp0yRJl19+uWbMmFHnca+++qrOPvtsxcXFNeu+8JwhSe0kSd3j62/e529GN2NP8ubYnFGk7dnFsgaZdVITp5g7p7w3FtJziyu050CppCNvv+bUr2O0zCYpq7BcGQU0jwMAAAC8pUnT3SUpNzdXo0eP1t69e3XppZeqb9++kqT169drzpw5mj9/vn799Ve1a9fOrQKmTJmirKwsPfDAA9q/f7+GDBmir7/+2tVMbteuXTKba7+XsGnTJi1atEjffvutW/dCy7h6XIpGp8YdsYu4vxidGqeXF+5o8kh6RkGZFm7J1qiUWCXFhh35ATW+rOnqfnzPBEWGNG0WwrHdq0fSG1uX7mwa1z0+XFFNvG6o1aJeiZHauL9Qq/fkqUP0kUf2AQAAAHhek0P6I488IqvVqm3bttXpxv7II4/o1FNP1SOPPFKnyVxT3HTTTbrpppvq/d5PP/1U51jv3r2ZkutDgi1mDUmK8XYZHjMiOVYWs0k7c0q0N69UnWNC65yTVViur9em67PV6fotLVeGIUWFBOn5i4fqhN5NGxV3rkefNLDpgdi5Lj2/tFIb9heof6e6b4ys2ZNXfW4Tp7ofeu2N+wu1Zm++Tu1PSAcAAAC8ocnT3T/55BP985//rBPQJalDhw568skn690/HfA3kSHBrlkBh055zykq19tLd+qSl5do1OPf6/5P12nZjuqAnhBpU0FZla6c85te/HnbEd9E2ppZpM0ZRQq2mHRy37p/pxoSZDFrRIpzXXpuvee41qO7ObNhUM0bLc7Hu6Os0i67gzfOAAAAgKPV5JH09PR09e/fv8HvDxgwQPv37/dIUYC3jU6N08rdeZq/IUN2h0Ofr07Xr9tyagXRwUkxOnNQR50+sKPiI6x68NN1eu+33Zr51UatTy/QE+cNUkiwpd7rf10zin5cj3i3G+4d2z1OP22q3i/9qrF190t3Tncf1CXGres6O8Gv2VvdPM5kaniLt0Ptzi3ROS/8qi7tQvXxX8Y0+XEAAAAA6mpySI+Pj1daWpq6dOlS7/d37Nih2NhYjxUGeNOY1Dj996dt+mrtfn219uCbTwM7R+uMQR11xsCOddafzzx3oPp3itLDn63Xpyv3aVtWkV68bHi90+W/rOnqPmlAR7drcza2W7q9+k0DyyHr0jMLy5SeXyaTSa4u9U3Vp2Okgi0mV+O5pqyvdzgM/fXD1couKld2UbnW7i1we5o9AAAAgIOaPN194sSJuvfee1VRUVHne+Xl5br//vt12mmnebQ4wFuGd4tVfIRNktS3Y5TumthbP915gj67eayuH59ab4A1mUy6bHSy3rp6lGLDrVq7t0B/+s8iLdtRe1r6zpxirU8vkMVs0in9mj7V3al/pyhF2IJUUFalDekFtb7n3B+9R0KEwm1Nfg9OkmQLsqh3h0hJB0fjj+TtZbv06yFLAj5fs8+tewIAAACoza3GccOHD1fPnj114403qk+fPjIMQxs2bNALL7yg8vJyvfnmmy1ZK9BqQq0WfXXrOJVW2NU1rukd26Xq6ej/d9NxuvZ/y7U+vUCXvLxED/+pvy4d1U2SXCPzo7vHqV241e3agixmjUhupx9rprwfus2au/ujH25g5xit3Vug1XvyNWlg46P8u3NLNPPLDZKkcT3jtXBLtr5Yna57TuvDlHcAAACgmZo8kt6lSxctXrxY/fr104wZM3T22WfrnHPO0b333qt+/frpl19+UVJSUkvWCrSqhEib2wHdqUu7MM27YbTOGNRRVQ5D9368Vvd+vEYVVQ59VbP12uludHU/3OjU+vdLX1MT0gc1czu8wV2c69LzGj3P4TB097zVKqmwa2RKrGb/eZhCgy3ac6C0WY3nAAAAAFRzaz5sSkqKvvrqKx04cEBbtmyRJPXo0YO16EA9wqxB+s/FQ9WvY5T++e0mvb10l9buzdeqPfkymaRT+zU/pB/rXJe+I9e1Lt0wDK3e6xxJj2nWdZ0j8Kv3NN487u2lO7V4e45Cgy166vxBCrcF6eS+7fX56nR9sSZdgwNoSz4AAACgNTV5JP1Q7dq108iRIzVy5EgCOtAIk8mkG0/soVenDlekLUirakaZRybHKiHS1uzr9usYpUhbkAoPWZeeUVCurMJyWcwm9evoXtM4p16JkbIGmVVYVqWdOSX1nrMrp0Qzv9ooSfrrab3VLS5ckjR5UPX0+C9Wpx9xCzoAAAAA9WtWSAfgnpP6JOrjG49T9/jqQHv20M5Hdb0gi1kja/ZLd+7lvnpPniSpZ/sIhVrr3/rtSIItZlfAX1VzvUM5HIbumrdKJRV2jUqJ1eWjk13fO6F3e4VZLdqbV6qVu+s+FgAAAMCREdKBVtKjfYQ+u3ms3r3mWE0ZfvT9G5xT3p3r0p0d2Qc2cz260yDnuvR61pa/uWSnlu7IrZnmPljmQ7Z/Cwm2aELf6m71X6xOP6oaAAAAgLaKkA60onBbkEanxtUKt83lDOnLatalOxu2DTrKfcqdIX/1Yduw7cwp1j9qprnPmNSn3qZ6Z9RMef9yTbocDqa8AwAAAO4ipAN+ql+nKEWGBKmwvErr9uW79khvbtM4J2fTt3V782WvCdrV09xXq7TSrmO7x+rPNdvJHW58rwSFWy3al1+mP5jyDgAAALiNkA74KYvZpFE169I/WrFXOcUVCjKb1KdD5FFdNzUhQqHBFhVX2LUju0iS9L/FaVq2I1dh1rrT3A8VEmzRKf2Y8g4AAAA0FyEd8GPOKe9zf9stSerdIVIhwc1rGudkMZs0oHN187jVe/KVll2sf3xdM8399D5Kim187/gzBnWSxJR3AAAAoDkI6YAfc4b00kq7pKNfj+40sHOMJGnl7jzdPW+1yiodGt09Tpc2MM39UON6xivSFqT9BWVaseuAR+oBAAAA2gpCOuDH+naMUlRIkOtrZ7g+Ws6w/96y3VqWlqtwq0VPnj+oSQ3vDp3y/jlT3gEAAAC3ENIBP2YxmzQyJc71tcdG0muuU2F3SJJmTOp7xGnuh6LLOwAAANA8hHTAzx3bvbp5nNViVq/Eo2sa55QSF65IW/UI/XE94nTpqK5uPX5sz3hFhgQps7Bcv+9kyjsAAADQVIR0wM+d2q+DwqwWndSnvaxBnvkrbTabNHVMsvp1jNIT5w2SyeTevu62IItO7ddBkvTF6n0eqQkAAABoC0yGYbSpuagFBQWKjo5Wfn6+oqKivF0O4BH5pZUKCTbLFnR0nd096ceNmZo25zclRNq0ZMbJsjRhPTsAAAAQiNzJoYykAwEgOjTYpwK6JB3XI15RIUHKKizXb2m53i4HAAAA8AuEdAAtwhpk1sT+zinvdHkHAAAAmoKQDqDFOLu8f7U2XXYf7/JuGIYOFFdo9Z48fbE6XS/+vE1Pf7dZ+aWVXqknLbtYd7y/SlszC71yfwAAAHhH0JFPAYDmOa5HvKJDg5VdVKGlO3I0JjXe2yVpR3axNmcUas+BUu3OLdGeAyWuz4sr7HXO35lTrOcuGtqqNRqGobvmrdJvaQeUU1yuOdNGtur9AQAA4D2EdAAtJthi1mn9O2ju77v15Zp0r4b0zMIyPf7FBn2ysvFu8+0jberSLlQdY0L11Zp0fbpyn6YMT9KYHq1X+3frM/RbWvXWdT9vztKeAyXq0q7p+9QDAADAfxHSAbSoMwZ11Nzfd+vrtfv10Jn9FWRp3VU2doeht5fu1FPfbFJhWZVMJmlg52gltQtTl9hQdWkXpqR21X92aReqkOCDDfge/HSt3li8U/d/ulZf3Xq8x7a4a0yV3aF/fL1RkhRsManSbuj933Zr+qm9W/zeAAAA8D5COoAWNTo1Tu3Cqqe8L9uR26oj0qt25+neT9Zo7d4CSdKgLtH6+9kDNKhLTJMeP/3U3vpizX5tyyrWK4u26y8n9GjBaqvN/X23tmcVKzbcqjtP7a2/fbxG7/++R7ec3LPV3+AAAABA6+NffABaVLDFrNMGVHd5/3xN63R5zy+p1H2frNHZL/yitXsLFBkSpEfPHqCP/3JckwO6VL213b1n9JEkPT9/i/YcKGmhiqsVl1fpme+2SJJuOamHzhvWWe3CgrW/oEw/bcpq0XsDAADANxDSAbS4MwZ2kiR9vXa/quyOFruPYRj6cPkenfSvn/TWkl0yDOncoZ31wx0n6LJju8liNrl9zbOHdNaolFiVVTr08GfrW6Dqg15euF3ZReVKjgvTJaO6yRZk0fnDukiS3l22q0XvDQAAAN9ASAfQ4o7tHqvYcKtyiyu0ZHtui9xjc0ahpry0RHd8sEo5xRXq0T5C715zrJ6eMkQJkbZmX9dkMunvZw9QkNmk79ZnaP6GDA9WfVBmYZleWrBdknT3aX1c698vGtlVkvTjpkztyyttkXsDAADAdxDSAbS4oEOmvH+xpvHu6u7KLCzT3z9fr0nPLdSyHbkKDbbor6f10Ze3jNPo1DiP3KNnYqSuGpciSXrw/9aptJ6t2o7Ws99vUUmFXUOSYnR6zWslSakJERqVEiuHIb3/+26P3xcAAAC+hZAOoFVMHthRUvWU90oPTHnfnVui+z9Zq7FP/KhXFu1QlcPQKf0S9d3043XDCake78R+y0k91Sk6RHsOlOqFn7Z69NpbMws197fqAP63SX1lMtWeln/JqOrR9Pd/2y27w/DovQEAAOBbCOkAWsXIlFjFR1h1oKRSC7c0vwna1sxCTX9/pU745096c8lOVVQ5NLRrjF6fNkIvXz68xfYTD7cF6YEz+0uSXvx5u7ZnFXns2k98vUn2mjcZRqbE1vn+xP4dFBMWrH35ZVqwmQZyAAAAgYyQDqBVHDrl/co5v+u0Zxfoof9bp6/X7ldeScURH796T56uf3O5TnlmgT5asVd2h6FxPeP17jXH6qMbxujE3u1b+iloYv9EndA7QRV2hx74dJ0M4+hHtZftyNV36zNkMZv019P61HtOSLBF5w6tbiD3Dg3kAAAAAhr7pANoNdOOS9HynXnakF6gjfsLtXF/oeb8miaTSerTIUqju8fp2O6xGpUSp+iwYBmGoaU7cjXrx61auCXbdZ2J/RP1lxN6aHBSTKvWbzKZ9PBZ/XXKMwu0aGu2vliTrsmDOjX7eoZh6PEvN0iSpoxIUo/2EQ2ee/HIJL32yw79sDFT+/PL1CE6pNn3BQAAgO8yGZ4YCvIjBQUFio6OVn5+vqKiorxdDtAmZReVa+n2XC3enq0l23O1NbP21HGTSerXMUpBFrNW7c6TJFnMJv1pcCddf0KqeiVGeqHqg577foue+X6z2kfaNP+O8YoMCW7Wdb5ck66/vL1CYVaLfrrrBLWPbDx4XzD7V/2WdkB3nNJLN5/cs1n3BAAAQOtzJ4cykg6g1cVH2HTGoI46Y1B1M7nMwrKa0J6jJdtztD2rWOv2FUiSrEFmXTi8i647PlVJsS2z3txd143vro//2KO0nBI9+/0W3T+5n9vXqKhy6ImvN0qSrj2++xEDuiRdPLKrfks7oPd+260bT+whczP2fQcAAIBvI6QD8Lr2kSE6c3AnnTm4eup4RkGZlmzPUU5RhSYP6qj2Ub41tTsk2KKH/zRAU19bpjm/pun8YV3Ut6N7M3PeWbpTO3NKFB9h0zXjujfpMZMGdtRD/7dOe/NKtXBrtsb3SmhO+U3icBhaszdffTtGebxTPgAAABrGv7wA+JzEqBD9aUhnXTk2xecCutP4XgmaNLCD7A5D932yVg43tkYrKKvU8z9Ub+N2+yk9FW5r2vulIcEWnXtMdQO5d5e2XAM5u8PQnfNW6U+zftHlry1VlQe2zAMAAEDTENIBoJnun9xPYVaLlu88oHkr9jT5cS/+vE25xRXqnhCuKcOT3LrnxSOr90z/fkOGMgvL3HpsU9gdhu78YJU+WrFXkrRke67rDQUAAAC0PEI6ADRTx+hQ3TahuoHbA5+u1ZQXF+v+T9bqzcVpWro9RweK624tl55fqlcW7pAk3XNaHwVZ3PvPcO8OkTqma4yqHIbmLW/6GwNNUWV36Pa5K/XxH3tlMZtcbwj8+4ct+nVr9hEeDQAAAE9gTToAHIVpx6Xou/UZ+i3tgJbuyNXSHbm1vh8fYVOvxAj1SoxUz8QILdqSrfIqh0Ykt9Mp/RKbdc+LR3bVil15em/Zbl1/fKpHGshV2R26be5Kfb46XUFmk/5zyVCdNqCjHA5Dc3/frVvnrtSXt4xTQqTtqO8FAACAhrEFGwAcpSq7Qxv3F2pzRqE2ZxRpS0ahNmUUas+B0gYf89FfxuiYru2adb/SCrtGPv69Csuq9NZVozS2Z3xzS5ckVdoduvW9P/Tlmv0Ktpj0n0uO0cT+HVz3Ous/i7Qls0jjesbrjWkj6SoPAADgJrZgA4BWFGQxa0DnaA3oHF3reHF5lbZmFmlzRqG21Py5PatYE/snNjugS1Ko1aJzhnbW/xbv1LvLdh1VSK+0O3TzO3/o63XVAf2/lw7ThENG+EOtFs269Bid9Z9FWrglW7MXbNNfTujR7PsBAACgcYykA4AfWr+vQJOeX6hgi0mLZ5ys+Aj3p6FXVDl00zsr9O36DFktZs2+7Bid1Kf+Kfjv/7Zbd3+4WhazSXOvPVbDk2OP9ikAAAC0Ge7kUBrHAYAf6tcpSoOTYlRpN/RhMxrIlVfZ9Ze3awJ6kFkvXj6swYAuSRcM76Kzh3SS3WHolnf/qLcpHgAAAI4eIR0A/NQlI6u3b3t32S65MymqvMquG95aoe83ZMgWZNbLlw/Xib3bN/oYk8mkv58zUCnx4dqXX6a75q1y654AAABoGkI6APipyYM6KcIWpLScEi3entOkx5RV2nXdm8v1w8ZM2YLMenXqCI3vldCkx0bYgvTvi4fKajHr+w2Zeu2XtKOoHgAAAPWhcRwA+KlwW5D+NKST3l66S+8u260xqfGqsjuUW1Kh7MIK5RSXK7uoXDlFFcqq+XPdvgJtSC9QSLBZr00doTE93Gs6N6BztO6b3FcPfLpO//hqg0Ykt9OgLjEt8wQBAADaIBrHAYAfW7s3X5P/vUgWs0nRocE6UFKhI/1XPTTYoteuGKHRqXHNuqdhGLrhrRX6et1+dY0N0+e3jFVUSHCzrgUAANAWsAUbALQRAzpHa0RyO/2WdkC5Nc3czCYpNtyq+Aib4iKsigu3uT5PiLDp2O5x6hoX1ux7mkwmPXH+IK3dl69duSWa8dEa/efioTKZ2D8dAADgaDGSDgB+Lr+0UhvSC9QuzKq4CKvahVllMbd8YP5j1wFdMHuxqhyGHjtngC4d1a3F7wkAAOCP2IINANqQ6NBgHds9Tr07RCo+wtYqAV2ShnZtp7tP6y1Jeviz9Xri643amlnUKvcGAAAIVIykAwCazeEwdO2by/X9hgzXsaFdY3T+sC6aPKiTokNZqw4AAOBODiWkAwCOSpXdoe/WZ2je8j36aXOW7I7q/61Yg8ya2L+Dzh/WRWN7xLfaCD8AAICvIaQ3gpAOAC0ns7BMn/6xTx8s363NGQenvneICtE5x3TWecd0UY/2EV6sEAAAoPUR0htBSAeAlmcYhtbuLdC85bv16ap9yiupdH3vuB5x+se5g5QU2/wO8wAAAP6EkN4IQjoAtK7yKrt+2JBZazp8pC1Ij549QGcP7ezt8gAAAFqc33V3nzVrlpKTkxUSEqJRo0Zp2bJljZ6fl5enG2+8UR07dpTNZlOvXr305ZdftlK1AAB32IIsOn1gR716xQj9dOcJGt6tnQrLq3Tb3JW67b0/VFBWeeSLAAAAtBFeD+lz587V9OnT9eCDD2rFihUaPHiwJk6cqMzMzHrPr6io0CmnnKK0tDTNmzdPmzZt0ssvv6zOnRmNAQBflxQbpveuPVa3Tegps0n6ZOU+TXpuoZbvzPV2aQAAAD7B69PdR40apREjRug///mPJMnhcCgpKUk333yz7rnnnjrnz549W0899ZQ2btyo4GD3t/ZhujsA+IblO3N129yV2p1bKovZpJtP6qGbTuyhIIvX3z8GAADwKL+Z7l5RUaHly5drwoQJrmNms1kTJkzQ4sWL633M//3f/2n06NG68cYblZiYqAEDBujxxx+X3W6v9/zy8nIVFBTU+gAAeN+wbrH68pZxOmdoZ9kdhp79fosuemmJdueWeLs0AAAAr/FqSM/OzpbdbldiYmKt44mJidq/f3+9j9m+fbvmzZsnu92uL7/8Uvfff7/+9a9/6e9//3u958+cOVPR0dGuj6SkJI8/DwBA80SGBOuZKUP03EVDFGkL0u87D2jScwv16cq93i4NAADAK/xuTqHD4VD79u310ksvadiwYZoyZYruvfdezZ49u97zZ8yYofz8fNfH7t27W7liAMCR/GlIZ3156zgNq2kqd+t7K3X73JUqpKkcAABoY7wa0uPj42WxWJSRkVHreEZGhjp06FDvYzp27KhevXrJYrG4jvXt21f79+9XRUVFnfNtNpuioqJqfQAAfE9SbJjmHtJU7uM/9mrC0z/rs1X71MZ2CwUAAG2YV0O61WrVsGHDNH/+fNcxh8Oh+fPna/To0fU+5rjjjtPWrVvlcDhcxzZv3qyOHTvKarW2eM0AgJYTZDHrtgm99MH1o9UtLkwZBeW6+d0/dOkrS7U1s9Db5QEAALQ4r093nz59ul5++WW98cYb2rBhg2644QYVFxdr2rRpkqTLL79cM2bMcJ1/ww03KDc3V7feeqs2b96sL774Qo8//rhuvPFGbz0FAICHDesWq29uO17TT+klW5BZv27L0WnPLtTMLzeouLyq2detqHIos6BMJRVVjM4DAACfFOTtAqZMmaKsrCw98MAD2r9/v4YMGaKvv/7a1Uxu165dMpsPvpeQlJSkb775RrfffrsGDRqkzp0769Zbb9Vf//pXbz0FAEALCAm26JaTe+qcoZ318Gfr9f2GDL24YLs+XblP903uqzMGdpTJZDridfJLK/XTpkx9uz5DP2/KUlFNyDebpHBbkCJtQYoICVKELUgRIcHVX9ccO6Vfoo7tHtfSTxUAAMDF6/uktzb2SQcA/zR/Q4Ye/my9dtVs0XZcjzg9fNYA9WgfUefcfXml+m59hr5bn6El23NU5Wje/+pMJumByf007biUo6odAAC0be7kUEI6AMBvlFXa9eLP2/XCT1tVXuVQsMWkq8Z2180n9dDuAyX6dl2Gvl2/X2v3FtR6XI/2ETq1X6JO6ZeoQV1iVF5lV1FZlQrLq1RUVqWi8ioV1vxZVFapovIqrdtXoK/WVm8HOu24ZN13Rj9ZzEceuQcAADgcIb0RhHQA8H+7ckr0yOfr9P2GTEmSNcisiqqDDUVNJmlY13Y6tX+iTunXQSnx4W7fwzAMvbhgu/7x1UZJ0qn9EvXcRUMVarUc4ZEAAAC1EdIbQUgHgMDx/foMPfz5Ou3OLZUtyKxxPeN1Sr9EndQnUQmRNo/c47NV+3TH+6tUYXdocJdovTJ1hMeuDQAA2gZCeiMI6QAQWMoq7dqSUaTU9uEKs7ZMP9Tf0nJ1zf9+V15JpZJiQ/X6FSPrXQsPAABQH3dyqNe3YAMA4GiEBFs0sEt0iwV0SRqRHKuPbhijbnFh2p1bqnNf+EVLtue02P0AAEDbRUgHAKAJuidE6KMbxuiYrjEqKKvSZa8u1Sd/7PV2WQAAIMB4fZ90AAD8RVyETe9cc6ymv79SX67Zr9vmrtTu3BLddFKPOnu2F5dXaVtWkbZmVn84P3cY0iUju+rSY7u26Og/AADwT6xJBwDATQ6HoSe+3qgXF2yXJJ0/rIuGJMW4wvi2zCLtyy9r9Bqx4VZdPS5Fl49OVoSNsA4AQCCjcVwjCOkAAE95c3GaHvy/dXI08H/S+AirUhMi1KN99UdqQoTS80s168dt2pVbIkmKDg3Wlcel6IrjkhUdGtyK1QMAgNZCSG8EIR0A4Ek/bszUf3/epnCrxRXGnYE8Jsxa72Oq7A7936p9+s+PW7U9q1iSFGkL0tQxybpqbIrahdf/OAAA4J8I6Y0gpAMAfIXdYejLNen6zw9btSmjUJIUbrXoz6O76Zpx3RUfwX7sAAAEAkJ6IwjpAABf43AY+nb9fj0/f6vWpxdIkkKCzTpnaBedPqCDju0eJ2sQG7IAAOCvCOmNIKQDAHyVYRj6YWOmnp+/Rav25LuOR9qCdGKf9jqlX6JO6J2gyJCWX7teXmWXYVTvQw8AAI4OIb0RhHQAgK8zDEOLt+Xos9Xp+n5DhrIKy13fC7aYNCY1Xqf2T9QpfRPVPirEY/fclFGohZuztWBLlpbtyFWELUj//fMwjUyJ9cg9AABoqwjpjSCkAwD8icNhaOWePH27LkPfrtuv7dnFtb4/tGuMTumXqL4do9QpOlQdY0IUaQuqs297fbKLyvXL1mwt2JythVuylHnImwFOwRaT/nHuIJ03rIvHnhMAAG0NIb0RhHQAgD/bmlmkb9fv17frMrRyd16954RbLeoYE6qO0SE1H6HqFBOiDtGhMpukX7flaMHmLK3bV1DrcSHBZh3bPU7jeibo2O6xmvXjVn25Zr8k6S8npOrOU3vLbD5y+AcAALUR0htBSAcABIqMgjJ9tz5DP2/O0u7cEqXnlym/tNKta/TrGKVxveJ1fM8EDevWrtYadIfD0NPfbdZ/ftwqSTqtfwc9PWWwwqxBHn0eAAAEOkJ6IwjpAIBAVlxepf0FZUrPK1N6fqnS8w/5M69MJZVVGtEtVuN6xeu4HvFqH3nkNe0frdijez5cowq7QwM7R+uVqcOV2Iy18Fszi/TrtmxFhwYrMap6lD8xKoTmdACAgEdIbwQhHQAA9/2Wlqvr3lyu3OIKdYgK0StTh2tA5+gjPq6iyqFv1+/XW0t2asn23HrPiQkLVoeoEHWIDqn15+CkGPXtyP+rAQD+j5DeCEI6AADNsyunRFe98Zu2ZBYpNNiiZ6YM0WkDOtR77p4DJXp32S7N/W2PsouqG9KZTdLo1Dg5HNL+gjLtzy9TaaW90Xs+ef4gXTg8yePPBQCA1kRIbwQhHQCA5isoq9SNb6/Qwi3ZkqS/ntZH14/vLpPJJLvD0M+bM/XWkl36cVOmnP/CaB9p00UjknTRyK7qFBPqupZhGCoorZ6eXx3aS7U/v1z7C0q1LbNYy9JyZTZJz100VGcO7uSNpwsAgEcQ0htBSAcA4OhU2R165PP1+t/inZKk847pou4J4Xpn6S7tzSt1nXdcjzj9eVQ3TeiXqGCL2a17GIahez9Zq3eW7lKQ2aTZfx6mCf0SPfo8AABoLYT0RhDSAQDwjDd+TdPDn62T45B/SUSHBuuCYV10yaiu6p4QcVTXdzgM3fHBKn38x15Zg8x6beoIje0Zf5RVAwDQ+gjpjSCkAwDgOT9tytTd81arS7tQXTqqm84Y1NGj3dqr7A7d+M4KfbMuQ6HBFv3vqpEakRzrsesDANAaCOmNIKQDAOBfyqvsuvZ/y/Xz5ixF2oL09jWjNKhLjLfLAgCgydzJoe4tEAMAAGhltiCLZv95mEalxKqwvEqXv7ZMm/YXerssAABaBCEdAAD4vFCrRa9eMUJDkmKUV1KpS19Zqh3Zxd4uCwAAjyOkAwAAvxBhC9Ib00aqb8coZReV69KXl2jPgRKP36ewrFK/bsvWd+szVHaEfdxbQkWVQ+8t26V7PlytfYd0ywcAtA2sSQcAAH4lu6hcU15crG1ZxeoWF6YPrhut9lEhzbpWeZVdG9MLtWpPnlbuztPqPfnallXk2uM9PsKmaccl68+juik6LNiDz6L+Wj74fY/++9M211Z2vRIjNO+GMYoKadl7AwBaFo3jGkFIBwDA/+3PL9MFL/6q3bml6tk+Qi9fPlxhVosMSQ7DkGEc/NP1uaTSCrvWpxdo1e48rd6Tp/XpBaq01/2nUOeYUFU5HMooKJckhVktmjIiSVcel6Kk2DCPPpeySrvm/rZb//1pm/YXlEmSEiJtMozqNyTG9ojX69NGuL3XPADAdxDSG0FIBwAgMOzOLdEFsxe7gm1ztQsL1uCkGA3qEqMhSdEa1CVG8RE2VVQ59PnqfXppwXZtrGlUZzGbNGlgR113fHcN6Bx9VPctrbDr3WW7NPvnbcosrH4zIDHKphvGp+qikV21NbNIF764WCUVdk0ZnqR/nDdQJpPpqO4JAPAOQnojCOkAAASObVlFuvZ/v2tbVrHMJslkMrn+NEkym0wymQ7+GWQ2qWf7SA2uCeNDkmLUpV1oo+HXMAwt3JKtlxZs16Kt2a7jY1LjdM3x3XVCrwS3wnNJRZXeXrJLLy7Yruyi6nDeKTpEN5zYQxcM61Jrn/kfNmbo6jd+l8OQ7prYWzee2MP9FwkA4HWE9EYQ0gEAQHOt3Zuvlxdu1+er02V3VP8TqndipE7plyiL2SRzzZsEZvPBNwfMrj9NOlBSobeX7lJucYWk6mn1N57YQ+cP6yJrUP3T2d9cnKb7P10nSXruoiH605DOrfNkAQAeQ0hvBCEdAAAcrb15pXpt0Q69t2yXiivc7wDfNTZMN53YQ+cc07lJa83//vl6vbJoh6wWs966epRGpsQ2p2wAgJcQ0htBSAcAAJ6SX1qpD37frV25JXIYhhxG9fR4h0O1v6753GSSxvVM0NlDOinIjUZwDoehG95erm/WZSgmLFgf3TBG3RMiWvCZAQA8iZDeCEI6AADwR6UVdl308hKt2p2nbnFh+uiGMYqLsHm7rCbLK6nQt+sz1KN9hI7p2s7b5QBAqyKkN4KQDgAA/FVWYbnOeeEX7TlQqmHd2untq0fVajTna+wOQ79szdb7v+/Wt+szVFHlkC3IrP+7aax6d4j0dnkA0GrcyaFsuAkAAOAnEiJtmjNthKJCgrR85wHd8cEqORy+N96yM6dY//p2k8Y+8YMuf22ZPl+drooqhyJtQSqvcujGd1aopKLK22UCgE8K8nYBAAAAaLoe7SM1+7JhmvraMn2xOl1dY8P019P6eLsslVRU6cs1+/XB77u1dEeu63h0aLDOHtJJFwxPUsfoEE16fqG2ZhbpwU/X6akLBnuxYgDwTUx3BwAA8EMfLt+jOz5YJUl65E/9ddmx3dzar90TMgvLtGZPvr5dl6HPV+9zdbp3Nsi7cHgXTeibWGtK/pLtObrk5SVyGNLTFw7Wucd0adWaAcAbWJPeCEI6AAAIFM98t1nPzd8iSeqeEK6LRiTp3GO6KL4FGsplF5Vrzd58rdmTr9V78rV2b772F5TVOqdbXJguGNZF5x7TRZ1iQhu81nPfb9Ez329WmNWiz24eq1Q61QMIcIT0RhDSAQBAoDAMQ099s0mv/5Km0srqUewgs0mn9EvUlBFJGtczQRaz+6PrucUVWrO3Ooiv3pOnNXvytS+/rM55JpPUI6G6W/u5x3TWyJTYJo3m2x2G/vzKUi3enqO+HaP08V/G+HQDPAA4WoT0RhDSAQBAoCksq9Tnq9P13m+7tWp3nut4p+gQnT88SRcM66Kk2LB6H5tZUKa1+/K1dm+B1tYE84YCeff4cA3sHK2BXWI0qEu0+nWMUriteS2OMgrKNOm5hcoprtBlx3bTo2cPaNZ1AMAfENIbQUgHAACBbEN6geb+tlufrNyrvJJKSdUBe2yPeF04PEnWILPW7c2vHinfV6CswvJ6r5PiDOSdozWwS7T6d4pSZEiwR2v9eXOWpr62TJL0wqXHaNLAjh69PgD4CkJ6IwjpAACgLSirtOvb9Rma+9su/bI1p8HzzCapR/sIDegUrf6dozWgU5T6tUAgb8gTX2/Uf3/apkhbkL64ZZy6xtU/4g8A/oyQ3ghCOgAAaGt25ZTog+W79fnqdIUGWzSgc5QGdI5W/07VU9ZDrd5bD15pd+iil5Zo+c4DGtwlWh9cP0bWILPX6gGAlkBIbwQhHQAAwLfszSvVpOcWKr+0UlePTdF9k/t5uyQA8Ch3cihvUwIAAMCrOseE6p8XDJYkvbJoh75fn+HligDAewjpAAAA8LpT+iXqyuNSJEl3zlulfXmlXq4IALyDkA4AAACfcM/pfTSoS7TySip163t/qMru8HZJANDqCOkAAADwCdYgs/598VBF2oL0W9oBjX/qJ01/f6XeW7ZL27KK1MZaKTVJWaVdi7Zkq7TC7u1SAHgIjeMAAADgU75Zt1+3vPuHyqtqj6THR1g1IjlWI5JjNTIlVn07RsliNjX5ulV2hyxmk0ympj/Gl+3ILtYNby3Xxv2F6hwTqvsn99PE/okB8/yAQEJ390YQ0gEAAHxfYVmlVuzK0287crVsR65W7slTxWGhPdIWpGO6tVPfjlEqr7KruLxKxeV2FVdUqbi8SkXlzmNVKiqvUnmVQx2iQnThiCRdNCJJnWJCj7rO3bklWrs3X51iQtU9IbzV9pf/ck267p63WkXlVbWOj+sZrwfP7K8e7SNapQ4ATUNIbwQhHQAAwP+UVdq1Zm++ltWE9uU7D9QJqO4wm6ST+iTq0mO76vieCW6NyGcUlOnz1en6fPU+/bErr9b32kfa1D0hXKkJEeqeEKHuCeHqkRChTjGhbt2jIRVVDs38aoNe/yVNkjQyOVZPnj9I85bv0UsLtqvC7lCQ2aSrxqbo5pN7KsIWdNT3BHD0COmNIKQDAAD4P7vD0Ib0Ai3bkaudOcUKtQYpwmZRuC1I4bYgRbj+rDlmDVKY1aLF23P09pJdWrw9x3WtLu1CdfHIrrpweJISIm313i+nqFxfrd2vz1bt07K0XDn/BW0ySX07RCmrqFxZheUN1msNMqt7fLgGdYnWJaO6aUhSjNvPeW9eqW56Z4XrjYHrxnfXXaf2VpClus1UWnaxHvl8vX7YmCmp+g2De8/oq7MGd2IKPOBlhPRGENIBAACwNbNI7y7bpXnL9yi/tFKSFGQ2aWL/Drp0VFeNTo1TQVmVvl23X5+tTtcvW7Nldxz8Z/Owbu105qCOmjSwo9pHhUiSCsoqtT2rWNuzirQtq0jbs4q1LatIadklqjisU/3gpBhdMaabJg3sKFuQ5Yj1/rQpU7fPXakDJZWKCgnSvy4colP6JdZ77vwNGXrk8/XamVMiSRqZEquHz+qvvh35ty/gLYT0RhDSAQAA4FRWadcXq9P19tKdWnHI1PXOMaHKKiyvFa4Hdo7WmYM76oxBndTZjfXsdoehvQdKtSWzUF+sTtfnq9Nd142PsOrikV116ahu6hAdUu9jn/1+s/7z41YZRnUNL1x6jJJiw474vF5ZuF3/+XGryiodMpuky0cn6/ZTeik6tHXWzQM4iJDeCEI6AAAA6rN+X4HeWbZTH6/Yq+KaLc16JUbozEGdNHlwJ6XEh3vkPtlF5Xpv2S69tWSX9heUSaoZxR/QQVeMSdbwbu1kMpmUVViu2+b+oV+2Vk/N//OxXXXfGf0UEnzkkXenvXmleuyL9fpyzX5J1dPuO0aHKDEyRO2jbOoQFaLEqOrPE6NCXF+HWpt+DwBH5nchfdasWXrqqae0f/9+DR48WP/+9781cuTIes+dM2eOpk2bVuuYzWZTWVlZk+5FSAcAAEBjisqrtHhbjrrGhql3h8gWu0+l3aHv1mdozq9pWrYj13W8X8conTm4k17/ZYcyC8sVGmzRP84bqD8N6dzsey3akq2HPlunrZlFTTo/MiRIHaND1CkmVJ1jQmv92SmmOsw718IDODK/Culz587V5ZdfrtmzZ2vUqFF69tln9cEHH2jTpk1q3759nfPnzJmjW2+9VZs2bXIdM5lMSkysf03O4QjpAAAA8DXr9xXozSVp+viPvSqrPDjFvkf7CP330mPUM/Ho3yxwOAztPlCijIJyZRSUKaOgTJmFBz/PKCjX/vwylVbaj3gts0nqEFUd4jvGhCoyJEjhVotCaxr0Hfp59Uf150EWkwpKq1RQWqn80koVlNX8WVp12NeVchiGQq3V1w1zXi/YojBb7WuGBltU6TBUVmFXSYVdpZV2lVZUVf9Z6XB9XlJhl91hKDEqRJ1jQtWlXfUbD51r/owNt9JgDy3Gr0L6qFGjNGLECP3nP/+RJDkcDiUlJenmm2/WPffcU+f8OXPm6LbbblNeXl6z7kdIBwAAgK/KK6nQ+7/v1ofL92pIUoweOLOfwltxGzXDMPT/7d17cFT1+cfxz9nNbi5ALgrkAgnhokC4CUFooFVHMjIMdbB2FDsUg1QZNEyJ1Cq2o2AtBLAyXLRgL4pVWsS2YGVGLQZIB4oQAig3ud9+EhJTzRVy2/P9/bHJwhqKWpE9S96vmZ3d8/2e5Ty7z3x1nzxnz9bUN6m0qk4llXU6U3Fen3x+Xp9U+B+fqTyvkoq6VhfCuxZEeVzNRXuMusRHKT7GqyafrUafUaPPVlPzfaNt1Nhkq8m21eAzavLZcrssedwued0ueSP8N4/bpcjmx163f9sT4f8jgDH+99oYyTaSkZFt/BNGkt1corksSy7LkttlyWVJLlfztmXJstQ87p/7Koz8P+NXH7j5VN944fHFcz7bltftUpTHrcgI/33L48igMZciXJYsXRTEF+K5eNOy/Htalv/1tfxdxGp+HZb8Y1ZzvHbgffLfGxnZ9oU5Nc+N6Z+suBjnXm/h69ShIf3hxIaGBhUXF+vJJ58MjLlcLmVnZ2vr1q3/9Xk1NTXq1q2bbNvWkCFDNHfuXPXr1++S+9bX16u+/sLPYVRVVV25FwAAAABcQfExXk25paem3NIzJMe3LEsdojzqEOVRr86X7t7btlF5Tb0+qTivMxV1Kqk8r5r6Jp1v8Km2ocnfzW7wqbbB39Gurfc1d7Kb1Ogzio2KUFy0R7EttyiP4qI9zWMRgccuy9K5Bv/zzl/UJa+tv3CMc81dc4/bpWiPW1Fet2I8bkV7/QVltKelC+/fdlmWzlae1/8F/vjgvy+rrlddo62jn9bq6Ke1V/ldx5UwpFuCo4v0ryOkRXp5ebl8Pl+rU9UTExP18ccfX/I5vXv31ssvv6yBAweqsrJSv/nNbzRixAjt27dPXbt2bbV/fn6+nnnmmW8lfgAAAKCtcbksdY6NUufYKA1OC3U0V0Z9k08lFXWBov3/Ks6rpq5JHre/Qx7RfO9xW4pwueSJcMnjshTRPOaz/V32lk50o8+ooclWg8/fnW70meZxO9BFtmTJ5ZKk5g5yy5ilwGn3tjGyjZHP9nfefba/426Mkc/4H9u2kb///tV43S5FRrgV6fF3+CM9zdvNXf+Wx26XpYYmW3XN3fa6Rp/qm/z3gbEmW/WNPjXZrY9/qRO2m08WaL6/0BkP7pRfmGvptLd03S9s+7vxrou68dFf44KKThfSIv1/kZWVpaysrMD2iBEj1LdvX7300kt69tlnW+3/5JNPasaMGYHtqqoqpaamXpVYAQAAADhfZIRb6R3bKf0KXcEf+CZCWqR37NhRbrdbpaWlQeOlpaVKSkr6Sv+Gx+PR4MGDdeTIkUvOR0ZGKjIy8hvHCgAAAADAty2kv5vg9XqVmZmpgoKCwJht2yooKAjqll+Oz+fTnj17lJyc/G2FCQAAAADAVRHy091nzJihnJwcDR06VMOGDdOiRYtUW1sb+C30+++/X126dFF+fr4k6Ve/+pW+853vqFevXqqoqNBzzz2nkydP6sEHHwzlywAAAAAA4BsLeZE+fvx4ffrpp3r66ad19uxZ3XTTTXr33XcDF5M7deqUXK4LDf/PP/9cDz30kM6ePauEhARlZmbq3//+tzIyMkL1EgAAAAAAuCJC/jvpVxu/kw4AAAAAuJq+Th0a0u+kAwAAAACACyjSAQAAAABwCIp0AAAAAAAcgiIdAAAAAACHoEgHAAAAAMAhKNIBAAAAAHAIinQAAAAAAByCIh0AAAAAAIegSAcAAAAAwCEo0gEAAAAAcAiKdAAAAAAAHIIiHQAAAAAAh6BIBwAAAADAISJCHcDVZoyRJFVVVYU4EgAAAABAW9BSf7bUo5fT5or06upqSVJqamqIIwEAAAAAtCXV1dWKi4u77D6W+Sql/DXEtm2dOXNGHTp0kGVZoQ7nsqqqqpSamqrTp08rNjY21OHgMshV+CBX4YNchQ9yFT7IVfggV+GDXIWPUObKGKPq6mqlpKTI5br8t87bXCfd5XKpa9euoQ7ja4mNjWXBhwlyFT7IVfggV+GDXIUPchU+yFX4IFfhI1S5+rIOegsuHAcAAAAAgENQpAMAAAAA4BAU6Q4WGRmpWbNmKTIyMtSh4EuQq/BBrsIHuQof5Cp8kKvwQa7CB7kKH+GSqzZ34TgAAAAAAJyKTjoAAAAAAA5BkQ4AAAAAgENQpAMAAAAA4BAU6QAAAAAAOARFukO9+OKLSk9PV1RUlIYPH67t27eHOqQ271//+pfuvPNOpaSkyLIsrV27NmjeGKOnn35aycnJio6OVnZ2tg4fPhyaYNu4/Px83XzzzerQoYM6d+6su+66SwcPHgzap66uTrm5ubr++uvVvn17/fCHP1RpaWmIIm67li1bpoEDByo2NlaxsbHKysrSO++8E5gnT841b948WZalvLy8wBj5cobZs2fLsqygW58+fQLz5MlZPvnkE/34xz/W9ddfr+joaA0YMEA7duwIzPP5whnS09NbrSvLspSbmyuJdeUkPp9PTz31lLp3767o6Gj17NlTzz77rC6+XrrT1xVFugO98cYbmjFjhmbNmqWdO3dq0KBBGj16tMrKykIdWptWW1urQYMG6cUXX7zk/IIFC7RkyRItX75c27ZtU7t27TR69GjV1dVd5UhRWFio3NxcffDBB1q/fr0aGxt1xx13qLa2NrDPo48+qrfffltvvvmmCgsLdebMGd19990hjLpt6tq1q+bNm6fi4mLt2LFDt99+u8aNG6d9+/ZJIk9OVVRUpJdeekkDBw4MGidfztGvXz+VlJQEbps3bw7MkSfn+PzzzzVy5Eh5PB6988472r9/v55//nklJCQE9uHzhTMUFRUFran169dLku655x5JrCsnmT9/vpYtW6YXXnhBBw4c0Pz587VgwQItXbo0sI/j15WB4wwbNszk5uYGtn0+n0lJSTH5+fkhjAoXk2TWrFkT2LZt2yQlJZnnnnsuMFZRUWEiIyPNX/7ylxBEiIuVlZUZSaawsNAY48+Nx+Mxb775ZmCfAwcOGElm69atoQoTzRISEswf/vAH8uRQ1dXV5oYbbjDr1683t956q5k+fboxhnXlJLNmzTKDBg265Bx5cpYnnnjCfPe73/2v83y+cK7p06ebnj17Gtu2WVcOM3bsWDN58uSgsbvvvttMmDDBGBMe64pOusM0NDSouLhY2dnZgTGXy6Xs7Gxt3bo1hJHhco4fP66zZ88G5S0uLk7Dhw8nbw5QWVkpSbruuuskScXFxWpsbAzKV58+fZSWlka+Qsjn82nVqlWqra1VVlYWeXKo3NxcjR07NigvEuvKaQ4fPqyUlBT16NFDEyZM0KlTpySRJ6f5xz/+oaFDh+qee+5R586dNXjwYP3+978PzPP5wpkaGhr0+uuva/LkybIsi3XlMCNGjFBBQYEOHTokSfrwww+1efNmjRkzRlJ4rKuIUAeAYOXl5fL5fEpMTAwaT0xM1McffxyiqPBlzp49K0mXzFvLHELDtm3l5eVp5MiR6t+/vyR/vrxer+Lj44P2JV+hsWfPHmVlZamurk7t27fXmjVrlJGRod27d5Mnh1m1apV27typoqKiVnOsK+cYPny4VqxYod69e6ukpETPPPOMvve972nv3r3kyWGOHTumZcuWacaMGfrFL36hoqIi/fSnP5XX61VOTg6fLxxq7dq1qqio0KRJkyTx3z+nmTlzpqqqqtSnTx+53W75fD7NmTNHEyZMkBQen9sp0gFc03Jzc7V3796g72PCWXr37q3du3ersrJSf/3rX5WTk6PCwsJQh4UvOH36tKZPn67169crKioq1OHgMlq6RZI0cOBADR8+XN26ddPq1asVHR0dwsjwRbZta+jQoZo7d64kafDgwdq7d6+WL1+unJycEEeH/+aPf/yjxowZo5SUlFCHgktYvXq1Vq5cqT//+c/q16+fdu/erby8PKWkpITNuuJ0d4fp2LGj3G53q6tBlpaWKikpKURR4cu05Ia8Ocu0adO0bt06bdy4UV27dg2MJyUlqaGhQRUVFUH7k6/Q8Hq96tWrlzIzM5Wfn69BgwZp8eLF5MlhiouLVVZWpiFDhigiIkIREREqLCzUkiVLFBERocTERPLlUPHx8brxxht15MgR1pXDJCcnKyMjI2isb9++ga8n8PnCeU6ePKn3339fDz74YGCMdeUsP//5zzVz5kzdd999GjBggCZOnKhHH31U+fn5ksJjXVGkO4zX61VmZqYKCgoCY7Ztq6CgQFlZWSGMDJfTvXt3JSUlBeWtqqpK27ZtI28hYIzRtGnTtGbNGm3YsEHdu3cPms/MzJTH4wnK18GDB3Xq1Cny5QC2bau+vp48OcyoUaO0Z88e7d69O3AbOnSoJkyYEHhMvpyppqZGR48eVXJyMuvKYUaOHNnqJ0IPHTqkbt26SeLzhRO98sor6ty5s8aOHRsYY105y7lz5+RyBZe5brdbtm1LCpN1Feor16G1VatWmcjISLNixQqzf/9+M2XKFBMfH2/Onj0b6tDatOrqarNr1y6za9cuI8ksXLjQ7Nq1y5w8edIYY8y8efNMfHy8eeutt8xHH31kxo0bZ7p3727Onz8f4sjbnocfftjExcWZTZs2mZKSksDt3LlzgX2mTp1q0tLSzIYNG8yOHTtMVlaWycrKCmHUbdPMmTNNYWGhOX78uPnoo4/MzJkzjWVZ5p///Kcxhjw53cVXdzeGfDnFz372M7Np0yZz/Phxs2XLFpOdnW06duxoysrKjDHkyUm2b99uIiIizJw5c8zhw4fNypUrTUxMjHn99dcD+/D5wjl8Pp9JS0szTzzxRKs51pVz5OTkmC5duph169aZ48ePm7///e+mY8eO5vHHHw/s4/R1RZHuUEuXLjVpaWnG6/WaYcOGmQ8++CDUIbV5GzduNJJa3XJycowx/p9zeOqpp0xiYqKJjIw0o0aNMgcPHgxt0G3UpfIkybzyyiuBfc6fP28eeeQRk5CQYGJiYswPfvADU1JSErqg26jJkyebbt26Ga/Xazp16mRGjRoVKNCNIU9O98UinXw5w/jx401ycrLxer2mS5cuZvz48ebIkSOBefLkLG+//bbp37+/iYyMNH369DG/+93vgub5fOEc7733npF0yfefdeUcVVVVZvr06SYtLc1ERUWZHj16mF/+8pemvr4+sI/T15VljDEhaeEDAAAAAIAgfCcdAAAAAACHoEgHAAAAAMAhKNIBAAAAAHAIinQAAAAAAByCIh0AAAAAAIegSAcAAAAAwCEo0gEAAAAAcAiKdAAAAAAAHIIiHQAAXFHp6elatGhRqMMAACAsUaQDABDGJk2apLvuukuSdNtttykvL++qHXvFihWKj49vNV5UVKQpU6ZctTgAALiWRIQ6AAAA4CwNDQ3yer3/8/M7dep0BaMBAKBtoZMOAMA1YNKkSSosLNTixYtlWZYsy9KJEyckSXv37tWYMWPUvn17JSYmauLEiSovLw8897bbbtO0adOUl5enjh07avTo0ZKkhQsXasCAAWrXrp1SU1P1yCOPqKamRpK0adMmPfDAA6qsrAwcb/bs2ZJan+5+6tQpjRs3Tu3bt1dsbKzuvfdelZaWBuZnz56tm266Sa+99prS09MVFxen++67T9XV1d/umwYAgANRpAMAcA1YvHixsrKy9NBDD6mkpEQlJSVKTU1VRUWFbr/9dg0ePFg7duzQu+++q9LSUt17771Bz3/11Vfl9Xq1ZcsWLV++XJLkcrm0ZMkS7du3T6+++qo2bNigxx9/XJI0YsQILVq0SLGxsYHjPfbYY63ism1b48aN02effabCwkKtX79ex44d0/jx44P2O3r0qNauXat169Zp3bp1Kiws1Lx5876ldwsAAOfidHcAAK4BcXFx8nq9iomJUVJSUmD8hRde0ODBgzV37tzA2Msvv6zU1FQdOnRIN954oyTphhtu0IIFC4L+zYu/356enq5f//rXmjp1qn7729/K6/UqLi5OlmUFHe+LCgoKtGfPHh0/flypqamSpD/96U/q16+fioqKdPPNN0vyF/MrVqxQhw4dJEkTJ05UQUGB5syZ883eGAAAwgyddAAArmEffvihNm7cqPbt2wduffr0keTvXrfIzMxs9dz3339fo0aNUpcuXdShQwdNnDhR//nPf3Tu3LmvfPwDBw4oNTU1UKBLUkZGhuLj43XgwIHAWHp6eqBAl6Tk5GSVlZV9rdcKAMC1gE46AADXsJqaGt15552aP39+q7nk5OTA43bt2gXNnThxQt///vf18MMPa86cObruuuu0efNm/eQnP1FDQ4NiYmKuaJwejydo27Is2bZ9RY8BAEA4oEgHAOAa4fV65fP5gsaGDBmiv/3tb0pPT1dExFf/335xcbFs29bzzz8vl8t/4t3q1au/9Hhf1LdvX50+fVqnT58OdNP379+viooKZWRkfOV4AABoKzjdHQCAa0R6erq2bdumEydOqLy8XLZtKzc3V5999pl+9KMfqaioSEePHtV7772nBx544LIFdq9evdTY2KilS5fq2LFjeu211wIXlLv4eDU1NSooKFB5efklT4PPzs7WgAEDNGHCBO3cuVPbt2/X/fffr1tvvVVDhw694u8BAADhjiIdAIBrxGOPPSa3262MjAx16tRJp06dUkpKirZs2SKfz6c77rhDAwYMUF5enuLj4wMd8ksZNGiQFi5cqPnz56t///5auXKl8vPzg/YZMWKEpk6dqvHjx6tTp06tLjwn+U9bf+utt5SQkKBbbrlF2dnZ6tGjh954440r/voBALgWWMYYE+ogAAAAAAAAnXQAAAAAAByDIh0AAAAAAIegSAcAAAAAwCEo0gEAAAAAcAiKdAAAAAAAHIIiHQAAAAAAh6BIBwAAAADAISjSAQAAAABwCIp0AAAAAAAcgiIdAAAAAACHoEgHAAAAAMAh/h8rqrZ5BG0yVAAAAABJRU5ErkJggg==\n",
544
      "text/plain": [
545
       "<Figure size 1200x600 with 1 Axes>"
546
      ]
547
     },
548
     "metadata": {},
549
     "output_type": "display_data"
550
    }
551
   ],
552
   "source": [
553
    "# create empty array for callback to store evaluations of the objective function (callback)\n",
554
    "objective_func_vals = []\n",
555
    "plt.rcParams[\"figure.figsize\"] = (12, 6)\n",
556
    "\n",
557
    "# fit classifier to data\n",
558
    "estimator_classifier.fit(X, y)\n",
559
    "\n",
560
    "# return to default figsize\n",
561
    "plt.rcParams[\"figure.figsize\"] = (6, 4)"
562
   ]
563
  },
564
  {
565
   "cell_type": "markdown",
566
   "metadata": {},
567
   "source": [
568
    "The classifier can now differentiate between classes with an accuracy of:"
569
   ]
570
  },
571
  {
572
   "cell_type": "code",
573
   "execution_count": 18,
574
   "metadata": {},
575
   "outputs": [
576
    {
577
     "data": {
578
      "text/plain": [
579
       "0.92"
580
      ]
581
     },
582
     "execution_count": 18,
583
     "metadata": {},
584
     "output_type": "execute_result"
585
    }
586
   ],
587
   "source": [
588
    "# score classifier\n",
589
    "estimator_classifier.score(X, y)"
590
   ]
591
  },
592
  {
593
   "cell_type": "markdown",
594
   "metadata": {},
595
   "source": [
596
    "### 4.3 Compute Local Effective Dimension of trained QNN\n",
597
    "\n",
598
    "Now that we have trained our network, let's evaluate the local effective dimension based on the trained weights. To do that we access the trained weights directly from the classifier."
599
   ]
600
  },
601
  {
602
   "cell_type": "code",
603
   "execution_count": 19,
604
   "metadata": {
605
    "pycharm": {
606
     "name": "#%%\n"
607
    }
608
   },
609
   "outputs": [
610
    {
611
     "name": "stdout",
612
     "output_type": "stream",
613
     "text": [
614
      "normalized local effective dimensions for trained QNN:  [0.95278883 0.95560153 0.95692356 0.9642895  0.96611037 0.9681968\n",
615
      " 0.96970102 0.97069368 0.97349292 0.97529831]\n"
616
     ]
617
    }
618
   ],
619
   "source": [
620
    "trained_weights = estimator_classifier.weights\n",
621
    "\n",
622
    "# get Local Effective Dimension for set of trained weights\n",
623
    "local_ed_trained = LocalEffectiveDimension(\n",
624
    "    qnn=estimator_qnn, weight_samples=trained_weights, input_samples=X\n",
625
    ")\n",
626
    "\n",
627
    "local_eff_dim_trained = local_ed_trained.get_effective_dimension(dataset_size=n)\n",
628
    "\n",
629
    "print(\n",
630
    "    \"normalized local effective dimensions for trained QNN: \",\n",
631
    "    local_eff_dim_trained / estimator_qnn.num_weights,\n",
632
    ")"
633
   ]
634
  },
635
  {
636
   "cell_type": "markdown",
637
   "metadata": {},
638
   "source": [
639
    "### 4.4 Compute Local Effective Dimension of untrained QNN\n",
640
    "\n",
641
    "We can compare this result with the effective dimension of the untrained network, using the `initial_point` as our weight sample:"
642
   ]
643
  },
644
  {
645
   "cell_type": "code",
646
   "execution_count": 20,
647
   "metadata": {},
648
   "outputs": [
649
    {
650
     "name": "stdout",
651
     "output_type": "stream",
652
     "text": [
653
      "normalized local effective dimensions for untrained QNN:  [0.97019742 0.97173693 0.97250146 0.97700455 0.97815438 0.97948161\n",
654
      " 0.98044331 0.98107966 0.98287941 0.98404302]\n"
655
     ]
656
    }
657
   ],
658
   "source": [
659
    "# get Local Effective Dimension for set of untrained weights\n",
660
    "local_ed_untrained = LocalEffectiveDimension(\n",
661
    "    qnn=estimator_qnn, weight_samples=initial_point, input_samples=X\n",
662
    ")\n",
663
    "\n",
664
    "local_eff_dim_untrained = local_ed_untrained.get_effective_dimension(dataset_size=n)\n",
665
    "\n",
666
    "print(\n",
667
    "    \"normalized local effective dimensions for untrained QNN: \",\n",
668
    "    local_eff_dim_untrained / estimator_qnn.num_weights,\n",
669
    ")"
670
   ]
671
  },
672
  {
673
   "cell_type": "markdown",
674
   "metadata": {
675
    "pycharm": {
676
     "name": "#%% md\n"
677
    }
678
   },
679
   "source": [
680
    "### 4.5 Plot and analyze results\n",
681
    "\n",
682
    "If we plot the effective dimension values before and after training, we can see the following result:"
683
   ]
684
  },
685
  {
686
   "cell_type": "code",
687
   "execution_count": 21,
688
   "metadata": {
689
    "pycharm": {
690
     "name": "#%%\n"
691
    },
692
    "tags": [
693
     "nbsphinx-thumbnail"
694
    ]
695
   },
696
   "outputs": [
697
    {
698
     "data": {
699
      "image/png": "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+Z4nNTWV3r174+DggKenJ7NmzcpTZtWqVTRq1AhHR0c8PDx44403uH79OpDTzNWqVSsAKlSogEqlom/fvgBs376dZ599FhcXFypVqkTHjh2JiYnJNw4hStqQIUPYt28f3377LUePHuXVV1+lXbt2nD17FoAff/yRqlWrsm3bNvz9/fHz8+Ptt9/m9u3bBl1HkhQhBJCzfP3UqVNZsGABly9ffqxz/f7771y5coU//viD2bNnM378eDp27EiFChXYv38/gwYN4p133slznREjRvDRRx9x6NAhmjZtSqdOnbh16xYACQkJtG7dmpCQEA4ePMj27du5du0a3bt31znHypUrsbKyYu/evSxevDjf+ObNm8esWbOYOXMmR48eJSwsjJdeekn7H+zVq1epU6cOH330EVevXmX48OH5nmfEiBHs3r2bH374gf/973/s2rWLf//9V6dMVlYWkydP5siRI2zZsoULFy5oExEfHx82btwIQHR0NFevXmXevHlATgIUHh7OwYMHiYyMxMzMjK5du6LRaAz4mxDC+GJjY1m+fDkbNmzgueeeIyAggOHDh/Pss89qf/k4d+4cFy9eZMOGDXzzzTesWLGCqKgoXnnlFcMuVmxLFwohyowHVzB++umnlbfeektRFEXZvHmz8uB/E+PHj1fq16+vc+ycOXMUX19fnXP5+voqarVau61mzZrKc889p/2cnZ2t2NvbK+vWrVMURVHOnz+vAMq0adO0ZbKyspSnnnpKmT59uqIoijJ58mTlhRde0Ln2pUuXFECJjo5WFCVnBdyQkJBH3q+Xl5cyZcoUnW2NGzdW3nvvPe3n+vXrF7pKdnJysmJlZaV899132m23bt1SbG1tlQ8++KDA4/755x8FUJKTkxVFub8K7aNW5b1x44YCKMeOHSu0nBDGBiibN2/Wft62bZsCKPb29jovCwsLpXv37oqiKMqAAQN0/m0qiqJERUUpgHL69Gm9ry19UoQQOqZPn07r1q0LrD3QR506dTAzu19R6+7uTt26dbWfzc3NqVSpkrbZI1fTpk217y0sLGjUqBGnTp0C4MiRI+zcuRMHB4c814uJiaFGjRoANGzYsNDYkpKSuHLlCs2aNdPZ3qxZM44cOaLnHeZcMzMzk9DQUO22ihUratvfc0VFRTFhwgSOHDnCnTt3tDUhsbGx1K5du8Dznz17lnHjxrF//35u3rypc9yDz1KIkpaSkoK5uTlRUVGYm5vr7Mv99+np6YmFhYX23yVArVq1gJyf4Yf/nRREkhQhhI7mzZsTFhbG6NGjtc0SuczMzMj5xeq+rKysPOewtLTU+axSqfLdZkjTRUpKCp06dWL69Ol59nl6emrf29vb633O4paamkpYWBhhYWGsWbOGypUrExsbS1hYGJmZmYUe26lTJ3x9ffnqq6/w8vJCo9FQt27dRx4nRHELCQlBrVZz/fp1nnvuuXzLNGvWjOzsbGJiYggICADgzJkzAAZ1Rpc+KUKIPKZNm8aPP/7Ivn37dLZXrlyZ+Ph4nUTFmHOb/P3339r32dnZREVFaX/7atCgASdOnMDPz49q1arpvAxJTJycnPDy8mLv3r062/fu3VtozcbDAgICsLS0ZP/+/dptd+7c0f5HDDkdgW/dusW0adN47rnnCAwMzFN7lDv6SK1Wa7fdunWL6Ohoxo4dy/PPP0+tWrW4c+eO3rEJ8bhSUlI4fPiw9t/3+fPnOXz4MLGxsdSoUYOePXvSu3dvNm3axPnz5zlw4AARERH89NNPQE5H/AYNGvDWW29x6NAhoqKieOedd2jbtq1O7cqjSJIihMgjKCiInj17Mn/+fJ3tLVu25MaNG8yYMYOYmBgWLVrEL7/8YrTrLlq0iM2bN3P69GkGDx7MnTt3eOuttwAYPHgwt2/f5vXXX+eff/4hJiaGX3/9lX79+ul8wetjxIgRTJ8+nfXr1xMdHc2oUaM4fPgwH3zwgd7ncHBwoH///owYMYLff/+d48eP07dvX51mripVqmBlZcWCBQs4d+4cW7duZfLkyTrn8fX1RaVSsW3bNm7cuEFKSgoVKlSgUqVKLFmyhP/++4/ff/+d8PBwg+5RiMdx8OBBQkJCCAkJASA8PJyQkBDGjRsHwPLly+nduzcfffQRNWvWpEuXLvzzzz9UqVIFyKl1/fHHH3F1daV58+a8+OKL1KpVi2+//dawQIzUr0YIUYY92HE21/nz5xUrKyvl4f8mvvjiC8XHx0ext7dXevfurUyZMiVPx9mHz9WiRYs8nUl9fX2VOXPmaK8FKGvXrlWaNGmiWFlZKbVr11Z+//13nWPOnDmjdO3aVXFxcVFsbW2VwMBAZdiwYYpGoynwOvlRq9XKhAkTFG9vb8XS0lKpX7++8ssvv+iUeVTHWUXJ6Tzbq1cvxc7OTnF3d1dmzJiRJ4a1a9cqfn5+irW1tdK0aVNl69atCqAcOnRIW2bSpEmKh4eHolKplD59+iiKoii//fabUqtWLcXa2lqpV6+esmvXrjwdGIV40qkU5aEGZiGEEEKIUkCae4QQQghRKkmSIoQQQohSSZIUIYQQQpRKkqQIIYQQolSSJEUIIYQQpZIkKUIIIYQolSRJEUIIIUSpJEmKEEIIIUolSVKEEEIIUSpJkiKEEEKIUkmSFCGEEEKUSpKkCCGEEKJU+n/HGmO5IsFXowAAAABJRU5ErkJggg==\n",
700
      "text/plain": [
701
       "<Figure size 600x400 with 1 Axes>"
702
      ]
703
     },
704
     "metadata": {},
705
     "output_type": "display_data"
706
    }
707
   ],
708
   "source": [
709
    "# plot the normalized effective dimension for the model\n",
710
    "plt.plot(n, np.array(local_eff_dim_trained) / estimator_qnn.num_weights, label=\"trained weights\")\n",
711
    "plt.plot(\n",
712
    "    n, np.array(local_eff_dim_untrained) / estimator_qnn.num_weights, label=\"untrained weights\"\n",
713
    ")\n",
714
    "\n",
715
    "plt.xlabel(\"Number of data\")\n",
716
    "plt.ylabel(\"Normalized LOCAL effective dimension\")\n",
717
    "plt.legend()\n",
718
    "plt.show()"
719
   ]
720
  },
721
  {
722
   "cell_type": "markdown",
723
   "metadata": {},
724
   "source": [
725
    "In general, we should expect the value of the local effective dimension to decrease after training. This can be understood by looking back into the main goal of machine learning, which is to pick a model that is expressive enough to fit your data, but not too expressive that it overfits and performs badly on new data samples.  \n",
726
    "\n",
727
    "Certain optimizers help regularize the overfitting of a model by learning parameters, and this action of learning inherently reduces a model’s expressiveness, as measured by the local effective dimension. Following this logic, a randomly initialized parameter set will most likely produce a higher effective dimension that the final set of trained weights, because that model with that particular parameterization is “using more parameters” unnecessarily to fit the data. After training (with the implicit regularization), a trained model will not need to use so many parameters and thus have more “inactive parameters” and a lower effective dimension. \n",
728
    "\n",
729
    "We must keep in mind though that this is the general intuition, and there might be cases where a randomly selected set of weights happens to provide a lower effective dimension than the trained weights for a specific model. "
730
   ]
731
  },
732
  {
733
   "cell_type": "code",
734
   "execution_count": 22,
735
   "metadata": {
736
    "pycharm": {
737
     "name": "#%%\n"
738
    },
739
    "tags": []
740
   },
741
   "outputs": [
742
    {
743
     "data": {
744
      "text/html": [
745
       "<h3>Version Information</h3><table><tr><th>Software</th><th>Version</th></tr><tr><td><code>qiskit</code></td><td>0.44.1</td></tr><tr><td><code>qiskit-terra</code></td><td>0.25.1</td></tr><tr><td><code>qiskit_machine_learning</code></td><td>0.6.1</td></tr><tr><th colspan='2'>System information</th></tr><tr><td>Python version</td><td>3.10.8</td></tr><tr><td>Python compiler</td><td>GCC 10.4.0</td></tr><tr><td>Python build</td><td>main, Nov 22 2022 08:26:04</td></tr><tr><td>OS</td><td>Linux</td></tr><tr><td>CPUs</td><td>8</td></tr><tr><td>Memory (Gb)</td><td>31.142810821533203</td></tr><tr><td colspan='2'>Wed Nov 22 16:38:24 2023 UTC</td></tr></table>"
746
      ],
747
      "text/plain": [
748
       "<IPython.core.display.HTML object>"
749
      ]
750
     },
751
     "metadata": {},
752
     "output_type": "display_data"
753
    },
754
    {
755
     "data": {
756
      "text/html": [
757
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>&copy; Copyright IBM 2017, 2023.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
758
      ],
759
      "text/plain": [
760
       "<IPython.core.display.HTML object>"
761
      ]
762
     },
763
     "metadata": {},
764
     "output_type": "display_data"
765
    }
766
   ],
767
   "source": [
768
    "import qiskit.tools.jupyter\n",
769
    "\n",
770
    "%qiskit_version_table\n",
771
    "%qiskit_copyright"
772
   ]
773
  }
774
 ],
775
 "metadata": {
776
  "celltoolbar": "Tags",
777
  "kernelspec": {
778
   "display_name": "Python 3 (ipykernel)",
779
   "language": "python",
780
   "name": "python3"
781
  },
782
  "language_info": {
783
   "codemirror_mode": {
784
    "name": "ipython",
785
    "version": 3
786
   },
787
   "file_extension": ".py",
788
   "mimetype": "text/x-python",
789
   "name": "python",
790
   "nbconvert_exporter": "python",
791
   "pygments_lexer": "ipython3",
792
   "version": "3.10.8"
793
  },
794
  "widgets": {
795
   "application/vnd.jupyter.widget-state+json": {
796
    "state": {
797
     "09a6e6ed5c084398858c5392b360efb2": {
798
      "model_module": "@jupyter-widgets/controls",
799
      "model_module_version": "2.0.0",
800
      "model_name": "ButtonModel",
801
      "state": {
802
       "button_style": "primary",
803
       "description": "Clear",
804
       "layout": "IPY_MODEL_3eab0af23cfe45f59a7ca663e9193530",
805
       "style": "IPY_MODEL_f37ee516540f4a7f8f55f461382d4236",
806
       "tooltip": null
807
      }
808
     },
809
     "109b9f59d0d24b529db36b0e6805e936": {
810
      "model_module": "@jupyter-widgets/controls",
811
      "model_module_version": "2.0.0",
812
      "model_name": "HTMLModel",
813
      "state": {
814
       "layout": "IPY_MODEL_184977444faa47f18953316e63e08a00",
815
       "style": "IPY_MODEL_288c2166e6df4a3eb4f23a2f0e1c1dfb",
816
       "value": "<h5>Job ID</h5>"
817
      }
818
     },
819
     "114f81fe630f4ba29aa399e4755e41c7": {
820
      "model_module": "@jupyter-widgets/controls",
821
      "model_module_version": "2.0.0",
822
      "model_name": "HTMLModel",
823
      "state": {
824
       "layout": "IPY_MODEL_322c2200dc974686b1724a637dd45f48",
825
       "style": "IPY_MODEL_2fe1ade89712448b93da39a2accd25c7",
826
       "value": "<h5>Queue</h5>"
827
      }
828
     },
829
     "184977444faa47f18953316e63e08a00": {
830
      "model_module": "@jupyter-widgets/base",
831
      "model_module_version": "2.0.0",
832
      "model_name": "LayoutModel",
833
      "state": {
834
       "width": "190px"
835
      }
836
     },
837
     "288c2166e6df4a3eb4f23a2f0e1c1dfb": {
838
      "model_module": "@jupyter-widgets/controls",
839
      "model_module_version": "2.0.0",
840
      "model_name": "HTMLStyleModel",
841
      "state": {
842
       "description_width": "",
843
       "font_size": null,
844
       "text_color": null
845
      }
846
     },
847
     "2fe1ade89712448b93da39a2accd25c7": {
848
      "model_module": "@jupyter-widgets/controls",
849
      "model_module_version": "2.0.0",
850
      "model_name": "HTMLStyleModel",
851
      "state": {
852
       "description_width": "",
853
       "font_size": null,
854
       "text_color": null
855
      }
856
     },
857
     "322c2200dc974686b1724a637dd45f48": {
858
      "model_module": "@jupyter-widgets/base",
859
      "model_module_version": "2.0.0",
860
      "model_name": "LayoutModel",
861
      "state": {
862
       "width": "70px"
863
      }
864
     },
865
     "3eab0af23cfe45f59a7ca663e9193530": {
866
      "model_module": "@jupyter-widgets/base",
867
      "model_module_version": "2.0.0",
868
      "model_name": "LayoutModel",
869
      "state": {
870
       "grid_area": "right",
871
       "padding": "0px 0px 0px 0px",
872
       "width": "70px"
873
      }
874
     },
875
     "4e1b4f52a31a4476b5d22a926be150f6": {
876
      "model_module": "@jupyter-widgets/controls",
877
      "model_module_version": "2.0.0",
878
      "model_name": "HTMLStyleModel",
879
      "state": {
880
       "description_width": "",
881
       "font_size": null,
882
       "text_color": null
883
      }
884
     },
885
     "51411fe9aa834996ac19de03b757810a": {
886
      "model_module": "@jupyter-widgets/controls",
887
      "model_module_version": "2.0.0",
888
      "model_name": "HTMLStyleModel",
889
      "state": {
890
       "description_width": "",
891
       "font_size": null,
892
       "text_color": null
893
      }
894
     },
895
     "57a1c62e69534db1895ca78e45e04122": {
896
      "model_module": "@jupyter-widgets/base",
897
      "model_module_version": "2.0.0",
898
      "model_name": "LayoutModel",
899
      "state": {}
900
     },
901
     "5c19a819cf2b418393df54e67a12e824": {
902
      "model_module": "@jupyter-widgets/base",
903
      "model_module_version": "2.0.0",
904
      "model_name": "LayoutModel",
905
      "state": {
906
       "margin": "0px 0px 0px 37px",
907
       "width": "600px"
908
      }
909
     },
910
     "6901d98c37dd414a918fad31d6ec664e": {
911
      "model_module": "@jupyter-widgets/base",
912
      "model_module_version": "2.0.0",
913
      "model_name": "LayoutModel",
914
      "state": {
915
       "margin": "0px 0px 10px 0px"
916
      }
917
     },
918
     "6ceb8eeb5f87486087c589a1968b8148": {
919
      "model_module": "@jupyter-widgets/controls",
920
      "model_module_version": "2.0.0",
921
      "model_name": "HTMLModel",
922
      "state": {
923
       "layout": "IPY_MODEL_fd1035ffd0544addbc61bc26f9795e81",
924
       "style": "IPY_MODEL_51411fe9aa834996ac19de03b757810a",
925
       "value": "<h5>Status</h5>"
926
      }
927
     },
928
     "84334bcf0cd8479c943df057062df9bb": {
929
      "model_module": "@jupyter-widgets/controls",
930
      "model_module_version": "2.0.0",
931
      "model_name": "HTMLModel",
932
      "state": {
933
       "layout": "IPY_MODEL_f70ec821d24f46a9b6a491f26dfe317a",
934
       "style": "IPY_MODEL_d28424781ca64f139fef57d2ebc26c95",
935
       "value": "<h5>Backend</h5>"
936
      }
937
     },
938
     "905890c9d2b64231a89de9cd622a4fdb": {
939
      "model_module": "@jupyter-widgets/controls",
940
      "model_module_version": "2.0.0",
941
      "model_name": "HBoxModel",
942
      "state": {
943
       "children": [
944
        "IPY_MODEL_109b9f59d0d24b529db36b0e6805e936",
945
        "IPY_MODEL_84334bcf0cd8479c943df057062df9bb",
946
        "IPY_MODEL_6ceb8eeb5f87486087c589a1968b8148",
947
        "IPY_MODEL_114f81fe630f4ba29aa399e4755e41c7",
948
        "IPY_MODEL_a292b3cecf514dca849103f26baf07fe"
949
       ],
950
       "layout": "IPY_MODEL_5c19a819cf2b418393df54e67a12e824"
951
      }
952
     },
953
     "a292b3cecf514dca849103f26baf07fe": {
954
      "model_module": "@jupyter-widgets/controls",
955
      "model_module_version": "2.0.0",
956
      "model_name": "HTMLModel",
957
      "state": {
958
       "layout": "IPY_MODEL_57a1c62e69534db1895ca78e45e04122",
959
       "style": "IPY_MODEL_4e1b4f52a31a4476b5d22a926be150f6",
960
       "value": "<h5>Message</h5>"
961
      }
962
     },
963
     "acce221590a84fe485e562cc8e4b8bb2": {
964
      "model_module": "@jupyter-widgets/base",
965
      "model_module_version": "2.0.0",
966
      "model_name": "LayoutModel",
967
      "state": {
968
       "grid_template_areas": "\n                                       \". . . . right \"\n                                        ",
969
       "grid_template_columns": "20% 20% 20% 20% 20%",
970
       "width": "100%"
971
      }
972
     },
973
     "b645ba3fb5a54cd38ef777530a32f160": {
974
      "model_module": "@jupyter-widgets/controls",
975
      "model_module_version": "2.0.0",
976
      "model_name": "HTMLModel",
977
      "state": {
978
       "layout": "IPY_MODEL_6901d98c37dd414a918fad31d6ec664e",
979
       "style": "IPY_MODEL_e4167e8bf5db43639de8052259390077",
980
       "value": "<p style='font-family: IBM Plex Sans, Arial, Helvetica, sans-serif; font-size: 20px; font-weight: medium;'>Circuit Properties</p>"
981
      }
982
     },
983
     "d28424781ca64f139fef57d2ebc26c95": {
984
      "model_module": "@jupyter-widgets/controls",
985
      "model_module_version": "2.0.0",
986
      "model_name": "HTMLStyleModel",
987
      "state": {
988
       "description_width": "",
989
       "font_size": null,
990
       "text_color": null
991
      }
992
     },
993
     "e4167e8bf5db43639de8052259390077": {
994
      "model_module": "@jupyter-widgets/controls",
995
      "model_module_version": "2.0.0",
996
      "model_name": "HTMLStyleModel",
997
      "state": {
998
       "description_width": "",
999
       "font_size": null,
1000
       "text_color": null
1001
      }
1002
     },
1003
     "f37ee516540f4a7f8f55f461382d4236": {
1004
      "model_module": "@jupyter-widgets/controls",
1005
      "model_module_version": "2.0.0",
1006
      "model_name": "ButtonStyleModel",
1007
      "state": {
1008
       "font_family": null,
1009
       "font_size": null,
1010
       "font_style": null,
1011
       "font_variant": null,
1012
       "font_weight": null,
1013
       "text_color": null,
1014
       "text_decoration": null
1015
      }
1016
     },
1017
     "f70ec821d24f46a9b6a491f26dfe317a": {
1018
      "model_module": "@jupyter-widgets/base",
1019
      "model_module_version": "2.0.0",
1020
      "model_name": "LayoutModel",
1021
      "state": {
1022
       "width": "145px"
1023
      }
1024
     },
1025
     "fd1035ffd0544addbc61bc26f9795e81": {
1026
      "model_module": "@jupyter-widgets/base",
1027
      "model_module_version": "2.0.0",
1028
      "model_name": "LayoutModel",
1029
      "state": {
1030
       "width": "95px"
1031
      }
1032
     },
1033
     "ff1ac22249024665aa3136985f58f27f": {
1034
      "model_module": "@jupyter-widgets/controls",
1035
      "model_module_version": "2.0.0",
1036
      "model_name": "GridBoxModel",
1037
      "state": {
1038
       "children": [
1039
        "IPY_MODEL_09a6e6ed5c084398858c5392b360efb2"
1040
       ],
1041
       "layout": "IPY_MODEL_acce221590a84fe485e562cc8e4b8bb2"
1042
      }
1043
     }
1044
    },
1045
    "version_major": 2,
1046
    "version_minor": 0
1047
   }
1048
  }
1049
 },
1050
 "nbformat": 4,
1051
 "nbformat_minor": 4
1052
}