diff --git a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb index 873f5985..b5c257bb 100644 --- a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb +++ b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb @@ -16,7 +16,54 @@ "cell_type": "markdown", "id": "4ea73db3", "metadata": {}, - "source": [] + "source": [ + "# Stage 0: Setup\n", + "p.d.DataFrame\n", + "\n", + "# Stage 1: Infect a random subset of people\n", + "Functions used: infected_indices = np.random.choice(ppl.index, size=int(len(ppl) * ATTACK_RATE), replace=False).\n", + "\n", + "Sampling procedure: Simple random sampling without replacement (Every person has an equal chance of being chosen and no person can be picked twice. This is unlike simple random sampling with replacement where the sampled unit is returned to the population.)\n", + "\n", + "Sample Size: 100 random individuals (10% attack rate).\n", + "\n", + "Sampling Frame: 1000 individuals (200 from wedding and 800 from brunch).\n", + "\n", + "Underlying Distribution: Binomial distribution. \n", + "\n", + "# Stage 2: Primary contact tracing - randomly decide which infected people get traced\n", + "Functions used: ppl.loc[ppl['infected'], 'traced'] = np.random.rand(sum(ppl['infected'])) < TRACE_SUCCESS\n", + "\n", + "Sampling procedure: From the 100 infected individuals from above, each is given a random number between 0 and 1, if the nnumber is below 0.20 they are marked as traced. (Independent Bernoulli trial per person).\n", + "\n", + "Sample Size: Around 20 individuals, each is traced with a proabaility of 0.20 (TRACE_SUCCESS).\n", + "\n", + "Sampling Frame: 100 infected individuals from the stage above. \n", + "\n", + "Underlying Distribution: Binomial distribution. \n", + "\n", + "# Stage 3: Secondary contact tracing based on event attendance\n", + "Functions used: events_traced = event_trace_counts[event_trace_counts >= SECONDARY_TRACE_THRESHOLD].index\n", + "\n", + "Sampling procedure: If 2 or more infected people from the same event were already traced in the stage above, everyone else infected at that event gets traced automatically. Not random as who gets traced can change after each run. \n", + "\n", + "Sample Size: Is variable, depends on the random outcomes from the two stages above.\n", + "\n", + "Sampling Frame: Infected individuals that are not traced who attend an event with more than 2 people traced in stage above. \n", + "\n", + "Underlying Distribution: No direct distribution.\n", + "\n", + "# Stage 4: Run the simulation 1000 times\n", + "Functions used: results = [simulate_event(m) for m in range(1000)]\n", + "\n", + "Sampling procedure: The above stages are repeated 1000 times, with a new random seed state which produces a distribution of outcomes from the infections and traces. \n", + "\n", + "Sample Size: 1000 replications.\n", + "\n", + "Sampling Frame: All possible simulation outcomes. \n", + "\n", + "Underlying Distribution: Normal distribution. " + ] }, { "cell_type": "markdown", @@ -30,7 +77,11 @@ "cell_type": "markdown", "id": "4cf5d993", "metadata": {}, - "source": [] + "source": [ + "10 repetitions: The histogram looks very different each time the code is run with completely different results. I would say the results are really unstable and not very reproducible as the shapes are uneven and there were some gaps in some runs. \n", + "\n", + "100 repetitions: The histogram looks more similiar in pattern to the 1000 repetitions but still shifts significantly each time it is run and still not as reproducible. It is not as consistent as 1000 repetitions but more consistent than 10 repetitions. " + ] }, { "cell_type": "markdown", @@ -44,7 +95,18 @@ "cell_type": "markdown", "id": "77613cc3", "metadata": {}, - "source": [] + "source": [ + "One way to make the simulation reproducible is to set a random seed before running the simulation. \n", + "For example np.random.seed(123).\n", + "\n", + "Run the simulation 1000 times\n", + "\n", + "np.random.seed(123) # ADDED LINE \n", + "results = [simulate_event(m) for m in range(100)]\n", + "props_df = pd.DataFrame(results, columns=[\"Infections\", \"Traces\"])\n", + "\n", + "If you do not set a random seed, the code will generate a sequence of random numbers each time the script runs which will results in the histogram looking slightly different each time it is run. By setting a random seed, the simulation is forced to follow the excat same random number sequence each time the script is run resulting in a code that is reproducible. " + ] }, { "cell_type": "markdown", @@ -56,10 +118,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "ab8587a0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAax5JREFUeJzt3Xt8j/X/x/HnZ+d9dsKwOR+HCckhoWxLCPmKSuVMfXPoYFHkq7JUSJG+FZ0d8nVISToQXyEa5VwxhyRTtjTHMRvb3r8//Pb5+tjGNp/Lx9bjfrt9bjfX+3p/rut1fa5rlz13Xdf7YzPGGAEAAAAAAJfzcHcBAAAAAACUVIRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4ABTJz5kzZbDZt2rTJ3aVcsZ07dyouLk6//faby5e9cuVKNWvWTAEBAbLZbFq8ePEl+//555966qmn1LBhQwUGBsrPz08REREaNmyY9u7d6/L6LjR+/PjL1nc119O/f3/ZbLbLvvr37295zZJks9kUFxd3VdblDr/99pvT5+rh4aHQ0FB16tRJ69evd3d5+YqLi5PNZnPLuqOjoxUdHX3ZftWrV8/3+D116pSk/51TXXkeql69uu64444iv//1119X7dq15ePjI5vNpuPHj7usNunS597+/furevXqLl1fQR05ckSjR49W/fr1FRAQoJCQENWrV099+vTRjz/+6JaaAJQsXu4uAACutp07d+q5555TdHS0S3/JM8aoR48eqlOnjpYsWaKAgADVrVs33/4//PCD7rjjDhlj9Mgjj6hly5by8fHR7t27NWfOHN144406duyYy+q72Pjx43X33XfrzjvvtGwdhVnPM888o8GDBzumt2zZoocffljjx49XTEyMo71cuXJWlepk/fr1qly58lVZlzs9+uij6tmzp7KysrRjxw4999xziomJ0fr163XDDTe4u7xcHnzwQd1+++3uLuOyWrdurVdeeSVXu91ud0M1l7dt2zY99thjevDBB9WvXz95eXkpKCjIpeu41Ln3mWee0bBhw1y6voI4deqUbrrpJp06dUpPPvmkrr/+ep05c0Z79uzRokWLtG3bNjVq1Oiq1wWgZCF0A4CLHDp0SEePHlW3bt3Utm3bS/Y9efKkunbtKj8/P8XHxzuFu+joaA0aNEgff/yx1SVfU2rVqqVatWo5ptPT0yVJERERuummm/J935kzZ+Tn5+fyq5+XWmdJUrVqVce2tm7dWrVr11bbtm01bdo0vfvuu1e07LS0NJeHzMqVKxeLP4aUKlWqWB1DO3bskCT985//1I033njV13/hz/7VtHDhQv3yyy/65ptvnP64J0nDhw9Xdnb2Va/pzJkz8vf3v+rrBWAdbi8HUGT9+/dXYGCgdu3apQ4dOiggIEAVKlTQxIkTJUkbNmzQzTffrICAANWpU0ezZs1yen/O7ZUrVqzQgAEDVKZMGQUEBKhLly769ddfnfquWLFCXbt2VeXKleXn56fatWtr0KBBSklJyVXXrl27dP/99yssLEy+vr6qWrWq+vbtq4yMDM2cOVP33HOPJCkmJsZxy+fMmTMvua3r1q1T27ZtFRQUJLvdrlatWunLL790zI+Li3MEgVGjRslms13yKvq7776r5ORkTZo0Kd8AcffddztNL1myRC1btpTdbldQUJDatWuX6zbgnFtvd+zYofvvv18hISEKCwvTwIEDdeLECUc/m82m06dPa9asWY7PIOe22b/++ktDhw5V/fr1FRgYqPLly+vWW2/V2rVrc9WYkZGhcePGKTIyUn5+fgoNDVVMTIzi4+Mvu56iyDlmli9froEDB6pcuXKy2+3KyMjQL7/8ogEDBigiIkJ2u12VKlVSly5d9NNPP+VazvHjxzVixAjVrFlTvr6+Kl++vDp16qRdu3Y5fUYX3l6es+5Vq1ZpyJAhKlu2rEJDQ9W9e3cdOnQo1+cyYsQIhYeHy263q02bNtq8ebOqV69eoNvjjx49qqFDh6pSpUry8fFRzZo1NWbMGGVkZDj1s9lseuSRR/Thhx8qMjJSdrtd119/vb744ovCfbAXyAmKBw4ccLT997//Vdu2bRUcHCy73a7WrVtr5cqVTu/LOfa2bNmiu+++W6VLl3YEqezsbL3++utq3Lix/P39HYF0yZIlTstYsGCBWrZsqYCAAAUGBqpDhw7aunVrnuvJceedd6patWp5hqMWLVqoSZMmjmljjKZNm+aoo3Tp0rr77rtznW+MMZo0aZKqVasmPz8/NWnSREuXLi3Mx1gk+R0fBb2t/WI5jxC88sormjJlimrUqKHAwEC1bNlSGzZscFp+7969JZ3/zC5+jKMg+1+6snNvXreXp6ena/To0apRo4Z8fHxUqVIlPfzww7lue8+5rX7ZsmVq0qSJ/P39Va9ePX3wwQeX/YyOHDkiSapQoUKe8z08nH9Vvtz/BVL+j0Dk9UhBTu2LFi3SDTfcID8/Pz333HOSpD/++EMPPfSQqlSpIh8fH1WsWFF33323/vzzT8f7T548qSeeeMLpM4qNjdXp06ed1r1w4UK1aNFCISEhstvtqlmzpgYOHHjZzweAaxC6AVyRc+fOqXv37urcubM+++wzdezYUaNHj9a//vUv9evXTwMHDtSnn36qunXrqn///tq8eXOuZTzwwAPy8PDQ3LlzNXXqVP3www+Kjo52+sVq3759atmypaZPn67ly5fr2Wef1ffff6+bb75Z586dc/Tbvn27mjdvrg0bNmjcuHFaunSpJkyYoIyMDJ09e1adO3fW+PHjJUlvvvmm1q9fr/Xr16tz5875buOaNWt066236sSJE3r//fc1b948BQUFqUuXLlqwYIGk87e8Llq0SNL523XXr1+vTz/9NN9lLl++XJ6enurSpUuBPue5c+eqa9euCg4O1rx58/T+++/r2LFjio6O1rp163L1v+uuu1SnTh198skneuqppzR37lw9/vjjjvnr16+Xv7+/4/nd9evXa9q0aZLOBz5JGjt2rL788kvNmDFDNWvWVHR0tFavXu1YRmZmpjp27Kjnn39ed9xxhz799FPNnDlTrVq1UmJi4mXXcyUGDhwob29vffjhh/r444/l7e2tQ4cOKTQ0VBMnTtSyZcv05ptvysvLSy1atNDu3bsd701NTdXNN9+st99+WwMGDNDnn3+ut956S3Xq1FFSUtJl1/3ggw/K29tbc+fO1aRJk7R69WpHYMkxYMAATZ06VQMGDNBnn32mu+66S926dSvQM7Lp6emKiYnR7NmzNXz4cH355Zfq3bu3Jk2apO7du+fq/+WXX+qNN97QuHHj9Mknn6hMmTLq1q1briBZUL/88ouk/93GP2fOHLVv317BwcGaNWuWPvroI5UpU0YdOnTIM3h1795dtWvX1sKFC/XWW29JOh+ohg0bpubNm2vBggWaP3++/vGPfziFj/Hjx+v+++9X/fr19dFHH+nDDz9UamqqbrnlFu3cuTPfegcOHKjExER98803Tu27du3SDz/8oAEDBjjaBg0apNjYWN12221avHixpk2bph07dqhVq1ZOQea5557TqFGj1K5dOy1evFhDhgzRP//5T6fj6HKMMcrMzHR6ueOqqXT+XLdixQpNnTpV//nPf3T69Gl16tTJ8Ye4adOm6emnn5YkzZgxQ+vXr9czzzwjqeD739XnXmOM7rzzTr3yyivq06ePvvzySw0fPlyzZs3SrbfemusPUNu3b9eIESP0+OOP67PPPlOjRo30wAMP6Ntvv73kZ9OyZUtJUt++fbV48WJHCM9LQf4vKIotW7boySef1GOPPaZly5bprrvu0h9//KHmzZvr008/1fDhw7V06VJNnTpVISEhjseO0tLSFBUVpVmzZumxxx7T0qVLNWrUKM2cOVP/+Mc/ZIyRdP48fO+996pmzZqaP3++vvzySz377LPKzMwscs0ACskAQAHMmDHDSDIbN250tPXr189IMp988omj7dy5c6ZcuXJGktmyZYuj/ciRI8bT09MMHz481zK7devmtK7vvvvOSDIvvPBCnrVkZ2ebc+fOmQMHDhhJ5rPPPnPMu/XWW02pUqXM4cOH892WhQsXGklm1apVBdr2m266yZQvX96kpqY62jIzM02DBg1M5cqVTXZ2tjHGmP379xtJ5uWXX77sMuvVq2fCw8MLtP6srCxTsWJF07BhQ5OVleVoT01NNeXLlzetWrVytI0dO9ZIMpMmTXJaxtChQ42fn5+jVmOMCQgIMP369bvs+jMzM825c+dM27ZtnfbV7NmzjSTz7rvvXvL9BV3PxVatWmUkmYULFzraco6Zvn37Fqjus2fPmoiICPP444872seNG2ckmRUrVlzy/ZLM2LFjc6176NChTv0mTZpkJJmkpCRjjDE7duwwksyoUaOc+s2bN89Iuuxn8dZbbxlJ5qOPPnJqf+mll4wks3z5cqcaw8LCzMmTJx1tycnJxsPDw0yYMOGS68k5Xl966SVz7tw5k56ebjZv3myaN29uJJkvv/zSnD592pQpU8Z06dLF6b1ZWVnm+uuvNzfeeKOjLefYe/bZZ536fvvtt0aSGTNmTL61JCYmGi8vL/Poo486taempprw8HDTo0ePXOvJce7cORMWFmZ69uzp9N6RI0caHx8fk5KSYowxZv369UaSmTx5slO/gwcPGn9/fzNy5EhjjDHHjh0zfn5++Z6XoqKi8t2OHNWqVTOScr0u/Axyjqf9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0XpzfiG5+Bflt99+22na399fUVFRWrhwYb6/3Fy4nIJcAQkICFCLFi20aNEip/7Z2dmaM2eOKleunOu2wIJ44IEHFB4erpEjR+Z7q1/OwGx169ZVpUqVNHfuXMfAONL52x0/+eQTx4jmhZXfVSCbzZbrs/7xxx9zjZTesWNHpaenX3bk98JcbboSedX95Zdf5vp8O3bsqD179uQaeMtV2rRpI0m5Blb6+OOPCzRwUdu2bXXq1CktXrzYqX327NmO+VdL69atVapUKe3cuVPNmjXL8+Xj43PJZXTs2FGScv0R50IdOnSQl5eX9u3bl+96LmfAgAH6/vvvtW7dOn3++efq16+f0y3Vd9xxh4wx+uOPP/JcfsOGDSWdH73dz88v3/OSlapXr64ff/zRqW3Pnj2WP8KSn4LufyvOvTnH+Zw5c5zaP/nkE50+fdplPwd//vlnngPcZWVlae/evbLb7SpVqlSh/i/I+cPMxfvy888/L3BdHTt21KpVqy657++44w7t27dPoaGhee6bvP5A5Ovrq6ioKL300kuSlOvbAQBYgyvdANxu06ZNevDBB3XPPffo4MGDGjNmjCpVquR4/rFevXqqVauWnnrqKRljVKZMGX3++edasWJFrmVNmTJFN998s1q0aKGnnnpKtWvX1p9//qklS5bo7bffVlBQkBo0aCBJeueddxQUFCQ/Pz/VqFEj31t/J0yYoHbt2ikmJkZPPPGEfHx8NG3aNP3888+aN29ekb4fOiQkRJ999pnuuOMO3XDDDXrkkUfUsmVLxzPIc+bM0fbt29W9e3d5eHho0qRJ6tWrl+644w4NGjRIGRkZevnll3X8+HHHV7QVVsOGDbV69Wp9/vnnqlChgoKCglS3bl3dcccdev755zV27FhFRUVp9+7dGjdunGrUqOEUGu+//37NmDFDgwcP1u7duxUTE6Ps7Gx9//33ioyMdFzBz289rnbHHXdo5syZqlevnho1aqTNmzfr5ZdfznWLZmxsrBYsWKCuXbvqqaee0o033qgzZ85ozZo1uuOOO3J9V29hXXfddbr//vs1efJkeXp66tZbb9WOHTs0efJkhYSEXPaugL59++rNN99Uv3799Ntvv6lhw4Zat26dxo8fr06dOhX5WfSiCAwM1Ouvv65+/frp6NGjuvvuu1W+fHn99ddf2r59u/76669LhmlJuuWW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4eGKi4tzzK9evbo++eQTzZ49WzabTf3795cknThxQg899JDKly+v4OBg3Xrrrdq+fbvTspcsWaJmzZrJz89PZcuWVffu3R3rPHDggB5//HHZbDbHQFgzZ85UqVKlnJYxffp01apVSz4+Pqpbt67TlV3p/CBa7733nrp16ya73a6IiAgtWbLEMf/YsWPq1auXypUrJ39/f0VERGjGjBl5fhb9+/fXo48+qsTERNlsNlWvXt1R7yOPPKLhw4erbNmyateunSRpzZo1uvHGG+Xr66sKFSroqaeeUmZmptNn++ijjyo2NlalS5dWWFiY3nnnHZ0+fVoDBgxQUFCQatWqpaVLl+a7f26++WZ5e3tr9erVjrbVq1fr4YcfVmpqqn755Ren9piYmALvn4kTJyosLExBQUF64IEHlJ6e7jQ/KytLw4cPV6lSpRQaGqqRI0fq4i8siI6OdrpboXr16ho/frwGDhyooKAgVa1aVe+8847Te+Lj49W4cWP5+fmpWbNmWrx4sWw2m+O29sLsMwAAAKAkI3SXELNmzVJAQIC+//57TZo0SePGjdOKFSskSRs3btTtt9+uHj16KCkpSa+99pqMMercubOSk5P11VdfafPmzWrSpInatm2ro0ePSpK+/PJLde/eXZ07d9bWrVu1cuVKNWvWTNL5W5IrV66scePGKSkpSUlJSXnW9emnn2rYsGEaMWKEfv75Zw0aNEgDBgzIdYX3ueeeU48ePfTjjz+qU6dO6tWrl6OOZ555Rjt37tTSpUuVkJCg6dOn53vL+GuvvaZx48apcuXKSkpK0saNG50+Iy8vL3333Xd6++239ccff6hTp05q3ry5tm/frunTp+v999/XCy+8kOuzLVu2rH744Qc9+uijGjJkiO655x61atVKW7ZsUYcOHdSnTx+lpeX9OEJAQICaN2/utM1r1qxR27Zt1bp1a0f7wYMH9euvvyomJqZA++ejjz7S2LFj9eKLL2rTpk2qUKGCpk2b5rTuyZMn64MPPtD777+vdevW6ejRo/r000/zrPPi9zVr1kxbt27V0KFDNWTIEO3atUuSlJqaqi5duqhhw4basmWLnn/+eY0aNcrp/YXZZwAAAECJZkq4EydOGEnmxIkTueadOXPG7Ny505w5c8apffPmzUaSadp0s4mONpa+mjY9v67NmzcXeJv69etnunbt6piOiooyN998s1Of5s2bm1GjRjmmu3btavr16+eYXrlypQkODjbp6elO76tVq5Z5++23jTHGtGzZ0vTq1SvfOqpVq2ZeffVVp7YZM2aYkJAQx3SrVq3MP//5T6c+99xzj+nUqZNjWpJ5+umnHdOnTp0yNpvNLF261BhjTJcuXcyAAQPyreNir776qqlWrZpTW1RUlGncuLFT27/+9S9Tt25dk52d7Wh78803TWBgoMnKynK878LPNjMz0wQEBJg+ffo42pKSkowks379+nxr+te//mXq1KljjDFmx44dJjg42GRmZpqJEyeanj17GmOMmTVrlvH19TVpaWkF3j+DBw92mt+iRQtz/fXXO6YrVKhgJk6c6Jg+d+6cqVy5cq7jZ9iwYY7patWqmd69ezums7OzTfny5c306dONMcZMnz7dhIaGOv3cvPvuu0aS2bp1qzGm8Pssv59FAAAA4Fp1qax5Ia50lxCNGjVymq5QoYIOHz6cb//Nmzfr1KlTCg0NVWBgoOO1f/9+7du3T5K0bds2tW3b9orqSkhIUOvWrZ3aWrdu7TSo2MX1BwQEKCgoyFH/kCFDNH/+fDVu3FgjR45UfHx8kWrJuUp/YW0tW7Z0+o7o1q1b69SpU/r999/zrM3T01OhoaFq2LChoy0sLEySLvl5x8TEaM+ePTp06JBWr16tm2++WZ6enoqKinLcdr569WrddNNN8vf3L9D+yan/QhdOnzhxQklJSU5tXl5euT6HvFy4zTabTeHh4Y7t2717txo1aiQ/Pz9HnxtvvNHp/a7aZwAAAEBxx0BqJcTFo0/bbDZlZ2fn2z87O1sVKlRwes44R84z2a4aEO3CUCud/0qvi9suVX/Hjh114MABffnll/rvf/+rtm3b6uGHH9Yrr7xSqDoCAgIuW4f5/+edL2zPq7YL23L6Xurzbt26tXx8fLR69WqtWrVKUVFRks7/IeDEiRPas2ePVq1a5XjeviD7x0qX2h+X+txyuGqfAQAAAMUdV7r/ppo0aaLk5GR5eXmpdu3aTq+cZ28bNWqklStX5rsMHx8fZWVlXXI9kZGRWrdunVNbfHy8IiMLN4BcuXLl1L9/f82ZM0dTp07NNbBXUdSvX1/x8fFOgTE+Pl5BQUGqVKnSFS//Qv7+/mrRooVWr16tb7/9VtHR0ZLOX3lu1aqVZs+erd9++80xiFpB9k9kZKQ2bNjgtJ4Lp0NCQlShQgWntszMTG3evPmKtqVevXr68ccflZGR4WjbtGlTrn5W7DMAAACguCF0/03ddtttatmype688059/fXX+u233xQfH6+nn37aEaDGjh2refPmaezYsUpISNBPP/2kSZMmOZZRvXp1ffvtt/rjjz+UkpKS53qefPJJzZw5U2+99Zb27t2rKVOmaNGiRXriiScKXOuzzz6rzz77TL/88ot27NihL774otChPS9Dhw7VwYMH9eijj2rXrl367LPPNHbsWA0fPlweHq7/0YiJidH8+fN15swZNWnSxNEeFRWlf//7345gLhVs/wwbNkwffPCBPvjgA+3Zs0djx47Vjh07nNY5bNgwTZw4UZ9++ql27dqloUOH6vjx41e0HT179lR2drYeeughJSQk6Ouvv3Zcwc65Am7VPgMAAACKG24vv4S0tITLdyoG68iLzWbTV199pTFjxmjgwIH666+/FB4erjZt2jieUY6OjtbChQv1/PPPa+LEiQoODlabNm0cyxg3bpwGDRqkWrVqKSMjI9ctxpJ055136rXXXtPLL7+sxx57TDVq1NCMGTMcV3oLwsfHR6NHj9Zvv/0mf39/3XLLLZo/f/4VfwaVKlXSV199pSeffFLXX3+9ypQpowceeEBPP/30FS87LzExMRo3bpxuv/12eXn970cvKipKTz/9tNq2bStfX19JBds/9957r/bt26dRo0YpPT1dd911l4YMGaKvv/7asewRI0YoKSlJ/fv3l4eHhwYOHKhu3brpxIkTRd6O4OBgff755xoyZIgaN26shg0b6tlnn1XPnj0dz3lbtc8AANeWxMTEfP/wDlysbNmyqlq1qrvLAK46m8krKZUgJ0+eVEhIiE6cOKHg4GCneenp6dq/f79q1KjhNChUYmKi6taNVHp63l8B5Wp+fnbt3p3ASQjF1n/+8x8NGDBAJ06cKNJYAPn9LAIArl1X+/clFH/8zouS5lJZ80Jc6c5D1apVtXt3wlX7yy1/9UNxM3v2bNWsWVOVKlXS9u3bNWrUKPXo0cNlg+8BAK59KSkpSk9PU2TkHNntPEKES0tLS1BCQm+lpKTwey/+dgjd+ahatSonBCAfycnJevbZZ5WcnKwKFSronnvu0YsvvujusgAAbmC3RyooqMnlOwLA3xShG0ChjRw5UiNHjnR3GQAAAMA1j9HLAQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAi/CVYflITExUSkrKVVlX2bJlS+R3gvfv31/Hjx/X4sWL3V2KyxRkm6Kjo9W4cWNNnTpVklS9enXFxsYqNjb2qtQIAAAA4NpB6M5DYmKiIuvWVVp6+lVZn93PTwm7dxcoeNtstkvO79evn2bOnOmiyqw1c+ZMxcbG6vjx41e0nPvuu08nTpzQ0qVLHW1Lly5Vp06d9PTTT+v55593tD///POaPn26Dh06dEXrLIyNGzcqICDgqq0PAAAAwLWD0J2HlJQUpaWna05kpCLtdkvXlZCWpt4JCUpJSSlQ6E5KSnL8e8GCBXr22We1e/duR5u/v79T/3Pnzsnb29t1BV+DYmJi9MQTTygzM1NeXucP6dWrV6tKlSpatWqVU9/Vq1crJibmqtZXrly5q7o+AAAAANcOnum+hEi7XU2Cgix9FTbUh4eHO14hISGy2WyO6fT0dJUqVUofffSRoqOj5efnpzlz5ujIkSO6//77VblyZdntdjVs2FDz5s1zWm52drZeeukl1a5dW76+vqpatapefPFFx/w//vhD9957r0qXLq3Q0FB17dpVv/32m2N+VlaWhg8frlKlSik0NFQjR46UMSbf7Vi9erUGDBigEydOyGazyWazKS4uTpJ07Ngx9e3bV6VLl5bdblfHjh21d+/efJcVExOjU6dOadOmTU7Lf+qpp7Rx40alpaVJks6ePav169c7Qrcrtun06dPq27evAgMDVaFCBU2ePDlXfdWrV3fcai6dv1vhvffeU7du3WS32xUREaElS5Y4vWfJkiWKiIiQv7+/YmJiNGvWLNlsNsddAQcOHFCXLl1UunRpBQQE6LrrrtNXX32V72cEAAAAwD0I3SXQqFGj9NhjjykhIUEdOnRQenq6mjZtqi+++EI///yzHnroIfXp00fff/+94z2jR4/WSy+9pGeeeUY7d+7U3LlzFRYWJklKS0tTTEyMAgMD9e2332rdunUKDAzU7bffrrNnz0qSJk+erA8++EDvv/++1q1bp6NHj+rTTz/Nt8ZWrVpp6tSpCg4OVlJSkpKSkvTEE09IOv/c9KZNm7RkyRKtX79exhh16tRJ586dy3NZderUUcWKFR1XtVNTU7Vlyxbdc889qlWrlr777jtJ0oYNG3TmzBnFxMS4bJuefPJJrVq1Sp9++qmWL1+u1atXa/PmzZfdR88995x69OihH3/8UZ06dVKvXr109OhRSdJvv/2mu+++W3feeae2bdumQYMGacyYMU7vf/jhh5WRkaFvv/1WP/30k1566SUFBgZedr0AAAAAri5uLy+BYmNj1b17d6e2nEArSY8++qiWLVumhQsXqkWLFkpNTdVrr72mN954Q/369ZMk1apVSzfffLMkaf78+fLw8NB7773neKZ8xowZKlWqlFavXq327dtr6tSpGj16tO666y5J0ltvvaWvv/463xp9fHycrtTn2Lt3r5YsWaLvvvtOrVq1kiT95z//UZUqVbR48WLdc889eS4vOjpaq1ev1ujRo7V27VrVqVNH5cqVU1RUlFavXq127do5bjmvVauWPvjggyveplOnTun999/X7Nmz1a5dO0nSrFmzVLly5cvtIvXv31/333+/JGn8+PF6/fXX9cMPP+j222/XW2+9pbp16+rll1+WJNWtW1c///yz050HiYmJuuuuu9SwYUNJUs2aNS+7TgAAAABXH6G7BGrWrJnTdFZWliZOnKgFCxbojz/+UEZGhjIyMhyDeyUkJCgjI0Nt27bNc3mbN2/WL7/8oqCgIKf29PR07du3TydOnFBSUpJatmzpmOfl5aVmzZpd8hbzvCQkJMjLy0stWrRwtIWGhqpu3bpKSEjI930xMTGKjY3VuXPntHr1akVHR0uSoqKi9Prrr0s6f8v5rbfe6rJt2rdvn86ePevUp0yZMqpbt+5lt7NRo0aOfwcEBCgoKEiHDx+WJO3evVvNmzd36n/jjTc6TT/22GMaMmSIli9frttuu0133XWX0zIBAAAAXBsI3SXQxSNlT548Wa+++qqmTp2qhg0bKiAgQLGxsY7bqC8efO1i2dnZatq0qf7zn//kmufqQcLyC+nGmEuO3B4TE6PTp09r48aNWrVqlZ588klJ50N33759dfToUa1fv95xJd8V21TYPyhc6OLB7Ww2m7Kzsx3LvXhbL17Xgw8+qA4dOujLL7/U8uXLNWHCBE2ePFmPPvpokWsCAAAA4Ho80/03sHbtWnXt2lW9e/fW9ddfr5o1azoNTJYzYNfKlSvzfH+TJk20d+9elS9fXrVr13Z6hYSEKCQkRBUqVNCGDRsc78nMzLzss80+Pj7Kyspyaqtfv74yMzOdnjc/cuSI9uzZo8jIyHyXVatWLVWpUkVLlizRtm3bFBUVJUmqUKGCqlevrsmTJys9Pd0xiJortql27dry9vZ26nPs2DHt2bPnktt9OfXq1dPGjRud2i4cJC5HlSpVNHjwYC1atEgjRozQu+++e0XrBQAAAOB6hO6/gdq1a2vFihWKj49XQkKCBg0apOTkZMd8Pz8/jRo1SiNHjtTs2bO1b98+bdiwQe+//74kqVevXipbtqy6du2qtWvXav/+/VqzZo2GDRum33//XZI0bNgwTZw4UZ9++ql27dqloUOHXvb7t6tXr65Tp05p5cqV57+mLS1NERER6tq1q/75z39q3bp12r59u3r37q1KlSqpa9eul1xeTEyMpk2bptq1azsGgZP+d4t5zZo1HV/L5optCgwM1AMPPKAnn3xSK1eu1M8//6z+/fvLw+PKfqwGDRqkXbt2adSoUdqzZ48++ugjx3ev51wBj42N1ddff639+/dry5Yt+uabby75RwkAAAAA7sHt5ZeQ8P9fNVXc1/HMM89o//796tChg+x2ux566CHdeeedOnHihFMfLy8vPfvsszp06JAqVKigwYMHS5Lsdru+/fZbjRo1St27d1dqaqoqVaqktm3bKjg4WJI0YsQIJSUlOULnwIED1a1bN6d1XKxVq1YaPHiw7r33Xh05ckRjx45VXFycZsyYoWHDhumOO+7Q2bNn1aZNG3311VeX/b7xmJgYzZ492/E8d46oqCi999576tGjh6PNVdv08ssv69SpU/rHP/6hoKAgjRgx4pLbXBA1atTQxx9/rBEjRui1115Ty5YtNWbMGA0ZMkS+vr6Szj+n//DDD+v3339XcHCwbr/9dr366qtXtF4AAAAArmczV/JgajFw8uRJhYSE6MSJE44wlSM9PV379+9XjRo15Ofn52hPTExUZN26SktPvyo12v38lLB7t+MqLHCxF198UW+99ZYOHjzo7lIskd/PIgDg2rVlyxY1bdpUTZtuVlBQE3eXg2tcauoWbd7cVJs3b1aTJhwvKBkulTUvxJXuPFStWlUJu3crJSXlqqyvbNmyBG44mTZtmpo3b67Q0FB99913evnll/XII4+4uywAAAAAhUTozkfVqlUJwnCbvXv36oUXXtDRo0dVtWpVjRgxQqNHj3Z3WQAAAAAKidANXINeffVVntEGAAAASgBGLwcAAAAAwCKEbgAAAAAALELolpSdne3uEoC/NX4GAQAAUFL9rZ/p9vHxkYeHhw4dOqRy5crJx8dHNpvN3WUBfxvGGJ09e1Z//fWXPDw85OPj4+6SAAAAAJf6W4duDw8P1ahRQ0lJSTp06JC7ywH+tux2u6pWrSoPD26+AQAAQMnytw7d0vmr3VWrVlVmZqaysrLcXQ7wt+Pp6SkvLy/uMgEAAECJ9LcP3ZJks9nk7e0tb29vd5cCAAAAAChBuJcTAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALCIl7sLAAAAKKkSExOVkpLi7jIskZCQIElKS0twcyUoKm/vsvLzq+ruMoASj9ANAABggcTEREXWrau09HR3l2KphITe7i4BReTl4admN+4meAMWI3QDAABYICUlRWnp6ZoTGalIu93d5bjc6bQ07UxIUIB/pDw8S972lXT7s9P0dFqCzp1LIXQDFiN0AwAAWCjSbleToCB3l+FyqZIyJQV52uXpVfK2r8TLdHcBwN8HA6kBAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABa5ZkL3hAkTZLPZFBsb62gzxiguLk4VK1aUv7+/oqOjtWPHDvcVCQAAAABAIVwToXvjxo1655131KhRI6f2SZMmacqUKXrjjTe0ceNGhYeHq127dkpNTXVTpQAAAAAAFJzbQ/epU6fUq1cvvfvuuypdurSj3RijqVOnasyYMerevbsaNGigWbNmKS0tTXPnznVjxQAAAAAAFIzbQ/fDDz+szp0767bbbnNq379/v5KTk9W+fXtHm6+vr6KiohQfH3+1ywQAAAAAoNC83Lny+fPna8uWLdq4cWOuecnJyZKksLAwp/awsDAdOHAg32VmZGQoIyPDMX3y5EkXVQsAAAAAQOG47Ur3wYMHNWzYMM2ZM0d+fn759rPZbE7TxphcbReaMGGCQkJCHK8qVaq4rGYAAAAAAArDbaF78+bNOnz4sJo2bSovLy95eXlpzZo1+ve//y0vLy/HFe6cK945Dh8+nOvq94VGjx6tEydOOF4HDx60dDsAAAAAAMiP224vb9u2rX766SentgEDBqhevXoaNWqUatasqfDwcK1YsUI33HCDJOns2bNas2aNXnrppXyX6+vrK19fX0trBwAAAACgINwWuoOCgtSgQQOntoCAAIWGhjraY2NjNX78eEVERCgiIkLjx4+X3W5Xz5493VEyAAAAAACF4taB1C5n5MiROnPmjIYOHapjx46pRYsWWr58uYKCgtxdGgAAAAAAl3VNhe7Vq1c7TdtsNsXFxSkuLs4t9QAAAAAAcCXc/j3dAAAAAACUVIRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALOLW0D19+nQ1atRIwcHBCg4OVsuWLbV06VLHfGOM4uLiVLFiRfn7+ys6Olo7duxwY8UAAAAAABScW0N35cqVNXHiRG3atEmbNm3Srbfeqq5duzqC9aRJkzRlyhS98cYb2rhxo8LDw9WuXTulpqa6s2wAAAAAAArEraG7S5cu6tSpk+rUqaM6deroxRdfVGBgoDZs2CBjjKZOnaoxY8aoe/fuatCggWbNmqW0tDTNnTvXnWUDAAAAAFAg18wz3VlZWZo/f75Onz6tli1bav/+/UpOTlb79u0dfXx9fRUVFaX4+Ph8l5ORkaGTJ086vQAAAAAAcAe3h+6ffvpJgYGB8vX11eDBg/Xpp5+qfv36Sk5OliSFhYU59Q8LC3PMy8uECRMUEhLieFWpUsXS+gEAAAAAyI/bQ3fdunW1bds2bdiwQUOGDFG/fv20c+dOx3ybzebU3xiTq+1Co0eP1okTJxyvgwcPWlY7AAAAAACX4uXuAnx8fFS7dm1JUrNmzbRx40a99tprGjVqlCQpOTlZFSpUcPQ/fPhwrqvfF/L19ZWvr6+1RQMAAAAAUABuv9J9MWOMMjIyVKNGDYWHh2vFihWOeWfPntWaNWvUqlUrN1YIAAAAAEDBuPVK97/+9S917NhRVapUUWpqqubPn6/Vq1dr2bJlstlsio2N1fjx4xUREaGIiAiNHz9edrtdPXv2dGfZAAAAAAAUiFtD959//qk+ffooKSlJISEhatSokZYtW6Z27dpJkkaOHKkzZ85o6NChOnbsmFq0aKHly5crKCjInWUDAAAAAFAgbg3d77///iXn22w2xcXFKS4u7uoUBAAAAACAC11zz3QDAAAAAFBSELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALBIkUL3/v37XV0HAAAAAAAlTpFCd+3atRUTE6M5c+YoPT3d1TUBAAAAAFAiFCl0b9++XTfccINGjBih8PBwDRo0SD/88IOrawMAAAAAoFgrUuhu0KCBpkyZoj/++EMzZsxQcnKybr75Zl133XWaMmWK/vrrL1fXCQAAAABAsXNFA6l5eXmpW7du+uijj/TSSy9p3759euKJJ1S5cmX17dtXSUlJrqoTAAAAAIBi54pC96ZNmzR06FBVqFBBU6ZM0RNPPKF9+/bpm2++0R9//KGuXbu6qk4AAAAAAIodr6K8acqUKZoxY4Z2796tTp06afbs2erUqZM8PM5n+Bo1aujtt99WvXr1XFosAAAAAADFSZFC9/Tp0zVw4EANGDBA4eHhefapWrWq3n///SsqDgAAAACA4qxIoXvv3r2X7ePj46N+/foVZfEAAAAAAJQIRXqme8aMGVq4cGGu9oULF2rWrFlXXBQAAAAAACVBkUL3xIkTVbZs2Vzt5cuX1/jx46+4KAAAAAAASoIihe4DBw6oRo0audqrVaumxMTEKy4KAAAAAICSoEihu3z58vrxxx9ztW/fvl2hoaFXXBQAAAAAACVBkUL3fffdp8cee0yrVq1SVlaWsrKy9M0332jYsGG67777XF0jAAAAAADFUpFGL3/hhRd04MABtW3bVl5e5xeRnZ2tvn378kw3AAAAAAD/r0ih28fHRwsWLNDzzz+v7du3y9/fXw0bNlS1atVcXR8AAAAAAMVWkUJ3jjp16qhOnTquqgUAAAAAgBKlSKE7KytLM2fO1MqVK3X48GFlZ2c7zf/mm29cUhwAAAAAAMVZkUL3sGHDNHPmTHXu3FkNGjSQzWZzdV0AAAAAABR7RQrd8+fP10cffaROnTq5uh4AAAAAAEqMIn1lmI+Pj2rXru3qWgAAAAAAKFGKFLpHjBih1157TcYYV9cDAAAAAECJUaTby9etW6dVq1Zp6dKluu666+Tt7e00f9GiRS4pDgAAAACA4qxIobtUqVLq1q2bq2sBAAAAAKBEKVLonjFjhqvrAAAAAHCVpaUlXNX1JCRcnfWh+CtbtqyqVq3q7jJcokihW5IyMzO1evVq7du3Tz179lRQUJAOHTqk4OBgBQYGurJGAAAAAC6Ukn1WHpISEnpf1fX27n1114fiy+7np4Tdu0tE8C5S6D5w4IBuv/12JSYmKiMjQ+3atVNQUJAmTZqk9PR0vfXWW66uEwAAAICLpJpMZUsa51tdtbxDLV9fdlaaTp9JUP3ISAXY7ZavD8VbQlqaeickKCUl5e8buocNG6ZmzZpp+/btCg393w9pt27d9OCDD7qsOAAAAADWqeHhr0ivIMvXkyUpVVJju11BQdavD7iWFHn08u+++04+Pj5O7dWqVdMff/zhksIAAAAAACjuivQ93dnZ2crKysrV/vvvv/OXKwAAAAAA/l+RQne7du00depUx7TNZtOpU6c0duxYderUyVW1AQAAAABQrBXp9vJXX31VMTExql+/vtLT09WzZ0/t3btXZcuW1bx581xdIwAAAAAAxVKRQnfFihW1bds2zZs3T1u2bFF2drYeeOAB9erVS/7+/q6uEQAAAACAYqnI39Pt7++vgQMHauDAga6sBwAAAACAEqNIoXv27NmXnN+3b98iFQMAAAAAQElS5O/pvtC5c+eUlpYmHx8f2e12QjcAAMVYYmKiUlJS3F1GsZeQkCBJOp2WplQ312KF02lp7i4BAIqFIoXuY8eO5Wrbu3evhgwZoieffPKKiwIAAO6RmJiounUjlZ5OoHKVnQkJynR3ERbKNkae7i4CAK5hRX6m+2IRERGaOHGievfurV27drlqsQAA4CpKSUlRenqaIiPnyG6PdHc5xVpaWoISEnorwD9SQZ52d5fjcucyjyo9fb+MMe4uBQCuaS4L3ZLk6empQ4cOuXKRAADADez2SAUFNXF3GSWCh6ddnl5B7i7D5bKyuRsCAAqiSKF7yZIlTtPGGCUlJemNN95Q69atXVIYAAAAAADFXZFC95133uk0bbPZVK5cOd16662aPHmyK+oCAAAAAKDYK1Lozs7OdnUdAAAAAACUOB7uLgAAAAAAgJKqSFe6hw8fXuC+U6ZMKcoqAAAAAAAo9ooUurdu3aotW7YoMzNTdevWlSTt2bNHnp6eatLkfyOd2mw211QJAAAAAEAxVKTQ3aVLFwUFBWnWrFkqXbq0JOnYsWMaMGCAbrnlFo0YMcKlRQIAAAAAUBwV6ZnuyZMna8KECY7ALUmlS5fWCy+8wOjlAAAAAAD8vyKF7pMnT+rPP//M1X748GGlpqZecVEAAAAAAJQERQrd3bp104ABA/Txxx/r999/1++//66PP/5YDzzwgLp37+7qGgEAAAAAKJaK9Ez3W2+9pSeeeEK9e/fWuXPnzi/Iy0sPPPCAXn75ZZcWCAAAAABAcVWk0G232zVt2jS9/PLL2rdvn4wxql27tgICAlxdHwAAAAAAxVaRbi/PkZSUpKSkJNWpU0cBAQEyxriqLgAAAAAAir0ihe4jR46obdu2qlOnjjp16qSkpCRJ0oMPPsjXhQEAAAAA8P+KFLoff/xxeXt7KzExUXa73dF+7733atmyZS4rDgAAAACA4qxIz3QvX75cX3/9tSpXruzUHhERoQMHDrikMAAAAAAAirsiXek+ffq00xXuHCkpKfL19b3iogAAAAAAKAmKFLrbtGmj2bNnO6ZtNpuys7P18ssvKyYmxmXFAQAAAABQnBXp9vKXX35Z0dHR2rRpk86ePauRI0dqx44dOnr0qL777jtX1wgAAAAAQLFUpCvd9evX148//qgbb7xR7dq10+nTp9W9e3dt3bpVtWrVcnWNAAAAAAAUS4W+0n3u3Dm1b99eb7/9tp577jkragIAAAAAoEQo9JVub29v/fzzz7LZbFbUAwAAAABAiVGk28v79u2r999/39W1AAAAAABQohRpILWzZ8/qvffe04oVK9SsWTMFBAQ4zZ8yZYpLigMAAAAAoDgrVOj+9ddfVb16df38889q0qSJJGnPnj1OfbjtHAAAAACA8woVuiMiIpSUlKRVq1ZJku699179+9//VlhYmCXFAQAAAABQnBUqdBtjnKaXLl2q06dPu7QgAAAAACXT6bQ0d5eAYqCkHSdFeqY7x8UhHAAAAAAulm3OSpISEhLcXAmKg5wHmJOSktxah6sUKnTbbLZcz2zzDDcAAACASzEmU5Lk51dX3l6Bbq4G1zq/zCNS+m86fvy4u0txiULfXt6/f3/5+vpKktLT0zV48OBco5cvWrTIdRUCAAAAKBE8POzy9Apydxm4xnlm/Y1vL+/Xr5/TdO/evV1aDAAAAAAAJUmhQveMGTOsqgMAAAAAgBLHw90FAAAAAABQUhG6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALCIW0P3hAkT1Lx5cwUFBal8+fK68847tXv3bqc+xhjFxcWpYsWK8vf3V3R0tHbs2OGmigEAAAAAKDi3hu41a9bo4Ycf1oYNG7RixQplZmaqffv2On36tKPPpEmTNGXKFL3xxhvauHGjwsPD1a5dO6WmprqxcgAAAAAALs/LnStftmyZ0/SMGTNUvnx5bd68WW3atJExRlOnTtWYMWPUvXt3SdKsWbMUFhamuXPnatCgQe4oGwAAAACAArmmnuk+ceKEJKlMmTKSpP379ys5OVnt27d39PH19VVUVJTi4+PdUiMAAAAAAAXl1ivdFzLGaPjw4br55pvVoEEDSVJycrIkKSwszKlvWFiYDhw4kOdyMjIylJGR4Zg+efKkRRUDAAAAAHBp18yV7kceeUQ//vij5s2bl2uezWZzmjbG5GrLMWHCBIWEhDheVapUsaReAAAAAAAu55oI3Y8++qiWLFmiVatWqXLlyo728PBwSf+74p3j8OHDua5+5xg9erROnDjheB08eNC6wgEAAAAAuAS3hm5jjB555BEtWrRI33zzjWrUqOE0v0aNGgoPD9eKFSscbWfPntWaNWvUqlWrPJfp6+ur4OBgpxcAAAAAAO7g1me6H374Yc2dO1efffaZgoKCHFe0Q0JC5O/vL5vNptjYWI0fP14RERGKiIjQ+PHjZbfb1bNnT3eWDgAAAADAZbk1dE+fPl2SFB0d7dQ+Y8YM9e/fX5I0cuRInTlzRkOHDtWxY8fUokULLV++XEFBQVe5WgAAAAAACsetodsYc9k+NptNcXFxiouLs74gAAAAAABc6JoYSA0AAAAAgJKI0A0AAAAAgEUI3QAAAAAAWMStz3QDAOAKiYmJSklJcXcZJUJCQoIkKS0twc2VFH98hgAAidANACjmEhMTFVm3rtLS091dSomSkNDb3SWUGMacdXcJAAA3InQDAIq1lJQUpaWna05kpCLtdneXU+ydTkvTzoQEBfhHysOTz/NKfJd5RNPSf5PJznR3KQAANyJ0AwBKhEi7XU2CgtxdRrGXKilTUpCnXZ5efJ5XYn9WmrtLAABcAxhIDQAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIu4NXR/++236tKliypWrCibzabFixc7zTfGKC4uThUrVpS/v7+io6O1Y8cO9xQLAAAAAEAhuTV0nz59Wtdff73eeOONPOdPmjRJU6ZM0RtvvKGNGzcqPDxc7dq1U2pq6lWuFAAAAACAwvNy58o7duyojh075jnPGKOpU6dqzJgx6t69uyRp1qxZCgsL09y5czVo0KCrWSoAAAAAAIXm1tB9Kfv371dycrLat2/vaPP19VVUVJTi4+PzDd0ZGRnKyMhwTJ88edLyWl0lMTFRKSkp7i4DyFPZsmVVtWpVd5cBAAAAFCvXbOhOTk6WJIWFhTm1h4WF6cCBA/m+b8KECXruuecsrc0KiYmJiqxbV2np6e4uBciT3c9PCbt3E7wBAACAQrhmQ3cOm83mNG2MydV2odGjR2v48OGO6ZMnT6pK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cFVwrOFq4njD1cKxhquJ4w1XC8fatSskJOSyfa7p0C1Jw4cPV58+fdSsWTO1bNlS77zzjhITEzV48GB3lwYAAAAAwCVd86H73nvv1ZEjRzRu3DglJSWpQYMG+uqrr1StWjV3lwYAAAAAwCVd86FbkoYOHaqhQ4e6uwxL+fr6auzYsblujQdcjWMNVxPHG64WjjVcTRxvuFo41kqGa3r0cgAAAAAAijMPdxcAAAAAAEBJRegGAAAAAMAihG4AAAAAACxC6LbItGnTVKNGDfn5+alp06Zau3btJfuvWbNGTZs2lZ+fn2rWrKm33norV59PPvlE9evXl6+vr+rXr69PP/3UqvJRzLj6eJs5c6ZsNluuV3p6upWbgWKgMMdaUlKSevbsqbp168rDw0OxsbF59uPchvy4+njj3Ib8FOZYW7Rokdq1a6dy5copODhYLVu21Ndff52rH+c25MXVxxrnteKB0G2BBQsWKDY2VmPGjNHWrVt1yy23qGPHjkpMTMyz//79+9WpUyfdcsst2rp1q/71r3/pscce0yeffOLos379et17773q06ePtm/frj59+qhHjx76/vvvr9Zm4RplxfEmScHBwUpKSnJ6+fn5XY1NwjWqsMdaRkaGypUrpzFjxuj666/Psw/nNuTHiuNN4tyG3Ap7rH377bdq166dvvrqK23evFkxMTHq0qWLtm7d6ujDuQ15seJYkzivFQsGLnfjjTeawYMHO7XVq1fPPPXUU3n2HzlypKlXr55T26BBg8xNN93kmO7Ro4e5/fbbnfp06NDB3HfffS6qGsWVFcfbjBkzTEhIiMtrRfFW2GPtQlFRUWbYsGG52jm3IT9WHG+c25CXKznWctSvX98899xzjmnObciLFcca57XigSvdLnb27Flt3rxZ7du3d2pv37694uPj83zP+vXrc/Xv0KGDNm3apHPnzl2yT37LxN+DVcebJJ06dUrVqlVT5cqVdccdd+T6qyr+XopyrBUE5zbkxarjTeLcBmeuONays7OVmpqqMmXKONo4t+FiVh1rEue14oDQ7WIpKSnKyspSWFiYU3tYWJiSk5PzfE9ycnKe/TMzM5WSknLJPvktE38PVh1v9erV08yZM7VkyRLNmzdPfn5+at26tfbu3WvNhuCaV5RjrSA4tyEvVh1vnNtwMVcca5MnT9bp06fVo0cPRxvnNlzMqmON81rx4OXuAkoqm83mNG2MydV2uf4Xtxd2mfj7cPXxdtNNN+mmm25yzG/durWaNGmi119/Xf/+979dVTaKISvOQ5zbkB9XHxuc25Cfoh5r8+bNU1xcnD777DOVL1/eJctEyebqY43zWvFA6HaxsmXLytPTM9dfrA4fPpzrL1s5wsPD8+zv5eWl0NDQS/bJb5n4e7DqeLuYh4eHmjdvzl9N/8aKcqwVBOc25MWq4+1inNtwJcfaggUL9MADD2jhwoW67bbbnOZxbsPFrDrWLsZ57drE7eUu5uPjo6ZNm2rFihVO7StWrFCrVq3yfE/Lli1z9V++fLmaNWsmb2/vS/bJb5n4e7DqeLuYMUbbtm1ThQoVXFM4ip2iHGsFwbkNebHqeLsY5zYU9VibN2+e+vfvr7lz56pz58655nNuw8WsOtYuxnntGuWO0dtKuvnz5xtvb2/z/vvvm507d5rY2FgTEBBgfvvtN2OMMU899ZTp06ePo/+vv/5q7Ha7efzxx83OnTvN+++/b7y9vc3HH3/s6PPdd98ZT09PM3HiRJOQkGAmTpxovLy8zIYNG6769uHaYsXxFhcXZ5YtW2b27dtntm7dagYMGGC8vLzM999/f9W3D9eOwh5rxhizdetWs3XrVtO0aVPTs2dPs3XrVrNjxw7HfM5tyI8VxxvnNuSlsMfa3LlzjZeXl3nzzTdNUlKS43X8+HFHH85tyIsVxxrnteKB0G2RN99801SrVs34+PiYJk2amDVr1jjm9evXz0RFRTn1X716tbnhhhuMj4+PqV69upk+fXquZS5cuNDUrVvXeHt7m3r16plPPvnE6s1AMeHq4y02NtZUrVrV+Pj4mHLlypn27dub+Pj4q7EpuMYV9liTlOtVrVo1pz6c25AfVx9vnNuQn8Ica1FRUXkea/369XNaJuc25MXVxxrnteLBZsz/j6AEAAAAAABcime6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBACiBqlevrqlTp7q7DKWlpemuu+5ScHCwbDabjh8/7u6SAAC4qgjdAAD8v/79+8tms8lms8nb21s1a9bUE088odOnT7u7tHzNnDlTpUqVytW+ceNGPfTQQ1e/oIvMmjVLa9euVXx8vJKSkhQSEuLukgAAuKq83F0AAADXkttvv10zZszQuXPntHbtWj344IM6ffq0pk+fnqvvuXPn5O3t7YYq/7f+/JQrV+4qVpK/ffv2KTIyUg0aNHB3KQAAuAVXugEAuICvr6/Cw8NVpUoV9ezZU7169dLixYslSXFxcWrcuLE++OAD1axZU76+vjLGKDExUV27dlVgYKCCg4PVo0cP/fnnn45l5rzv7bffVpUqVWS323XPPfc43WqdnZ2tcePGqXLlyvL19VXjxo21bNkyx/zffvtNNptNH330kaKjo+Xn56c5c+ZowIABOnHihOMKfVxcnKTct5cXtMYPP/xQ1atXV0hIiO677z6lpqZe8vP65JNPdN1118nX11fVq1fX5MmTHfOio6M1efJkffvtt7LZbIqOjs53OUuWLFGzZs3k5+ensmXLqnv37o55c+bMUbNmzRQUFKTw8HD17NlThw8fdsw/duyYevXqpXLlysnf318RERGaMWOGY/4ff/yhe++9V6VLl1ZoaKi6du2q3377zTF/9erVuvHGGxUQEKBSpUqpdevWOnDgwCW3GwCAgiJ0AwBwCf7+/k5XlH/55Rd99NFH+uSTT7Rt2zZJ0p133qmjR49qzZo1WrFihfbt26d7773XaTk57/v888+1bNkybdu2TQ8//LBj/muvvabJkyfrlVde0Y8//qgOHTroH//4h/bu3eu0nFGjRumxxx5TQkKC2rZtq6lTpyo4OFhJSUlKSkrSE088kWsbjDEFqnHfvn1avHixvvjiC33xxRdas2aNJk6cmO9ns3nzZvXo0UP33XeffvrpJ8XFxemZZ57RzJkzJUmLFi3SP//5T7Vs2VJJSUlatGhRnsv58ssv1b17d3Xu3Flbt27VypUr1axZM8f8s2fP6vnnn9f27du1ePFi7d+/X/3793fMf+aZZ7Rz504tXbpUCQkJmj59usqWLSvp/DPlMTExCgwM1Lfffqt169YpMDBQt99+u86ePavMzEzdeeedioqK0o8//qj169froYceks1my3e7AQAoFAMAAIwxxvTr18907drVMf3999+b0NBQ06NHD2OMMWPHjjXe3t7m8OHDjj7Lly83np6eJjEx0dG2Y8cOI8n88MMPjvd5enqagwcPOvosXbrUeHh4mKSkJGOMMRUrVjQvvviiUz3Nmzc3Q4cONcYYs3//fiPJTJ061anPjBkzTEhISK5tqVatmnn11VcLVaPdbjcnT5509HnyySdNixYt8v28evbsadq1a+fU9uSTT5r69es7pocNG2aioqLyXYYxxrRs2dL06tXrkn0u9MMPPxhJJjU11RhjTJcuXcyAAQPy7Pv++++bunXrmuzsbEdbRkaG8ff3N19//bU5cuSIkWRWr15d4PUDAFAYXOkGAOACX3zxhQIDA+Xn56eWLVuqTZs2ev311x3zq1Wr5vS8dEJCgqpUqaIqVao42urXr69SpUopISHB0Va1alVVrlzZMd2yZUtlZ2dr9+7dOnnypA4dOqTWrVs71dK6dWunZUhyugJcUAWtsXr16goKCnJMV6hQwek27ryWm1fNe/fuVVZWVoHr27Ztm9q2bZvv/K1bt6pr166qVq2agoKCHLepJyYmSpKGDBmi+fPnq3Hjxho5cqTi4+Md7928ebN++eUXBQUFKTAwUIGBgSpTpozS09O1b98+lSlTRv3791eHDh3UpUsXvfbaa0pKSipw7QAAXA6hGwCAC8TExGjbtm3avXu30tPTtWjRIpUvX94xPyAgwKm/MSbPW5Hza8+RM+/CPhf3z2sZF6+/IApa48WDwtlsNmVnZxdqucaYQtfn7++f77zTp0+rffv2CgwM1Jw5c7Rx40Z9+umnks7fdi5JHTt21IEDBxQbG6tDhw6pbdu2jtvss7Oz1bRpU23bts3ptWfPHvXs2VOSNGPGDK1fv16tWrXSggULVKdOHW3YsKHQ2wEAQF4I3QAAXCAgIEC1a9dWtWrVCjQyef369ZWYmKiDBw862nbu3KkTJ04oMjLS0ZaYmKhDhw45ptevXy8PDw/VqVNHwcHBqlixotatW+e07Pj4eKdl5MXHx+eyV5ULWmNh1a9fP8+a69SpI09PzwIvp1GjRlq5cmWe83bt2qWUlBRNnDhRt9xyi+rVq5fn1fdy5cqpf//+mjNnjqZOnap33nlHktSkSRPt3btX5cuXV+3atZ1eF3592Q033KDRo0crPj5eDRo00Ny5cwtcPwAAl0LoBgDgCtx2221q1KiRevXqpS1btuiHH35Q3759FRUV5XQruJ+fn/r166ft27dr7dq1euyxx9SjRw+Fh4dLkp588km99NJLWrBggXbv3q2nnnpK27Zt07Bhwy65/urVq+vUqVNauXKlUlJSlJaWVuQaC2vEiBFauXKlnn/+ee3Zs0ezZs3SG2+8kedgbpcyduxYzZs3T2PHjlVCQoJ++uknTZo0SdL52/J9fHz0+uuv69dff9WSJUv0/PPPO73/2Wef1WeffaZffvlFO3bs0BdffOH4Y0KvXr1UtmxZde3aVWvXrtX+/fu1Zs0aDRs2TL///rv279+v0aNHa/369Tpw4ICWL1+uPXv2XNEfIwAAuBChGwCAK2Cz2bR48WKVLl1abdq00W233aaaNWtqwYIFTv1q166t7t27q1OnTmrfvr0aNGigadOmOeY/9thjGjFihEaMGKGGDRtq2bJlWrJkiSIiIi65/latWmnw4MG69957Va5cOUdYLUqNhdWkSRN99NFHmj9/vho0aKBnn31W48aNcxpZvCCio6O1cOFCLVmyRI0bN9att96q77//XtL5K9gzZ87UwoULVb9+fU2cOFGvvPKK0/t9fHw0evRoNWrUSG3atJGnp6fmz58vSbLb7fr2229VtWpVde/eXZGRkRo4cKDOnDmj4OBg2e127dq1S3fddZfq1Kmjhx56SI888ogGDRp0RZ8NAAA5bKYoD18BAIACi4uL0+LFix1fMQYAAP4+uNINAAAAAIBFCN0AAAAAAFiE28sBAAAAALAIV7oBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsMj/AV5tFuNx3qgjAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Import necessary libraries\n", "import pandas as pd\n", @@ -131,7 +204,8 @@ " return p_wedding_infections, p_wedding_traces\n", "\n", "# Run the simulation 1000 times\n", - "results = [simulate_event(m) for m in range(1000)]\n", + "np.random.seed(123) # ADDED LINE \n", + "results = [simulate_event(m) for m in range(100)]\n", "props_df = pd.DataFrame(results, columns=[\"Infections\", \"Traces\"])\n", "\n", "# Plotting the results\n", @@ -193,7 +267,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "base", "language": "python", "name": "python3" }, @@ -207,7 +281,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.13.9" } }, "nbformat": 4,