 bondscell_results $2fa207dd-749f-4dc0-b4ab-159edf1d9bcequeued¤logsrunning¦outputbody8begin_value_iteration_v (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAF⹰persist_js_state·has_pluto_hook_features§cell_id$2fa207dd-749f-4dc0-b4ab-159edf1d9bcedepends_on_disabled_cells§runtime $gpublished_object_keysdepends_on_skipped_cells§errored$e0cc1ca1-595d-44e2-8612-261df9e2d327queued¤logsrunning¦outputbody	<div class="markdown"><blockquote>
<h3><em>Exercise 8.1</em></h3>
<p>The nonplanning method looks particularly poor in Figure 8.3 because it is a one-step method; a method using multi-step bootstrapping would do better. Do you think one of the multi-step bootstrapping methods from Chapter 7 could do as well as the Dyna method? Explain why or why not.</p>
</blockquote>
<p>For the n &#61; 50 agent, it can learn a policy that covers nearly the entire maze during the second episode.  In the extreme case of a multistep method we would attempt to solve the maze using monte carlo sampling in which case after a single episode we would have action/value updates for every state visited along the random trajectory.  However, these action/value estimates would be high variance estimates of the randomly initialized policy.  In contrast, the Dyna method after one random episode has observed most or all of the transitions in the maze.  During the long planning phase its Q updates would actually be able to converge to the optimal policy given a large enough n using bootstrapping and the single reward from reaching the goal.  As long as something is sampled close to the goal that information will propagate through to the rest of the states and each update is simultaneously improving the ϵ-greedy policy.  With multi-step bootstrapping we can extend the updates back along the trajectory a certain distance, but in the extreme case we just sample values from the random policy without any bootstrapping or we bootstrap to a limited degree close to the goal and still have the lack of information further away from it.  Since this environment is deterministic, having the sample transitions is equivalent to having a full model of the environment.  This could be used explicitely with value iteration to obtain the Q function as well.  The planning step is effectively performing this computation but only using the known transitions and over time is focused only on the states visited by the optimal or nearly optimal policy.  No n-step method can take advantage of previously observed transitions this well, but it should be noted that Dyna-Q only works this well if the environment is deterministic and is taking advantage of the fact that we know our model is correct for the transitions already observed.  </p>
</div>mimetext/htmlrootassigneelast_run_timestampA`persist_js_state·has_pluto_hook_features§cell_id$e0cc1ca1-595d-44e2-8612-261df9e2d327depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$304e6afd-11e0-4011-9929-85889b988400queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$304e6afd-11e0-4011-9929-85889b988400depends_on_disabled_cells§runtime 7)published_object_keysdepends_on_skipped_cells§errored$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07queued¤logsrunning¦outputbody8make_ϵ_greedy_policy! (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampAGJpersist_js_state·has_pluto_hook_features§cell_id$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07depends_on_disabled_cells§runtime  Z'published_object_keysdepends_on_skipped_cells§errored$3b4e27e7-8065-44b3-bc2a-e540913aa540queued¤logsrunning¦outputbody*takestep (generic function with 4 methods)mimetext/plainrootassigneelast_run_timestampA#persist_js_state·has_pluto_hook_features§cell_id$3b4e27e7-8065-44b3-bc2a-e540913aa540depends_on_disabled_cells§runtime Xpublished_object_keysdepends_on_skipped_cells§errored$6e273f2b-a1af-421f-aca7-772a836b89efqueued¤logsrunning¦outputbody>uniform_bellman_policy_value! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAIpersist_js_state·has_pluto_hook_features§cell_id$6e273f2b-a1af-421f-aca7-772a836b89efdepends_on_disabled_cells§runtime 'Upublished_object_keysdepends_on_skipped_cells§errored$726af565-8905-4409-864f-a5c1b5767e09queued¤logsrunning¦outputbody3form_random_policy (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA+persist_js_state·has_pluto_hook_features§cell_id$726af565-8905-4409-864f-a5c1b5767e09depends_on_disabled_cells§runtime  Qpublished_object_keysdepends_on_skipped_cells§errored$5d2abde0-7128-41c3-bd1f-b6940492d1aequeued¤logsrunning¦outputbody2double_q_learning (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$5d2abde0-7128-41c3-bd1f-b6940492d1aedepends_on_disabled_cells§runtime $published_object_keysdepends_on_skipped_cells§errored$76489f21-677e-4c25-beaa-afaf2244cd94queued¤logsrunning¦outputbodyf<div class="markdown"><h4>Figure 8.2</h4>
<p>Learning curves for a Dyna-Q agent in the maze</p>
</div>mimetext/htmlrootassigneelast_run_timestampA_Gpersist_js_state·has_pluto_hook_features§cell_id$76489f21-677e-4c25-beaa-afaf2244cd94depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$1127c36f-9bc0-49b1-9481-8a5861bdf6caqueued¤logsrunning¦outputbody	<div class="markdown"><blockquote>
<h3><em>Exercise 8.5</em></h3>
<p>How might the tabular Dyna-Q algorithm shown above be modified to handle stochastic environments?  How might this modification perform poorly on changing environments such as considered in this section?  How could the algorithm be modified to handle stochastic environments <em>and</em> changing environments?</p>
</blockquote>
<p>Instead of storing the most recent transition for a state-action pair, we could store the fraction of the time different transition states and rewards are observed.  That way our model becomes a distribution model using the previously experienced samples as estimates of the true transition probabilities.  Then for the planning updates, we would sample the transition from the model stochastically and perform the same Q update.</p>
<p>If the environment is changing, then the model will take much longer to modify compared to the original version where as soon as a new transition is observed it replaces the previous value.  If we averaging the previously observed transitions and there are many actions, then a new experience would only slightly modify the model even if we use constant step size averaging.  We would therefore expect such a model to react much more slowly to a changing environment.</p>
<p>One solution to speed up model updates could be to use a modified reward such as what is used for Dyna-Q&#43; in which the time since a state-action pair was selected increases the planning reward update for that transition, but that method assumed that a single visit to the state is adequate to update the model.  In a stochastic environment if we are counting transition to have an estimate of the probabilities for each one, our method would need a way of forgetting transitions that no longer happen.  We could simply keep only data from the most recent n transitions or average with exponential decaying weights such that we give higher weight to more cently observed transitions in the probability distribution.  We may also have to keep track of the time since a specific transitions was seen rather than simply the time a state action pair was attempted, so we&#39;d have <span class="tex">$\tau&#40;s, a, s′, r&#41;$</span> and then the planning Q update could add up or take the maximum of all of the observed transitions from that state.  A state action pair would then be boosted if any one of the possible transitions has not been seen recently.  </p>
</div>mimetext/htmlrootassigneelast_run_timestampAa=persist_js_state·has_pluto_hook_features§cell_id$1127c36f-9bc0-49b1-9481-8a5861bdf6cadepends_on_disabled_cells§runtime )ĵpublished_object_keysdepends_on_skipped_cells§errored$69ff1b72-cb1b-4724-a445-38e4c9846964queued¤logsrunning¦outputbody[<div class="markdown"><h4>Figure 8.4:</h4>
<p>Average performance of Dyna-Q agent on a blocking task.  After 1000 episodes of training the environment is switched to the second version.  The flat portion of the graph shows the agent getting stuck following the old optimal policy and needing many time steps to learn the new environment</p>
</div>mimetext/htmlrootassigneelast_run_timestampA`ODpersist_js_state·has_pluto_hook_features§cell_id$69ff1b72-cb1b-4724-a445-38e4c9846964depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$3edc09ab-8fa1-440f-8a45-546898a2b2a3queued¤logsrunning¦outputbody*takestep (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAepersist_js_state·has_pluto_hook_features§cell_id$3edc09ab-8fa1-440f-8a45-546898a2b2a3depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$6c8cd429-2c2e-4515-98b2-d0394962e479queued¤logsrunning¦outputbody*takestep (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampA#;persist_js_state·has_pluto_hook_features§cell_id$6c8cd429-2c2e-4515-98b2-d0394962e479depends_on_disabled_cells§runtime Pĵpublished_object_keysdepends_on_skipped_cells§errored$6605b946-3010-47ed-8d88-3c4dca993cf8queued¤logsrunning¦outputbody8begin_value_iteration_q (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAްpersist_js_state·has_pluto_hook_features§cell_id$6605b946-3010-47ed-8d88-3c4dca993cf8depends_on_disabled_cells§runtime $c&published_object_keysdepends_on_skipped_cells§errored$00c8f62f-dee2-476c-b896-68d3ab57a168queued¤logsrunning¦outputbody+figure_8_8 (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAV persist_js_state·has_pluto_hook_features§cell_id$00c8f62f-dee2-476c-b896-68d3ab57a168depends_on_disabled_cells§runtime Ýpublished_object_keysdepends_on_skipped_cells§errored$4d4baa61-b5bd-4bcf-a491-9a35a1695f0bqueued¤logsrunning¦outputbody<div style = "display: flex;">
<div>Without planning (n = 0)	<div style = "display: flex; transform: scale(1.0); background-color: white;">
		<div>
			<div class = "gridworld test">
				<div class = "gridcell test" x = "1" y = "1" style = "grid-row: 6; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "2" style = "grid-row: 5; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "3" style = "grid-row: 4; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "4" style = "grid-row: 3; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "5" style = "grid-row: 2; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "6" style = "grid-row: 1; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "1" style = "grid-row: 6; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "2" style = "grid-row: 5; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "3" style = "grid-row: 4; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "4" style = "grid-row: 3; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "5" style = "grid-row: 2; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "6" style = "grid-row: 1; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "1" style = "grid-row: 6; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "2" style = "grid-row: 5; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "3" style = "grid-row: 4; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "4" style = "grid-row: 3; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "5" style = "grid-row: 2; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "6" style = "grid-row: 1; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "1" style = "grid-row: 6; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "2" style = "grid-row: 5; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "3" style = "grid-row: 4; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "4" style = "grid-row: 3; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "5" style = "grid-row: 2; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "6" style = "grid-row: 1; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "1" style = "grid-row: 6; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "2" style = "grid-row: 5; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "3" style = "grid-row: 4; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "4" style = "grid-row: 3; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "5" style = "grid-row: 2; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "6" style = "grid-row: 1; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "1" style = "grid-row: 6; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "2" style = "grid-row: 5; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "3" style = "grid-row: 4; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "4" style = "grid-row: 3; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "5" style = "grid-row: 2; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "6" style = "grid-row: 1; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "1" style = "grid-row: 6; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "2" style = "grid-row: 5; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "3" style = "grid-row: 4; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "4" style = "grid-row: 3; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "5" style = "grid-row: 2; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "6" style = "grid-row: 1; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "1" style = "grid-row: 6; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "2" style = "grid-row: 5; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "3" style = "grid-row: 4; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "4" style = "grid-row: 3; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "5" style = "grid-row: 2; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "6" style = "grid-row: 1; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "1" style = "grid-row: 6; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "2" style = "grid-row: 5; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "3" style = "grid-row: 4; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "4" style = "grid-row: 3; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "5" style = "grid-row: 2; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "6" style = "grid-row: 1; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div>
			</div>
		</div>
		<div style = "display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-end; color: black; font-size: 18px; width: 5em; margin-left: 1em;">
			<div style = "display: flex; flex-direction: column; align-items: center; justify-content: center; color: black; background-color: rgba(100, 100, 100, 0.1);">
	<div style = "display: flex; align-items: center; justify-content: center;">
	<div class = "downarrow" style = "transform: rotate(90deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(270deg);"></div>
	<div class = "downarrow" style = "position: absolute;"></div>
	</div>
	<div>Actions</div>
</div>

		</div>
	</div>

	<style>
		.test.gridworld {
			display: grid;
			grid-template-columns: repeat(9, 40px);
			grid-template-rows: repeat(6, 40px);
			background-color: white;

		.test[x="1"][y="4"]::before {
			content: 'S';
			position: absolute;
			color: green;
			opacity: 1.0;
		}

		.test[x="9"][y="6"]::before {
			content: 'G';
			position: absolute;
			color: red;
			opacity: 1.0;
		}

	</style>
</div>
<div>With planning (n = 50)	<div style = "display: flex; transform: scale(1.0); background-color: white;">
		<div>
			<div class = "gridworld test">
				<div class = "gridcell test" x = "1" y = "1" style = "grid-row: 6; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "2" style = "grid-row: 5; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "3" style = "grid-row: 4; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "4" style = "grid-row: 3; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "5" style = "grid-row: 2; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "1" y = "6" style = "grid-row: 1; grid-column: 1;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "1" style = "grid-row: 6; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "2" style = "grid-row: 5; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "3" style = "grid-row: 4; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "4" style = "grid-row: 3; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "5" style = "grid-row: 2; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "2" y = "6" style = "grid-row: 1; grid-column: 2;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "1" style = "grid-row: 6; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "2" style = "grid-row: 5; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "3" style = "grid-row: 4; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "4" style = "grid-row: 3; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "5" style = "grid-row: 2; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "3" y = "6" style = "grid-row: 1; grid-column: 3;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "1" style = "grid-row: 6; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "2" style = "grid-row: 5; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "3" style = "grid-row: 4; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "4" style = "grid-row: 3; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "5" style = "grid-row: 2; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "4" y = "6" style = "grid-row: 1; grid-column: 4;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "1" style = "grid-row: 6; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "2" style = "grid-row: 5; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "3" style = "grid-row: 4; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "4" style = "grid-row: 3; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "5" style = "grid-row: 2; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "5" y = "6" style = "grid-row: 1; grid-column: 5;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "1" style = "grid-row: 6; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "2" style = "grid-row: 5; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "3" style = "grid-row: 4; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "4" style = "grid-row: 3; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "5" style = "grid-row: 2; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "6" y = "6" style = "grid-row: 1; grid-column: 6;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "1" style = "grid-row: 6; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "2" style = "grid-row: 5; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "3" style = "grid-row: 4; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "4" style = "grid-row: 3; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 1.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "5" style = "grid-row: 2; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 1.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "7" y = "6" style = "grid-row: 1; grid-column: 7;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 1.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "1" style = "grid-row: 6; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 1.0"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "2" style = "grid-row: 5; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 1.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "3" style = "grid-row: 4; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "4" style = "grid-row: 3; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "5" style = "grid-row: 2; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "8" y = "6" style = "grid-row: 1; grid-column: 8;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "1" style = "grid-row: 6; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "2" style = "grid-row: 5; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "3" style = "grid-row: 4; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "4" style = "grid-row: 3; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "5" style = "grid-row: 2; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 1.0;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.0"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.0"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.0"></div>
	</div>
</div><div class = "gridcell test" x = "9" y = "6" style = "grid-row: 1; grid-column: 9;">	<div style = "display: flex; align-items: center; justify-content: center; transform: scale(0.8);">
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: 0.25;"></div>	
	<div class = "downarrow" style = "position: absolute; opacity: 0.25"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: 0.25"></div>
	<div class = "downarrow" style = "transform: rotate(-90deg); opacity: 0.25"></div>
	</div>
</div>
			</div>
		</div>
		<div style = "display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-end; color: black; font-size: 18px; width: 5em; margin-left: 1em;">
			<div style = "display: flex; flex-direction: column; align-items: center; justify-content: center; color: black; background-color: rgba(100, 100, 100, 0.1);">
	<div style = "display: flex; align-items: center; justify-content: center;">
	<div class = "downarrow" style = "transform: rotate(90deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(270deg);"></div>
	<div class = "downarrow" style = "position: absolute;"></div>
	</div>
	<div>Actions</div>
</div>

		</div>
	</div>

	<style>
		.test.gridworld {
			display: grid;
			grid-template-columns: repeat(9, 40px);
			grid-template-rows: repeat(6, 40px);
			background-color: white;

		.test[x="1"][y="4"]::before {
			content: 'S';
			position: absolute;
			color: green;
			opacity: 1.0;
		}

		.test[x="9"][y="6"]::before {
			content: 'G';
			position: absolute;
			color: red;
			opacity: 1.0;
		}

	</style>
</div>
</div>
mimetext/htmlrootassigneelast_run_timestampAfbpersist_js_state·has_pluto_hook_features§cell_id$4d4baa61-b5bd-4bcf-a491-9a35a1695f0bdepends_on_disabled_cells§runtimeDpublished_object_keysdepends_on_skipped_cells§errored$cd79ce14-14a1-43c6-93e0-b4a786f7f9fbqueued¤logsrunning¦outputbody><div class="markdown"><p>Because planning proceeds incrementally, it is trivial to intermix planning and acting.  So the learning from the model can inform the interaction with the environment in parallel and then any information from the environment can be used to update the model whenever it is received.</p>
</div>mimetext/htmlrootassigneelast_run_timestampA_persist_js_state·has_pluto_hook_features§cell_id$cd79ce14-14a1-43c6-93e0-b4a786f7f9fbdepends_on_disabled_cells§runtime 'εpublished_object_keysdepends_on_skipped_cells§errored$516234a8-2748-11ed-35df-432eebaa5162queued¤logsrunning¦outputbody<div class="markdown"><h1>Chapter 8 - Planning and Learning with Tabular Methods</h1>
<p>So far we have seen example problems where we have a full model of the environment in the form of the probability transition function as well as environments where we can only sample trajectories.  In this chapter we will integrate the techniques that are <em>model-based</em> and <em>model-free</em> and show how they can be intermixed.</p>
<h2>8.1 Models and Planning</h2>
<p>A <em>model</em> is anything that an agent can use to predict the environment.  If the model provides a full description of all possible transitions it is called a <em>distribution model</em> vs a <em>sample model</em> that can only generate one of those possibilities according to the correct probability distribution.  In dynamic programming, we used a distribution model while for certain example problems such as blackjack we only had a sample model.</p>
<p>A model can be used the create a <em>simulated experience</em> of the environment such as a trajectory.  The common thread across all the techniques is the computation of the value function to improve a policy and using some update process to compute the value function for example from the data collected in simulated experience.  For the learning methods considered so far, we have assumed that the data collected from trajectories is generated by the environment itself while in planning methods this experience would come instead from a model.  However the learning techniques largely still apply to planning techniques as well since the nature of the data is the same.  Consider a planning method analogous to Q-learning called <em>random-sample one-step tabular Q-planning</em>.  This technique applies the Q-learning update to a transition sapmled from a model.  Instead of interacting with the environment in an episode or continuing task, this technique simply selects a state action pair at random and observes the transition.  Just like with Q-learning, this method converges to the optimal policy under the assumption that all state-action pairs are visited an infinite number of times but the policy will only be optimal for the model of the environment.</p>
<p>Performing updates on single transitions highlights another theme of planning methods which don&#39;t necessarily involve exaustive solutions to the whole environment.  We can direct the method to specific states of interest which may be important for problems with very large state spaces.</p>
<h2>8.2 Dyna: Integrated Planning, Acting, and Learning</h2>
<p>A planning agent can use real experience in at least two ways: 1&#41; it can be used to improve the model to make it a better match for the real environment &#40;<em>model-learning</em>&#41; and 2&#41; it can be used directly to improve the value function using the previous learning methods &#40;<em>direct reinforcement learning</em>&#41;.  If a better model is then used to improve the value function this is also called <em>indirect reinforcement learning</em>.  </p>
<p>Indirect methods can make better use of a limited amount of experience, but direct methods are much simpler and are not affected by the biases in the design of the model.  Dyna-Q includes all the processes of planning, acting, model-learning, and direct RL.  The planning method is the random-sample one-step tabular Q-planning described above.  The direct RL method is one-step tabular Q-learning.  The model-learning mdethod is also table-based and assumes the environment is deterministic.  After each transition <span class="tex">$S_t,A_t \longrightarrow R_&#123;t&#43;1&#125;,S_&#123;t&#43;1&#125;$</span>, the model records in its table entry for <span class="tex">$S_t,A_t$</span> the prediction that <span class="tex">$R_&#123;t&#43;1&#125;,S_&#123;t&#43;1&#125;$</span> will deterministically follow.  Thus if the model is queried with a state-action pair that has been experienced before, it simply returns the last-observed next state and next reward as its prediction.</p>
<p>During planning, the Q-planning algorithm randomly samples only from state-action pairs that have previously been experienced, so the model is never queried with a pair about which it has no information.  The learning and planning portions of the algorithm are connected in that they use the same type of update.  The only difference is the source of the experience used.</p>
<p>The collection of real experience and planning could occur simultaneously in these agents, but for a serial implementation it is assumed that the acting, model-learning, and direct RL processes are very fast while the planning process is the model computation-intensive.  Let us assume that after each step of acting, model-learning, and direct RL there is time for <span class="tex">$n$</span> iterations of the Q-planning algorithm.  Without the model update and the <span class="tex">$n$</span> loop planning step, this algorithm is identical to one-step tabular Q-learning.  An example implementation is below along with an example applying it to a maze environment.</p>
</div>mimetext/htmlrootassigneelast_run_timestampA_yWpersist_js_state·has_pluto_hook_features§cell_id$516234a8-2748-11ed-35df-432eebaa5162depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$bf7950f2-05fa-4455-ad08-27735148d95cqueued¤logsrunning¦outputbody9monte_carlo_tree_search (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampAųsqpersist_js_state·has_pluto_hook_features§cell_id$bf7950f2-05fa-4455-ad08-27735148d95cdepends_on_disabled_cells§runtimeR7published_object_keysdepends_on_skipped_cells§errored$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/a7554ac9055de0b8"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAiİpersist_js_state·has_pluto_hook_features§cell_id$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27depends_on_disabled_cells§runtime ؁published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/a7554ac9055de0b8depends_on_skipped_cells§errored$47ce2eda-b2c4-4f81-8d91-955bc35bab49queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$47ce2eda-b2c4-4f81-8d91-955bc35bab49depends_on_disabled_cells§runtime g6Qpublished_object_keysdepends_on_skipped_cells§errored$679b6096-b3ca-422d-9d9a-225832510ab1queued¤logsrunning¦outputbodymsg{UndefVarError: `vholdtest` not defined in `Main.var"workspace#3"`
Suggestion: check for spelling errors or missing imports.stacktracecall_shorttop-level scopeinlined£urlpath/home/runner/work/Reinforcement-Learning-Sutton-Barto-Exercise-Solutions/Reinforcement-Learning-Sutton-Barto-Exercise-Solutions/Chapter-08/Chapter_08_Planning_&_Learning_with_Tabular_Methods.jl#==#679b6096-b3ca-422d-9d9a-225832510ab1source_packagecalltop-level scopelinfo_typeCore.CodeInfolinefile^Chapter_08_Planning_&_Learning_with_Tabular_Methods.jl#==#679b6096-b3ca-422d-9d9a-225832510ab1functop-level scopeparent_modulefrom_c¤mime'application/vnd.pluto.stacktrace+objectrootassigneelast_run_timestampAů,persist_js_state·has_pluto_hook_features§cell_id$679b6096-b3ca-422d-9d9a-225832510ab1depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$d5ac7c6f-9636-46d9-806f-34d6c8e4d4d5queued¤logsrunning¦outputbody%<div class="markdown"><p>Consider the simple maze shown above where the agent can take four actions which take it deterministically into the neighboring square unless it is blocked by a wall represented by a W in the diagram.  In this case the agent remains in its original state.  Reward is zero on all transitions except those into the goal state, on which it is &#43;1.  After reaching the goal the agent returns to the start to begin a new episode.  This is a discounted episodic task with <span class="tex">$\gamma &#61; 0.95$</span></p>
</div>mimetext/htmlrootassigneelast_run_timestampA_persist_js_state·has_pluto_hook_features§cell_id$d5ac7c6f-9636-46d9-806f-34d6c8e4d4d5depends_on_disabled_cells§runtime a}published_object_keysdepends_on_skipped_cells§errored$aee1f6a8-de43-402e-b375-86c0f2f9e6b8queued¤logsrunning¦outputbody.figure_8_5′ (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAmpersist_js_state·has_pluto_hook_features§cell_id$aee1f6a8-de43-402e-b375-86c0f2f9e6b8depends_on_disabled_cells§runtime jpublished_object_keysdepends_on_skipped_cells§errored$a3243bc4-7ae7-418a-9881-a265ca95f5efqueued¤logsrunning¦outputbody><div class="markdown"><h2>8.4 Prioritized Sweeping</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAaWѰpersist_js_state·has_pluto_hook_features§cell_id$a3243bc4-7ae7-418a-9881-a265ca95f5efdepends_on_disabled_cells§runtime /published_object_keysdepends_on_skipped_cells§errored$466268c4-664d-42dd-84c1-7b8ade49936fqueued¤logsrunning¦outputbody<div class="markdown"><p>For each maze there is an optimal path that scales up with the size.  The plot below compares prioritized sweeping with Dyna-Q where each method can make at most 5 planning updates.  The number of updates until an optimal path is found is computed for different size mazes.  The number of updates required for prioritied sweeping is dramatically lower by tens or hundreds of times depending on the size of the maze.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAaOpersist_js_state·has_pluto_hook_features§cell_id$466268c4-664d-42dd-84c1-7b8ade49936fdepends_on_disabled_cells§runtime @0published_object_keysdepends_on_skipped_cells§errored$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96queued¤logsrunning¦outputbody(rollout (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAKpersist_js_state·has_pluto_hook_features§cell_id$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96depends_on_disabled_cells§runtime )published_object_keysdepends_on_skipped_cells§errored$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8queued¤logsrunning¦outputbody+runepisode (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA`persist_js_state·has_pluto_hook_features§cell_id$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8depends_on_disabled_cells§runtime Rѵpublished_object_keysdepends_on_skipped_cells§errored$f424edac-388d-4465-900f-9459d2a88f79queued¤logsrunning¦outputbody*init_step (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampARpersist_js_state·has_pluto_hook_features§cell_id$f424edac-388d-4465-900f-9459d2a88f79depends_on_disabled_cells§runtime cWpublished_object_keysdepends_on_skipped_cells§errored$08e81e30-119d-4f4e-a865-f1f85cbffd31queued¤logsrunning¦outputbody<div class="markdown"><p>For many tasks the state space is too large to be solved effectively without prioritization.  That being said, there are multiple methods of prioritizing states such as looking forward from states that are being visited frequently by the policy.  </p>
<p>Prioritized sweeping also makes use of expected updates to update the priority queue &#40;sweeping through model state action pairs&#41; which could be very costly in environments with large numbers of actions.  Also in stochastic environments, our model may not even be accurate for some low probability transitions which would be a waste to consider.  An alternative is to use sample updates which are higher variance individually, but may win out in terms of rate of convergence per computation in environments with high stochasticity and large branching.  In the next sections, we more closely examine the value of expected and sample updates.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAapersist_js_state·has_pluto_hook_features§cell_id$08e81e30-119d-4f4e-a865-f1f85cbffd31depends_on_disabled_cells§runtime 0published_object_keysdepends_on_skipped_cells§errored$898f1b06-a34f-496b-99db-9ca23498cbeequeued¤logsrunning¦outputbodyCprioritized_sweeping_deterministic (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAOpersist_js_state·has_pluto_hook_features§cell_id$898f1b06-a34f-496b-99db-9ca23498cbeedepends_on_disabled_cells§runtimehpublished_object_keysdepends_on_skipped_cells§errored$08ff749b-f4ff-4639-99f5-48262aa4643equeued¤logsrunning¦outputbodyQ<div class="markdown"><p>In the Dyna agents simulated transitions are started in the state-actino pairs selected uniformly at random from all previously experienced pairs, but a uniform selection is usually not the best.  Planning can be much more efficient if updates are focused on particular state-action pairs.  In particular if an environment has goal states such as the maze, then one-step TD updates will only be relevant along the trajectory leading to that goal.  Not all environments have goal states, but the idea still applies to cases where only certain states are expected to be updated given a certain amount of data from environment interactions.  We can therefore work <em>backward</em> from states we know will be updated to consider all of the relevant predecessor states.  Using <em>prioritized sweeping</em>, we maintain a queue of every state-action pair whose estimated value would change nontrivially if updated, prioritized by the size of the change.  When the top pair in the queue is updated, the effect on each of its predecessor pairs is computed.  If the effect is greater than some small threshold, then the pair is inserted int the queue with a new priority.  In this way the effects of changes are efficiently backpropagated backward until quienscence.  A full implementation of priorized sweeping can be found below.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAaxypersist_js_state·has_pluto_hook_features§cell_id$08ff749b-f4ff-4639-99f5-48262aa4643edepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$245d9616-e0d2-497e-bfdd-4729a7215bfdqueued¤logsrunning¦outputbody<div class="markdown"><p>The maze task is a horrible candidate for MCTS because it is solved so effectively with the other techniques that build accurate action value estimates for the entire maze.  It is very likely that states will be revisited in this task as well and that information is useful to solve the problem.  MCTS would be most useful for problems where we cannot even know the full state space and states are never seen again in the course of a single episode as well as for tasks whose episodes don&#39;t last very long.  Blackjack might be a good example of this since the number of steps is usually one or two.  Another example could be tic-tac-toe.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAc"persist_js_state·has_pluto_hook_features§cell_id$245d9616-e0d2-497e-bfdd-4729a7215bfddepends_on_disabled_cells§runtime gpublished_object_keysdepends_on_skipped_cells§errored$e8a6e672-b860-404f-83c1-62a080f23112queued¤logsrunning¦outputbody0<div class="markdown"><h3>Figure 8.8</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAbŰpersist_js_state·has_pluto_hook_features§cell_id$e8a6e672-b860-404f-83c1-62a080f23112depends_on_disabled_cells§runtime Apublished_object_keysdepends_on_skipped_cells§errored$39ae7727-ea72-48f3-8d63-e03a9f607f87queued¤logsrunning¦outputbody/make_dyna_maze (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAmPpersist_js_state·has_pluto_hook_features§cell_id$39ae7727-ea72-48f3-8d63-e03a9f607f87depends_on_disabled_cells§runtime Gڵpublished_object_keysdepends_on_skipped_cells§errored$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056queued¤logsrunning¦outputbody)rollout (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampA
԰persist_js_state·has_pluto_hook_features§cell_id$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056depends_on_disabled_cells§runtime +published_object_keysdepends_on_skipped_cells§errored$d0b18699-7d3a-418d-9d15-be41f1643f09queued¤logsrunning¦outputbodyBtrajectory_bellman_optimal_value! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampANpersist_js_state·has_pluto_hook_features§cell_id$d0b18699-7d3a-418d-9d15-be41f1643f09depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$cd1980ff-2f35-4599-b08c-2037ddf5e995queued¤logsrunning¦outputbody1figure_8_4′′ (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$cd1980ff-2f35-4599-b08c-2037ddf5e995depends_on_disabled_cells§runtime rpublished_object_keysdepends_on_skipped_cells§errored$c32d0943-ba8f-438f-83b6-5ed42221f630queued¤logsrunning¦outputbody1figure_8_5′′ (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAWpersist_js_state·has_pluto_hook_features§cell_id$c32d0943-ba8f-438f-83b6-5ed42221f630depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$fc137613-7b4b-414c-93af-eeb2ace5d67fqueued¤logsrunning¦outputbody8make_ϵ_greedy_policy! (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampA"?persist_js_state·has_pluto_hook_features§cell_id$fc137613-7b4b-414c-93af-eeb2ace5d67fdepends_on_disabled_cells§runtime <ݵpublished_object_keysdepends_on_skipped_cells§errored$cffc9f11-77d7-4076-aa3b-821f1c741f58queued¤logsrunning¦outputbody%uct (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAYpersist_js_state·has_pluto_hook_features§cell_id$cffc9f11-77d7-4076-aa3b-821f1c741f58depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$4b424a47-dfeb-4380-8ab8-8bd24a080c2equeued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/758f20745cddbdf8"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAjϰpersist_js_state·has_pluto_hook_features§cell_id$4b424a47-dfeb-4380-8ab8-8bd24a080c2edepends_on_disabled_cells§runtime"$published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/758f20745cddbdf8depends_on_skipped_cells§errored$0f37ec0a-b737-478b-bf6a-027899250c4equeued¤logsrunning¦outputbody+sarsa_step (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA홚persist_js_state·has_pluto_hook_features§cell_id$0f37ec0a-b737-478b-bf6a-027899250c4edepends_on_disabled_cells§runtime Dpublished_object_keysdepends_on_skipped_cells§errored$8dbc76fd-ac73-47ca-983e-0e90023390e3queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/195acae2fa071a1a"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8dbc76fd-ac73-47ca-983e-0e90023390e3depends_on_disabled_cells§runtime2'ѡpublished_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/195acae2fa071a1adepends_on_skipped_cells§errored$e4f73889-af82-4304-89d5-ee50172eb3daqueued¤logsrunning¦outputbody5make_greedy_policy! (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$e4f73889-af82-4304-89d5-ee50172eb3dadepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$636d768c-670d-4485-a1dd-2bab6cf086d0queued¤logsrunning¦outputbody0make_random_mdp (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampALpersist_js_state·has_pluto_hook_features§cell_id$636d768c-670d-4485-a1dd-2bab6cf086d0depends_on_disabled_cells§runtime H%published_object_keysdepends_on_skipped_cells§errored$cd139745-1877-43a2-97a0-3333e544cbd8queued¤logsrunning¦outputbody*figure8_2 (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAƛ>\persist_js_state·has_pluto_hook_features§cell_id$cd139745-1877-43a2-97a0-3333e544cbd8depends_on_disabled_cells§runtime CUpublished_object_keysdepends_on_skipped_cells§errored$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6queued¤logsrunning¦outputbody5q_policy_evaluation! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA6persist_js_state·has_pluto_hook_features§cell_id$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6depends_on_disabled_cells§runtime .dpublished_object_keysdepends_on_skipped_cells§errored$f369a092-420d-4660-b802-93f05d5e7972queued¤logsrunning¦outputbody+apply_uct! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAbApersist_js_state·has_pluto_hook_features§cell_id$f369a092-420d-4660-b802-93f05d5e7972depends_on_disabled_cells§runtime )published_object_keysdepends_on_skipped_cells§errored$1d97325a-8b9a-438d-a5f9-e17638e64627queued¤logsrunning¦outputbody7initialize_state_value (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA~persist_js_state·has_pluto_hook_features§cell_id$1d97325a-8b9a-438d-a5f9-e17638e64627depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$113d2bc2-1f77-479f-86e5-a65b20672d7aqueued¤logsrunning¦outputbody6double_expected_sarsa (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAݰpersist_js_state·has_pluto_hook_features§cell_id$113d2bc2-1f77-479f-86e5-a65b20672d7adepends_on_disabled_cells§runtime
Tĵpublished_object_keysdepends_on_skipped_cells§errored$27d12c1c-ddb0-4bc1-af51-3388ff806705queued¤logsrunning¦outputbody <div class="markdown"><h4>Figure 8.3:</h4>
<p>Policies found by planning and nonplanning Dyna-Q agents after episode <bond def="num_episodes_8_3" unique_id="Gw43lLc7ygzI"><input type='number' min='1' step='1' max='100' value='2'></bond>. The arrows indicate the greedy action with respect to the learned state-action value function.  Without planning, the only states with a policy update are those within n episodes of the goal where n is the number of episodes experienced so far in training.  For the planning agent after 1 episode, at least one of the values will be updated so during future planning steps, that information can propagate through the other states through bootstrapping since we are free to sample transitions from states into the ones that already have a value update.</p>
</div>mimetext/htmlrootassigneelast_run_timestampArpersist_js_state·has_pluto_hook_features§cell_id$27d12c1c-ddb0-4bc1-af51-3388ff806705depends_on_disabled_cells§runtimeֶpublished_object_keysdepends_on_skipped_cells§errored$f0e88db8-e3ee-4b74-923e-c34038024824queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/b33bcd4825a11f8e"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAO)persist_js_state·has_pluto_hook_features§cell_id$f0e88db8-e3ee-4b74-923e-c34038024824depends_on_disabled_cells§runtimeJpublished_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/b33bcd4825a11f8edepends_on_skipped_cells§errored$b0df4dad-74c7-4469-a13f-5ef6bb81199fqueued¤logsrunning¦outputbody<div class="markdown"><h4>Figure 8.5:</h4>
<p>Average performance of Dyna-Q on shortcut task.  The constant slope after learning the optimal policy indicates the shortcut is not exploited.</p>
</div>mimetext/htmlrootassigneelast_run_timestampA`Hpersist_js_state·has_pluto_hook_features§cell_id$b0df4dad-74c7-4469-a13f-5ef6bb81199fdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$cfdaa9c2-265f-4540-9d04-d1b7a72aee3equeued¤logslinemsg,Downloading a local version of plotly@2.26.2text/plaincell_id$cfdaa9c2-265f-4540-9d04-d1b7a72aee3ekwargsidPlutoPlotly_70a501d8fileJ/home/runner/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jlgrouplocal_plotly_librarylevelInforunning¦outputbodyj<div class="markdown"><h3>Figure 8.7:</h3>
<p>Comparison of efficiency of expected and sample updates 	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/cb4cbc067ea31403"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
</p>
</div>mimetext/htmlrootassigneelast_run_timestampAENpersist_js_state·has_pluto_hook_features§cell_id$cfdaa9c2-265f-4540-9d04-d1b7a72aee3edepends_on_disabled_cells§runtimeΈ~lpublished_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/cb4cbc067ea31403depends_on_skipped_cells§errored$250ea9da-dea3-4bf3-932d-cdda6756ae33queued¤logsrunning¦outputbody,runepisode (generic function with 4 methods)mimetext/plainrootassigneelast_run_timestampA$Opersist_js_state·has_pluto_hook_features§cell_id$250ea9da-dea3-4bf3-932d-cdda6756ae33depends_on_disabled_cells§runtime =published_object_keysdepends_on_skipped_cells§errored$bc295bb5-addb-4bcf-a3e3-c839ccc346bdqueued¤logsrunning¦outputbody2<div class="markdown"><h3>Maze Example</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAbpersist_js_state·has_pluto_hook_features§cell_id$bc295bb5-addb-4bcf-a3e3-c839ccc346bddepends_on_disabled_cells§runtime սpublished_object_keysdepends_on_skipped_cells§errored$729197ce-2c27-467d-ba5f-47a1ecd539f2queued¤logsrunning¦outputbodyprefixInt64elements0text/plain0text/plain0text/plain1text/plain1text/plain1text/plain2text/plain2text/plain	1text/plain
0text/plaintypeArrayprefix_shortobjectidc15093f62d779bc9mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampA2Ͱpersist_js_state·has_pluto_hook_features§cell_id$729197ce-2c27-467d-ba5f-47a1ecd539f2depends_on_disabled_cells§runtimeiBpublished_object_keysdepends_on_skipped_cells§errored$1aa76f3d-6041-4886-a6cd-787bdf1ec63cqueued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/8abe7fb8cc2fd548"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAcpersist_js_state·has_pluto_hook_features§cell_id$1aa76f3d-6041-4886-a6cd-787bdf1ec63cdepends_on_disabled_cells§runtimeD_published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/8abe7fb8cc2fd548depends_on_skipped_cells§errored$3bf9e526-826d-42b8-84ee-75f1c7f79c69queued¤logsrunning¦outputbody4display_rook_policy (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA2persist_js_state·has_pluto_hook_features§cell_id$3bf9e526-826d-42b8-84ee-75f1c7f79c69depends_on_disabled_cells§runtime <mpublished_object_keysdepends_on_skipped_cells§errored$308fd488-a009-4de0-8b27-c1f6b0677fedqueued¤logsrunning¦outputbody$uct (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAYhUpersist_js_state·has_pluto_hook_features§cell_id$308fd488-a009-4de0-8b27-c1f6b0677feddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$340ba72b-172a-4d92-99b2-17687ab511c7queued¤logsrunning¦outputbody<div class="markdown"><blockquote>
<h3><em>Exercise 8.4 &#40;programming&#41;</em></h3>
<p>The exploration bonus described above actually changes the estimated values of states and actions. Is this necessary? Suppose the bonus <span class="tex">$\kappa \sqrt&#123;\tau&#125;$</span> was used not in updates, but solely in action selection. That is, suppose the action selected was always that for which <span class="tex">$Q&#40;S_t,a&#41; &#43; \kappa \sqrt&#123;\tau&#40;S_t, a&#41;&#125;$</span> was maximal. Carry out a gridworld experiment that tests and illustrates the strengths and weaknesses of this alternate approach.</p>
</blockquote>
</div>mimetext/htmlrootassigneelast_run_timestampA`Upersist_js_state·has_pluto_hook_features§cell_id$340ba72b-172a-4d92-99b2-17687ab511c7depends_on_disabled_cells§runtime Rpublished_object_keysdepends_on_skipped_cells§errored$44364e7f-1910-421a-b961-63fbbaac8230queued¤logsrunning¦outputbody8bellman_optimal_value! (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampA3$Spersist_js_state·has_pluto_hook_features§cell_id$44364e7f-1910-421a-b961-63fbbaac8230depends_on_disabled_cells§runtime P6published_object_keysdepends_on_skipped_cells§errored$4f4551fe-54a9-4186-ab8f-3535dc2bf4c5queued¤logsrunning¦outputbody<div class="markdown"><h2>8.3 When the Model Is Wrong</h2>
<p>In the maze example the model started out empty and then was only filled in with correct information.  In general, we cannot expect to be so fortunate.  Models may be incorrect because the environment is stochastic and only a limited number of samples have been observed, or simply because the environment has changed.  When the model is incorrect, the planning process will likely compute a suboptimal policy.</p>
<p>In some cases, the suboptimal poicy computed by planning quickly leads to the discovery and correction of the modeling error.  This tends to happen when the model is optimistic in the sense of predicting greater reward or better state transitions than are actually possible.  The planned policy attempts to exploit these opportunities and in doing so it discovers that they do not exist.</p>
<h3>Example 8.2: Blocking Maze</h3>
<p>Consider a maze with a barrier that separates the start from the goal except for an opening on one end.  After a set number of time steps this path is blocked and replaced with a longer path open at the other end.  Below is an example of the environment with a random trajectory before and after the blocking.</p>
</div>mimetext/htmlrootassigneelast_run_timestampA`2persist_js_state·has_pluto_hook_features§cell_id$4f4551fe-54a9-4186-ab8f-3535dc2bf4c5depends_on_disabled_cells§runtime Jpublished_object_keysdepends_on_skipped_cells§errored$f6486854-4892-4fb6-a805-de56b19b3571queued¤logsrunning¦outputbody.make_uct_plus (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAqpersist_js_state·has_pluto_hook_features§cell_id$f6486854-4892-4fb6-a805-de56b19b3571depends_on_disabled_cells§runtime C.published_object_keysdepends_on_skipped_cells§errored$fb5601b0-06d4-43c4-81a6-23a4a8f29f00queued¤logsrunning¦outputbody3make_random_policy (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$fb5601b0-06d4-43c4-81a6-23a4a8f29f00depends_on_disabled_cells§runtime -Եpublished_object_keysdepends_on_skipped_cells§errored$82e5719c-bbdb-4a18-b2f0-ad746b6acd41queued¤logsrunning¦outputbody*make_puct (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAkypersist_js_state·has_pluto_hook_features§cell_id$82e5719c-bbdb-4a18-b2f0-ad746b6acd41depends_on_disabled_cells§runtime 9published_object_keysdepends_on_skipped_cells§errored$c62cc32c-0d29-4ea2-8284-ac4c883df6dbqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampA"persist_js_state·has_pluto_hook_features§cell_id$c62cc32c-0d29-4ea2-8284-ac4c883df6dbdepends_on_disabled_cells§runtime 2published_object_keysdepends_on_skipped_cells§errored$8586d633-7c50-49ba-9b74-b5bdad27c317queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/d66ad0b4e19c289f"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAĖT*persist_js_state·has_pluto_hook_features§cell_id$8586d633-7c50-49ba-9b74-b5bdad27c317depends_on_disabled_cells§runtime   Qr)published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/d66ad0b4e19c289fdepends_on_skipped_cells§errored$bb439641-30bd-495d-ba70-06b2e27efdbdqueued¤logsrunning¦outputbody/make_gridworld (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA<6Dpersist_js_state·has_pluto_hook_features§cell_id$bb439641-30bd-495d-ba70-06b2e27efdbddepends_on_disabled_cells§runtime ^ڵpublished_object_keysdepends_on_skipped_cells§errored$aab6ca56-57ca-421e-9b71-e3e96681c4c5queued¤logsrunning¦outputbody=<div class="markdown"><h2>8.6 Trajectory Sampling</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAb]ٰpersist_js_state·has_pluto_hook_features§cell_id$aab6ca56-57ca-421e-9b71-e3e96681c4c5depends_on_disabled_cells§runtime 蚵published_object_keysdepends_on_skipped_cells§errored$41bb1f78-b83a-4a45-ba5c-faa94e112f45queued¤logsrunning¦outputbody4get_mcts_statistics (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAfipersist_js_state·has_pluto_hook_features§cell_id$41bb1f78-b83a-4a45-ba5c-faa94e112f45depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$0fff8e1b-d0c2-49b8-93b4-8d1615c26690queued¤logsrunning¦outputbodyM<script>
	
// Load the library for consistent smooth scrolling
const {default: scrollIntoView} = await import("data:text/javascript;base64,dmFyIFE9ZT0+Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lJiYxPT09ZS5ub2RlVHlwZSxVPShlLHQpPT4oIXR8fCJoaWRkZW4iIT09ZSkmJiJ2aXNpYmxlIiE9PWUmJiJjbGlwIiE9PWUsQT0oZSx0KT0+e2lmKGUuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0fHxlLmNsaWVudFdpZHRoPGUuc2Nyb2xsV2lkdGgpe2xldCBsPWdldENvbXB1dGVkU3R5bGUoZSxudWxsKTtyZXR1cm4gVShsLm92ZXJmbG93WSx0KXx8VShsLm92ZXJmbG93WCx0KXx8KGU9PntsZXQgdD0oZT0+e2lmKCFlLm93bmVyRG9jdW1lbnR8fCFlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZnJhbWVFbGVtZW50fWNhdGNoe3JldHVybiBudWxsfX0pKGUpO3JldHVybiEhdCYmKHQuY2xpZW50SGVpZ2h0PGUuc2Nyb2xsSGVpZ2h0fHx0LmNsaWVudFdpZHRoPGUuc2Nyb2xsV2lkdGgpfSkoZSl9cmV0dXJuITF9LFg9KGUsdCxsLG8sbixyLGkscyk9PnI8ZSYmaT50fHxyPmUmJmk8dD8wOnI8PWUmJnM8PWx8fGk+PXQmJnM+PWw/ci1lLW86aT50JiZzPGx8fHI8ZSYmcz5sP2ktdCtuOjAsJD1lPT5lLnBhcmVudEVsZW1lbnQ/PyhlLmdldFJvb3ROb2RlKCkuaG9zdHx8bnVsbCksdHQ9KGUsdCk9Pnt2YXIgbCxvLG4scjtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybltdO2xldHtzY3JvbGxNb2RlOmksYmxvY2s6cyxpbmxpbmU6YSxib3VuZGFyeTpoLHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzOnV9PXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgaD9oOmU9PmUhPT1oO2lmKCFRKGUpKXRocm93IFR5cGVFcnJvcigiSW52YWxpZCB0YXJnZXQiKTtsZXQgdj1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbT1bXSx3PWU7Zm9yKDtRKHcpJiZnKHcpOyl7aWYoKHc9JCh3KSk9PT12KXttLnB1c2godyk7YnJlYWt9bnVsbCE9dyYmdz09PWRvY3VtZW50LmJvZHkmJkEodykmJiFBKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCl8fG51bGwhPXcmJkEodyx1KSYmbS5wdXNoKHcpfWxldCBXPW51bGwhPShvPW51bGw9PShsPXdpbmRvdy52aXN1YWxWaWV3cG9ydCk/dm9pZCAwOmwud2lkdGgpP286aW5uZXJXaWR0aCxIPW51bGwhPShyPW51bGw9PShuPXdpbmRvdy52aXN1YWxWaWV3cG9ydCk/dm9pZCAwOm4uaGVpZ2h0KT9yOmlubmVySGVpZ2h0LHtzY3JvbGxYOl8sc2Nyb2xsWTp4fT13aW5kb3cse2hlaWdodDpFLHdpZHRoOlQsdG9wOk4scmlnaHQ6TCxib3R0b206WSxsZWZ0OkN9PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUj0ic3RhcnQiPT09c3x8Im5lYXJlc3QiPT09cz9OOiJlbmQiPT09cz9ZOk4rRS8yLFY9ImNlbnRlciI9PT1hP0MrVC8yOiJlbmQiPT09YT9MOkMsQj1bXTtmb3IobGV0IEQ9MDtEPG0ubGVuZ3RoO0QrKyl7bGV0IE89bVtEXSx7aGVpZ2h0Omosd2lkdGg6SSx0b3A6UyxyaWdodDpxLGJvdHRvbTp6LGxlZnQ6Rn09Ty5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZigiaWYtbmVlZGVkIj09PWkmJk4+PTAmJkM+PTAmJlk8PUgmJkw8PVcmJk4+PVMmJlk8PXomJkM+PUYmJkw8PXEpYnJlYWs7bGV0IEc9Z2V0Q29tcHV0ZWRTdHlsZShPKSxKPXBhcnNlSW50KEcuYm9yZGVyTGVmdFdpZHRoLDEwKSxLPXBhcnNlSW50KEcuYm9yZGVyVG9wV2lkdGgsMTApLFA9cGFyc2VJbnQoRy5ib3JkZXJSaWdodFdpZHRoLDEwKSxaPXBhcnNlSW50KEcuYm9yZGVyQm90dG9tV2lkdGgsMTApLGVlPTAsZXQ9MCxlbD0ib2Zmc2V0V2lkdGgiaW4gTz9PLm9mZnNldFdpZHRoLU8uY2xpZW50V2lkdGgtSi1QOjAsZW89Im9mZnNldEhlaWdodCJpbiBPP08ub2Zmc2V0SGVpZ2h0LU8uY2xpZW50SGVpZ2h0LUstWjowLGVuPSJvZmZzZXRXaWR0aCJpbiBPPzA9PT1PLm9mZnNldFdpZHRoPzA6SS9PLm9mZnNldFdpZHRoOjAsZXI9Im9mZnNldEhlaWdodCJpbiBPPzA9PT1PLm9mZnNldEhlaWdodD8wOmovTy5vZmZzZXRIZWlnaHQ6MDtpZih2PT09TyllZT0ic3RhcnQiPT09cz9SOiJlbmQiPT09cz9SLUg6Im5lYXJlc3QiPT09cz9YKHgseCtILEgsSyxaLHgrUix4K1IrRSxFKTpSLUgvMixldD0ic3RhcnQiPT09YT9WOiJjZW50ZXIiPT09YT9WLVcvMjoiZW5kIj09PWE/Vi1XOlgoXyxfK1csVyxKLFAsXytWLF8rVitULFQpLGVlPU1hdGgubWF4KDAsZWUreCksZXQ9TWF0aC5tYXgoMCxldCtfKTtlbHNle2VlPSJzdGFydCI9PT1zP1ItUy1LOiJlbmQiPT09cz9SLXorWitlbzoibmVhcmVzdCI9PT1zP1goUyx6LGosSyxaK2VvLFIsUitFLEUpOlItKFMrai8yKStlby8yLGV0PSJzdGFydCI9PT1hP1YtRi1KOiJjZW50ZXIiPT09YT9WLShGK0kvMikrZWwvMjoiZW5kIj09PWE/Vi1xK1ArZWw6WChGLHEsSSxKLFArZWwsVixWK1QsVCk7bGV0e3Njcm9sbExlZnQ6ZWksc2Nyb2xsVG9wOmVkfT1PO2VlPU1hdGgubWF4KDAsTWF0aC5taW4oZWQrZWUvZXIsTy5zY3JvbGxIZWlnaHQtai9lcitlbykpLGV0PU1hdGgubWF4KDAsTWF0aC5taW4oZWkrZXQvZW4sTy5zY3JvbGxXaWR0aC1JL2VuK2VsKSksUis9ZWQtZWUsVis9ZWktZXR9Qi5wdXNoKHtlbDpPLHRvcDplZSxsZWZ0OmV0fSl9cmV0dXJuIEJ9LGY9ZT0+e3ZhciB0O3JldHVybiExPT09ZT97YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0In06KHQ9ZSk9PT1PYmplY3QodCkmJjAhPT1PYmplY3Qua2V5cyh0KS5sZW5ndGg/ZTp7YmxvY2s6InN0YXJ0IixpbmxpbmU6Im5lYXJlc3QifX07ZnVuY3Rpb24gYyhlLHQpe3ZhciBsO2lmKCFlLmlzQ29ubmVjdGVkfHwhKGU9PntsZXQgdD1lO2Zvcig7dCYmdC5wYXJlbnROb2RlOyl7aWYodC5wYXJlbnROb2RlPT09ZG9jdW1lbnQpcmV0dXJuITA7dD10LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290P3QucGFyZW50Tm9kZS5ob3N0OnQucGFyZW50Tm9kZX1yZXR1cm4hMX0pKGUpKXJldHVybjtpZigib2JqZWN0Ij09dHlwZW9mKGw9dCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBsLmJlaGF2aW9yKXJldHVybiB0LmJlaGF2aW9yKHR0KGUsdCkpO2xldCBvPSJib29sZWFuIj09dHlwZW9mIHR8fG51bGw9PXQ/dm9pZCAwOnQuYmVoYXZpb3I7Zm9yKGxldHtlbDpuLHRvcDpyLGxlZnQ6aX1vZiB0dChlLGYodCkpKW4uc2Nyb2xsKHt0b3A6cixsZWZ0OmksYmVoYXZpb3I6b30pfXZhciBkLHA9KCk9PihkfHwoZD0icGVyZm9ybWFuY2UiaW4gd2luZG93P3BlcmZvcm1hbmNlLm5vdy5iaW5kKHBlcmZvcm1hbmNlKTpEYXRlLm5vdyksZCgpKTtmdW5jdGlvbiBiKGUpe2xldCB0PU1hdGgubWluKChwKCktZS5zdGFydFRpbWUpL2UuZHVyYXRpb24sMSksbD1lLmVhc2UodCksbz1lLnN0YXJ0WCsoZS54LWUuc3RhcnRYKSpsLG49ZS5zdGFydFkrKGUueS1lLnN0YXJ0WSkqbDtlLm1ldGhvZChvLG4sdCxsKSxvIT09ZS54fHxuIT09ZS55P3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+YihlKSk6ZS5jYigpfWZ1bmN0aW9uIHkoZSx0LGwpe2xldCBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTo2MDAsbj1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06ZT0+MSstLWUqZSplKmUqZSxyPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06dm9pZCAwLGk9YXJndW1lbnRzLmxlbmd0aD42P2FyZ3VtZW50c1s2XTp2b2lkIDAscz1lLnNjcm9sbExlZnQsYT1lLnNjcm9sbFRvcDtiKHtzY3JvbGxhYmxlOmUsbWV0aG9kKHQsbCxvLG4pe2xldCByPU1hdGguY2VpbCh0KSxzPU1hdGguY2VpbChsKTtlLnNjcm9sbExlZnQ9cixlLnNjcm9sbFRvcD1zLGk/Lih7dGFyZ2V0OmUsZWxhcHNlZDpvLHZhbHVlOm4sbGVmdDpyLHRvcDpzfSl9LHN0YXJ0VGltZTpwKCksc3RhcnRYOnMsc3RhcnRZOmEseDp0LHk6bCxkdXJhdGlvbjpvLGVhc2U6bixjYjpyfSl9dmFyIE09ZT0+ZSYmIWUuYmVoYXZpb3J8fCJzbW9vdGgiPT09ZS5iZWhhdmlvcixrPWZ1bmN0aW9uKGUsdCl7bGV0IGw9dHx8e307cmV0dXJuIE0obCk/YyhlLHtibG9jazpsLmJsb2NrLGlubGluZTpsLmlubGluZSxzY3JvbGxNb2RlOmwuc2Nyb2xsTW9kZSxib3VuZGFyeTpsLmJvdW5kYXJ5LHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzOmwuc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMsYmVoYXZpb3I6ZT0+UHJvbWlzZS5hbGwoZS5yZWR1Y2UoKGUsdCk9PntsZXR7ZWw6byxsZWZ0Om4sdG9wOnJ9PXQsaT1vLnNjcm9sbExlZnQscz1vLnNjcm9sbFRvcDtyZXR1cm4gaT09PW4mJnM9PT1yP2U6Wy4uLmUsbmV3IFByb21pc2UoZT0+eShvLG4scixsLmR1cmF0aW9uLGwuZWFzZSwoKT0+ZSh7ZWw6byxsZWZ0OltpLG5dLHRvcDpbcyxyXX0pLGwub25TY3JvbGxDaGFuZ2UpKV19LFtdKSl9KTpQcm9taXNlLnJlc29sdmUoYyhlLHQpKX07ZXhwb3J0e2sgYXMgZGVmYXVsdH07")

const indent = true
const aside = true
const title_text = "Table of Contents"
const include_definitions = false


const tocNode = html`<nav class="plutoui-toc">
	<header>
	 <span class="toc-toggle open-toc"></span>
	 <span class="toc-toggle closed-toc"></span>
	 ${title_text}
	</header>
	<section></section>
</nav>`

tocNode.classList.toggle("aside", aside)
tocNode.classList.toggle("indent", indent)


const getParentCell = el => el.closest("pluto-cell")

const getHeaders = () => {
	const depth = Math.max(1, Math.min(6, 3)) // should be in range 1:6
	const range = Array.from({length: depth}, (x, i) => i+1) // [1, ..., depth]
	
	const selector = [
		...(include_definitions ? [
			`pluto-notebook pluto-cell .pluto-docs-binding`, 
			`pluto-notebook pluto-cell assignee:not(:empty)`, 
		] : []),
		...range.map(i => `pluto-notebook pluto-cell h${i}`)
	].join(",")
	return Array.from(document.querySelectorAll(selector)).filter(el => 
		// exclude headers inside of a pluto-docs-binding block
		!(el.nodeName.startsWith("H") && el.closest(".pluto-docs-binding"))
	)
}


const document_click_handler = (event) => {
	const path = (event.path || event.composedPath())
	const toc = path.find(elem => elem?.classList?.contains?.("toc-toggle"))
	if (toc) {
		event.stopImmediatePropagation()
		toc.closest(".plutoui-toc").classList.toggle("hide")
	}
}

document.addEventListener("click", document_click_handler)


const header_to_index_entry_map = new Map()
const currently_highlighted_set = new Set()

const last_toc_element_click_time = { current: 0 }

const intersection_callback = (ixs) => {
	let on_top = ixs.filter(ix => ix.intersectionRatio > 0 && ix.intersectionRect.y < ix.rootBounds.height / 2)
	if(on_top.length > 0){
		currently_highlighted_set.forEach(a => a.classList.remove("in-view"))
		currently_highlighted_set.clear()
		on_top.slice(0,1).forEach(i => {
			let div = header_to_index_entry_map.get(i.target)
			div.classList.add("in-view")
			currently_highlighted_set.add(div)
			
			/// scroll into view
			/*
			const toc_height = tocNode.offsetHeight
			const div_pos = div.offsetTop
			const div_height = div.offsetHeight
			const current_scroll = tocNode.scrollTop
			const header_height = tocNode.querySelector("header").offsetHeight
			
			const scroll_to_top = div_pos - header_height
			const scroll_to_bottom = div_pos + div_height - toc_height
			
			// if we set a scrollTop, then the browser will stop any currently ongoing smoothscroll animation. So let's only do this if you are not currently in a smoothscroll.
			if(Date.now() - last_toc_element_click_time.current >= 2000)
				if(current_scroll < scroll_to_bottom){
					tocNode.scrollTop = scroll_to_bottom
				} else if(current_scroll > scroll_to_top){
					tocNode.scrollTop = scroll_to_top
				}
			*/
		})
	}
}
let intersection_observer_1 = new IntersectionObserver(intersection_callback, {
	root: null, // i.e. the viewport
  	threshold: 1,
	rootMargin: "-15px", // slightly smaller than the viewport
	// delay: 100,
})
let intersection_observer_2 = new IntersectionObserver(intersection_callback, {
	root: null, // i.e. the viewport
  	threshold: 1,
	rootMargin: "15px", // slightly larger than the viewport
	// delay: 100,
})

const render = (elements) => {
	header_to_index_entry_map.clear()
	currently_highlighted_set.clear()
	intersection_observer_1.disconnect()
	intersection_observer_2.disconnect()

		let last_level = `H1`
	return html`${elements.map(h => {
	const parent_cell = getParentCell(h)

		let [className, title_el] = h.matches(`.pluto-docs-binding`) ? ["pluto-docs-binding-el", h.firstElementChild] : [h.nodeName, h]

	const a = html`<a 
		class="${className}" 
		title="${title_el.innerText}"
		href="#${parent_cell.id}"
	>${title_el.innerHTML}</a>`
	/* a.onmouseover=()=>{
		parent_cell.firstElementChild.classList.add(
			'highlight-pluto-cell-shoulder'
		)
	}
	a.onmouseout=() => {
		parent_cell.firstElementChild.classList.remove(
			'highlight-pluto-cell-shoulder'
		)
	} */
		
		
	a.onclick=(e) => {
		e.preventDefault();
		last_toc_element_click_time.current = Date.now()
		scrollIntoView(h, {
			behavior: 'smooth', 
			block: 'start',
		}).then(() => 
			// sometimes it doesn't scroll to the right place
			// solution: try a second time!
			scrollIntoView(h, {
				behavior: 'smooth', 
				block: 'start',
			})
	   )
	}

	const row =  html`<div class="toc-row ${className} after-${last_level}">${a}</div>`
		intersection_observer_1.observe(title_el)
		intersection_observer_2.observe(title_el)
		header_to_index_entry_map.set(title_el, row)

	if(className.startsWith("H"))
		last_level = className
		
	return row
})}`
}

const invalidated = { current: false }

const updateCallback = () => {
	if (!invalidated.current) {
		tocNode.querySelector("section").replaceWith(
			html`<section>${render(getHeaders())}</section>`
		)
	}
}
updateCallback()
setTimeout(updateCallback, 100)
setTimeout(updateCallback, 1000)
setTimeout(updateCallback, 5000)

const notebook = document.querySelector("pluto-notebook")


// We have a mutationobserver for each cell:
const mut_observers = {
	current: [],
}

const createCellObservers = () => {
	mut_observers.current.forEach((o) => o.disconnect())
	mut_observers.current = Array.from(notebook.querySelectorAll("pluto-cell")).map(el => {
		const o = new MutationObserver(updateCallback)
		o.observe(el, {attributeFilter: ["class"]})
		return o
	})
}
createCellObservers()

// And one for the notebook's child list, which updates our cell observers:
const notebookObserver = new MutationObserver(() => {
	updateCallback()
	createCellObservers()
})
notebookObserver.observe(notebook, {childList: true})

// And finally, an observer for the document.body classList, to make sure that the toc also works when it is loaded during notebook initialization
const bodyClassObserver = new MutationObserver(updateCallback)
bodyClassObserver.observe(document.body, {attributeFilter: ["class"]})

// Hide/show the ToC when the screen gets small
let match_listener = () => 
	tocNode.classList.toggle("hide", (tocNode.closest("pluto-editor") ?? document.body).scrollWidth < 1000)
for(let s of [1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000]) {
	let m = matchMedia(`(max-width: ${s}px)`)
	m.addListener(match_listener)
	invalidation.then(() => m.removeListener(match_listener))
}
match_listener()

invalidation.then(() => {
	invalidated.current = true
	intersection_observer_1.disconnect()
	intersection_observer_2.disconnect()
	notebookObserver.disconnect()
	bodyClassObserver.disconnect()
	mut_observers.current.forEach((o) => o.disconnect())
	document.removeEventListener("click", document_click_handler)
})

return tocNode
</script>
<style>
@media not print {

.plutoui-toc {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Cantarell, "Apple Color Emoji",
		"Segoe UI Emoji", "Segoe UI Symbol", system-ui, sans-serif;
	--main-bg-color: #fafafa;
	--pluto-output-color: hsl(0, 0%, 36%);
	--pluto-output-h-color: hsl(0, 0%, 21%);
	--sidebar-li-active-bg: rgb(235, 235, 235);
	--icon-filter: unset;
}

@media (prefers-color-scheme: dark) {
	.plutoui-toc {
		--main-bg-color: #303030;
		--pluto-output-color: hsl(0, 0%, 90%);
		--pluto-output-h-color: hsl(0, 0%, 97%);
		--sidebar-li-active-bg: rgb(82, 82, 82);
		--icon-filter: invert(1);
	}
}

.plutoui-toc.aside {
	color: var(--pluto-output-color);
	position: fixed;
	right: 1rem;
	top: 5rem;
	width: min(80vw, 300px);
	padding: 0.5rem;
	padding-top: 0em;
	/* border: 3px solid rgba(0, 0, 0, 0.15); */
	border-radius: 10px;
	/* box-shadow: 0 0 11px 0px #00000010; */
	max-height: calc(100vh - 5rem - 90px);
	overflow: auto;
	z-index: 40;
	background-color: var(--main-bg-color);
	transition: transform 300ms cubic-bezier(0.18, 0.89, 0.45, 1.12);
}

.plutoui-toc.aside.hide {
	transform: translateX(calc(100% - 28px));
}
.plutoui-toc.aside.hide section {
	display: none;
}
.plutoui-toc.aside.hide header {
	margin-bottom: 0em;
	padding-bottom: 0em;
	border-bottom: none;
}
}  /* End of Media print query */
.plutoui-toc.aside.hide .open-toc,
.plutoui-toc.aside:not(.hide) .closed-toc,
.plutoui-toc:not(.aside) .closed-toc {
	display: none;
}

@media (prefers-reduced-motion) {
  .plutoui-toc.aside {
	transition-duration: 0s;
  }
}

.toc-toggle {
	cursor: pointer;
    padding: 1em;
    margin: -1em;
    margin-right: -0.7em;
    line-height: 1em;
    display: flex;
}

.toc-toggle::before {
    content: "";
    display: inline-block;
    height: 1em;
    width: 1em;
    background-image: url("https://cdn.jsdelivr.net/gh/ionic-team/ionicons@5.5.1/src/svg/list-outline.svg");
	/* generated using https://dopiaza.org/tools/datauri/index.php */
    background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHRpdGxlPmlvbmljb25zLXY1LW88L3RpdGxlPjxsaW5lIHgxPSIxNjAiIHkxPSIxNDQiIHgyPSI0NDgiIHkyPSIxNDQiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozMnB4Ii8+PGxpbmUgeDE9IjE2MCIgeTE9IjI1NiIgeDI9IjQ0OCIgeTI9IjI1NiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjMycHgiLz48bGluZSB4MT0iMTYwIiB5MT0iMzY4IiB4Mj0iNDQ4IiB5Mj0iMzY4IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MzJweCIvPjxjaXJjbGUgY3g9IjgwIiBjeT0iMTQ0IiByPSIxNiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjMycHgiLz48Y2lyY2xlIGN4PSI4MCIgY3k9IjI1NiIgcj0iMTYiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozMnB4Ii8+PGNpcmNsZSBjeD0iODAiIGN5PSIzNjgiIHI9IjE2IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MzJweCIvPjwvc3ZnPg==");
    background-size: 1em;
	filter: var(--icon-filter);
}

.aside .toc-toggle.open-toc:hover::before {
    background-image: url("https://cdn.jsdelivr.net/gh/ionic-team/ionicons@5.5.1/src/svg/arrow-forward-outline.svg");
	/* generated using https://dopiaza.org/tools/datauri/index.php */
    background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHRpdGxlPmlvbmljb25zLXY1LWE8L3RpdGxlPjxwb2x5bGluZSBwb2ludHM9IjI2OCAxMTIgNDEyIDI1NiAyNjggNDAwIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NDhweCIvPjxsaW5lIHgxPSIzOTIiIHkxPSIyNTYiIHgyPSIxMDAiIHkyPSIyNTYiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDo0OHB4Ii8+PC9zdmc+");
}
.aside .toc-toggle.closed-toc:hover::before {
    background-image: url("https://cdn.jsdelivr.net/gh/ionic-team/ionicons@5.5.1/src/svg/arrow-back-outline.svg");
	/* generated using https://dopiaza.org/tools/datauri/index.php */
    background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHRpdGxlPmlvbmljb25zLXY1LWE8L3RpdGxlPjxwb2x5bGluZSBwb2ludHM9IjI0NCA0MDAgMTAwIDI1NiAyNDQgMTEyIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NDhweCIvPjxsaW5lIHgxPSIxMjAiIHkxPSIyNTYiIHgyPSI0MTIiIHkyPSIyNTYiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDA7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDo0OHB4Ii8+PC9zdmc+");
}



.plutoui-toc header {
	display: flex;
	align-items: center;
	gap: .3em;
	font-size: 1.5em;
	/* margin-top: -0.1em; */
	margin-bottom: 0.4em;
	padding: 0.5rem;
	margin-left: 0;
	margin-right: 0;
	font-weight: bold;
	/* border-bottom: 2px solid rgba(0, 0, 0, 0.15); */
	position: sticky;
	top: 0px;
	background: var(--main-bg-color);
	z-index: 41;
}
.plutoui-toc.aside header {
	padding-left: 0;
	padding-right: 0;
}

.plutoui-toc section .toc-row {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	padding: .1em;
	border-radius: .2em;
}

.plutoui-toc section .toc-row.H1 {
	margin-top: 1em;
}


.plutoui-toc.aside section .toc-row.in-view {
	background: var(--sidebar-li-active-bg);
}


	
.highlight-pluto-cell-shoulder {
	background: rgba(0, 0, 0, 0.05);
	background-clip: padding-box;
}

.plutoui-toc section a {
	text-decoration: none;
	font-weight: normal;
	color: var(--pluto-output-color);
}
.plutoui-toc section a:hover {
	color: var(--pluto-output-h-color);
}

.plutoui-toc.indent section a.H1 {
	font-weight: 700;
	line-height: 1em;
}

.plutoui-toc.indent section .after-H2 a { padding-left: 10px; }
.plutoui-toc.indent section .after-H3 a { padding-left: 20px; }
.plutoui-toc.indent section .after-H4 a { padding-left: 30px; }
.plutoui-toc.indent section .after-H5 a { padding-left: 40px; }
.plutoui-toc.indent section .after-H6 a { padding-left: 50px; }

.plutoui-toc.indent section a.H1 { padding-left: 0px; }
.plutoui-toc.indent section a.H2 { padding-left: 10px; }
.plutoui-toc.indent section a.H3 { padding-left: 20px; }
.plutoui-toc.indent section a.H4 { padding-left: 30px; }
.plutoui-toc.indent section a.H5 { padding-left: 40px; }
.plutoui-toc.indent section a.H6 { padding-left: 50px; }


.plutoui-toc.indent section a.pluto-docs-binding-el,
.plutoui-toc.indent section a.ASSIGNEE
	{
	font-family: JuliaMono, monospace;
	font-size: .8em;
	/* background: black; */
	font-weight: 700;
    font-style: italic;
	color: var(--cm-var-color); /* this is stealing a variable from Pluto, but it's fine if that doesnt work */
}
.plutoui-toc.indent section a.pluto-docs-binding-el::before,
.plutoui-toc.indent section a.ASSIGNEE::before
	{
	content: "> ";
	opacity: .3;
}
</style>
mimetext/htmlrootassigneelast_run_timestampA<persist_js_state·has_pluto_hook_features§cell_id$0fff8e1b-d0c2-49b8-93b4-8d1615c26690depends_on_disabled_cells§runtimeP+published_object_keysdepends_on_skipped_cells§errored$4e1c115a-4020-4a5a-a79a-56056892a953queued¤logsrunning¦outputbody;<div class="markdown"><h2>Gridworld Environment</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAc}persist_js_state·has_pluto_hook_features§cell_id$4e1c115a-4020-4a5a-a79a-56056892a953depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$324181f0-b890-4198-9b4b-c36547e6629aqueued¤logsrunning¦outputbody8create_ϵ_greedy_policy (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAìpersist_js_state·has_pluto_hook_features§cell_id$324181f0-b890-4198-9b4b-c36547e6629adepends_on_disabled_cells§runtime :Bpublished_object_keysdepends_on_skipped_cells§errored$eded8b72-70f4-4579-ba69-2eca409fa684queued¤logsrunning¦outputbody*plot_path (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAWnpersist_js_state·has_pluto_hook_features§cell_id$eded8b72-70f4-4579-ba69-2eca409fa684depends_on_disabled_cells§runtime ﵵpublished_object_keysdepends_on_skipped_cells§errored$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6queued¤logsrunning¦outputbodym_<div style = "background-color: white; color: black; display: flex; align-items: center; justify-content: center;">
<div>	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/ad3aa1d6cffe4c04"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
</div>
<div><div style = "display: flex; flex-direction: column; align-items: center; justify-content: center; color: black; background-color: rgba(100, 100, 100, 0.1);">
	<div style = "display: flex; align-items: center; justify-content: center;">
	<div class = "downarrow" style = "transform: rotate(90deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(270deg);"></div>
	<div class = "downarrow" style = "position: absolute;"></div>
	</div>
	<div>Actions</div>
</div>
</div>
</div>
mimetext/htmlrootassigneelast_run_timestampAApersist_js_state·has_pluto_hook_features§cell_id$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6depends_on_disabled_cells§runtime y|published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/ad3aa1d6cffe4c04depends_on_skipped_cells§errored$6a4116c9-87cf-4ee7-8030-aa1150853984queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/f514ba9bca5ec68d"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampA_Fpersist_js_state·has_pluto_hook_features§cell_id$6a4116c9-87cf-4ee7-8030-aa1150853984depends_on_disabled_cells§runtimeX@published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/f514ba9bca5ec68ddepends_on_skipped_cells§errored$ee0f55c6-e9c6-4199-9f27-5706f3c84863queued¤logsrunning¦outputbody9<div class="markdown"><h3>MCTS Implementation</h3>
</div>mimetext/htmlrootassigneelast_run_timestampAbpersist_js_state·has_pluto_hook_features§cell_id$ee0f55c6-e9c6-4199-9f27-5706f3c84863depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$caca8d95-e40e-4592-b29e-a7e8b19faeb5queued¤logsrunning¦outputbody	<div class="markdown"><p>Modifying Dyna-Q&#43; with this method of action selection no longer uses the ϵ-greedy policy for exploration as before and instead directly encourages exploration in the policy itself which no longer follows the value estimates directly.  Now, during the planning steps, we still update the value function using existing data.  The bonus reward for old experiences will only have an impact on the data collection by encouraging visits to states that have not been seen for a while.  The original method instead operates under the assumption that the value estimate updates during planning may be underestimating the value of states visited a long time ago and will boost their value increasing the chance of action selection indirectly.  </p>
<p>One problem with the method that modifies the action selection directly is that once the agent has found an optimal policy, along the trajectory of that path many state action pairs will be frequently visited, so an agent may deviate from that path for one action which has not been attempted in a while, but then by the same logic, the transition immediately back to the optimal state will be favored over all others since that transition hasn&#39;t been visited for a long time as well.  The agent may deviate slightly from the optimal path but never for long.  With DynaQ&#43;, however, eventually, unvisited states no matter how far away they are from the optimal path will eventually be visited since during planning those value bonuses will propagate throughout the whole environment.  That may be one reason why in the shortcut maze task, the modified DynaQ&#43; agent shown above never finds the shortcut and falls into the same trap as unmodified DynaQ.  If the goal is to find cases where the model is wrong even if it is far away in state space from the previously optimal policy, then DynaQ&#43; is a much more effective method than the one acting directly on action selection.</p>
<p>Similar to the original DynaQ, if the model is correct, then this algorithm will follow the optimal policy more often than DynaQ&#43; because very few deviations from optimal are tollerated.  You can see in both figures, once the environment is stable, the modified algorithm starts accumulating reward faster.  For the bloacking maze task, this method might perform the best over a certain time horizon by finding the new path faster than DynaQ but also consistently sticking new to the optimum more than DyanQ&#43;.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAa.persist_js_state·has_pluto_hook_features§cell_id$caca8d95-e40e-4592-b29e-a7e8b19faeb5depends_on_disabled_cells§runtime Qpublished_object_keysdepends_on_skipped_cells§errored$24efe9b4-9308-4ad1-8ef0-69f6f93407c0queued¤logsrunning¦outputbody<div class="markdown"><blockquote>
<h3><em>Exercise 8.2</em></h3>
<p>Why did the Dyna agent with exploration bonus, Dyna-Q&#43;, perform better in the first phase as well as in the second phase of the blocking and shortcut experiments?</p>
</blockquote>
<p>For the second phase, the maze changed in both cases so the exploration reward bonus in Dyna-Q&#43; encourages the policy to attempt different actions that have not been visited recently which would result in model updates that reflect the new environment.  For the first phase where the model is accurate, this task may benefit from larger initial exploration than the ϵ of 0.1 provides.  In that case the Dyna-Q&#43; reward simply acts like if we had a larger ϵ in the first place which may result in faster learning.</p>
</div>mimetext/htmlrootassigneelast_run_timestampA`Ĝpersist_js_state·has_pluto_hook_features§cell_id$24efe9b4-9308-4ad1-8ef0-69f6f93407c0depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$ecd8742c-2e10-4814-b477-7024e85b7fa6queued¤logsrunning¦outputbody7make_ϵ_greedy_policy! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA!Mװpersist_js_state·has_pluto_hook_features§cell_id$ecd8742c-2e10-4814-b477-7024e85b7fa6depends_on_disabled_cells§runtime  8published_object_keysdepends_on_skipped_cells§errored$beae0491-ed11-4edf-a136-d384578b088bqueued¤logsrunning¦outputbodyelementsprefixLeftelementstypestructprefix_shortLeftobjectidffffffffac7e5e95!application/vnd.pluto.tree+objectprefix@Dict{Main.var"workspace#3".GridworldState, Dict{Int64, Float32}}elementsprefixGridworldStateelementsx4text/plainy1text/plaintypestructprefix_shortGridworldStateobjectidab95892322307750!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elementstypeDictprefix_shortDictobjectidfe0560e2b3db5142!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy4text/plaintypestructprefix_shortGridworldStateobjectid325862729a669fde!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain52.0text/plain2text/plain51.0text/plain3text/plain81.0text/plain1text/plain56.0text/plaintypeDictprefix_shortDictobjectidfea827f9b51debbc!application/vnd.pluto.tree+objectprefixGridworldStateelementsx4text/plainy2text/plaintypestructprefix_shortGridworldStateobjectid27c77ee455c46eb4!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elementstypeDictprefix_shortDictobjectid5f92f37df6f67837!application/vnd.pluto.tree+objectprefixGridworldStateelementsx3text/plainy1text/plaintypestructprefix_shortGridworldStateobjectidec7c7c34fdbec3f2!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain1.0text/plaintypeDictprefix_shortDictobjectid9c938c3ef0f77498!application/vnd.pluto.tree+objectprefixGridworldStateelementsx2text/plainy1text/plaintypestructprefix_shortGridworldStateobjectidef30e57a3ff0766e!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain1.0text/plain2text/plain6.0text/plain3text/plain2.0text/plain1text/plain2.0text/plaintypeDictprefix_shortDictobjectid4915531949faf4f6!application/vnd.pluto.tree+objectprefixGridworldStateelementsx3text/plainy6text/plaintypestructprefix_shortGridworldStateobjectid87fd641095222e9d!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain2.0text/plain2text/plain5.0text/plain3text/plain2.0text/plain1text/plain3.0text/plaintypeDictprefix_shortDictobjectide6bf3012854eb8fe!application/vnd.pluto.tree+objectprefixGridworldStateelementsx2text/plainy5text/plaintypestructprefix_shortGridworldStateobjectidc75547dd94f170c1!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain18.0text/plain2text/plain17.0text/plain3text/plain14.0text/plain1text/plain14.0text/plaintypeDictprefix_shortDictobjectid45a738d1431ece42!application/vnd.pluto.tree+objectprefixGridworldStateelementsx2text/plainy2text/plaintypestructprefix_shortGridworldStateobjectid74f497567b7de001!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain7.0text/plain2text/plain5.0text/plain3text/plain9.0text/plain1text/plain9.0text/plaintypeDictprefix_shortDictobjectidef85c8cf96dc001c!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy3text/plaintypestructprefix_shortGridworldStateobjectid7d75a91561e03d66!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain25.0text/plain2text/plain26.0text/plain3text/plain30.0text/plain1text/plain24.0text/plaintypeDictprefix_shortDictobjectidc6701cc644addeca!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy1text/plaintypestructprefix_shortGridworldStateobjectid78e123e4099fe993!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain3.0text/plain2text/plain2.0text/plain3text/plain9.0text/plain1text/plain5.0text/plaintypeDictprefix_shortDictobjectidd08c069758e85958!application/vnd.pluto.tree+objectmoretypeDictprefix_shortDictobjectid674101c8864f7c1c!application/vnd.pluto.tree+objectprefix@Dict{Main.var"workspace#3".GridworldState, Dict{Int64, Float32}}elementsprefixGridworldStateelementsx4text/plainy1text/plaintypestructprefix_shortGridworldStateobjectidab95892322307750!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elementstypeDictprefix_shortDictobjectida2539aee7c77bf3b!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy4text/plaintypestructprefix_shortGridworldStateobjectid325862729a669fde!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain0.700827text/plain2text/plain0.696991text/plain3text/plain0.76413text/plain1text/plain0.70808text/plaintypeDictprefix_shortDictobjectid77508f52a66eb858!application/vnd.pluto.tree+objectprefixGridworldStateelementsx4text/plainy2text/plaintypestructprefix_shortGridworldStateobjectid27c77ee455c46eb4!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elementstypeDictprefix_shortDictobjectid81bc4d30bb492978!application/vnd.pluto.tree+objectprefixGridworldStateelementsx3text/plainy1text/plaintypestructprefix_shortGridworldStateobjectidec7c7c34fdbec3f2!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain0.95text/plaintypeDictprefix_shortDictobjectid5beb9b7d6fa78bb2!application/vnd.pluto.tree+objectprefixGridworldStateelementsx2text/plainy1text/plaintypestructprefix_shortGridworldStateobjectidef30e57a3ff0766e!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain0.9025text/plain2text/plain0.838876text/plain3text/plain0.818798text/plain1text/plain0.774799text/plaintypeDictprefix_shortDictobjectidef5f4d85968ee30c!application/vnd.pluto.tree+objectprefixGridworldStateelementsx3text/plainy6text/plaintypestructprefix_shortGridworldStateobjectid87fd641095222e9d!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain0.92625text/plain2text/plain0.852775text/plain3text/plain0.882253text/plain1text/plain0.858127text/plaintypeDictprefix_shortDictobjectidf38a11889ee47522!application/vnd.pluto.tree+objectprefixGridworldStateelementsx2text/plainy5text/plaintypestructprefix_shortGridworldStateobjectidc75547dd94f170c1!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain0.814499text/plain2text/plain0.780975text/plain3text/plain0.776294text/plain1text/plain0.782916text/plaintypeDictprefix_shortDictobjectid29d052208b71045d!application/vnd.pluto.tree+objectprefixGridworldStateelementsx2text/plainy2text/plaintypestructprefix_shortGridworldStateobjectid74f497567b7de001!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain0.855627text/plain2text/plain0.795567text/plain3text/plain0.814752text/plain1text/plain0.82404text/plaintypeDictprefix_shortDictobjectida849892608637e6e!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy3text/plaintypestructprefix_shortGridworldStateobjectid7d75a91561e03d66!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain0.773485text/plain2text/plain0.76205text/plain3text/plain0.787554text/plain1text/plain0.768714text/plaintypeDictprefix_shortDictobjectid7bb057d7af2e5372!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy1text/plaintypestructprefix_shortGridworldStateobjectid78e123e4099fe993!application/vnd.pluto.tree+objectprefixDict{Int64, Float32}elements4text/plain0.835238text/plain2text/plain0.777856text/plain3text/plain0.827622text/plain1text/plain0.853253text/plaintypeDictprefix_shortDictobjectidc7e9f02a47a452f2!application/vnd.pluto.tree+objectmoretypeDictprefix_shortDictobjectid726018cd1c8db039!application/vnd.pluto.tree+objecttypeTupleobjectidd953fb7fee844eb0mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampA^tpersist_js_state·has_pluto_hook_features§cell_id$beae0491-ed11-4edf-a136-d384578b088bdepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$562e824c-34b5-415d-b186-d8e2cf1980e7queued¤logsrunning¦outputbody+figure_8_5 (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAʛΫpersist_js_state·has_pluto_hook_features§cell_id$562e824c-34b5-415d-b186-d8e2cf1980e7depends_on_disabled_cells§runtime Epublished_object_keysdepends_on_skipped_cells§errored$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69queued¤logsrunning¦outputbody1show_grid_policy (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAIpersist_js_state·has_pluto_hook_features§cell_id$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69depends_on_disabled_cells§runtime8µpublished_object_keysdepends_on_skipped_cells§errored$eb9ba23d-bee5-4bb1-b3e1-fe40d9f681dcqueued¤logsrunning¦outputbody-check_policy (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAUpersist_js_state·has_pluto_hook_features§cell_id$eb9ba23d-bee5-4bb1-b3e1-fe40d9f681dcdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771bqueued¤logsrunning¦outputbody8monte_carlo_tree_search (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA\)persist_js_state·has_pluto_hook_features§cell_id$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771bdepends_on_disabled_cells§runtime \published_object_keysdepends_on_skipped_cells§errored$6cf35193-dba5-4f78-a4ac-245dda7a0846queued¤logsrunning¦outputbody9begin_value_iteration_v (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAG<persist_js_state·has_pluto_hook_features§cell_id$6cf35193-dba5-4f78-a4ac-245dda7a0846depends_on_disabled_cells§runtime #published_object_keysdepends_on_skipped_cells§errored$39c96fc8-8259-46e3-88a0-a14eb6752b5cqueued¤logsrunning¦outputbody0show_grid_value (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA,persist_js_state·has_pluto_hook_features§cell_id$39c96fc8-8259-46e3-88a0-a14eb6752b5cdepends_on_disabled_cells§runtime u۵published_object_keysdepends_on_skipped_cells§errored$4494cb61-ee2c-467b-9bf6-0afb59023e91queued¤logsrunning¦outputbody&sarsa (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$4494cb61-ee2c-467b-9bf6-0afb59023e91depends_on_disabled_cells§runtime V>published_object_keysdepends_on_skipped_cells§errored$618b5f35-2df5-4ffb-a34f-add542691080queued¤logsrunning¦outputbody)takestep (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$618b5f35-2df5-4ffb-a34f-add542691080depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$0f9080af-f166-4a78-a003-8df07f6c27d4queued¤logsrunning¦outputbodyc<style>
	.downarrow {
		display: flex;
		justify-content: center;
		align-items: center;
		flex-direction: column;
	}

	.downarrow::before {
		content: '';
		width: 2px;
		height: 40px;
		background-color: black;
	}
	.downarrow::after {
		content: '';
		width: 0px;
		height: 0px;
		border-left: 5px solid transparent;
		border-right: 5px solid transparent;
		border-top: 10px solid black;
	}

	.gridcell {
			display: flex;
			justify-content: center;
			align-items: center;
			border: 1px solid black;
		}

	.windbox {
		height: 40px;
		width: 40px;
		display: flex;
		justify-content: center;
		align-items: center;
		transform: rotate(180deg);
		background-color: green;
	}

	.windbox * {
		background-color: green;
		color: green;
	}

	.windbox[w="0"] {
		opacity: 0.0; 
	}

	.windbox[w="1"] {
		opacity: 0.5;
	}

	.windbox[w="2"] {
		opacity: 1.0;
	}
</style>
mimetext/htmlrootassigneelast_run_timestampAlpersist_js_state·has_pluto_hook_features§cell_id$0f9080af-f166-4a78-a003-8df07f6c27d4depends_on_disabled_cells§runtime++published_object_keysdepends_on_skipped_cells§errored$f8bf29fe-568f-437f-ba82-6b861988a18equeued¤logsrunning¦outputbody4make_greedy_policy! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$f8bf29fe-568f-437f-ba82-6b861988a18edepends_on_disabled_cells§runtime "P۵published_object_keysdepends_on_skipped_cells§errored$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3queued¤logsrunning¦outputbody*figure8_3 (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAP<Cpersist_js_state·has_pluto_hook_features§cell_id$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3depends_on_disabled_cells§runtime)^wpublished_object_keysdepends_on_skipped_cells§errored$b15f1262-1acf-40e5-87a7-bc4b1b437a42queued¤logsrunning¦outputbody,runepisode (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampA$:Ұpersist_js_state·has_pluto_hook_features§cell_id$b15f1262-1acf-40e5-87a7-bc4b1b437a42depends_on_disabled_cells§runtime Gmpublished_object_keysdepends_on_skipped_cells§errored$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2queued¤logsrunning¦outputbody/expected_sarsa (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAupersist_js_state·has_pluto_hook_features§cell_id$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2depends_on_disabled_cells§runtime ypublished_object_keysdepends_on_skipped_cells§errored$b3a5adcb-5343-44e9-9466-1c51c1143a0dqueued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/e3f0ea7a069278b6"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampANϰpersist_js_state·has_pluto_hook_features§cell_id$b3a5adcb-5343-44e9-9466-1c51c1143a0ddepends_on_disabled_cells§runtimeΞpublished_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/e3f0ea7a069278b6depends_on_skipped_cells§errored$80affd41-b5e6-4b9c-b827-4e3b39bd7767queued¤logsrunning¦outputbody3value_iteration_v! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA@Xpersist_js_state·has_pluto_hook_features§cell_id$80affd41-b5e6-4b9c-b827-4e3b39bd7767depends_on_disabled_cells§runtime >published_object_keysdepends_on_skipped_cells§errored$9a1b250f-b404-4db3-a4b7-4cd33b79d921queued¤logsrunning¦outputbody5create_greedy_policy (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAŽ<persist_js_state·has_pluto_hook_features§cell_id$9a1b250f-b404-4db3-a4b7-4cd33b79d921depends_on_disabled_cells§runtime +vpublished_object_keysdepends_on_skipped_cells§errored$db66615e-fbbc-4ea8-b529-bdc14e58a215queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/69fe4d8c476440b4"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAʕIpersist_js_state·has_pluto_hook_features§cell_id$db66615e-fbbc-4ea8-b529-bdc14e58a215depends_on_disabled_cells§runtime%H^published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/69fe4d8c476440b4depends_on_skipped_cells§errored$72b40384-9ca1-4bc1-8e1a-8b639d39e215queued¤logsrunning¦outputbody<div class="markdown"><p>In this section we compare two ways of distributing updates.  The classical approach, from dynamic programming, is to perform sweeps through the entire state &#40;or state-action&#41; space, updating each state &#40;or state-action pair&#41; once per sweep.  This is problematic on large tasks because there may not be time to complete even one sweep.  In many tasks, the vast majority or the states are irrelevant because they are visited only under very poor policies or with very low probability.  Exhaustive sweeps implicitely devote equal time to all parts of the state space rather than focusing where it is needed.  As we discussed in Chapter 4, exhaustive sweeps and the equal treatment of all states that they imply are not necessary properties of dynamic programming.  In principle, updates can be distributed in any way one likes &#40;to assure convergence, all states or state-action pairs must be visited in the limit an infinite number of times; although an exception to this is discussed in Section 8.7 below&#41;, but in practice exhaustive sweeps are often used.</p>
<p>The second approach is to sample from the state or state-action space according to some distribution.  One could sample uniformly, as in the Dyna-Q agent, but this would suffer from some of the same problems as exhaustive sweeps.  More appealing is to distribute updates according to the on-poliy distribution, that is according to the distribution observed when following the current policy.  One advantage of this distribution is that it is easily generated; one simply interacts with the model, following the current policy.  In an episodic task, one starts in a start state &#40;or according to the starting-state distribution&#41; and simulates until the terminal state.  In a continuing task, one starts anywhere and just keeps simulating.  In either case, sample state transitions and rewards are given by the model, and sample actions are given by the current policy.  In other words, one simulates explicit individual trajectories and performs updates at the state or state-action pairs encountered along the way.  We call this way of generating experience and updates <em>trajectory sampling</em>.</p>
<p>Is the on-policy distribution of updates a good one?  Intuitively it seems like a good choice, at least better than the uniform distribution.  For example, if you are learning to play chess, you study positions that might arise in real games, not random positions of chess pieces.  The latter may be valid states, but to be able to accurately value them is a different skill from evaluating positions in real games.  We will also see in Part II that the on policy distribution has significant advantages when function approximation is used.  Whether or not function approximation is used, one might expect on-policy focusing to significantly improve the speed of planning.</p>
<p>The following experiment attempts to assess empirically the value of sampling from the on policy distribution by comparing it directly to the alternative of <em>uniform</em> sampling.  In the <em>uniform</em> case, all state action pairs are updated once in place and in the <em>on-policy</em> case an episode is imulated starting from the same state and updating each state-action pair that occured under the current <span class="tex">$\epsilon$</span>-greedy policy <span class="tex">$&#40;\epsilon &#61; 0.1&#41;$</span>.  The tasks were undiscounted episodic tasks, generated randomly as follows.  From each of the <span class="tex">$\vert \mathcal&#123;S&#125; \vert$</span> states, two actions were possible, each of which results in one of <span class="tex">$b$</span> next states, all equally likely, with a different random selection of <span class="tex">$b$</span> states for each state-action pair.  The branching factor, <span class="tex">$b$</span>, was the same for all state-action pairs.  In addition, on all transitions there was a 0.1 probability of transition to the terminal state, ending the episode.  The expected reward on each transition was selected from a Gaussian distribution with mean 0 and variance 1.  At any point in the planning process one can stop and exhaustively compute <span class="tex">$v_&#123;\tilde \pi&#125;&#40;s_0&#41;$</span>, the true value of the start state under the greedy policy, <span class="tex">$\tilde \pi$</span>, given the current action-value function <span class="tex">$Q$</span>, as in indication of how well the agent would do on a new episode on which it acted greedily &#40;all while assuming the model is correct&#41;.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAbpersist_js_state·has_pluto_hook_features§cell_id$72b40384-9ca1-4bc1-8e1a-8b639d39e215depends_on_disabled_cells§runtime f+published_object_keysdepends_on_skipped_cells§errored$63bf9d16-4516-4cec-895f-f010275bca16queued¤logsrunning¦outputbodyD<div class="markdown"><h2>8.5 Expected vs Sample Updates</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAapersist_js_state·has_pluto_hook_features§cell_id$63bf9d16-4516-4cec-895f-f010275bca16depends_on_disabled_cells§runtime +published_object_keysdepends_on_skipped_cells§errored$0adcbce8-2be5-48ef-af43-04815e10dc5cqueued¤logsrunning¦outputbody5make_greedy_policy! (generic function with 5 methods)mimetext/plainrootassigneelast_run_timestampAŰn?persist_js_state·has_pluto_hook_features§cell_id$0adcbce8-2be5-48ef-af43-04815e10dc5cdepends_on_disabled_cells§runtime 0jpublished_object_keysdepends_on_skipped_cells§errored$f9e4baec-c988-4abd-9bb0-c618c0ec07b9queued¤logsrunning¦outputbody)rollout (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$f9e4baec-c988-4abd-9bb0-c618c0ec07b9depends_on_disabled_cells§runtime .Ipublished_object_keysdepends_on_skipped_cells§errored$502a7125-4460-4d39-be14-4852fb6d9ad2queued¤logsrunning¦outputbody+plot_path (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampAWְpersist_js_state·has_pluto_hook_features§cell_id$502a7125-4460-4d39-be14-4852fb6d9ad2depends_on_disabled_cells§runtime cDpublished_object_keysdepends_on_skipped_cells§errored$31072f9b-de1b-42cf-a187-cbff99b49b50queued¤logsrunning¦outputbody<div class="markdown"><p>Throughout the book we have considered a variety of value-function updates for the state value <span class="tex">$v&#40;s&#41;$</span> and the state-action value <span class="tex">$q&#40;s, a&#41;$</span>.  Broadly, they can be separated into expected updates and sample-updates.  The first expected update considered was for dynamic programming in which we make use of the full probability transition function <span class="tex">$p&#40;s^\prime, r \vert s, a&#41;$</span>.  When used with a policy <span class="tex">$\pi$</span> that provides a probability distribution over actions for each state, this technique is called <em>policy evaluation</em> and when a maximization is used over actions to find optimal value function and policy policy, this corresponds to <em>value iteration</em>.  Both of these techniques could be used with either the state or state-action value function.</p>
<p>The expected update for a state-action pair, <span class="tex">$s,a$</span>, is:</p>
<p class="tex">$$Q&#40;s, a&#41; \leftarrow \sum_&#123;s^\prime,r&#125;\hat p &#40;s^\prime,r \vert s, a&#41; \left &#91; \gamma \max_&#123;a^\prime&#125; Q&#40;s^\prime, a^\prime&#41; \right &#93; \tag&#123;8.1&#125;$$</p>
<p>Considering just one-step sample updates, we use an environment to sample a transition: <span class="tex">$&#40;s, a&#41; \rightarrow &#40;s^\prime, r&#41;$</span>.  Since we do not use the full probability transition function, the updates make use of a learning rate and accumulate samples over time either with Sarsa or Q-learning.  </p>
<p>The corresponding sample update for <span class="tex">$s,a$</span> given a sample next state and reward, <span class="tex">$S^\prime$</span> and <span class="tex">$R$</span> &#40;from the model&#41;, is the Q-learning-like update:</p>
<p class="tex">$$Q&#40;s, a&#41; \leftarrow Q&#40;s, a&#41; &#43; \alpha \left &#91; R &#43; \gamma \max_&#123;a^\prime&#125; Q&#40;s^\prime, a^\prime&#41; - Q&#40;s, a&#41; \right &#93; \tag&#123;8.2&#125;$$</p>
<p>where <span class="tex">$\alpha$</span> is the usual positive step-size parameter.</p>
<p>The difference between expected and sample updates is significant to the extent that the environment is stochastic, specifically, to the extent that, given a state and action, many possible next states may occur with various probabilities.  If only one next state is possible, then the expected and sample updates given above are identical &#40;taking <span class="tex">$\alpha&#61;1$</span>&#41;.  If there are many possible next states, then tehre may be significant differences.  In favor  of the expected update is that it is an exact computation, resulting in a new <span class="tex">$Q&#40;s, a&#41;$</span> whose correctness is limited only by the correctness of the <span class="tex">$Q&#40;s^\prime, a^\prime&#41;$</span> at successor states.  The sample update is in addition affected by sampling error.  On the other hand, the sample update is cheaper computationally because it considers only one next state, not all possible next states.  In practice, the computation required by update operations is usually dominated by the number of state-action pairs at which <span class="tex">$Q$</span> is evaluated.  For a particular starting pair, <span class="tex">$s, a$</span>, let <span class="tex">$b$</span> be the <em>branching factor</em> &#40;i.e. the number or possible next states, <span class="tex">$s^\prime$</span>, for which <span class="tex">$\hat p &#40;s^\prime, s, a&#41; \gt 0$</span>&#41;.  Then an expected update of this pair requires roughly <span class="tex">$b$</span> times as much computation as a sample update.</p>
<p>If there is enough time to complete an expected update, then the resulting estimate is generally better than that of <span class="tex">$b$</span> sample updates because of the absense of sampling error.  But if there is insufficient time to complete an expected update, then sample updates are always preferable because they at least make some improvement int he value estimate with fewer than <span class="tex">$b$</span> updates.  In a large problem with many state-action pairs, we are often in the latter situation.  With so many state-action pairs, expected updates of all of them would take a very long time.  Before that we may be much better off with a few sample updates at many state-action pairs than with expected updates at a few pairs.  Given a unit of computation effort, is it better devoted to a few expected updates or to <span class="tex">$b$</span> times as many sample updates?</p>
<p>Figure 8.7 shows the results of any analysis that suggests and answer ot this question.  It shows the estimation error as a function of computation time for expected and sample updates for a variety of branching factors <span class="tex">$b$</span>.  The case considered is that in which all <span class="tex">$b$</span> successor states are equally likely and in which the error in the initial estimate is 1.  The values at the next states are assumed correct, sot he expected update redues the error to zero upon its completion.  In this case, sample updates reduce the error according to <span class="tex">$\sqrt&#123;\frac&#123;b-1&#125;&#123;bt&#125;&#125;$</span> where <span class="tex">$t$</span> is the number of sample updates that have been performed &#40;assuming same averages, i.e. <span class="tex">$\alpha &#61; 1/t$</span>&#41;.  The key observation is that for moderately large <span class="tex">$b$</span> the error falls dramatically with a tiny fraction of <span class="tex">$b$</span> updates.  For these cases, many state-action pairs could have their values improved dramatically, to within a few percent of the effect of an expected update, in teh same time that a single state-action pair could undergo an expected update.</p>
<p>The advantage of sample updates shown in Figure 8.7 is probably an underestimate of the real effect.  In a real problem, the values of successor states would be estimates that are themselves updated.  By causing estimates to be more accurate sooner, sample updates will have a second advantage in that the values backed up from the successor states will be more accurate.  These results suggest that sample updates are likely to be superior to expected updates on problems with large stochastic branching factors and too many states to be solved exactly.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAb'persist_js_state·has_pluto_hook_features§cell_id$31072f9b-de1b-42cf-a187-cbff99b49b50depends_on_disabled_cells§runtime {µpublished_object_keysdepends_on_skipped_cells§errored$77fde69f-2119-41eb-8993-a93b2c47ca7equeued¤logsrunning¦outputbody=<div class="markdown"><h2>Gridworld Visualization</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAcpersist_js_state·has_pluto_hook_features§cell_id$77fde69f-2119-41eb-8993-a93b2c47ca7edepends_on_disabled_cells§runtime Ppublished_object_keysdepends_on_skipped_cells§errored$65818e67-c146-4686-a9aa-d0859ef662fbqueued¤logsrunning¦outputbody<<div class="markdown"><h3>Example 8.1: Dyna Maze</h3>
</div>mimetext/htmlrootassigneelast_run_timestampA_persist_js_state·has_pluto_hook_features§cell_id$65818e67-c146-4686-a9aa-d0859ef662fbdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$b03087e9-e15d-4563-bdae-4d9ba7d2cec6queued¤logsrunning¦outputbody=<div class="markdown"><h2>MDP Types and Functions</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAcbpersist_js_state·has_pluto_hook_features§cell_id$b03087e9-e15d-4563-bdae-4d9ba7d2cec6depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$195d2a34-c44c-4088-8ec4-dece3107f16dqueued¤logsrunning¦outputbody7bellman_optimal_value! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA23apersist_js_state·has_pluto_hook_features§cell_id$195d2a34-c44c-4088-8ec4-dece3107f16ddepends_on_disabled_cells§runtime ^ȵpublished_object_keysdepends_on_skipped_cells§errored$6858ef8b-1ca7-4e96-b57e-26553423cc13queued¤logsrunning¦outputbody/sample_action (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAxupersist_js_state·has_pluto_hook_features§cell_id$6858ef8b-1ca7-4e96-b57e-26553423cc13depends_on_disabled_cells§runtime zhpublished_object_keysdepends_on_skipped_cells§errored$e689df6b-d6f0-4928-9212-a940aa00b0efqueued¤logsrunning¦outputbodyٺ<style>
	main {
		margin: 0 auto;
		max-width: min(1200px, 90%);
    	padding-left: max(10px, 5%);
    	padding-right: max(10px, 5%);
		font-size: max(10px, min(24px, 2vw));
	}
</style>
mimetext/htmlrootassigneelast_run_timestampAcIpersist_js_state·has_pluto_hook_features§cell_id$e689df6b-d6f0-4928-9212-a940aa00b0efdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$3b0d2c55-2123-4b51-b946-6bc352e3d00aqueued¤logsrunning¦outputbodyl<div class="markdown"><blockquote>
<h3><em>Exercise 8.6</em></h3>
<p>The analysis above assumed that all of the <span class="tex">$b$</span> possible next states were equally likely to occur.  Suppose instead that the distribution was highly skewed, that some of the <span class="tex">$b$</span> states were much more likely to occur than most.  Would this strengthen or weaken the case for sample updates over expected updates?  Support your answer.</p>
</blockquote>
<p>For the expected updates, all transitions no matter how small the probability are given the same amount of computation time.  If certain transitions are much more likely than others, than the resulting state value computation is dominated by those transitions.  If we perform sample updates, those transitions will appear more frequently than the less likely ones and will contribute earlier to the error reduction.  In the extreme case if just one transition is close to probability 1, then that will be sampled almost every time and after just a single sample the error could be reduced close to 0.  An expected update, on the other hand, would have to consider every state action pair to just perform a single update.  Therefore the efficiency of sample updates would become exaggerated in all real world problems where the subsequent state transition probabilities deviate from a uniform distribution.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAbBаpersist_js_state·has_pluto_hook_features§cell_id$3b0d2c55-2123-4b51-b946-6bc352e3d00adepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cfqueued¤logsrunning¦outputbody*simulate! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAPnpersist_js_state·has_pluto_hook_features§cell_id$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cfdepends_on_disabled_cells§runtime &ezpublished_object_keysdepends_on_skipped_cells§errored$d4e1e807-7e87-4b43-9c36-f59999dfcd2dqueued¤logsrunning¦outputbody/get_dict_value (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAS#persist_js_state·has_pluto_hook_features§cell_id$d4e1e807-7e87-4b43-9c36-f59999dfcd2ddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$e25ec0d5-f70f-4269-b2a1-efa194936f72queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampA<persist_js_state·has_pluto_hook_features§cell_id$e25ec0d5-f70f-4269-b2a1-efa194936f72depends_on_disabled_cells§runtime 	_published_object_keysdepends_on_skipped_cells§errored$1f7d77a6-d774-436d-a745-5a160cc15f2bqueued¤logsrunning¦outputbody+plot_path (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAWpersist_js_state·has_pluto_hook_features§cell_id$1f7d77a6-d774-436d-a745-5a160cc15f2bdepends_on_disabled_cells§runtime  F:published_object_keysdepends_on_skipped_cells§errored$5b688057-06c7-4ae4-95d6-0a2ff451f11cqueued¤logsrunning¦outputbody.figure_8_4′ (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAp^persist_js_state·has_pluto_hook_features§cell_id$5b688057-06c7-4ae4-95d6-0a2ff451f11cdepends_on_disabled_cells§runtime \)published_object_keysdepends_on_skipped_cells§errored$8987052b-0828-43a5-982e-5f3d6209f2aaqueued¤logsrunning¦outputbody<bond def="fig_8_4_params" unique_id="IIcT7KYTWV7G"><span style='display: contents;'>
	<span style='display: contents;'><div class="markdown"><p>Planning Steps: <pl-combined-child key='zgemfucvnn' style='display: contents;'><input type='number' min='1' step='1' max='100' value='5'></pl-combined-child></p>
</div><script id='zgemfucvnn'>
const div = currentScript.parentElement
let key = "zgemfucvnn"
const inputs = div.querySelectorAll(`pl-combined-child[key='${key}'] > *:first-child`)

const values = Array(inputs.length)

inputs.forEach(async (el,i) => {
	el.oninput = (e) => {
		e.stopPropagation()
	}
	const gen = Generators.input(el)
	while(true) {
		values[i] = await gen.next().value
		div.dispatchEvent(new CustomEvent("input", {}))
	}
})


let set_input_value = (() => {
	let result = null
	try {
	result = setBoundElementValueLikePluto
} catch (e) {
	result = ((input, new_value) => {
	// fallback in case https://github.com/fonsp/Pluto.jl/pull/1755 is not available
    if (new_value == null) {
        //@ts-ignore
        input.value = new_value
        return
    }
    if (input instanceof HTMLInputElement) {
        switch (input.type) {
            case "range":
            case "number": {
                if (input.valueAsNumber !== new_value) {
                    input.valueAsNumber = new_value
                }
                return
            }
            case "date": {
                if (input.valueAsDate == null || Number(input.valueAsDate) !== Number(new_value)) {
                    input.valueAsDate = new_value
                }
                return
            }
            case "checkbox": {
                if (input.checked !== new_value) {
                    input.checked = new_value
                }
                return
            }
            case "file": {
                // Can't set files :(
                return
            }
        }
    } else if (input instanceof HTMLSelectElement && input.multiple) {
        for (let option of Array.from(input.options)) {
            option.selected = new_value.includes(option.value)
        }
        return
    }
    //@ts-ignore
    if (input.value !== new_value) {
        //@ts-ignore
        input.value = new_value
    }
})
}
return result
})()


Object.defineProperty(div, 'value', {
	get: () => values,
	set: (newvals) => {
		if(!newvals) {
			return
		}
		inputs.forEach((el, i) => {
			values[i] = newvals[i]
			set_input_value(el, newvals[i])
		})
},
	configurable: true,
});

</script></span>
	<input type=submit id='fcozdtdaow'>
	<script id='fcozdtdaow'>

let key = "fcozdtdaow"

let div = currentScript.parentElement
let button = currentScript.previousElementSibling
let input = div.firstElementChild
if(input === button) {
	return
}


let set_input_value = (() => {
	let result = null
	try {
	result = setBoundElementValueLikePluto
} catch (e) {
	result = ((input, new_value) => {
	// fallback in case https://github.com/fonsp/Pluto.jl/pull/1755 is not available
    if (new_value == null) {
        //@ts-ignore
        input.value = new_value
        return
    }
    if (input instanceof HTMLInputElement) {
        switch (input.type) {
            case "range":
            case "number": {
                if (input.valueAsNumber !== new_value) {
                    input.valueAsNumber = new_value
                }
                return
            }
            case "date": {
                if (input.valueAsDate == null || Number(input.valueAsDate) !== Number(new_value)) {
                    input.valueAsDate = new_value
                }
                return
            }
            case "checkbox": {
                if (input.checked !== new_value) {
                    input.checked = new_value
                }
                return
            }
            case "file": {
                // Can't set files :(
                return
            }
        }
    } else if (input instanceof HTMLSelectElement && input.multiple) {
        for (let option of Array.from(input.options)) {
            option.selected = new_value.includes(option.value)
        }
        return
    }
    //@ts-ignore
    if (input.value !== new_value) {
        //@ts-ignore
        input.value = new_value
    }
})
}
return result
})()



let private_value = null
let public_value = null




private_value = public_value = div.value
if(private_value != null) {
	set_input_value(input, private_value)
} else {

	// private_value = public_value = input.value
}

input.oninput = (e) => {
	e.stopPropagation()
}
const gen = Generators.input(input)

// If the child does not have an initial value, the `gen.next().value` promise will never resolve. If it does, then it resolves instantly.
let first_value = await Promise.any([
	gen.next().value,
	Promise.resolve(undefined)
])
private_value = public_value = first_value

;(async () => {
	while(true) {
		private_value = await gen.next().value
		// div.dispatchEvent(new CustomEvent("input", {}))
	}
})()

button.addEventListener("click", () => {
	public_value = private_value
	div.dispatchEvent(new CustomEvent("input", {}))
})


Object.defineProperty(div, 'value', {
	get: () => public_value,
	set: (newval) => {
		private_value = newval
		public_value = newval
		
		set_input_value(input, newval)
	},
	configurable: true,
});

</script></span></bond>mimetext/htmlrootassigneelast_run_timestampAlpersist_js_state·has_pluto_hook_features§cell_id$8987052b-0828-43a5-982e-5f3d6209f2aadepends_on_disabled_cells§runtimeCApublished_object_keysdepends_on_skipped_cells§errored$4b2a4fb1-7395-4293-9ff9-e2f9da50f56bqueued¤logsrunning¦outputbody3value_iteration_q! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA97persist_js_state·has_pluto_hook_features§cell_id$4b2a4fb1-7395-4293-9ff9-e2f9da50f56bdepends_on_disabled_cells§runtime 
t[published_object_keysdepends_on_skipped_cells§errored$fcaddc19-c0c9-4e8e-8f84-adc7a02cc1f5queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/95a7829c5a22024f"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAŗlapersist_js_state·has_pluto_hook_features§cell_id$fcaddc19-c0c9-4e8e-8f84-adc7a02cc1f5depends_on_disabled_cells§runtime(Wpublished_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/95a7829c5a22024fdepends_on_skipped_cells§errored$5afad18b-1d87-450e-a0ff-8c1249d663edqueued¤logsrunning¦outputbody.tabular_dynaQ (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAk<persist_js_state·has_pluto_hook_features§cell_id$5afad18b-1d87-450e-a0ff-8c1249d663eddepends_on_disabled_cells§runtime@published_object_keysdepends_on_skipped_cells§errored$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3queued¤logsrunning¦outputbody2tabular_dynaQplus (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA`_persist_js_state·has_pluto_hook_features§cell_id$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$5ae2d740-13c7-4568-8f04-25bc82fecbdbqueued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/d28007b66490ffa3"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAnepersist_js_state·has_pluto_hook_features§cell_id$5ae2d740-13c7-4568-8f04-25bc82fecbdbdepends_on_disabled_cells§runtimeΫ#published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/d28007b66490ffa3depends_on_skipped_cells§errored$0dbd2b87-d000-408b-8d04-25fc0fa512d1queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/8b0fca3c029bef9b"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAk/persist_js_state·has_pluto_hook_features§cell_id$0dbd2b87-d000-408b-8d04-25fc0fa512d1depends_on_disabled_cells§runtime2&published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/8b0fca3c029bef9bdepends_on_skipped_cells§errored$33f66659-1a87-4890-9137-dbc7776a19d8queued¤logsrunning¦outputbody5make_greedy_policy! (generic function with 4 methods)mimetext/plainrootassigneelast_run_timestampA+.persist_js_state·has_pluto_hook_features§cell_id$33f66659-1a87-4890-9137-dbc7776a19d8depends_on_disabled_cells§runtime -ֵpublished_object_keysdepends_on_skipped_cells§errored$269f4505-e807-446c-8fd8-3458482e00abqueued¤logsrunning¦outputbody5tabular_dynaQplus′ (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAnpersist_js_state·has_pluto_hook_features§cell_id$269f4505-e807-446c-8fd8-3458482e00abdepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$037f1804-b24e-46e7-b2a8-6747e669db66queued¤logsrunning¦outputbody+makelookup (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA&persist_js_state·has_pluto_hook_features§cell_id$037f1804-b24e-46e7-b2a8-6747e669db66depends_on_disabled_cells§runtime Bypublished_object_keysdepends_on_skipped_cells§errored$c1ff1bea-649c-4483-b4be-55134f0e8cb7queued¤logsrunning¦outputbody.sample_action (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAx?ٰpersist_js_state·has_pluto_hook_features§cell_id$c1ff1bea-649c-4483-b4be-55134f0e8cb7depends_on_disabled_cells§runtime ͵published_object_keysdepends_on_skipped_cells§errored$7ae23e8e-d554-4d26-a08a-83dab507af13queued¤logsrunning¦outputbody>initialize_state_action_value (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAODpersist_js_state·has_pluto_hook_features§cell_id$7ae23e8e-d554-4d26-a08a-83dab507af13depends_on_disabled_cells§runtime 1Ypublished_object_keysdepends_on_skipped_cells§errored$26fe0c28-8f0f-4cff-87fb-76f04fce1be1queued¤logsrunning¦outputbody<div class="markdown"><blockquote>
<h3><em>Exercise 8.3</em></h3>
<p>Careful inspection of Figure 8.5 reveals that the difference between Dyna-Q&#43; and Dyna-Q narrowed slightly over the first part of the experiment. What is the reason for this?</p>
</blockquote>
<p>As long as the environment isn&#39;t changing, no matter how small ϵ is both algorithms will converge to the optimal policy as long as <span class="tex">$\alpha$</span>, <span class="tex">$\kappa$</span>, and <span class="tex">$\tau$</span> converge to 0.  For a given value of <span class="tex">$\epsilon$</span>, the Dyna-Q&#43; agent will take more exploratory actions due to the modified rewards updating the Q function.  If both agents have converged to close to the optimal policy at this point, then the agent which follows a more expoitative policy will produce higher rewards.  In this case, the extra exploration of Dyna-Q&#43; is not beneficial and its relative performance to Dyna-Q degrades.</p>
</div>mimetext/htmlrootassigneelast_run_timestampA`3persist_js_state·has_pluto_hook_features§cell_id$26fe0c28-8f0f-4cff-87fb-76f04fce1be1depends_on_disabled_cells§runtime K,published_object_keysdepends_on_skipped_cells§errored$98547223-05a6-43da-80b2-63c67d2de283queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/a52c35ad9932b961"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampA>persist_js_state·has_pluto_hook_features§cell_id$98547223-05a6-43da-80b2-63c67d2de283depends_on_disabled_cells§runtime|
_published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/a52c35ad9932b961depends_on_skipped_cells§errored$4b3604db-0c1b-4770-95b1-5f5bb34d071bqueued¤logsrunning¦outputbody,addelements (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA%=persist_js_state·has_pluto_hook_features§cell_id$4b3604db-0c1b-4770-95b1-5f5bb34d071bdepends_on_disabled_cells§runtime۵published_object_keysdepends_on_skipped_cells§errored$143fff7d-0bb2-43b4-b810-53784fe848bdqueued¤logsrunning¦outputbody+q_learning (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$143fff7d-0bb2-43b4-b810-53784fe848bddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$6778296c-ab05-47e7-86d2-e98c075a8a0cqueued¤logsrunning¦outputbody9begin_value_iteration_q (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampA9隰persist_js_state·has_pluto_hook_features§cell_id$6778296c-ab05-47e7-86d2-e98c075a8a0cdepends_on_disabled_cells§runtime )ӵpublished_object_keysdepends_on_skipped_cells§errored$c04c803c-cdca-4b8b-9c9d-e456ee677906queued¤logsrunning¦outputbodyprefix`MDP_TD{GridworldState, GridworldAction, var"#tr#253"{GridworldState, Float32, Float32, var"#246#257", Float32, GridworldState, Float32, Bool, var"#isterm#252"{GridworldState, GridworldState, Bool}, var"#step#251"{var"#260#262", var"#boundstate#250"{Int64, Int64}}}, var"#243#254"{GridworldState}, var"#isterm#252"{GridworldState, GridworldState, Bool}}elementsstatesprefix$Main.var"workspace#3".GridworldStateelementsprefixGridworldStateelementsx1text/plainy1text/plaintypestructprefix_shortGridworldStateobjectid78e123e4099fe993!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy2text/plaintypestructprefix_shortGridworldStateobjectide3e6b188bd382934!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy3text/plaintypestructprefix_shortGridworldStateobjectid7d75a91561e03d66!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy4text/plaintypestructprefix_shortGridworldStateobjectid325862729a669fde!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy5text/plaintypestructprefix_shortGridworldStateobjectid59376920d2867542!application/vnd.pluto.tree+objectprefixGridworldStateelementsx1text/plainy6text/plaintypestructprefix_shortGridworldStateobjectidd7705072323ddd64!application/vnd.pluto.tree+objectprefixGridworldStateelementsx2text/plainy1text/plaintypestructprefix_shortGridworldStateobjectidef30e57a3ff0766e!application/vnd.pluto.tree+objectprefixGridworldStateelementsx2text/plainy2text/plaintypestructprefix_shortGridworldStateobjectid74f497567b7de001!application/vnd.pluto.tree+object	prefixGridworldStateelementsx2text/plainy3text/plaintypestructprefix_shortGridworldStateobjectid166e372c9e1355f0!application/vnd.pluto.tree+objectmore6prefixGridworldStateelementsx9text/plainy6text/plaintypestructprefix_shortGridworldStateobjectid1d0d8e9e873bda4f!application/vnd.pluto.tree+objecttypeArrayprefix_shortobjectid5e3404ae0546631b!application/vnd.pluto.tree+objectstatelookupprefix1Dict{Main.var"workspace#3".GridworldState, Int64}elementsprefixGridworldStateelementsx1text/plainy4text/plaintypestructprefix_shortGridworldStateobjectid325862729a669fde!application/vnd.pluto.tree+object4text/plainprefixGridworldStateelementsx8text/plainy6text/plaintypestructprefix_shortGridworldStateobjectidd0ac7db8d6b14b7f!application/vnd.pluto.tree+object48text/plainprefixGridworldStateelementsx6text/plainy2text/plaintypestructprefix_shortGridworldStateobjectid4d2c7a741b24f41a!application/vnd.pluto.tree+object32text/plainprefixGridworldStateelementsx3text/plainy1text/plaintypestructprefix_shortGridworldStateobjectidec7c7c34fdbec3f2!application/vnd.pluto.tree+object13text/plainprefixGridworldStateelementsx7text/plainy4text/plaintypestructprefix_shortGridworldStateobjectid6d65389d7722da42!application/vnd.pluto.tree+object40text/plainprefixGridworldStateelementsx6text/plainy4text/plaintypestructprefix_shortGridworldStateobjectid4e5052acf2cd62e8!application/vnd.pluto.tree+object34text/plainprefixGridworldStateelementsx6text/plainy6text/plaintypestructprefix_shortGridworldStateobjectidb2f6373593d54ffb!application/vnd.pluto.tree+object36text/plainprefixGridworldStateelementsx9text/plainy5text/plaintypestructprefix_shortGridworldStateobjectid26f50dc5dc06527c!application/vnd.pluto.tree+object53text/plainprefixGridworldStateelementsx6text/plainy5text/plaintypestructprefix_shortGridworldStateobjectidc13ef9f7ef89e757!application/vnd.pluto.tree+object35text/plainprefixGridworldStateelementsx3text/plainy6text/plaintypestructprefix_shortGridworldStateobjectid87fd641095222e9d!application/vnd.pluto.tree+object18text/plainmoretypeDictprefix_shortDictobjectidb327a2c12cf53e8d!application/vnd.pluto.tree+objectactionsprefix%Main.var"workspace#3".GridworldActionelementsprefixUpelementstypestructprefix_shortUpobjectidffffffff3d46da74!application/vnd.pluto.tree+objectprefixDownelementstypestructprefix_shortDownobjectidffffffffd3211a14!application/vnd.pluto.tree+objectprefixLeftelementstypestructprefix_shortLeftobjectidffffffffac7e5e95!application/vnd.pluto.tree+objectprefixRightelementstypestructprefix_shortRightobjectidffffffffe46c1e9e!application/vnd.pluto.tree+objecttypeArrayprefix_shortobjectid438bebd2b1ee3c7c!application/vnd.pluto.tree+objectactionlookupprefix2Dict{Main.var"workspace#3".GridworldAction, Int64}elementsprefixUpelementstypestructprefix_shortUpobjectidffffffff3d46da74!application/vnd.pluto.tree+object1text/plainprefixDownelementstypestructprefix_shortDownobjectidffffffffd3211a14!application/vnd.pluto.tree+object2text/plainprefixRightelementstypestructprefix_shortRightobjectidffffffffe46c1e9e!application/vnd.pluto.tree+object4text/plainprefixLeftelementstypestructprefix_shortLeftobjectidffffffffac7e5e95!application/vnd.pluto.tree+object3text/plaintypeDictprefix_shortDictobjectid3bf05d9d6d85a74!application/vnd.pluto.tree+objectstate_init%#243 (generic function with 1 method)text/plainstep(::Main.var"workspace#3".var"#tr#253"{Main.var"workspace#3".GridworldState, Float32, Float32, Main.var"workspace#3".var"#246#257", Float32, Main.var"workspace#3".GridworldState, Float32, Bool, Main.var"workspace#3".var"#isterm#252"{Main.var"workspace#3".GridworldState, Main.var"workspace#3".GridworldState, Bool}, Main.var"workspace#3".var"#step#251"{Main.var"workspace#3".var"#260#262", Main.var"workspace#3".var"#boundstate#250"{Int64, Int64}}}) (generic function with 1 method)text/plainistermٝ(::Main.var"workspace#3".var"#isterm#252"{Main.var"workspace#3".GridworldState, Main.var"workspace#3".GridworldState, Bool}) (generic function with 1 method)text/plaintypestructprefix_shortMDP_TDobjectid36d0eb4ffa9f9c28mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAƔְpersist_js_state·has_pluto_hook_features§cell_id$c04c803c-cdca-4b8b-9c9d-e456ee677906depends_on_disabled_cells§runtime(ҵpublished_object_keysdepends_on_skipped_cells§errored$9d69687a-8df6-4e74-aa99-fbfcc84bcccfqueued¤logsrunning¦outputbodyH<div style = "display: flex; flex-direction: column; align-items: center; justify-content: center; color: black; background-color: rgba(100, 100, 100, 0.1);">
	<div style = "display: flex; align-items: center; justify-content: center;">
	<div class = "downarrow" style = "transform: rotate(90deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(270deg);"></div>
	<div class = "downarrow" style = "position: absolute;"></div>
	</div>
	<div>Actions</div>
</div>
mimetext/htmlrootassigneeconst rook_action_displaylast_run_timestampA=Fpersist_js_state·has_pluto_hook_features§cell_id$9d69687a-8df6-4e74-aa99-fbfcc84bcccfdepends_on_disabled_cells§runtime iߵpublished_object_keysdepends_on_skipped_cells§errored$16c68a13-c295-4a64-bc2b-2ae8451f332fqueued¤logsrunning¦outputbody8bellman_optimal_value! (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampA2 persist_js_state·has_pluto_hook_features§cell_id$16c68a13-c295-4a64-bc2b-2ae8451f332fdepends_on_disabled_cells§runtime [published_object_keysdepends_on_skipped_cells§errored$fb00aedd-e103-4463-b4f8-d0dce6275c64queued¤logsrunning¦outputbody,example_8_4 (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA{persist_js_state·has_pluto_hook_features§cell_id$fb00aedd-e103-4463-b4f8-d0dce6275c64depends_on_disabled_cells§runtime q*published_object_keysdepends_on_skipped_cells§errored$e43513e8-2517-43b7-9a16-e57d4125edc4queued¤logsrunning¦outputbody,runepisode (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$e43513e8-2517-43b7-9a16-e57d4125edc4depends_on_disabled_cells§runtime Ppublished_object_keysdepends_on_skipped_cells§errored$df62fd47-6627-4931-b429-964c65960446queued¤logsrunning¦outputbody+figure_8_7 (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAZpersist_js_state·has_pluto_hook_features§cell_id$df62fd47-6627-4931-b429-964c65960446depends_on_disabled_cells§runtime 7Upublished_object_keysdepends_on_skipped_cells§errored$321bdf5a-bff7-4181-986f-d3884ea96d27queued¤logsrunning¦outputbody2<div class="markdown"><h1>Dependencies</h1>
</div>mimetext/htmlrootassigneelast_run_timestampAc3"persist_js_state·has_pluto_hook_features§cell_id$321bdf5a-bff7-4181-986f-d3884ea96d27depends_on_disabled_cells§runtime =published_object_keysdepends_on_skipped_cells§errored$82e1ceb8-b1bb-4dea-b041-bf462041793fqueued¤logsrunning¦outputbody5make_greedy_policy! (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAgpersist_js_state·has_pluto_hook_features§cell_id$82e1ceb8-b1bb-4dea-b041-bf462041793fdepends_on_disabled_cells§runtime ,published_object_keysdepends_on_skipped_cells§errored$5e49504e-9623-48f9-aeb5-360906b92a09queued¤logsrunning¦outputbodymsgفUndefVarError: `nyt_valid_words` not defined in `Main.var"workspace#3"`
Suggestion: check for spelling errors or missing imports.stacktracecall_shorttop-level scopeinlined£urlpath/home/runner/work/Reinforcement-Learning-Sutton-Barto-Exercise-Solutions/Reinforcement-Learning-Sutton-Barto-Exercise-Solutions/Chapter-08/Chapter_08_Planning_&_Learning_with_Tabular_Methods.jl#==#5e49504e-9623-48f9-aeb5-360906b92a09source_packagecalltop-level scopelinfo_typeCore.CodeInfolinefile^Chapter_08_Planning_&_Learning_with_Tabular_Methods.jl#==#5e49504e-9623-48f9-aeb5-360906b92a09functop-level scopeparent_modulefrom_c¤mime'application/vnd.pluto.stacktrace+objectrootassigneevholdtestlast_run_timestampAŮy)persist_js_state·has_pluto_hook_features§cell_id$5e49504e-9623-48f9-aeb5-360906b92a09depends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$2ff6d187-e06f-47b5-9834-d06bfc820c26queued¤logsrunning¦outputbody+figure_8_4 (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA persist_js_state·has_pluto_hook_features§cell_id$2ff6d187-e06f-47b5-9834-d06bfc820c26depends_on_disabled_cells§runtime @published_object_keysdepends_on_skipped_cells§errored$c31f4646-aa8a-41e3-9c68-ae8a349d4ed1queued¤logsrunning¦outputbodyj	<script id='plot_1'>
		// We start by putting all the variable interpolation here at the beginning
		// We have to convert all typedarrays in the layout to normal arrays. See Issue #25
		// We use lodash for this for compactness
		function removeTypedArray(o) {
			return _.isTypedArray(o) ? Array.from(o) :
			_.isPlainObject(o) ? _.mapValues(o, removeTypedArray) : 
			o
		}

		// Publish the plot object to JS
		let plot_obj = _.update(/* See the documentation for AbstractPlutoDingetjes.Display.published_to_js */ getPublishedObject("3ee53c46-38f7-11f0-16c9-2b093684d981/dc5f2c047336b14a"), "layout", removeTypedArray)
		// Get the plotly listeners
		const plotly_listeners = {}
		// Get the JS listeners
		const js_listeners = {}
		// Deal with eventual custom classes
		let custom_classlist = []


		// Load the plotly library
		let Plotly = undefined
		try {
			let _mod = await import("./plotlyjs/plotlyjs-2.26.2.min.js")
			Plotly = _mod.default
		} catch (e) {
			console.log("Local load failed, trying with the web esm.sh version")
			let _mod = await import("https://esm.sh/plotly.js-dist-min@2.26.2/es2022/plotly.js-dist-min.mjs")
			Plotly = _mod.default
		}

		// Check if we have to force local mathjax font cache
		if (false && window?.MathJax?.config?.svg?.fontCache === 'global') {
			window.MathJax.config.svg.fontCache = 'local'
		}

		// Flag to check if this cell was  manually ran or reactively ran
const firstRun = this ? false : true
const CONTAINER = this ?? html`<div class='plutoplotly-container'>`
const PLOT = CONTAINER.querySelector('.js-plotly-plot') ?? CONTAINER.appendChild(html`<div>`)
const parent = CONTAINER.parentElement
// We use a controller to remove event listeners upon invalidation
const controller = new AbortController()
// We have to add this to keep supporting @bind with the old API using PLOT
PLOT.addEventListener('input', (e) => {
	CONTAINER.value = PLOT.value
	if (e.bubbles) {
		return
	}
	CONTAINER.dispatchEvent(new CustomEvent('input'))
}, { signal: controller.signal })

	// This create the style subdiv on first run
	firstRun && CONTAINER.appendChild(html`
	<style>
	.plutoplotly-container {
		width: 100%;
		height: 100%;
		min-height: 0;
		min-width: 0;
	}
	.plutoplotly-container .js-plotly-plot .plotly div {
		margin: 0 auto; // This centers the plot
	}
	.plutoplotly-container.popped-out {
		overflow: auto;
		z-index: 1000;
		position: fixed;
		resize: both;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		border-top-left-radius: 0px;
		border-top-right-radius: 0px;
	}
	.plutoplotly-clipboard-header {
		display: flex;
		flex-flow: row wrap;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-top-left-radius: 12px;
		border-top-right-radius: 12px;
		position: fixed;
		z-index: 1001;
		cursor: move;
		transform: translate(0px, -100%);
		padding: 5px;
	}
	.plutoplotly-clipboard-header span {
		display: inline-block;
		flex: 1
	}
	.plutoplotly-clipboard-header.hidden {
		display: none;
	}
	.clipboard-span {
		position: relative;
	}
	.clipboard-value {
		padding-right: 5px;
		padding-left: 2px;
		cursor: text;
	}
	.clipboard-span.format {
		display: none;
	}
	.clipboard-span.filename {
		flex: 0 0 100%;
		text-align: center;
		border-top: 3px solid var(--kbd-border-color);
		margin-top: 5px;
		display: none;
	}
	.plutoplotly-container.filesave .clipboard-span.filename {
		display: inline-block;
	}
	.clipboard-value.filename {
		margin-left: 3px;
		text-align: left;
		min-width: min(60%, min-content);
	}
	.plutoplotly-container.filesave .clipboard-span.format {
		display: inline-flex;
	}
	.clipboard-span.format .label {
		flex: 0 0 0;
	}
	.clipboard-value.format {
		position: relative;
		flex: 1 0 auto;
		min-width: 30px;
		margin-right: 10px;
	}
	div.format-options {
		display: inline-flex;
		flex-flow: column;
		position: absolute;
		background: var(--main-bg-color);
		border-radius: 12px;
		padding-left: 3px;
		z-index: 2000;
	}
	div.format-options:hover {
		cursor: pointer;
		border: 3px solid var(--kbd-border-color);
		padding: 3px;
		transform: translate(-3px, -6px);
	}
	div.format-options .format-option {
		display: none;
	}
	div.format-options:hover .format-option {
		display: inline-block;
	}
	.format-option:not(.selected) {
		margin-top: 3px;
	}
	div.format-options .format-option.selected {
		order: -1;
		display: inline-block;
	}
	.format-option:hover {
		background-color: var(--kbd-border-color);
	}
	span.config-value {
		font-weight: normal;
		color: var(--pluto-output-color);
		display: none;
		position: absolute;
		background: var(--main-bg-color);
		border: 3px solid var(--kbd-border-color);
		border-radius: 12px;
		transform: translate(0px, calc(-100% - 10px));
		padding: 5px;
	}
	.label {
		user-select: none;
	}
	.label:hover span.config-value {
		display: inline-block;
		min-width: 150px;
	}
	.clipboard-span.matching-config .label {
		color: var(--cm-macro-color);
		font-weight: bold;
	}
	.clipboard-span.different-config .label {
		color: var(--cm-tag-color);
		font-weight: bold;
	}
</style>
`)

let original_height = plot_obj.layout.height
let original_width = plot_obj.layout.width
// For the height we have to also put a fixed value in case the plot is put on a non-fixed-size container (like the default wrapper)
// We define a variable to check whether we still have to remove the fixed height
let remove_container_size = firstRun
let container_height = original_height ?? PLOT.container_height ?? 400
CONTAINER.style.height = container_height + 'px'

// We create a Promise version of setTimeout
function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

// We import interact for dragging/resizing
const { default: interact } = await import('https://esm.sh/interactjs@1.10.19')


function getImageOptions() {
  const o = plot_obj.config.toImageButtonOptions ?? {};
  return {
    format: o.format ?? "png",
    width: o.width ?? original_width,
    height: o.height ?? original_height,
    scale: o.scale ?? 1,
    filename: o.filename ?? "newplot",
  };
}

const CLIPBOARD_HEADER =
  CONTAINER.querySelector(".plutoplotly-clipboard-header") ??
  CONTAINER.insertAdjacentElement(
    "afterbegin",
    html`<div class="plutoplotly-clipboard-header hidden">
      <span class="clipboard-span format"
        ><span class="label">Format:</span
        ><span class="clipboard-value format"></span
      ></span>
      <span class="clipboard-span width"
        ><span class="label">Width:</span
        ><span class="clipboard-value width"></span>px</span
      >
      <span class="clipboard-span height"
        ><span class="label">Height:</span
        ><span class="clipboard-value height"></span>px</span
      >
      <span class="clipboard-span scale"
        ><span class="label">Scale:</span
        ><span class="clipboard-value scale"></span
      ></span>
      <button class="clipboard-span set">Set</button>
      <button class="clipboard-span unset">Unset</button>
      <span class="clipboard-span filename"
        ><span class="label">Filename:</span
        ><span class="clipboard-value filename"></span
      ></span>
    </div>`
  );

function checkConfigSync(container) {
  const valid_classes = [
    "missing-config",
    "matching-config",
    "different-config",
  ];
  function setClass(cl) {
    for (const name of valid_classes) {
      container.classList.toggle(name, name == cl);
    }
  }
  // We use the custom getters we'll set up in the container
  const { ui_value, config_value, config_span, key } = container;
  if (config_value === undefined) {
    setClass("missing-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> is not present in the config.`;
  } else if (ui_value == config_value) {
    setClass("matching-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has the same value in the config and in the header.`;
  } else {
    setClass("different-config");
    config_span.innerHTML = `The key <b><em>${key}</em></b> has a different value (<em>${config_value}</em>) in the config.`;
  }
  // Add info about setting and unsetting
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click on the label <em><b>once</b></em> to set the current UI value in the config.`
  );
  config_span.insertAdjacentHTML(
    "beforeend",
    `<br>Click <em><b>twice</b></em> to remove this key from the config.`
  );
}

const valid_formats = ["png", "svg", "webp", "jpeg", "full-json"];
function initializeUIValueSpan(span, key, value) {
  const container = span.closest(".clipboard-span");
  span.contentEditable = key === "format" ? "false" : "true";
  let parse = (x) => x;
  let update = (x) => (span.textContent = x);
  if (key === "width" || key === "height") {
    parse = (x) => Math.round(parseFloat(x));
  } else if (key === "scale") {
    parse = parseFloat;
  } else if (key === "format") {
    // We remove contentEditable
    span.contentEditable = "false";
    // Here we first add the subspans for each option
    const opts_div = span.appendChild(html`<div class="format-options"></div>`);
    for (const fmt of valid_formats) {
      const opt = opts_div.appendChild(
        html`<span class="format-option ${fmt}">${fmt}</span>`
      );
      opt.onclick = (e) => {
        span.value = opt.textContent;
      };
    }
    parse = (x) => {
      return valid_formats.includes(x) ? x : localValue;
    };
    update = (x) => {
      for (const opt of opts_div.children) {
        opt.classList.toggle("selected", opt.textContent === x);
      }
    };
  } else {
    // We only have filename here
  }
  let localValue;
  Object.defineProperty(span, "value", {
    get: () => {
      return localValue;
    },
    set: (val) => {
      if (val !== "") {
        localValue = parse(val);
      }
      update(localValue);
      checkConfigSync(container);
    },
  });
  // We also assign a listener so that the editable is blurred when enter is pressed
  span.onkeydown = (e) => {
    if (e.keyCode === 13) {
      e.preventDefault();
      span.blur();
    }
  };
  span.value = value;
}

function initializeConfigValueSpan(span, key) {
  // Here we mostly want to define the setter and getter
  const container = span.closest(".clipboard-span");
  Object.defineProperty(span, "value", {
    get: () => {
      return plot_obj.config.toImageButtonOptions[key];
    },
    set: (val) => {
      // if undefined is passed, we remove the entry from the options
      if (val === undefined) {
        delete plot_obj.config.toImageButtonOptions[key];
      } else {
        plot_obj.config.toImageButtonOptions[key] = val;
      }
      checkConfigSync(container);
    },
  });
}

const config_spans = {};
for (const [key, value] of Object.entries(getImageOptions())) {
  const container = CLIPBOARD_HEADER.querySelector(`.clipboard-span.${key}`);
  const label = container.querySelector(".label");
  // We give the label a function that on single click will set the current value and with double click will unset it
  label.onclick = DualClick(
    () => {
      container.config_value = container.ui_value;
    },
    (e) => {
      console.log("e", e);
      e.preventDefault();
      container.config_value = undefined;
    }
  );
  const ui_value_span = container.querySelector(".clipboard-value");
  const config_value_span =
    container.querySelector(".config-value") ??
    label.insertAdjacentElement(
      "afterbegin",
      html`<span class="config-value"></span>`
    );
  // Assing the two spans as properties of the containing span
  container.ui_span = ui_value_span;
  container.config_span = config_value_span;
  container.key = key;
  config_spans[key] = container;
  if (firstRun) {
    plot_obj.config.toImageButtonOptions =
      plot_obj.config.toImageButtonOptions ?? {};
    // We do the initialization of the value span
    initializeUIValueSpan(ui_value_span, key, value);
    // Then we initialize the config value
    initializeConfigValueSpan(config_value_span, key);
    // We put some convenience getters/setters
    // ui_value forward
    Object.defineProperty(container, "ui_value", {
      get: () => ui_value_span.value,
      set: (val) => {
        ui_value_span.value = val;
      },
    });
    // config_value forward
    Object.defineProperty(container, "config_value", {
      get: () => config_value_span.value,
      set: (val) => {
        config_value_span.value = val;
      },
    });
  }
}

// These objects will contain the default value

// This code updates the image options in the PLOT config with the provided ones
function setImageOptions(o) {
  for (const [key, container] of Object.entries(config_spans)) {
    container.config_value = o[key];
  }
}
function unsetImageOptions() {
  setImageOptions({});
}

const set_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.set");
const unset_button = CLIPBOARD_HEADER.querySelector(".clipboard-span.unset");
if (firstRun) {
  set_button.onclick = (e) => {
    for (const container of Object.values(config_spans)) {
      container.config_value = container.ui_value;
    }
  };
  unset_button.onclick = unsetImageOptions;
}

// We add a function to check if the clipboard is popped out
CONTAINER.isPoppedOut = () => {
  return CONTAINER.classList.contains("popped-out");
};

CLIPBOARD_HEADER.onmousedown = function (event) {
  if (event.target.matches("span.clipboard-value")) {
    console.log("We don't move!");
    return;
  }
  const start = {
    left: parseFloat(CONTAINER.style.left),
    top: parseFloat(CONTAINER.style.top),
    X: event.pageX,
    Y: event.pageY,
  };
  function moveAt(event, start) {
    const top = event.pageY - start.Y + start.top + "px";
    const left = event.pageX - start.X + start.left + "px";
    CLIPBOARD_HEADER.style.left = left;
    CONTAINER.style.left = left;
    CONTAINER.style.top = top;
  }

  // move our absolutely positioned ball under the pointer
  moveAt(event, start);
  function onMouseMove(event) {
    moveAt(event, start);
  }

  // We use this to remove the mousemove when clicking outside of the container
  const controller = new AbortController();

  // move the container on mousemove
  document.addEventListener("mousemove", onMouseMove, {
    signal: controller.signal,
  });
  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        cleanUp();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );

  function cleanUp() {
    console.log("cleaning up the plot move listener");
    controller.abort();
    CLIPBOARD_HEADER.onmouseup = null;
  }

  // (3) drop the ball, remove unneeded handlers
  CLIPBOARD_HEADER.onmouseup = cleanUp;
};

function sendToClipboard(blob) {
  if (!navigator.clipboard) {
    alert(
      "The Clipboard API does not seem to be available, make sure the Pluto notebook is being used from either localhost or an https source."
    );
  }
  navigator.clipboard
    .write([
      new ClipboardItem({
        // The key is determined dynamically based on the blob's type.
        [blob.type]: blob,
      }),
    ])
    .then(
      function () {
        console.log("Async: Copying to clipboard was successful!");
      },
      function (err) {
        console.error("Async: Could not copy text: ", err);
      }
    );
}

function copyImageToClipboard() {
  // We extract the image options from the provided parameters (if they exist)
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key. We also ignore format because the clipboard only supports png.
    if (val === undefined || key === "format") {
      continue;
    }
    config[key] = val;
  }
  Plotly.toImage(PLOT, config).then(function (dataUrl) {
    fetch(dataUrl)
      .then((res) => res.blob())
      .then((blob) => {
        const paste_receiver = document.querySelector('paste-receiver.plutoplotly')
        if (paste_receiver) {
          paste_receiver.attachImage(dataUrl, CONTAINER)
        }
        sendToClipboard(blob)
      });
  });
}

function saveImageToFile() {
  const config = {};
  for (const [key, container] of Object.entries(config_spans)) {
    let val =
      container.config_value ??
      (CONTAINER.isPoppedOut() ? container.ui_value : undefined);
    // If we have undefined we don't create the key.
    if (val === undefined) {
      continue;
    }
    config[key] = val;
  }
  Plotly.downloadImage(PLOT, config);
}

let container_rect = { width: 0, height: 0, top: 0, left: 0 };
function unpop_container(cl) {
  CONTAINER.classList.toggle("popped-out", false);
  CONTAINER.classList.toggle(cl, false);
  // We fix the height back to the value it had before popout, also setting the flag to signal that upon first resize we remove the fixed inline-style
  CONTAINER.style.height = container_rect.height + "px";
  remove_container_size = true;
  // We set the other fixed inline-styles to null
  CONTAINER.style.width = "";
  CONTAINER.style.top = "";
  CONTAINER.style.left = "";
  // We also remove the CLIPBOARD_HEADER
  CLIPBOARD_HEADER.style.width = "";
  CLIPBOARD_HEADER.style.left = "";
  // Finally we remove the hidden class to the header
  CLIPBOARD_HEADER.classList.toggle("hidden", true);
  return;
}
function popout_container(opts) {
  const cl = opts?.cl;
  const target_container_size = opts?.target_container_size ?? {};
  const target_plot_size = opts?.target_plot_size ?? {};
  if (CONTAINER.isPoppedOut()) {
    return unpop_container(cl);
  }
  CONTAINER.classList.toggle(cl, cl === undefined ? false : true);
  // We extract the current size of the container, save them and fix them
  const { width, height, top, left } = CONTAINER.getBoundingClientRect();
  container_rect = { width, height, top, left };
  // We save the current plot size before we pop as it will fill the screen
  const current_plot_size = {
    width: PLOT._fullLayout.width,
    height: PLOT._fullLayout.height,
  };
  // We have to save the pad data before popping so we can resize precisely
  const pad = {};
  pad.unpopped = getSizeData().container_pad;
  CONTAINER.classList.toggle("popped-out", true);
  pad.popped = getSizeData().container_pad;
  // We do top and left based on the current rect
  for (const key of ["top", "left"]) {
    const start_val = target_container_size[key] ?? container_rect[key];
    let offset = 0;
    for (const kind of ["padding", "border"]) {
      offset += pad.popped[kind][key] - pad.unpopped[kind][key];
    }
    CONTAINER.style[key] = start_val - offset + "px";
    if (key === "left") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  // We compute the width and height depending on eventual config data
  const csz = computeContainerSize({
    width:
      target_plot_size.width ??
      config_spans.width.config_value ??
      current_plot_size.width,
    height:
      target_plot_size.height ??
      config_spans.height.config_value ??
      current_plot_size.height,
  });
  for (const key of ["width", "height"]) {
    const val = target_container_size[key] ?? csz[key];
    CONTAINER.style[key] = val + "px";
    if (key === "width") {
      CLIPBOARD_HEADER.style[key] = CONTAINER.style[key];
    }
  }
  CLIPBOARD_HEADER.classList.toggle("hidden", false);
  const controller = new AbortController();

  document.addEventListener(
    "mousedown",
    (e) => {
      if (e.target.closest(".plutoplotly-container") !== CONTAINER) {
        unpop_container();
        controller.abort();
        return;
      }
    },
    { signal: controller.signal }
  );
}

CONTAINER.popOut = popout_container;

function DualClick(single_func, dbl_func) {
  let nclicks = 0;
  return function (...args) {
    nclicks += 1;
    if (nclicks > 1) {
      dbl_func(...args);
      nclicks = 0;
    } else {
      delay(300).then(() => {
        if (nclicks == 1) {
          single_func(...args);
        }
        nclicks = 0;
      });
    }
  };
}

// We remove the default download image button
plot_obj.config.modeBarButtonsToRemove = _.union(
  plot_obj.config.modeBarButtonsToRemove,
  ["toImage"]
);
// We add the custom button to the modebar
plot_obj.config.modeBarButtonsToAdd = _.union(
  plot_obj.config.modeBarButtonsToAdd,
  [
    {
      name: "Copy PNG to Clipboard",
      icon: {
        height: 520,
        width: 520,
        path: "M280 64h40c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V128C0 92.7 28.7 64 64 64h40 9.6C121 27.5 153.3 0 192 0s71 27.5 78.4 64H280zM64 112c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H320c8.8 0 16-7.2 16-16V128c0-8.8-7.2-16-16-16H304v24c0 13.3-10.7 24-24 24H192 104c-13.3 0-24-10.7-24-24V112H64zm128-8a24 24 0 1 0 0-48 24 24 0 1 0 0 48z",
      },
      direction: "up",
      click: DualClick(copyImageToClipboard, () => {
        popout_container();
      }),
    },
    {
      name: "Download Image",
      icon: Plotly.Icons.camera,
      direction: "up",
      click: DualClick(saveImageToFile, () => {
        popout_container({ cl: "filesave" });
      }),
    },
  ]
);

function getOffsetData(el) {
  let cs = window.getComputedStyle(el, null);
  const odata = {
    padding: {
      left: parseFloat(cs.paddingLeft),
      right: parseFloat(cs.paddingRight),
      top: parseFloat(cs.paddingTop),
      bottom: parseFloat(cs.paddingBottom),
      width: parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight),
      height: parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom),
    },
    border: {
      left: parseFloat(cs.borderLeftWidth),
      right: parseFloat(cs.borderRightWidth),
      top: parseFloat(cs.borderTopWidth),
      bottom: parseFloat(cs.borderBottomWidth),
      width: parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth),
      height: parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth),
    }
  };
  if (el === PLOT) {
    // For the PLOT we also want to take into account the offset
    odata.offset = {
      top: PLOT.offsetParent == CONTAINER ? PLOT.offsetTop : 0,
      left: PLOT.offsetParent == CONTAINER ? PLOT.offsetLeft : 0,
    }
  }
  return odata;
}
function getSizeData() {
  const data = {
    plot_pad: getOffsetData(PLOT),
    plot_rect: PLOT.getBoundingClientRect(),
    container_pad: getOffsetData(CONTAINER),
    container_rect: CONTAINER.getBoundingClientRect(),
  };
  return data;
}
function computeContainerSize({ width, height }, sizeData = getSizeData()) {
  const computed_size = computePlotSize(sizeData);
  const offsets = computed_size.offsets;

  const plot_data = {
    width: width ?? computed_size.width,
    height: height ?? computed_size.height,
  };

  return {
    width: (width ?? computed_size.width) + offsets.width,
    height: (height ?? computed_size.height) + offsets.height,
    noChange: width == computed_size.width && height == computed_size.height,
  }
}

// This function will change the container size so that the resulting plot will be matching the provided specs
function changeContainerSize({ width, height }, sizeData = getSizeData()) {
  if (!CONTAINER.isPoppedOut()) {
    console.log("Tried to change container size when not popped, ignoring");
    return;
  }

  const csz = computeContainerSize({ width, height }, sizeData);

  if (csz.noChange) {
    console.log("Size is the same as current, ignoring");
    return
  }
  // We are now going to set he width and height of the container
  for (const key of ["width", "height"]) {
    CONTAINER.style[key] = csz[key] + "px";
  }
}
// We now create the function that will update the plot based on the values specified
function updateFromHeader() {
  const header_data = {
    height: config_spans.height.ui_value,
    width: config_spans.width.ui_value,
  };
  changeContainerSize(header_data);
}
// We assign this function to the onblur event of width and height
if (firstRun) {
  for (const container of Object.values(config_spans)) {
    container.ui_span.onblur = (e) => {
      container.ui_value = container.ui_span.textContent;
      updateFromHeader();
    };
  }
}
// This function computes the plot size to use for relayout as a function of the container size
function computePlotSize(data = getSizeData()) {
  // Remove Padding
  const { container_pad, plot_pad, container_rect } = data;
  const offsets = {
    width:
      plot_pad.padding.width +
      plot_pad.border.width +
      plot_pad.offset.left +
      container_pad.padding.width +
      container_pad.border.width,
    height:
      plot_pad.padding.height +
      plot_pad.border.height +
      plot_pad.offset.top +
      container_pad.padding.height +
      container_pad.border.height,
  };
  const sz = {
    width: Math.round(container_rect.width - offsets.width),
    height: Math.round(container_rect.height - offsets.height),
    offsets,
  };
  return sz;
}

// Create the resizeObserver to make the plot even more responsive! :magic:
const resizeObserver = new ResizeObserver((entries) => {
  const sizeData = getSizeData();
  const {container_rect, container_pad} = sizeData;
  let plot_size = computePlotSize(sizeData);
  // We save the height in the PLOT object
  PLOT.container_height = container_rect.height;
  // We deal with some stuff if the container is poppped
  CLIPBOARD_HEADER.style.width = container_rect.width + "px";
  CLIPBOARD_HEADER.style.left = container_rect.left + "px";
  config_spans.height.ui_value = plot_size.height;
  config_spans.width.ui_value = plot_size.width;
  /* 
		The addition of the invalid argument `plutoresize` seems to fix the problem with calling `relayout` simply with `{autosize: true}` as update breaking mouse relayout events tracking. 
		See https://github.com/plotly/plotly.js/issues/6156 for details
		*/
  let config = {
    // If this is popped out, we ignore the original width/height
    width: (CONTAINER.isPoppedOut() ? undefined : original_width) ?? plot_size.width,
    height: (CONTAINER.isPoppedOut() ? undefined : original_height) ?? plot_size.height,
    plutoresize: true,
  };
  Plotly.relayout(PLOT, config).then(() => {
    if (remove_container_size && !CONTAINER.isPoppedOut()) {
      // This is needed to avoid the first resize upon plot creation to already be without a fixed height
      CONTAINER.style.height = "";
      CONTAINER.style.width = "";
      remove_container_size = false;
    }
  });
});

resizeObserver.observe(CONTAINER);


Plotly.react(PLOT, plot_obj).then(() => {
	// Assign the Plotly event listeners
	for (const [key, listener_vec] of Object.entries(plotly_listeners)) {
		for (const listener of listener_vec) {
			PLOT.on(key, listener)
		}
	}
	// Assign the JS event listeners
	for (const [key, listener_vec] of Object.entries(js_listeners)) {
		for (const listener of listener_vec) {
			PLOT.addEventListener(key, listener, {
				signal: controller.signal
			})
		}
	}
}
)


invalidation.then(() => {
	// Remove all plotly listeners
	PLOT.removeAllListeners()
	// Remove all JS listeners
	controller.abort()
	// Remove the resizeObserver
	resizeObserver.disconnect()
})



		return CONTAINER
	</script>
mimetext/htmlrootassigneelast_run_timestampAl9"persist_js_state·has_pluto_hook_features§cell_id$c31f4646-aa8a-41e3-9c68-ae8a349d4ed1depends_on_disabled_cells§runtime0published_object_keys53ee53c46-38f7-11f0-16c9-2b093684d981/dc5f2c047336b14adepends_on_skipped_cells§errored$dab6eac0-7958-4d3a-a1af-781fb57e7adbqueued¤logsrunning¦outputbody<div class="markdown"><h3>Example 8.3: Shortcut Maze</h3>
<p>The problem of an incorrect model can be even worse in the case of an improvement to the environment.  The following example illustrates the problem in which a maze is at first blocked forcing a longer path.  After a certain number of timesteps a shorter path is opened up without disturbing the original path.  The Dyna-Q agent however never learns to switch to the shortcut because the model never reveals it or provides incentive to explore paths that it already thinks are suboptimal.  Even with an ϵ-greedy policy, it is very unlikely that hte agent will take so many exploratory actions as to discover the shortcut.  </p>
</div>mimetext/htmlrootassigneelast_run_timestampA`l۰persist_js_state·has_pluto_hook_features§cell_id$dab6eac0-7958-4d3a-a1af-781fb57e7adbdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$04ea981e-337e-4324-a5cc-178eb3c7605bqueued¤logsrunning¦outputbodyB<div class="markdown"><h2>8.11 Monte Carlo Tree Search</h2>
</div>mimetext/htmlrootassigneelast_run_timestampAbpersist_js_state·has_pluto_hook_features§cell_id$04ea981e-337e-4324-a5cc-178eb3c7605bdepends_on_disabled_cells§runtime spublished_object_keysdepends_on_skipped_cells§errored$976ff0c3-54aa-41f0-b963-baf77bea8cb8queued¤logsrunning¦outputbody<div class="markdown"><p>The general problem here is the conflict between exploration and exploitation.  In a planning context, exploration means trying actions that improve the model, whereas exploitation means behaving in the optimal way given the current model.  We want the agent to explore to find changes in the environment, but not so much that performance is greatly degraded.  As in the earlier exploration/exploitation conflict, there probably is no solution that is both perfect and practical, but simple heuristics are often effective.</p>
<p>An example of such a heuristic is that used by the Dyna-Q&#43; agent which keeps track of how many time steps have elapsed since the state-action pair was last tried in a real interaction with the environment.  The more time that has elapsed, the greater &#40;we might presume&#41; the chance that the dynamics of this pair has changed and that the model is incorrect.  To encourage behavior that tests long-untried actions, a special &quot;bonus reward&quot; is given on simulated experiences involving these actions.  In particular, if the modeled reward for a transition is <span class="tex">$r$</span>, and the transition has not been tried in <span class="tex">$\tau$</span> time steps, then planning updates are done as if that transition produced a reward of <span class="tex">$r &#43; \kappa \sqrt&#123;\rho&#125;$</span>, for some small <span class="tex">$\kappa$</span>.  This encourages the agent to keep testing all accessible state transitions and even to find long sequences of actions in order to carry out such tests.  Of course all this testing has its cost, but in many cases, as in the shortcut maze, this kind of computational curiosity is well worth the extra exploration.</p>
</div>mimetext/htmlrootassigneelast_run_timestampA`Lpersist_js_state·has_pluto_hook_features§cell_id$976ff0c3-54aa-41f0-b963-baf77bea8cb8depends_on_disabled_cells§runtime Vpublished_object_keysdepends_on_skipped_cells§errored$094321bc-2d44-4e67-9ac6-5216a42e0cd3queued¤logsrunning¦outputbody7bellman_policy_update! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$094321bc-2d44-4e67-9ac6-5216a42e0cd3depends_on_disabled_cells§runtime 8apublished_object_keysdepends_on_skipped_cells§errored$13f08473-f0d8-47d1-aa48-de3e4a083dbfqueued¤logsrunning¦outputbody+simulate! (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampA4jpersist_js_state·has_pluto_hook_features§cell_id$13f08473-f0d8-47d1-aa48-de3e4a083dbfdepends_on_disabled_cells§runtime 2zpublished_object_keysdepends_on_skipped_cells§errored$f143446c-e44b-4d75-baa7-3b24eafad003queued¤logsrunning¦outputbody+simulate! (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$f143446c-e44b-4d75-baa7-3b24eafad003depends_on_disabled_cells§runtime Mtpublished_object_keysdepends_on_skipped_cells§errored$0899f37c-5def-4d15-8ca3-ebdec8e96b43queued¤logsrunning¦outputbody9begin_value_iteration_v (generic function with 3 methods)mimetext/plainrootassigneelast_run_timestampAų'persist_js_state·has_pluto_hook_features§cell_id$0899f37c-5def-4d15-8ca3-ebdec8e96b43depends_on_disabled_cells§runtime , published_object_keysdepends_on_skipped_cells§errored$94b339bb-6e2d-422f-8043-615e8be9a217queued¤logsrunning¦outputbodyFiniteStochasticMDPmimetext/plainrootassigneelast_run_timestampAܖpersist_js_state·has_pluto_hook_features§cell_id$94b339bb-6e2d-422f-8043-615e8be9a217depends_on_disabled_cells§runtime Jpublished_object_keysdepends_on_skipped_cells§errored$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0aqueued¤logsrunning¦outputbody9monte_carlo_tree_search (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAűOpersist_js_state·has_pluto_hook_features§cell_id$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0adepends_on_disabled_cells§runtimeԵpublished_object_keysdepends_on_skipped_cells§errored$dff6f326-ab7e-45e5-8c5e-28bfbb1d99bcqueued¤logsrunning¦outputbody<div class="markdown"><h3>Example 8.4: Prioritized Sweeping on Mazes</h3>
<p>Consider different mazes with the same wall structure as the Dyna Maze example but scaled up to different resolutions.  Some example mazes are shown below.</p>
</div>mimetext/htmlrootassigneelast_run_timestampAapersist_js_state·has_pluto_hook_features§cell_id$dff6f326-ab7e-45e5-8c5e-28bfbb1d99bcdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$81f2f335-6606-4506-bfb3-d0d95e651f24queued¤logsrunning¦outputbody8bellman_optimal_update! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampACpersist_js_state·has_pluto_hook_features§cell_id$81f2f335-6606-4506-bfb3-d0d95e651f24depends_on_disabled_cells§runtime 7?ٵpublished_object_keysdepends_on_skipped_cells§errored$aa898360-f802-438a-9081-a2e517230db2queued¤logsrunning¦outputbody,apply_uct! (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAqՄpersist_js_state·has_pluto_hook_features§cell_id$aa898360-f802-438a-9081-a2e517230db2depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$2c587d5b-7b62-4835-ad02-9575c13d5874queued¤logsrunning¦outputbody3show_mcts_solution (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA\persist_js_state·has_pluto_hook_features§cell_id$2c587d5b-7b62-4835-ad02-9575c13d5874depends_on_disabled_cells§runtime $Gpublished_object_keysdepends_on_skipped_cells§errored$a8ec05ad-8333-4423-ab42-883ab806ebd7queued¤logsrunning¦outputbody?uniform_bellman_optimal_value! (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA7persist_js_state·has_pluto_hook_features§cell_id$a8ec05ad-8333-4423-ab42-883ab806ebd7depends_on_disabled_cells§runtime spublished_object_keysdepends_on_skipped_cells§errored±cell_dependencies $2fa207dd-749f-4dc0-b4ab-159edf1d9bceprecedence_heuristic	cell_id$2fa207dd-749f-4dc0-b4ab-159edf1d9bcedownstream_cells_mapbegin_value_iteration_vupstream_cells_maplengthzeroCompleteMDP$94b339bb-6e2d-422f-8043-615e8be9a217ones*Real$e0cc1ca1-595d-44e2-8612-261df9e2d327precedence_heuristic	cell_id$e0cc1ca1-595d-44e2-8612-261df9e2d327downstream_cells_mapupstream_cells_map@md_strgetindex$304e6afd-11e0-4011-9929-85889b988400precedence_heuristic	cell_id$304e6afd-11e0-4011-9929-85889b988400downstream_cells_mapMDP_MC$e43513e8-2517-43b7-9a16-e57d4125edc4upstream_cells_mapnewMDP$e25ec0d5-f70f-4269-b2a1-efa194936f72typeofrandFunctionVector$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07precedence_heuristic	cell_id$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07downstream_cells_mapmake_ϵ_greedy_policy!$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$d0b18699-7d3a-418d-9d15-be41f1643f09$679b6096-b3ca-422d-9d9a-225832510ab1$324181f0-b890-4198-9b4b-c36547e6629a$4494cb61-ee2c-467b-9bf6-0afb59023e91$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7a$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_mapsumisapproxAbstractVectorviewoneReallengtheachindex-/+*maximum$3b4e27e7-8065-44b3-bc2a-e540913aa540precedence_heuristic	cell_id$3b4e27e7-8065-44b3-bc2a-e540913aa540downstream_cells_maptakestep$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$d0b18699-7d3a-418d-9d15-be41f1643f09$b15f1262-1acf-40e5-87a7-bc4b1b437a42$250ea9da-dea3-4bf3-932d-cdda6756ae33$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7aupstream_cells_mapsample_action$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13weightskeysMatrixcollectsampleFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217Real$6e273f2b-a1af-421f-aca7-772a836b89efprecedence_heuristic	cell_id$6e273f2b-a1af-421f-aca7-772a836b89efdownstream_cells_mapuniform_bellman_policy_value!$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6upstream_cells_mapbellman_policy_update!$094321bc-2d44-4e67-9ac6-5216a42e0cd3zeroeachindexmaxMatrixisless+FiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217Real$726af565-8905-4409-864f-a5c1b5767e09precedence_heuristic	cell_id$726af565-8905-4409-864f-a5c1b5767e09downstream_cells_mapform_random_policy$0899f37c-5def-4d15-8ca3-ebdec8e96b43upstream_cells_maplength/CompleteMDP$94b339bb-6e2d-422f-8043-615e8be9a217ones$5d2abde0-7128-41c3-bd1f-b6940492d1aeprecedence_heuristic	cell_id$5d2abde0-7128-41c3-bd1f-b6940492d1aedownstream_cells_mapdouble_q_learningupstream_cells_mapAbstractFloatzerofirstdouble_expected_sarsa$113d2bc2-1f77-479f-86e5-a65b20672d7aonecreate_greedy_policy$9a1b250f-b404-4db3-a4b7-4cd33b79d921/Matrixmake_greedy_policy!$f8bf29fe-568f-437f-ba82-6b861988a18e$82e1ceb8-b1bb-4dea-b041-bf462041793f$e4f73889-af82-4304-89d5-ee50172eb3da$33f66659-1a87-4890-9137-dbc7776a19d8$0adcbce8-2be5-48ef-af43-04815e10dc5cinitialize_state_action_value$7ae23e8e-d554-4d26-a08a-83dab507af13MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbmake_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07create_ϵ_greedy_policy$324181f0-b890-4198-9b4b-c36547e6629a$76489f21-677e-4c25-beaa-afaf2244cd94precedence_heuristic	cell_id$76489f21-677e-4c25-beaa-afaf2244cd94downstream_cells_mapupstream_cells_map@md_strgetindex$1127c36f-9bc0-49b1-9481-8a5861bdf6caprecedence_heuristic	cell_id$1127c36f-9bc0-49b1-9481-8a5861bdf6cadownstream_cells_mapupstream_cells_map@md_strgetindex$69ff1b72-cb1b-4724-a445-38e4c9846964precedence_heuristic	cell_id$69ff1b72-cb1b-4724-a445-38e4c9846964downstream_cells_mapupstream_cells_map@md_strgetindex$3edc09ab-8fa1-440f-8a45-546898a2b2a3precedence_heuristic	cell_id$3edc09ab-8fa1-440f-8a45-546898a2b2a3downstream_cells_maptakestep$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$d0b18699-7d3a-418d-9d15-be41f1643f09$b15f1262-1acf-40e5-87a7-bc4b1b437a42$250ea9da-dea3-4bf3-932d-cdda6756ae33$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7aupstream_cells_mapFunction$6c8cd429-2c2e-4515-98b2-d0394962e479precedence_heuristic	cell_id$6c8cd429-2c2e-4515-98b2-d0394962e479downstream_cells_maptakestep$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$d0b18699-7d3a-418d-9d15-be41f1643f09$b15f1262-1acf-40e5-87a7-bc4b1b437a42$250ea9da-dea3-4bf3-932d-cdda6756ae33$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7aupstream_cells_mapFiniteDeterministicMDP$94b339bb-6e2d-422f-8043-615e8be9a217sample_action$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13MatrixReal$6605b946-3010-47ed-8d88-3c4dca993cf8precedence_heuristic	cell_id$6605b946-3010-47ed-8d88-3c4dca993cf8downstream_cells_mapbegin_value_iteration_qupstream_cells_maplengthzeroCompleteMDP$94b339bb-6e2d-422f-8043-615e8be9a217ones*Real$00c8f62f-dee2-476c-b896-68d3ab57a168precedence_heuristic	cell_id$00c8f62f-dee2-476c-b896-68d3ab57a168downstream_cells_mapfigure_8_8$8586d633-7c50-49ba-9b74-b5bdad27c317$fcaddc19-c0c9-4e8e-8f84-adc7a02cc1f5upstream_cells_map searchsortedfirstislessFloat64copymake_random_mdp$636d768c-670d-4485-a1dd-2bab6cf086d0lengthVectorscattermin/==:collect|>zeroscumsum<=Int64push!plotuniform_bellman_optimal_value!$a8ec05ad-8333-4423-ab42-883ab806ebd7foldxt+*!trajectory_bellman_optimal_value!$d0b18699-7d3a-418d-9d15-be41f1643f09MapLayoutmaximum$4d4baa61-b5bd-4bcf-a491-9a35a1695f0bprecedence_heuristic	cell_id$4d4baa61-b5bd-4bcf-a491-9a35a1695f0bdownstream_cells_mapupstream_cells_mapfigure8_3$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3num_episodes_8_3$27d12c1c-ddb0-4bc1-af51-3388ff806705$cd79ce14-14a1-43c6-93e0-b4a786f7f9fbprecedence_heuristic	cell_id$cd79ce14-14a1-43c6-93e0-b4a786f7f9fbdownstream_cells_mapupstream_cells_map@md_strgetindex$516234a8-2748-11ed-35df-432eebaa5162precedence_heuristic	cell_id$516234a8-2748-11ed-35df-432eebaa5162downstream_cells_mapupstream_cells_map@md_strgetindex$bf7950f2-05fa-4455-ad08-27735148d95cprecedence_heuristic	cell_id$bf7950f2-05fa-4455-ad08-27735148d95cdownstream_cells_mapmonte_carlo_tree_search$beae0491-ed11-4edf-a136-d384578b088b$2c587d5b-7b62-4835-ad02-9575c13d5874$41bb1f78-b83a-4a45-ba5c-faa94e112f45upstream_cells_map (DicttimeTuple>islessone'Base.CoreLogging.Base.fixup_stdlib_pathBase.CoreLogging.!lengthsample_action$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13<NamedTupleeachindexvaluesReal/@infoBase.invokelatestmake_greedy_policy!$f8bf29fe-568f-437f-ba82-6b861988a18e$82e1ceb8-b1bb-4dea-b041-bf462041793f$e4f73889-af82-4304-89d5-ee50172eb3da$33f66659-1a87-4890-9137-dbc7776a19d8$0adcbce8-2be5-48ef-af43-04815e10dc5croundminimumBase.CoreLogging.invokelatestBase.CoreLogging.===AfterstateMDP_MC$47ce2eda-b2c4-4f81-8d91-955bc35bab49:simulate!$f143446c-e44b-4d75-baa7-3b24eafad003$13f08473-f0d8-47d1-aa48-de3e4a083dbf$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cfzeroshaskey#___this_pluto_module_namerandIntegerFunctionapply_uct!$f369a092-420d-4660-b802-93f05d5e7972$aa898360-f802-438a-9081-a2e517230db2BaseInt64UInt64-Base.CoreLogging.isa+Base.CoreLogging.>=$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27precedence_heuristic	cell_id$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27downstream_cells_mapupstream_cells_mapfig_8_4_params$8987052b-0828-43a5-982e-5f3d6209f2aafigure_8_4$2ff6d187-e06f-47b5-9834-d06bfc820c26$47ce2eda-b2c4-4f81-8d91-955bc35bab49precedence_heuristic	cell_id$47ce2eda-b2c4-4f81-8d91-955bc35bab49downstream_cells_mapAfterstateMDP_MC$bf7950f2-05fa-4455-ad08-27735148d95c$f143446c-e44b-4d75-baa7-3b24eafad003$13f08473-f0d8-47d1-aa48-de3e4a083dbfupstream_cells_mapDictTuplefirsttypeof=>randFunctionmakelookup$037f1804-b24e-46e7-b2a8-6747e669db66VectorInt64new$679b6096-b3ca-422d-9d9a-225832510ab1precedence_heuristic	cell_id$679b6096-b3ca-422d-9d9a-225832510ab1downstream_cells_mapupstream_cells_mapvholdtest$5e49504e-9623-48f9-aeb5-360906b92a09make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07$d5ac7c6f-9636-46d9-806f-34d6c8e4d4d5precedence_heuristic	cell_id$d5ac7c6f-9636-46d9-806f-34d6c8e4d4d5downstream_cells_mapupstream_cells_map@md_strgetindex$aee1f6a8-de43-402e-b375-86c0f2f9e6b8precedence_heuristic	cell_id$aee1f6a8-de43-402e-b375-86c0f2f9e6b8downstream_cells_mapfigure_8_5′$f0e88db8-e3ee-4b74-923e-c34038024824upstream_cells_map:blocking_maze2$5ae2d740-13c7-4568-8f04-25bc82fecbdbtabular_dynaQplus$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3zerosblocking_maze3$db66615e-fbbc-4ea8-b529-bdc14e58a215cumsumtabular_dynaQ$5afad18b-1d87-450e-a0ff-8c1249d663edscatterplot/+$a3243bc4-7ae7-418a-9881-a265ca95f5efprecedence_heuristic	cell_id$a3243bc4-7ae7-418a-9881-a265ca95f5efdownstream_cells_mapupstream_cells_map@md_strgetindex$466268c4-664d-42dd-84c1-7b8ade49936fprecedence_heuristic	cell_id$466268c4-664d-42dd-84c1-7b8ade49936fdownstream_cells_mapupstream_cells_map@md_strgetindex$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96precedence_heuristic	cell_id$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96downstream_cells_maprollout$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771b$beae0491-ed11-4edf-a136-d384578b088b$2c587d5b-7b62-4835-ad02-9575c13d5874$41bb1f78-b83a-4a45-ba5c-faa94e112f45upstream_cells_mapInf$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8precedence_heuristic	cell_id$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8downstream_cells_maprunepisode$41bb1f78-b83a-4a45-ba5c-faa94e112f45$1f7d77a6-d774-436d-a745-5a160cc15f2bupstream_cells_mapmake_random_policy$fb5601b0-06d4-43c4-81a6-23a4a8f29f00MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6db$f424edac-388d-4465-900f-9459d2a88f79precedence_heuristic	cell_id$f424edac-388d-4465-900f-9459d2a88f79downstream_cells_mapinit_step$4494cb61-ee2c-467b-9bf6-0afb59023e91upstream_cells_mapsample_action$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13MatrixMDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbFunctionReal$08e81e30-119d-4f4e-a865-f1f85cbffd31precedence_heuristic	cell_id$08e81e30-119d-4f4e-a865-f1f85cbffd31downstream_cells_mapupstream_cells_map@md_strgetindex$898f1b06-a34f-496b-99db-9ca23498cbeeprecedence_heuristic	cell_id$898f1b06-a34f-496b-99db-9ca23498cbeedownstream_cells_map"prioritized_sweeping_deterministic$fb00aedd-e103-4463-b4f8-d0dce6275c64upstream_cells_map #zerokeysTuple>isless!onecopylengthdelete!<eachindex/isemptyinitialize_state_action_value$7ae23e8e-d554-4d26-a08a-83dab507af13==absMDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbPriorityQueueAbstractFloat:calculate_qmaxfirstzerosBase<=takestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540findall-Int64+*make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07maximumcreate_ϵ_greedy_policy$324181f0-b890-4198-9b4b-c36547e6629a$08ff749b-f4ff-4639-99f5-48262aa4643eprecedence_heuristic	cell_id$08ff749b-f4ff-4639-99f5-48262aa4643edownstream_cells_mapupstream_cells_map@md_strgetindex$245d9616-e0d2-497e-bfdd-4729a7215bfdprecedence_heuristic	cell_id$245d9616-e0d2-497e-bfdd-4729a7215bfddownstream_cells_mapupstream_cells_map@md_strgetindex$e8a6e672-b860-404f-83c1-62a080f23112precedence_heuristic	cell_id$e8a6e672-b860-404f-83c1-62a080f23112downstream_cells_mapupstream_cells_map@md_strgetindex$39ae7727-ea72-48f3-8d63-e03a9f607f87precedence_heuristic	cell_id$39ae7727-ea72-48f3-8d63-e03a9f607f87downstream_cells_mapmake_dyna_maze$4b424a47-dfeb-4380-8ab8-8bd24a080c2e$fb00aedd-e103-4463-b4f8-d0dce6275c64upstream_cells_map:unionceilInt64-+*make_gridworld$bb439641-30bd-495d-ba70-06b2e27efdbdinGridworldState$729197ce-2c27-467d-ba5f-47a1ecd539f2Set$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056precedence_heuristic	cell_id$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056downstream_cells_maprollout$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771b$beae0491-ed11-4edf-a136-d384578b088b$2c587d5b-7b62-4835-ad02-9575c13d5874$41bb1f78-b83a-4a45-ba5c-faa94e112f45upstream_cells_mapMDP$e25ec0d5-f70f-4269-b2a1-efa194936f72InfrandReal$d0b18699-7d3a-418d-9d15-be41f1643f09precedence_heuristic	cell_id$d0b18699-7d3a-418d-9d15-be41f1643f09downstream_cells_map!trajectory_bellman_optimal_value!$00c8f62f-dee2-476c-b896-68d3ab57a168upstream_cells_mapzeromax!bellman_optimal_update!$81f2f335-6606-4506-bfb3-d0d95e651f24islessFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217RealFunctiontakestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540Matrix+make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07$cd1980ff-2f35-4599-b08c-2037ddf5e995precedence_heuristic	cell_id$cd1980ff-2f35-4599-b08c-2037ddf5e995downstream_cells_mapfigure_8_4′′$c31f4646-aa8a-41e3-9c68-ae8a349d4ed1upstream_cells_map:blocking_maze2$5ae2d740-13c7-4568-8f04-25bc82fecbdbtabular_dynaQplus$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3zeroscumsumscatterplot/blocking_maze1$5ae2d740-13c7-4568-8f04-25bc82fecbdb+tabular_dynaQplus′$269f4505-e807-446c-8fd8-3458482e00ab$c32d0943-ba8f-438f-83b6-5ed42221f630precedence_heuristic	cell_id$c32d0943-ba8f-438f-83b6-5ed42221f630downstream_cells_mapfigure_8_5′′$1aa76f3d-6041-4886-a6cd-787bdf1ec63cupstream_cells_map:blocking_maze2$5ae2d740-13c7-4568-8f04-25bc82fecbdbtabular_dynaQplus$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3zerosblocking_maze3$db66615e-fbbc-4ea8-b529-bdc14e58a215cumsumscatterplot/+tabular_dynaQplus′$269f4505-e807-446c-8fd8-3458482e00ab$fc137613-7b4b-414c-93af-eeb2ace5d67fprecedence_heuristic	cell_id$fc137613-7b4b-414c-93af-eeb2ace5d67fdownstream_cells_mapmake_ϵ_greedy_policy!$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$d0b18699-7d3a-418d-9d15-be41f1643f09$679b6096-b3ca-422d-9d9a-225832510ab1$324181f0-b890-4198-9b4b-c36547e6629a$4494cb61-ee2c-467b-9bf6-0afb59023e91$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7a$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_map sumisnanislessoneFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217Base.CoreLogging.!lengthReal'Base.CoreLogging.Base.fixup_stdlib_patheachindex/Matrix@infoBase.invokelatest≈Base.CoreLogging.invokelatestBase.CoreLogging.===:maxInf#___this_pluto_module_nameBaseInt64-Base.CoreLogging.isa+Base.CoreLogging.>=$cffc9f11-77d7-4076-aa3b-821f1c741f58precedence_heuristic	cell_id$cffc9f11-77d7-4076-aa3b-821f1c741f58downstream_cells_mapuct$f369a092-420d-4660-b802-93f05d5e7972$f6486854-4892-4fb6-a805-de56b19b3571$aa898360-f802-438a-9081-a2e517230db2upstream_cells_mapDictInt64logsqrt/TupleReal$4b424a47-dfeb-4380-8ab8-8bd24a080c2eprecedence_heuristic	cell_id$4b424a47-dfeb-4380-8ab8-8bd24a080c2edownstream_cells_mapnewmaze2newmazeupstream_cells_mapmaze_walls$c04c803c-cdca-4b8b-9c9d-e456ee677906dyna_maze$c04c803c-cdca-4b8b-9c9d-e456ee677906make_dyna_maze$39ae7727-ea72-48f3-8d63-e03a9f607f87inplot_path$eded8b72-70f4-4579-ba69-2eca409fa684$1f7d77a6-d774-436d-a745-5a160cc15f2b$502a7125-4460-4d39-be14-4852fb6d9ad2$0f37ec0a-b737-478b-bf6a-027899250c4eprecedence_heuristic	cell_id$0f37ec0a-b737-478b-bf6a-027899250c4edownstream_cells_mapsarsa_step$4494cb61-ee2c-467b-9bf6-0afb59023e91upstream_cells_mapsample_action$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13MatrixMDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbFunctionReal$8dbc76fd-ac73-47ca-983e-0e90023390e3precedence_heuristic	cell_id$8dbc76fd-ac73-47ca-983e-0e90023390e3downstream_cells_mapupstream_cells_mapfigure8_2$cd139745-1877-43a2-97a0-3333e544cbd8$e4f73889-af82-4304-89d5-ee50172eb3daprecedence_heuristic	cell_id$e4f73889-af82-4304-89d5-ee50172eb3dadownstream_cells_mapmake_greedy_policy!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$0899f37c-5def-4d15-8ca3-ebdec8e96b43$9a1b250f-b404-4db3-a4b7-4cd33b79d921$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_map≈:summaxislessInfFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217Realeachindex-/Matrix$636d768c-670d-4485-a1dd-2bab6cf086d0precedence_heuristic	cell_id$636d768c-670d-4485-a1dd-2bab6cf086d0downstream_cells_mapmake_random_mdp$00c8f62f-dee2-476c-b896-68d3ab57a168upstream_cells_mapDictrandn:collect=>ziprandFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217eachindex-/+*fill$cd139745-1877-43a2-97a0-3333e544cbd8precedence_heuristic	cell_id$cd139745-1877-43a2-97a0-3333e544cbd8downstream_cells_mapfigure8_2$8dbc76fd-ac73-47ca-983e-0e90023390e3upstream_cells_map:Random$0fff8e1b-d0c2-49b8-93b4-8d1615c26690zerostabular_dynaQ$5afad18b-1d87-450e-a0ff-8c1249d663edendInt64scatterplot/+dyna_maze$c04c803c-cdca-4b8b-9c9d-e456ee677906LayoutRandom.seed!$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6precedence_heuristic	cell_id$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6downstream_cells_mapq_policy_evaluation!upstream_cells_mapzerouniform_bellman_policy_value!$6e273f2b-a1af-421f-aca7-772a836b89ef>islessFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217Realeps<Int64<=typemaxMatrix+$f369a092-420d-4660-b802-93f05d5e7972precedence_heuristic	cell_id$f369a092-420d-4660-b802-93f05d5e7972downstream_cells_mapapply_uct!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95cupstream_cells_map Dict@fastmathsumkeysTupleuct$308fd488-a009-4de0-8b27-c1f6b0677fed$cffc9f11-77d7-4076-aa3b-821f1c741f58Inf@inboundsBase.FastMath.div_fastVectorRealInt64BasevaluesBase.FastMath.add_fastisemptyBase.FastMath.mul_fast$1d97325a-8b9a-438d-a5f9-e17638e64627precedence_heuristic	cell_id$1d97325a-8b9a-438d-a5f9-e17638e64627downstream_cells_mapinitialize_state_valueupstream_cells_maplengthones*MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloat$113d2bc2-1f77-479f-86e5-a65b20672d7aprecedence_heuristic	cell_id$113d2bc2-1f77-479f-86e5-a65b20672d7adownstream_cells_mapdouble_expected_sarsa$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_map zerosum!islessoneVectorlength<copyeachindex/Matrixinitialize_state_action_value$7ae23e8e-d554-4d26-a08a-83dab507af13==MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloat:firstzerosrandfindallInt64takestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540-create_greedy_policy$9a1b250f-b404-4db3-a4b7-4cd33b79d921+undef*make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07create_ϵ_greedy_policy$324181f0-b890-4198-9b4b-c36547e6629a$27d12c1c-ddb0-4bc1-af51-3388ff806705precedence_heuristic	cell_id$27d12c1c-ddb0-4bc1-af51-3388ff806705downstream_cells_mapnum_episodes_8_3$4d4baa61-b5bd-4bcf-a491-9a35a1695f0bupstream_cells_map@md_strCore:Base.get@bindBasePlutoRunnerPlutoRunner.create_bondNumberFieldCore.applicablegetindex$f0e88db8-e3ee-4b74-923e-c34038024824precedence_heuristic	cell_id$f0e88db8-e3ee-4b74-923e-c34038024824downstream_cells_mapupstream_cells_mapfigure_8_5′$aee1f6a8-de43-402e-b375-86c0f2f9e6b8$b0df4dad-74c7-4469-a13f-5ef6bb81199fprecedence_heuristic	cell_id$b0df4dad-74c7-4469-a13f-5ef6bb81199fdownstream_cells_mapupstream_cells_map@md_strgetindex$cfdaa9c2-265f-4540-9d04-d1b7a72aee3eprecedence_heuristic	cell_id$cfdaa9c2-265f-4540-9d04-d1b7a72aee3edownstream_cells_mapupstream_cells_mapfigure_8_7$df62fd47-6627-4931-b429-964c65960446$250ea9da-dea3-4bf3-932d-cdda6756ae33precedence_heuristic	cell_id$250ea9da-dea3-4bf3-932d-cdda6756ae33downstream_cells_maprunepisode$41bb1f78-b83a-4a45-ba5c-faa94e112f45$1f7d77a6-d774-436d-a745-5a160cc15f2bupstream_cells_map!InfFunctionVectorReal<=takestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540push!CompleteMDP$94b339bb-6e2d-422f-8043-615e8be9a217Matrix+$bc295bb5-addb-4bcf-a3e3-c839ccc346bdprecedence_heuristic	cell_id$bc295bb5-addb-4bcf-a3e3-c839ccc346bddownstream_cells_mapupstream_cells_map@md_strgetindex$729197ce-2c27-467d-ba5f-47a1ecd539f2precedence_heuristic	cell_id$729197ce-2c27-467d-ba5f-47a1ecd539f2downstream_cells_mapapply_windDown$729197ce-2c27-467d-ba5f-47a1ecd539f2DownRight$729197ce-2c27-467d-ba5f-47a1ecd539f2UpLeft$729197ce-2c27-467d-ba5f-47a1ecd539f2Stay$729197ce-2c27-467d-ba5f-47a1ecd539f2Up$729197ce-2c27-467d-ba5f-47a1ecd539f2Right$729197ce-2c27-467d-ba5f-47a1ecd539f2GridworldAction$729197ce-2c27-467d-ba5f-47a1ecd539f2$bb439641-30bd-495d-ba70-06b2e27efdbdLeft$729197ce-2c27-467d-ba5f-47a1ecd539f2UpRight$729197ce-2c27-467d-ba5f-47a1ecd539f2DownLeft$729197ce-2c27-467d-ba5f-47a1ecd539f2wind_valsmove$bb439641-30bd-495d-ba70-06b2e27efdbdGridworldState$c04c803c-cdca-4b8b-9c9d-e456ee677906$39ae7727-ea72-48f3-8d63-e03a9f607f87$5ae2d740-13c7-4568-8f04-25bc82fecbdb$db66615e-fbbc-4ea8-b529-bdc14e58a215$2c587d5b-7b62-4835-ad02-9575c13d5874$bb439641-30bd-495d-ba70-06b2e27efdbdrook_actions$bb439641-30bd-495d-ba70-06b2e27efdbdupstream_cells_mapDown$729197ce-2c27-467d-ba5f-47a1ecd539f2Stay$729197ce-2c27-467d-ba5f-47a1ecd539f2UpLeft$729197ce-2c27-467d-ba5f-47a1ecd539f2DownRight$729197ce-2c27-467d-ba5f-47a1ecd539f2Up$729197ce-2c27-467d-ba5f-47a1ecd539f2Right$729197ce-2c27-467d-ba5f-47a1ecd539f2Int64Left$729197ce-2c27-467d-ba5f-47a1ecd539f2-GridworldAction$729197ce-2c27-467d-ba5f-47a1ecd539f2DownLeft$729197ce-2c27-467d-ba5f-47a1ecd539f2UpRight$729197ce-2c27-467d-ba5f-47a1ecd539f2+$1aa76f3d-6041-4886-a6cd-787bdf1ec63cprecedence_heuristic	cell_id$1aa76f3d-6041-4886-a6cd-787bdf1ec63cdownstream_cells_mapupstream_cells_mapfigure_8_5′′$c32d0943-ba8f-438f-83b6-5ed42221f630$3bf9e526-826d-42b8-84ee-75f1c7f79c69precedence_heuristic	cell_id$3bf9e526-826d-42b8-84ee-75f1c7f79c69downstream_cells_mapdisplay_rook_policy$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69upstream_cells_map HypertextLiteral.attribute_valueHypertextLiteral.BypassHypertextLiteral.ResultHypertextLiteral$0fff8e1b-d0c2-49b8-93b4-8d1615c26690@htlAbstractFloatVector$308fd488-a009-4de0-8b27-c1f6b0677fedprecedence_heuristic	cell_id$308fd488-a009-4de0-8b27-c1f6b0677feddownstream_cells_mapuct$f369a092-420d-4660-b802-93f05d5e7972$f6486854-4892-4fb6-a805-de56b19b3571$aa898360-f802-438a-9081-a2e517230db2upstream_cells_mapDictInt64logsqrt/Real$340ba72b-172a-4d92-99b2-17687ab511c7precedence_heuristic	cell_id$340ba72b-172a-4d92-99b2-17687ab511c7downstream_cells_mapupstream_cells_map@md_strgetindex$44364e7f-1910-421a-b961-63fbbaac8230precedence_heuristic	cell_id$44364e7f-1910-421a-b961-63fbbaac8230downstream_cells_mapbellman_optimal_value!$4b2a4fb1-7395-4293-9ff9-e2f9da50f56b$80affd41-b5e6-4b9c-b827-4e3b39bd7767upstream_cells_map zero@fastmathtypeminkeysBase.FastMath.sub_fastisless@inboundsFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217nothingVector<Base.FastMath.max_fastBase.simd_indexeachindexReal@simdBase.FastMath.abs_fastjulia.simdloopBase.FastMath.div_fastepsBaseBase.simd_outer_rangeBase.simd_inner_lengthBase.FastMath.add_fast+Base.FastMath.mul_fast$4f4551fe-54a9-4186-ab8f-3535dc2bf4c5precedence_heuristic	cell_id$4f4551fe-54a9-4186-ab8f-3535dc2bf4c5downstream_cells_mapupstream_cells_map@md_strgetindex$f6486854-4892-4fb6-a805-de56b19b3571precedence_heuristic	cell_id$f6486854-4892-4fb6-a805-de56b19b3571downstream_cells_mapmake_uct_plusupstream_cells_map Dict@fastmathzerokeys!uct$308fd488-a009-4de0-8b27-c1f6b0677fed$cffc9f11-77d7-4076-aa3b-821f1c741f58isless@inboundsonerandFunctionVectorReal<Int64Base-Base.FastMath.add_fast/isemptyBase.FastMath.mul_fast$fb5601b0-06d4-43c4-81a6-23a4a8f29f00precedence_heuristic	cell_id$fb5601b0-06d4-43c4-81a6-23a4a8f29f00downstream_cells_mapmake_random_policy$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8$502a7125-4460-4d39-be14-4852fb6d9ad2upstream_cells_maplength/onesMDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloat$82e5719c-bbdb-4a18-b2f0-ad746b6acd41precedence_heuristic	cell_id$82e5719c-bbdb-4a18-b2f0-ad746b6acd41downstream_cells_mapmake_puctupstream_cells_map DictBase.FastMath.sub_fast@fastmathzerokeyssqrt!@inboundsoneBase.FastMath.div_fastFunctionVectorRealInt64BaseBase.FastMath.add_fast/+isempty*Base.FastMath.mul_fast$c62cc32c-0d29-4ea2-8284-ac4c883df6dbprecedence_heuristic	cell_id$c62cc32c-0d29-4ea2-8284-ac4c883df6dbdownstream_cells_mapMDP_TD $5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$fb5601b0-06d4-43c4-81a6-23a4a8f29f00$1d97325a-8b9a-438d-a5f9-e17638e64627$7ae23e8e-d554-4d26-a08a-83dab507af13$eb9ba23d-bee5-4bb1-b3e1-fe40d9f681dc$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8$0f37ec0a-b737-478b-bf6a-027899250c4e$f424edac-388d-4465-900f-9459d2a88f79$4494cb61-ee2c-467b-9bf6-0afb59023e91$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7a$5d2abde0-7128-41c3-bd1f-b6940492d1ae$bb439641-30bd-495d-ba70-06b2e27efdbdupstream_cells_mapVectorInt64newDictMDP$e25ec0d5-f70f-4269-b2a1-efa194936f72Functionmakelookup$037f1804-b24e-46e7-b2a8-6747e669db66$8586d633-7c50-49ba-9b74-b5bdad27c317precedence_heuristic	cell_id$8586d633-7c50-49ba-9b74-b5bdad27c317downstream_cells_mapupstream_cells_mapfigure_8_8$00c8f62f-dee2-476c-b896-68d3ab57a168$bb439641-30bd-495d-ba70-06b2e27efdbdprecedence_heuristic	cell_id$bb439641-30bd-495d-ba70-06b2e27efdbddownstream_cells_mapmake_gridworld$c04c803c-cdca-4b8b-9c9d-e456ee677906$39ae7727-ea72-48f3-8d63-e03a9f607f87$5ae2d740-13c7-4568-8f04-25bc82fecbdb$db66615e-fbbc-4ea8-b529-bdc14e58a215upstream_cells_maprook_actions$729197ce-2c27-467d-ba5f-47a1ecd539f2:Int64GridworldAction$729197ce-2c27-467d-ba5f-47a1ecd539f2-Float32+clamp*==move$729197ce-2c27-467d-ba5f-47a1ecd539f2GridworldState$729197ce-2c27-467d-ba5f-47a1ecd539f2MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6db$aab6ca56-57ca-421e-9b71-e3e96681c4c5precedence_heuristic	cell_id$aab6ca56-57ca-421e-9b71-e3e96681c4c5downstream_cells_mapupstream_cells_map@md_strgetindex$41bb1f78-b83a-4a45-ba5c-faa94e112f45precedence_heuristic	cell_id$41bb1f78-b83a-4a45-ba5c-faa94e112f45downstream_cells_mapget_mcts_statisticsupstream_cells_maplength:rollout$f9e4baec-c988-4abd-9bb0-c618c0ec07b9$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96|>firstdyna_maze$c04c803c-cdca-4b8b-9c9d-e456ee677906meanmonte_carlo_tree_search$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771brunepisode$b15f1262-1acf-40e5-87a7-bc4b1b437a42$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8$e43513e8-2517-43b7-9a16-e57d4125edc4$250ea9da-dea3-4bf3-932d-cdda6756ae33$0fff8e1b-d0c2-49b8-93b4-8d1615c26690precedence_heuristiccell_id$0fff8e1b-d0c2-49b8-93b4-8d1615c26690downstream_cells_mapStatisticsStatsBaseTransducersDataStructuresPlutoUI$8987052b-0828-43a5-982e-5f3d6209f2aaRandom$cd139745-1877-43a2-97a0-3333e544cbd8$fb00aedd-e103-4463-b4f8-d0dce6275c64ArrowSerializationStaticArraysHypertextLiteral$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3$4b3604db-0c1b-4770-95b1-5f5bb34d071b$39c96fc8-8259-46e3-88a0-a14eb6752b5c$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69$3bf9e526-826d-42b8-84ee-75f1c7f79c69$9d69687a-8df6-4e74-aa99-fbfcc84bcccfPlutoPlotlyupstream_cells_mapTableOfContents$4e1c115a-4020-4a5a-a79a-56056892a953precedence_heuristic	cell_id$4e1c115a-4020-4a5a-a79a-56056892a953downstream_cells_mapupstream_cells_map@md_strgetindex$324181f0-b890-4198-9b4b-c36547e6629aprecedence_heuristic	cell_id$324181f0-b890-4198-9b4b-c36547e6629adownstream_cells_mapcreate_ϵ_greedy_policy$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$4494cb61-ee2c-467b-9bf6-0afb59023e91$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7a$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_mapReal:Matrixzerossizemake_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07copy$eded8b72-70f4-4579-ba69-2eca409fa684precedence_heuristic	cell_id$eded8b72-70f4-4579-ba69-2eca409fa684downstream_cells_mapplot_path$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6$5ae2d740-13c7-4568-8f04-25bc82fecbdb$db66615e-fbbc-4ea8-b529-bdc14e58a215$4b424a47-dfeb-4380-8ab8-8bd24a080c2e$2c587d5b-7b62-4835-ad02-9575c13d5874upstream_cells_map :maxislessfilterendVectorlength-scatterfindlastplotpush!+attr*fillLayoutmaximum$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6precedence_heuristic	cell_id$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6downstream_cells_mapupstream_cells_mapmaze_walls$c04c803c-cdca-4b8b-9c9d-e456ee677906HypertextLiteral.Bypassrook_action_display$9d69687a-8df6-4e74-aa99-fbfcc84bcccfHypertextLiteral$0fff8e1b-d0c2-49b8-93b4-8d1615c26690HypertextLiteral.Resultdyna_maze$c04c803c-cdca-4b8b-9c9d-e456ee677906HypertextLiteral.contentinplot_path$eded8b72-70f4-4579-ba69-2eca409fa684$1f7d77a6-d774-436d-a745-5a160cc15f2b$502a7125-4460-4d39-be14-4852fb6d9ad2@htl$6a4116c9-87cf-4ee7-8030-aa1150853984precedence_heuristic	cell_id$6a4116c9-87cf-4ee7-8030-aa1150853984downstream_cells_mapupstream_cells_mapshow_mcts_solution$2c587d5b-7b62-4835-ad02-9575c13d5874$ee0f55c6-e9c6-4199-9f27-5706f3c84863precedence_heuristic	cell_id$ee0f55c6-e9c6-4199-9f27-5706f3c84863downstream_cells_mapupstream_cells_map@md_strgetindex$caca8d95-e40e-4592-b29e-a7e8b19faeb5precedence_heuristic	cell_id$caca8d95-e40e-4592-b29e-a7e8b19faeb5downstream_cells_mapupstream_cells_map@md_strgetindex$24efe9b4-9308-4ad1-8ef0-69f6f93407c0precedence_heuristic	cell_id$24efe9b4-9308-4ad1-8ef0-69f6f93407c0downstream_cells_mapupstream_cells_map@md_strgetindex$ecd8742c-2e10-4814-b477-7024e85b7fa6precedence_heuristic	cell_id$ecd8742c-2e10-4814-b477-7024e85b7fa6downstream_cells_mapmake_ϵ_greedy_policy!$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$d0b18699-7d3a-418d-9d15-be41f1643f09$679b6096-b3ca-422d-9d9a-225832510ab1$324181f0-b890-4198-9b4b-c36547e6629a$4494cb61-ee2c-467b-9bf6-0afb59023e91$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7a$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_map ≈:summaxislessInfoneFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217Reallengtheachindexactions-/Matrix+$beae0491-ed11-4edf-a136-d384578b088bprecedence_heuristic	cell_id$beae0491-ed11-4edf-a136-d384578b088bdownstream_cells_mapupstream_cells_maprollout$f9e4baec-c988-4abd-9bb0-c618c0ec07b9$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96dyna_maze.state_initdyna_maze$c04c803c-cdca-4b8b-9c9d-e456ee677906monte_carlo_tree_search$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771b$562e824c-34b5-415d-b186-d8e2cf1980e7precedence_heuristic	cell_id$562e824c-34b5-415d-b186-d8e2cf1980e7downstream_cells_mapfigure_8_5$98547223-05a6-43da-80b2-63c67d2de283upstream_cells_map:blocking_maze2$5ae2d740-13c7-4568-8f04-25bc82fecbdbzerosblocking_maze3$db66615e-fbbc-4ea8-b529-bdc14e58a215cumsumtabular_dynaQ$5afad18b-1d87-450e-a0ff-8c1249d663edscatterplot/+*$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69precedence_heuristic	cell_id$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69downstream_cells_mapshow_grid_policy$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3upstream_cells_map findfirst:HypertextLiteral.BypassHypertextLiteral.contentmapreduce@htleachindex-HTML HypertextLiteral.attribute_valuedisplay_rook_policy$3bf9e526-826d-42b8-84ee-75f1c7f79c69HypertextLiteral$0fff8e1b-d0c2-49b8-93b4-8d1615c26690+rook_action_display$9d69687a-8df6-4e74-aa99-fbfcc84bcccfHypertextLiteral.ResultHypertextLiteral.StyleTag*maximum$eb9ba23d-bee5-4bb1-b3e1-fe40d9f681dcprecedence_heuristic	cell_id$eb9ba23d-bee5-4bb1-b3e1-fe40d9f681dcdownstream_cells_mapcheck_policyupstream_cells_mapMain.Base.inferencebarrier@assertsizenothinglengthMainthrowAssertionErrorMatrix==MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloat$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771bprecedence_heuristic	cell_id$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771bdownstream_cells_mapmonte_carlo_tree_search$beae0491-ed11-4edf-a136-d384578b088b$2c587d5b-7b62-4835-ad02-9575c13d5874$41bb1f78-b83a-4a45-ba5c-faa94e112f45upstream_cells_maprollout$f9e4baec-c988-4abd-9bb0-c618c0ec07b9$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96MDP$e25ec0d5-f70f-4269-b2a1-efa194936f72Real$6cf35193-dba5-4f78-a4ac-245dda7a0846precedence_heuristic	cell_id$6cf35193-dba5-4f78-a4ac-245dda7a0846downstream_cells_mapbegin_value_iteration_vupstream_cells_mapzeroFiniteMDP$94b339bb-6e2d-422f-8043-615e8be9a217ones*sizeReal$39c96fc8-8259-46e3-88a0-a14eb6752b5cprecedence_heuristic	cell_id$39c96fc8-8259-46e3-88a0-a14eb6752b5cdownstream_cells_mapshow_grid_valueupstream_cells_map *findfirst:HypertextLiteral.BypassHypertextLiteral.contentmapreduce@htlVectoreachindex-HTML HypertextLiteral.attribute_valueHypertextLiteral.ResultHypertextLiteral$0fff8e1b-d0c2-49b8-93b4-8d1615c26690+!=HypertextLiteral.StyleTag==roundmaximumMatrix$4494cb61-ee2c-467b-9bf6-0afb59023e91precedence_heuristic	cell_id$4494cb61-ee2c-467b-9bf6-0afb59023e91downstream_cells_mapsarsaupstream_cells_map zero!oneVectorlengthcopy/initialize_state_action_value$7ae23e8e-d554-4d26-a08a-83dab507af13==MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbinit_step$f424edac-388d-4465-900f-9459d2a88f79AbstractFloat:firstzerossarsa_step$0f37ec0a-b737-478b-bf6a-027899250c4efindallInt64-+undef*make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07create_ϵ_greedy_policy$324181f0-b890-4198-9b4b-c36547e6629a$618b5f35-2df5-4ffb-a34f-add542691080precedence_heuristic	cell_id$618b5f35-2df5-4ffb-a34f-add542691080downstream_cells_maptakestep$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$d0b18699-7d3a-418d-9d15-be41f1643f09$b15f1262-1acf-40e5-87a7-bc4b1b437a42$250ea9da-dea3-4bf3-932d-cdda6756ae33$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7aupstream_cells_mapsample_action$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13MatrixReal$0f9080af-f166-4a78-a003-8df07f6c27d4precedence_heuristic	cell_id$0f9080af-f166-4a78-a003-8df07f6c27d4downstream_cells_mapupstream_cells_mapHTML$f8bf29fe-568f-437f-ba82-6b861988a18eprecedence_heuristic	cell_id$f8bf29fe-568f-437f-ba82-6b861988a18edownstream_cells_mapmake_greedy_policy!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$0899f37c-5def-4d15-8ca3-ebdec8e96b43$9a1b250f-b404-4db3-a4b7-4cd33b79d921$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_map≈:summaxInfislessVectorRealFiniteDeterministicMDP$94b339bb-6e2d-422f-8043-615e8be9a217eachindex-/Matrix+*$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3precedence_heuristic	cell_id$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3downstream_cells_mapfigure8_3$4d4baa61-b5bd-4bcf-a491-9a35a1695f0bupstream_cells_mapshow_grid_policy$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69HypertextLiteral.BypassfirstHypertextLiteral.contenttabular_dynaQ$5afad18b-1d87-450e-a0ff-8c1249d663ed@htlcreate_greedy_policy$9a1b250f-b404-4db3-a4b7-4cd33b79d921HypertextLiteral.ResultHypertextLiteral$0fff8e1b-d0c2-49b8-93b4-8d1615c26690dyna_maze$c04c803c-cdca-4b8b-9c9d-e456ee677906last$b15f1262-1acf-40e5-87a7-bc4b1b437a42precedence_heuristic	cell_id$b15f1262-1acf-40e5-87a7-bc4b1b437a42downstream_cells_maprunepisode$41bb1f78-b83a-4a45-ba5c-faa94e112f45$1f7d77a6-d774-436d-a745-5a160cc15f2bupstream_cells_map<=takestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540push!!MDP$e25ec0d5-f70f-4269-b2a1-efa194936f72Inf+Vector$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2precedence_heuristic	cell_id$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2downstream_cells_mapexpected_sarsaupstream_cells_map zerosum!oneVectorlengthcopyeachindex/initialize_state_action_value$7ae23e8e-d554-4d26-a08a-83dab507af13==MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloat:firstzerosfindallInt64takestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540-+undef*make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07create_ϵ_greedy_policy$324181f0-b890-4198-9b4b-c36547e6629a$b3a5adcb-5343-44e9-9466-1c51c1143a0dprecedence_heuristic	cell_id$b3a5adcb-5343-44e9-9466-1c51c1143a0ddownstream_cells_mapupstream_cells_mapexample_8_4$fb00aedd-e103-4463-b4f8-d0dce6275c64$80affd41-b5e6-4b9c-b827-4e3b39bd7767precedence_heuristic	cell_id$80affd41-b5e6-4b9c-b827-4e3b39bd7767downstream_cells_mapvalue_iteration_v!$0899f37c-5def-4d15-8ca3-ebdec8e96b43upstream_cells_map<=bellman_optimal_value!$195d2a34-c44c-4088-8ec4-dece3107f16d$16c68a13-c295-4a64-bc2b-2ae8451f332f$44364e7f-1910-421a-b961-63fbbaac8230push!-copy$9a1b250f-b404-4db3-a4b7-4cd33b79d921precedence_heuristic	cell_id$9a1b250f-b404-4db3-a4b7-4cd33b79d921downstream_cells_mapcreate_greedy_policy$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3$269f4505-e807-446c-8fd8-3458482e00ab$113d2bc2-1f77-479f-86e5-a65b20672d7a$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_mapReal:Matrixzerosmake_greedy_policy!$f8bf29fe-568f-437f-ba82-6b861988a18e$82e1ceb8-b1bb-4dea-b041-bf462041793f$e4f73889-af82-4304-89d5-ee50172eb3da$33f66659-1a87-4890-9137-dbc7776a19d8$0adcbce8-2be5-48ef-af43-04815e10dc5csizecopy$db66615e-fbbc-4ea8-b529-bdc14e58a215precedence_heuristic	cell_id$db66615e-fbbc-4ea8-b529-bdc14e58a215downstream_cells_mapblocking_maze3$562e824c-34b5-415d-b186-d8e2cf1980e7$aee1f6a8-de43-402e-b375-86c0f2f9e6b8$c32d0943-ba8f-438f-83b6-5ed42221f630block3upstream_cells_map:block2$5ae2d740-13c7-4568-8f04-25bc82fecbdbblock_maze_base_args$5ae2d740-13c7-4568-8f04-25bc82fecbdbblocking_maze2$5ae2d740-13c7-4568-8f04-25bc82fecbdbplot_path$eded8b72-70f4-4579-ba69-2eca409fa684$1f7d77a6-d774-436d-a745-5a160cc15f2b$502a7125-4460-4d39-be14-4852fb6d9ad2GridworldState$729197ce-2c27-467d-ba5f-47a1ecd539f2inmake_gridworld$bb439641-30bd-495d-ba70-06b2e27efdbdSet$72b40384-9ca1-4bc1-8e1a-8b639d39e215precedence_heuristic	cell_id$72b40384-9ca1-4bc1-8e1a-8b639d39e215downstream_cells_mapupstream_cells_map@md_strgetindex$63bf9d16-4516-4cec-895f-f010275bca16precedence_heuristic	cell_id$63bf9d16-4516-4cec-895f-f010275bca16downstream_cells_mapupstream_cells_map@md_strgetindex$0adcbce8-2be5-48ef-af43-04815e10dc5cprecedence_heuristic	cell_id$0adcbce8-2be5-48ef-af43-04815e10dc5cdownstream_cells_mapmake_greedy_policy!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$0899f37c-5def-4d15-8ca3-ebdec8e96b43$9a1b250f-b404-4db3-a4b7-4cd33b79d921$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_map extremazeroexpAbstractVectorerrorisnansumoneisinfReallength-/*==abs$f9e4baec-c988-4abd-9bb0-c618c0ec07b9precedence_heuristic	cell_id$f9e4baec-c988-4abd-9bb0-c618c0ec07b9downstream_cells_maprollout$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771b$beae0491-ed11-4edf-a136-d384578b088b$2c587d5b-7b62-4835-ad02-9575c13d5874$41bb1f78-b83a-4a45-ba5c-faa94e112f45upstream_cells_map<=zero!MDP$e25ec0d5-f70f-4269-b2a1-efa194936f72^Inf+*FunctionReal$502a7125-4460-4d39-be14-4852fb6d9ad2precedence_heuristic	cell_id$502a7125-4460-4d39-be14-4852fb6d9ad2downstream_cells_mapplot_path$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6$5ae2d740-13c7-4568-8f04-25bc82fecbdb$db66615e-fbbc-4ea8-b529-bdc14e58a215$4b424a47-dfeb-4380-8ab8-8bd24a080c2e$2c587d5b-7b62-4835-ad02-9575c13d5874upstream_cells_mapmake_random_policy$fb5601b0-06d4-43c4-81a6-23a4a8f29f00$31072f9b-de1b-42cf-a187-cbff99b49b50precedence_heuristic	cell_id$31072f9b-de1b-42cf-a187-cbff99b49b50downstream_cells_mapupstream_cells_map@md_strgetindex$77fde69f-2119-41eb-8993-a93b2c47ca7eprecedence_heuristic	cell_id$77fde69f-2119-41eb-8993-a93b2c47ca7edownstream_cells_mapupstream_cells_map@md_strgetindex$65818e67-c146-4686-a9aa-d0859ef662fbprecedence_heuristic	cell_id$65818e67-c146-4686-a9aa-d0859ef662fbdownstream_cells_mapupstream_cells_map@md_strgetindex$b03087e9-e15d-4563-bdae-4d9ba7d2cec6precedence_heuristic	cell_id$b03087e9-e15d-4563-bdae-4d9ba7d2cec6downstream_cells_mapupstream_cells_map@md_strgetindex$195d2a34-c44c-4088-8ec4-dece3107f16dprecedence_heuristic	cell_id$195d2a34-c44c-4088-8ec4-dece3107f16ddownstream_cells_mapbellman_optimal_value!$4b2a4fb1-7395-4293-9ff9-e2f9da50f56b$80affd41-b5e6-4b9c-b827-4e3b39bd7767upstream_cells_map zero@fastmathtypeminBase.FastMath.sub_fastisless@inboundsnothingVector<Base.FastMath.max_fastBase.simd_indexeachindexReal@simdBase.FastMath.abs_fastjulia.simdloopBase.FastMath.div_fastepsBaseBase.simd_outer_rangeenumerateFiniteMDP$94b339bb-6e2d-422f-8043-615e8be9a217Base.FastMath.add_fastBase.simd_inner_length+Base.FastMath.mul_fast$6858ef8b-1ca7-4e96-b57e-26553423cc13precedence_heuristic	cell_id$6858ef8b-1ca7-4e96-b57e-26553423cc13downstream_cells_mapsample_action$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$f143446c-e44b-4d75-baa7-3b24eafad003$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cf$618b5f35-2df5-4ffb-a34f-add542691080$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540$0f37ec0a-b737-478b-bf6a-027899250c4e$f424edac-388d-4465-900f-9459d2a88f79upstream_cells_maplength:weightssampleAbstractFloatVector$e689df6b-d6f0-4928-9212-a940aa00b0efprecedence_heuristic	cell_id$e689df6b-d6f0-4928-9212-a940aa00b0efdownstream_cells_mapupstream_cells_mapBaseBase.Docs.HTML@html_str$3b0d2c55-2123-4b51-b946-6bc352e3d00aprecedence_heuristic	cell_id$3b0d2c55-2123-4b51-b946-6bc352e3d00adownstream_cells_mapupstream_cells_map@md_strgetindex$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cfprecedence_heuristic	cell_id$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cfdownstream_cells_mapsimulate!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95cupstream_cells_mapDictzero!≤haskeyoneget_dict_value$d4e1e807-7e87-4b43-9c36-f59999dfcd2dReal<=sample_action$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13Int64-/+*$d4e1e807-7e87-4b43-9c36-f59999dfcd2dprecedence_heuristic	cell_id$d4e1e807-7e87-4b43-9c36-f59999dfcd2ddownstream_cells_mapget_dict_value$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cfupstream_cells_mapDictzerohaskeyReal$e25ec0d5-f70f-4269-b2a1-efa194936f72precedence_heuristic	cell_id$e25ec0d5-f70f-4269-b2a1-efa194936f72downstream_cells_mapMDP$f9e4baec-c988-4abd-9bb0-c618c0ec07b9$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771b$304e6afd-11e0-4011-9929-85889b988400$c62cc32c-0d29-4ea2-8284-ac4c883df6db$b15f1262-1acf-40e5-87a7-bc4b1b437a42upstream_cells_map$1f7d77a6-d774-436d-a745-5a160cc15f2bprecedence_heuristic	cell_id$1f7d77a6-d774-436d-a745-5a160cc15f2bdownstream_cells_mapplot_path$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6$5ae2d740-13c7-4568-8f04-25bc82fecbdb$db66615e-fbbc-4ea8-b529-bdc14e58a215$4b424a47-dfeb-4380-8ab8-8bd24a080c2e$2c587d5b-7b62-4835-ad02-9575c13d5874upstream_cells_maprunepisode$b15f1262-1acf-40e5-87a7-bc4b1b437a42$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8$e43513e8-2517-43b7-9a16-e57d4125edc4$250ea9da-dea3-4bf3-932d-cdda6756ae33$5b688057-06c7-4ae4-95d6-0a2ff451f11cprecedence_heuristic	cell_id$5b688057-06c7-4ae4-95d6-0a2ff451f11cdownstream_cells_mapfigure_8_4′$0dbd2b87-d000-408b-8d04-25fc0fa512d1upstream_cells_map:blocking_maze2$5ae2d740-13c7-4568-8f04-25bc82fecbdbtabular_dynaQplus$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3zeroscumsumtabular_dynaQ$5afad18b-1d87-450e-a0ff-8c1249d663edscatterplot/blocking_maze1$5ae2d740-13c7-4568-8f04-25bc82fecbdb+$8987052b-0828-43a5-982e-5f3d6209f2aaprecedence_heuristic	cell_id$8987052b-0828-43a5-982e-5f3d6209f2aadownstream_cells_mapfig_8_4_params$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27upstream_cells_map@md_strCore:PlutoUI$0fff8e1b-d0c2-49b8-93b4-8d1615c26690|>Base.get@bindBasePlutoRunnerPlutoRunner.create_bondNumberFieldconfirmCore.applicablePlutoUI.combinegetindex$4b2a4fb1-7395-4293-9ff9-e2f9da50f56bprecedence_heuristic	cell_id$4b2a4fb1-7395-4293-9ff9-e2f9da50f56bdownstream_cells_mapvalue_iteration_q!$6778296c-ab05-47e7-86d2-e98c075a8a0cupstream_cells_map<=bellman_optimal_value!$195d2a34-c44c-4088-8ec4-dece3107f16d$16c68a13-c295-4a64-bc2b-2ae8451f332f$44364e7f-1910-421a-b961-63fbbaac8230-$fcaddc19-c0c9-4e8e-8f84-adc7a02cc1f5precedence_heuristic	cell_id$fcaddc19-c0c9-4e8e-8f84-adc7a02cc1f5downstream_cells_mapupstream_cells_mapfigure_8_8$00c8f62f-dee2-476c-b896-68d3ab57a168$5afad18b-1d87-450e-a0ff-8c1249d663edprecedence_heuristic	cell_id$5afad18b-1d87-450e-a0ff-8c1249d663eddownstream_cells_maptabular_dynaQ$cd139745-1877-43a2-97a0-3333e544cbd8$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3$2ff6d187-e06f-47b5-9834-d06bfc820c26$562e824c-34b5-415d-b186-d8e2cf1980e7$5b688057-06c7-4ae4-95d6-0a2ff451f11c$aee1f6a8-de43-402e-b375-86c0f2f9e6b8$fb00aedd-e103-4463-b4f8-d0dce6275c64upstream_cells_map Dictzerokeys!onecopylengtheachindex/initialize_state_action_value$7ae23e8e-d554-4d26-a08a-83dab507af13MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloatSet:firsthaskeyzerosrand<=findalltakestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540push!-Int64+*make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07maximumcreate_ϵ_greedy_policy$324181f0-b890-4198-9b4b-c36547e6629a$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3precedence_heuristic	cell_id$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3downstream_cells_maptabular_dynaQplus$5b688057-06c7-4ae4-95d6-0a2ff451f11c$aee1f6a8-de43-402e-b375-86c0f2f9e6b8$cd1980ff-2f35-4599-b08c-2037ddf5e995$c32d0943-ba8f-438f-83b6-5ed42221f630upstream_cells_map zero!sqrtoneceilcopylengtheachindex/initialize_state_action_value$7ae23e8e-d554-4d26-a08a-83dab507af13MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloat:hcatfirstoneszerosmapreducerand<=findalltakestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540-Int64+*make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07maximumcreate_ϵ_greedy_policy$324181f0-b890-4198-9b4b-c36547e6629a$5ae2d740-13c7-4568-8f04-25bc82fecbdbprecedence_heuristic	cell_id$5ae2d740-13c7-4568-8f04-25bc82fecbdbdownstream_cells_mapblock2$db66615e-fbbc-4ea8-b529-bdc14e58a215blocking_maze2$2ff6d187-e06f-47b5-9834-d06bfc820c26$db66615e-fbbc-4ea8-b529-bdc14e58a215$562e824c-34b5-415d-b186-d8e2cf1980e7$5b688057-06c7-4ae4-95d6-0a2ff451f11c$aee1f6a8-de43-402e-b375-86c0f2f9e6b8$cd1980ff-2f35-4599-b08c-2037ddf5e995$c32d0943-ba8f-438f-83b6-5ed42221f630block_maze_base_args$db66615e-fbbc-4ea8-b529-bdc14e58a215block1blocking_maze1$2ff6d187-e06f-47b5-9834-d06bfc820c26$5b688057-06c7-4ae4-95d6-0a2ff451f11c$cd1980ff-2f35-4599-b08c-2037ddf5e995upstream_cells_map:plot_path$eded8b72-70f4-4579-ba69-2eca409fa684$1f7d77a6-d774-436d-a745-5a160cc15f2b$502a7125-4460-4d39-be14-4852fb6d9ad2GridworldState$729197ce-2c27-467d-ba5f-47a1ecd539f2inmake_gridworld$bb439641-30bd-495d-ba70-06b2e27efdbdSet$0dbd2b87-d000-408b-8d04-25fc0fa512d1precedence_heuristic	cell_id$0dbd2b87-d000-408b-8d04-25fc0fa512d1downstream_cells_mapupstream_cells_mapfigure_8_4′$5b688057-06c7-4ae4-95d6-0a2ff451f11c$33f66659-1a87-4890-9137-dbc7776a19d8precedence_heuristic	cell_id$33f66659-1a87-4890-9137-dbc7776a19d8downstream_cells_mapmake_greedy_policy!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$0899f37c-5def-4d15-8ca3-ebdec8e96b43$9a1b250f-b404-4db3-a4b7-4cd33b79d921$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_map ≈zero:maxsumInfislessVectorRealeachindex-FiniteMDP$94b339bb-6e2d-422f-8043-615e8be9a217/Matrix+*$269f4505-e807-446c-8fd8-3458482e00abprecedence_heuristic	cell_id$269f4505-e807-446c-8fd8-3458482e00abdownstream_cells_maptabular_dynaQplus′$cd1980ff-2f35-4599-b08c-2037ddf5e995$c32d0943-ba8f-438f-83b6-5ed42221f630upstream_cells_map zero!sqrtoneceilcopylengtheachindex/initialize_state_action_value$7ae23e8e-d554-4d26-a08a-83dab507af13MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloat:hcatfirstoneszerosmapreducerand<=findalltakestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540-create_greedy_policy$9a1b250f-b404-4db3-a4b7-4cd33b79d921Int64+*make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07maximumcreate_ϵ_greedy_policy$324181f0-b890-4198-9b4b-c36547e6629a$037f1804-b24e-46e7-b2a8-6747e669db66precedence_heuristic	cell_id$037f1804-b24e-46e7-b2a8-6747e669db66downstream_cells_mapmakelookup$47ce2eda-b2c4-4f81-8d91-955bc35bab49$c62cc32c-0d29-4ea2-8284-ac4c883df6db$94b339bb-6e2d-422f-8043-615e8be9a217upstream_cells_mapDictenumerate=>Vector$c1ff1bea-649c-4483-b4be-55134f0e8cb7precedence_heuristic	cell_id$c1ff1bea-649c-4483-b4be-55134f0e8cb7downstream_cells_mapsample_action$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$f143446c-e44b-4d75-baa7-3b24eafad003$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cf$618b5f35-2df5-4ffb-a34f-add542691080$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540$0f37ec0a-b737-478b-bf6a-027899250c4e$f424edac-388d-4465-900f-9459d2a88f79upstream_cells_map:weightsMatrixsizesampleIntegerAbstractFloat$7ae23e8e-d554-4d26-a08a-83dab507af13precedence_heuristic	cell_id$7ae23e8e-d554-4d26-a08a-83dab507af13downstream_cells_mapinitialize_state_action_value$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$4494cb61-ee2c-467b-9bf6-0afb59023e91$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7a$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_maplengthones*MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloat$26fe0c28-8f0f-4cff-87fb-76f04fce1be1precedence_heuristic	cell_id$26fe0c28-8f0f-4cff-87fb-76f04fce1be1downstream_cells_mapupstream_cells_map@md_strgetindex$98547223-05a6-43da-80b2-63c67d2de283precedence_heuristic	cell_id$98547223-05a6-43da-80b2-63c67d2de283downstream_cells_mapupstream_cells_mapfigure_8_5$562e824c-34b5-415d-b186-d8e2cf1980e7$4b3604db-0c1b-4770-95b1-5f5bb34d071bprecedence_heuristic	cell_id$4b3604db-0c1b-4770-95b1-5f5bb34d071bdownstream_cells_mapaddelementsupstream_cells_mapHypertextLiteral.BypassHypertextLiteral.ResultHypertextLiteral$0fff8e1b-d0c2-49b8-93b4-8d1615c26690HypertextLiteral.content@htl$143fff7d-0bb2-43b4-b810-53784fe848bdprecedence_heuristic	cell_id$143fff7d-0bb2-43b4-b810-53784fe848bddownstream_cells_mapq_learningupstream_cells_map zero!oneVectorlengthcopyeachindex/initialize_state_action_value$7ae23e8e-d554-4d26-a08a-83dab507af13==MDP_TD$c62cc32c-0d29-4ea2-8284-ac4c883df6dbAbstractFloat:firstzerosfindallInt64takestep$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540-+undef*make_ϵ_greedy_policy!$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07maximumcreate_ϵ_greedy_policy$324181f0-b890-4198-9b4b-c36547e6629a$6778296c-ab05-47e7-86d2-e98c075a8a0cprecedence_heuristic	cell_id$6778296c-ab05-47e7-86d2-e98c075a8a0cdownstream_cells_mapbegin_value_iteration_qupstream_cells_mapepsInt64AzeroSvalue_iteration_q!$4b2a4fb1-7395-4293-9ff9-e2f9da50f56bCompleteMDP$94b339bb-6e2d-422f-8043-615e8be9a217MatrixtypemaxReal$c04c803c-cdca-4b8b-9c9d-e456ee677906precedence_heuristic	cell_id$c04c803c-cdca-4b8b-9c9d-e456ee677906downstream_cells_mapmaze_walls$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6$4b424a47-dfeb-4380-8ab8-8bd24a080c2e$2c587d5b-7b62-4835-ad02-9575c13d5874dyna_maze$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6$cd139745-1877-43a2-97a0-3333e544cbd8$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3$4b424a47-dfeb-4380-8ab8-8bd24a080c2e$beae0491-ed11-4edf-a136-d384578b088b$2c587d5b-7b62-4835-ad02-9575c13d5874$41bb1f78-b83a-4a45-ba5c-faa94e112f45upstream_cells_mapmake_gridworld$bb439641-30bd-495d-ba70-06b2e27efdbdGridworldState$729197ce-2c27-467d-ba5f-47a1ecd539f2inSet$9d69687a-8df6-4e74-aa99-fbfcc84bcccfprecedence_heuristic	cell_id$9d69687a-8df6-4e74-aa99-fbfcc84bcccfdownstream_cells_maprook_action_display$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69upstream_cells_mapHypertextLiteral.BypassHypertextLiteral.ResultHypertextLiteral$0fff8e1b-d0c2-49b8-93b4-8d1615c26690@htl$16c68a13-c295-4a64-bc2b-2ae8451f332fprecedence_heuristic	cell_id$16c68a13-c295-4a64-bc2b-2ae8451f332fdownstream_cells_mapbellman_optimal_value!$4b2a4fb1-7395-4293-9ff9-e2f9da50f56b$80affd41-b5e6-4b9c-b827-4e3b39bd7767upstream_cells_map zero@fastmathtypeminBase.FastMath.sub_fastisless@inboundsnothingVector<Base.FastMath.max_fastBase.simd_indexeachindexReal@simdBase.FastMath.abs_fastjulia.simdloopBase.FastMath.div_fastepsBaseFiniteDeterministicMDP$94b339bb-6e2d-422f-8043-615e8be9a217Base.simd_outer_rangeBase.simd_inner_lengthBase.FastMath.add_fast+Base.FastMath.mul_fast$fb00aedd-e103-4463-b4f8-d0dce6275c64precedence_heuristic	cell_id$fb00aedd-e103-4463-b4f8-d0dce6275c64downstream_cells_mapexample_8_4$b3a5adcb-5343-44e9-9466-1c51c1143a0dupstream_cells_map :"prioritized_sweeping_deterministic$898f1b06-a34f-496b-99db-9ca23498cbeeRandom$0fff8e1b-d0c2-49b8-93b4-8d1615c26690|>make_dyna_maze$39ae7727-ea72-48f3-8d63-e03a9f607f87tabular_dynaQ$5afad18b-1d87-450e-a0ff-8c1249d663edlengthtcollectscatterplot/+last==MapLayoutRandom.seed!$e43513e8-2517-43b7-9a16-e57d4125edc4precedence_heuristic	cell_id$e43513e8-2517-43b7-9a16-e57d4125edc4downstream_cells_maprunepisode$41bb1f78-b83a-4a45-ba5c-faa94e112f45$1f7d77a6-d774-436d-a745-5a160cc15f2bupstream_cells_mapMDP_MC$304e6afd-11e0-4011-9929-85889b988400rand$df62fd47-6627-4931-b429-964c65960446precedence_heuristic	cell_id$df62fd47-6627-4931-b429-964c65960446downstream_cells_mapfigure_8_7$cfdaa9c2-265f-4540-9d04-d1b7a72aee3eupstream_cells_map@md_str:sqrt-scatterplot/attr*Layoutgetindex$321bdf5a-bff7-4181-986f-d3884ea96d27precedence_heuristic	cell_id$321bdf5a-bff7-4181-986f-d3884ea96d27downstream_cells_mapupstream_cells_map@md_strgetindex$82e1ceb8-b1bb-4dea-b041-bf462041793fprecedence_heuristic	cell_id$82e1ceb8-b1bb-4dea-b041-bf462041793fdownstream_cells_mapmake_greedy_policy!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$0899f37c-5def-4d15-8ca3-ebdec8e96b43$9a1b250f-b404-4db3-a4b7-4cd33b79d921$5d2abde0-7128-41c3-bd1f-b6940492d1aeupstream_cells_map ≈zero:maxkeyssumInfislessFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217VectorRealeachindex-/Matrix+*$5e49504e-9623-48f9-aeb5-360906b92a09precedence_heuristic	cell_id$5e49504e-9623-48f9-aeb5-360906b92a09downstream_cells_mapvholdtest$679b6096-b3ca-422d-9d9a-225832510ab1upstream_cells_maplength-nyt_valid_wordsInf32fill$2ff6d187-e06f-47b5-9834-d06bfc820c26precedence_heuristic	cell_id$2ff6d187-e06f-47b5-9834-d06bfc820c26downstream_cells_mapfigure_8_4$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27upstream_cells_map:blocking_maze2$5ae2d740-13c7-4568-8f04-25bc82fecbdbscatterplot/zeros+blocking_maze1$5ae2d740-13c7-4568-8f04-25bc82fecbdbtabular_dynaQ$5afad18b-1d87-450e-a0ff-8c1249d663edcumsum$c31f4646-aa8a-41e3-9c68-ae8a349d4ed1precedence_heuristic	cell_id$c31f4646-aa8a-41e3-9c68-ae8a349d4ed1downstream_cells_mapupstream_cells_mapfigure_8_4′′$cd1980ff-2f35-4599-b08c-2037ddf5e995$dab6eac0-7958-4d3a-a1af-781fb57e7adbprecedence_heuristic	cell_id$dab6eac0-7958-4d3a-a1af-781fb57e7adbdownstream_cells_mapupstream_cells_map@md_strgetindex$04ea981e-337e-4324-a5cc-178eb3c7605bprecedence_heuristic	cell_id$04ea981e-337e-4324-a5cc-178eb3c7605bdownstream_cells_mapupstream_cells_map@md_strgetindex$976ff0c3-54aa-41f0-b963-baf77bea8cb8precedence_heuristic	cell_id$976ff0c3-54aa-41f0-b963-baf77bea8cb8downstream_cells_mapupstream_cells_map@md_strgetindex$094321bc-2d44-4e67-9ac6-5216a42e0cd3precedence_heuristic	cell_id$094321bc-2d44-4e67-9ac6-5216a42e0cd3downstream_cells_mapbellman_policy_update!$6e273f2b-a1af-421f-aca7-772a836b89efupstream_cells_map zero@fastmathkeysisless@inboundsFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217nothingReal<Base.simd_indexeachindex@simd/Matrixabsjulia.simdloopepsBaseBase.simd_outer_rangeInt64-Base.simd_inner_lengthBase.FastMath.add_fast+*Base.FastMath.mul_fast$13f08473-f0d8-47d1-aa48-de3e4a083dbfprecedence_heuristic	cell_id$13f08473-f0d8-47d1-aa48-de3e4a083dbfdownstream_cells_mapsimulate!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95cupstream_cells_map DictsumAfterstateMDP_MC$47ce2eda-b2c4-4f81-8d91-955bc35bab49keysTupleweightscollectIntegerRealFunctionInt64-values+*sample==$f143446c-e44b-4d75-baa7-3b24eafad003precedence_heuristic	cell_id$f143446c-e44b-4d75-baa7-3b24eafad003downstream_cells_mapsimulate!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95cupstream_cells_map DictzeroAfterstateMDP_MC$47ce2eda-b2c4-4f81-8d91-955bc35bab49max!Tupleisless≤BoolhaskeyIntegerRealFunctionsample_action$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13Int64<=values/+maximum$0899f37c-5def-4d15-8ca3-ebdec8e96b43precedence_heuristic	cell_id$0899f37c-5def-4d15-8ca3-ebdec8e96b43downstream_cells_mapbegin_value_iteration_vupstream_cells_mapAzerotypemaxcopyepsInt64VectorRealSvalue_iteration_v!$80affd41-b5e6-4b9c-b827-4e3b39bd7767CompleteMDP$94b339bb-6e2d-422f-8043-615e8be9a217make_greedy_policy!$f8bf29fe-568f-437f-ba82-6b861988a18e$82e1ceb8-b1bb-4dea-b041-bf462041793f$e4f73889-af82-4304-89d5-ee50172eb3da$33f66659-1a87-4890-9137-dbc7776a19d8$0adcbce8-2be5-48ef-af43-04815e10dc5cform_random_policy$726af565-8905-4409-864f-a5c1b5767e09$94b339bb-6e2d-422f-8043-615e8be9a217precedence_heuristic	cell_id$94b339bb-6e2d-422f-8043-615e8be9a217downstream_cells_mapFiniteDeterministicMDP$f8bf29fe-568f-437f-ba82-6b861988a18e$6c8cd429-2c2e-4515-98b2-d0394962e479$16c68a13-c295-4a64-bc2b-2ae8451f332fFiniteMDP$33f66659-1a87-4890-9137-dbc7776a19d8$195d2a34-c44c-4088-8ec4-dece3107f16d$6cf35193-dba5-4f78-a4ac-245dda7a0846CompleteMDP$6778296c-ab05-47e7-86d2-e98c075a8a0c$6605b946-3010-47ed-8d88-3c4dca993cf8$94b339bb-6e2d-422f-8043-615e8be9a217$250ea9da-dea3-4bf3-932d-cdda6756ae33$726af565-8905-4409-864f-a5c1b5767e09$0899f37c-5def-4d15-8ca3-ebdec8e96b43$2fa207dd-749f-4dc0-b4ab-159edf1d9bceFiniteStochasticMDP$a8ec05ad-8333-4423-ab42-883ab806ebd7$d0b18699-7d3a-418d-9d15-be41f1643f09$81f2f335-6606-4506-bfb3-d0d95e651f24$094321bc-2d44-4e67-9ac6-5216a42e0cd3$6e273f2b-a1af-421f-aca7-772a836b89ef$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6$636d768c-670d-4485-a1dd-2bab6cf086d0$82e1ceb8-b1bb-4dea-b041-bf462041793f$e4f73889-af82-4304-89d5-ee50172eb3da$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$3b4e27e7-8065-44b3-bc2a-e540913aa540$44364e7f-1910-421a-b961-63fbbaac8230upstream_cells_mapDictTuplezipmakelookup$037f1804-b24e-46e7-b2a8-6747e669db66VectorInt64RealeachindexnewlengthCompleteMDP$94b339bb-6e2d-422f-8043-615e8be9a217Matrix+Arrayundef$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0aprecedence_heuristic	cell_id$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0adownstream_cells_mapmonte_carlo_tree_search$beae0491-ed11-4edf-a136-d384578b088b$2c587d5b-7b62-4835-ad02-9575c13d5874$41bb1f78-b83a-4a45-ba5c-faa94e112f45upstream_cells_map &Dicttimekeys>islessget_dict_value$d4e1e807-7e87-4b43-9c36-f59999dfcd2done'Base.CoreLogging.Base.fixup_stdlib_pathBase.CoreLogging.!lengthsample_action$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13<NamedTupleeachindexRealMDP$e25ec0d5-f70f-4269-b2a1-efa194936f72/@infoBase.invokelatestmake_greedy_policy!$f8bf29fe-568f-437f-ba82-6b861988a18e$82e1ceb8-b1bb-4dea-b041-bf462041793f$e4f73889-af82-4304-89d5-ee50172eb3da$33f66659-1a87-4890-9137-dbc7776a19d8$0adcbce8-2be5-48ef-af43-04815e10dc5croundminimumBase.CoreLogging.invokelatestBase.CoreLogging.===:simulate!$f143446c-e44b-4d75-baa7-3b24eafad003$13f08473-f0d8-47d1-aa48-de3e4a083dbf$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cfzeros#___this_pluto_module_namerandFunctionapply_uct!$f369a092-420d-4660-b802-93f05d5e7972$aa898360-f802-438a-9081-a2e517230db2BaseInt64UInt64-Base.CoreLogging.isa+Base.CoreLogging.>=$dff6f326-ab7e-45e5-8c5e-28bfbb1d99bcprecedence_heuristic	cell_id$dff6f326-ab7e-45e5-8c5e-28bfbb1d99bcdownstream_cells_mapupstream_cells_map@md_strgetindex$81f2f335-6606-4506-bfb3-d0d95e651f24precedence_heuristic	cell_id$81f2f335-6606-4506-bfb3-d0d95e651f24downstream_cells_mapbellman_optimal_update!$a8ec05ad-8333-4423-ab42-883ab806ebd7$d0b18699-7d3a-418d-9d15-be41f1643f09upstream_cells_map zero@fastmathtypeminkeysisless@inboundsFiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217nothingReal<Base.FastMath.max_fastBase.simd_indexeachindex@simd/Matrixabsjulia.simdloopepsBaseBase.simd_outer_rangeInt64-Base.simd_inner_length+*$aa898360-f802-438a-9081-a2e517230db2precedence_heuristic	cell_id$aa898360-f802-438a-9081-a2e517230db2downstream_cells_mapapply_uct!$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95cupstream_cells_mapDict@fastmathsumkeysuct$308fd488-a009-4de0-8b27-c1f6b0677fed$cffc9f11-77d7-4076-aa3b-821f1c741f58Inf@inboundsVectorRealInt64BasevaluesBase.FastMath.add_fastBase.FastMath.mul_fast$2c587d5b-7b62-4835-ad02-9575c13d5874precedence_heuristic	cell_id$2c587d5b-7b62-4835-ad02-9575c13d5874downstream_cells_mapshow_mcts_solution$6a4116c9-87cf-4ee7-8030-aa1150853984upstream_cells_mapDictmaze_walls$c04c803c-cdca-4b8b-9c9d-e456ee677906Int64rollout$f9e4baec-c988-4abd-9bb0-c618c0ec07b9$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96Float32dyna_maze$c04c803c-cdca-4b8b-9c9d-e456ee677906plot_path$eded8b72-70f4-4579-ba69-2eca409fa684$1f7d77a6-d774-436d-a745-5a160cc15f2b$502a7125-4460-4d39-be14-4852fb6d9ad2GridworldState$729197ce-2c27-467d-ba5f-47a1ecd539f2inmonte_carlo_tree_search$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771b$a8ec05ad-8333-4423-ab42-883ab806ebd7precedence_heuristic	cell_id$a8ec05ad-8333-4423-ab42-883ab806ebd7downstream_cells_mapuniform_bellman_optimal_value!$00c8f62f-dee2-476c-b896-68d3ab57a168upstream_cells_mapzeroeachindexmaxbellman_optimal_update!$81f2f335-6606-4506-bfb3-d0d95e651f24Matrixisless+FiniteStochasticMDP$94b339bb-6e2d-422f-8043-615e8be9a217Realcell_execution_order $0fff8e1b-d0c2-49b8-93b4-8d1615c26690$516234a8-2748-11ed-35df-432eebaa5162$65818e67-c146-4686-a9aa-d0859ef662fb$d5ac7c6f-9636-46d9-806f-34d6c8e4d4d5$76489f21-677e-4c25-beaa-afaf2244cd94$27d12c1c-ddb0-4bc1-af51-3388ff806705$cd79ce14-14a1-43c6-93e0-b4a786f7f9fb$e0cc1ca1-595d-44e2-8612-261df9e2d327$4f4551fe-54a9-4186-ab8f-3535dc2bf4c5$69ff1b72-cb1b-4724-a445-38e4c9846964$8987052b-0828-43a5-982e-5f3d6209f2aa$dab6eac0-7958-4d3a-a1af-781fb57e7adb$b0df4dad-74c7-4469-a13f-5ef6bb81199f$976ff0c3-54aa-41f0-b963-baf77bea8cb8$24efe9b4-9308-4ad1-8ef0-69f6f93407c0$26fe0c28-8f0f-4cff-87fb-76f04fce1be1$340ba72b-172a-4d92-99b2-17687ab511c7$caca8d95-e40e-4592-b29e-a7e8b19faeb5$1127c36f-9bc0-49b1-9481-8a5861bdf6ca$a3243bc4-7ae7-418a-9881-a265ca95f5ef$08ff749b-f4ff-4639-99f5-48262aa4643e$dff6f326-ab7e-45e5-8c5e-28bfbb1d99bc$466268c4-664d-42dd-84c1-7b8ade49936f$08e81e30-119d-4f4e-a865-f1f85cbffd31$63bf9d16-4516-4cec-895f-f010275bca16$31072f9b-de1b-42cf-a187-cbff99b49b50$df62fd47-6627-4931-b429-964c65960446$cfdaa9c2-265f-4540-9d04-d1b7a72aee3e$3b0d2c55-2123-4b51-b946-6bc352e3d00a$aab6ca56-57ca-421e-9b71-e3e96681c4c5$72b40384-9ca1-4bc1-8e1a-8b639d39e215$e8a6e672-b860-404f-83c1-62a080f23112$04ea981e-337e-4324-a5cc-178eb3c7605b$ee0f55c6-e9c6-4199-9f27-5706f3c84863$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96$d4e1e807-7e87-4b43-9c36-f59999dfcd2d$308fd488-a009-4de0-8b27-c1f6b0677fed$cffc9f11-77d7-4076-aa3b-821f1c741f58$f369a092-420d-4660-b802-93f05d5e7972$82e5719c-bbdb-4a18-b2f0-ad746b6acd41$f6486854-4892-4fb6-a805-de56b19b3571$aa898360-f802-438a-9081-a2e517230db2$bc295bb5-addb-4bcf-a3e3-c839ccc346bd$245d9616-e0d2-497e-bfdd-4729a7215bfd$321bdf5a-bff7-4181-986f-d3884ea96d27$e689df6b-d6f0-4928-9212-a940aa00b0ef$b03087e9-e15d-4563-bdae-4d9ba7d2cec6$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cf$037f1804-b24e-46e7-b2a8-6747e669db66$e25ec0d5-f70f-4269-b2a1-efa194936f72$f9e4baec-c988-4abd-9bb0-c618c0ec07b9$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771b$47ce2eda-b2c4-4f81-8d91-955bc35bab49$f143446c-e44b-4d75-baa7-3b24eafad003$13f08473-f0d8-47d1-aa48-de3e4a083dbf$304e6afd-11e0-4011-9929-85889b988400$c62cc32c-0d29-4ea2-8284-ac4c883df6db$fb5601b0-06d4-43c4-81a6-23a4a8f29f00$1d97325a-8b9a-438d-a5f9-e17638e64627$7ae23e8e-d554-4d26-a08a-83dab507af13$eb9ba23d-bee5-4bb1-b3e1-fe40d9f681dc$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8$e43513e8-2517-43b7-9a16-e57d4125edc4$94b339bb-6e2d-422f-8043-615e8be9a217$81f2f335-6606-4506-bfb3-d0d95e651f24$a8ec05ad-8333-4423-ab42-883ab806ebd7$094321bc-2d44-4e67-9ac6-5216a42e0cd3$6e273f2b-a1af-421f-aca7-772a836b89ef$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6$6605b946-3010-47ed-8d88-3c4dca993cf8$636d768c-670d-4485-a1dd-2bab6cf086d0$f8bf29fe-568f-437f-ba82-6b861988a18e$82e1ceb8-b1bb-4dea-b041-bf462041793f$e4f73889-af82-4304-89d5-ee50172eb3da$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540$b15f1262-1acf-40e5-87a7-bc4b1b437a42$250ea9da-dea3-4bf3-932d-cdda6756ae33$726af565-8905-4409-864f-a5c1b5767e09$33f66659-1a87-4890-9137-dbc7776a19d8$195d2a34-c44c-4088-8ec4-dece3107f16d$16c68a13-c295-4a64-bc2b-2ae8451f332f$44364e7f-1910-421a-b961-63fbbaac8230$4b2a4fb1-7395-4293-9ff9-e2f9da50f56b$6778296c-ab05-47e7-86d2-e98c075a8a0c$80affd41-b5e6-4b9c-b827-4e3b39bd7767$2fa207dd-749f-4dc0-b4ab-159edf1d9bce$6cf35193-dba5-4f78-a4ac-245dda7a0846$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07$d0b18699-7d3a-418d-9d15-be41f1643f09$00c8f62f-dee2-476c-b896-68d3ab57a168$8586d633-7c50-49ba-9b74-b5bdad27c317$fcaddc19-c0c9-4e8e-8f84-adc7a02cc1f5$5e49504e-9623-48f9-aeb5-360906b92a09$679b6096-b3ca-422d-9d9a-225832510ab1$0adcbce8-2be5-48ef-af43-04815e10dc5c$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$0899f37c-5def-4d15-8ca3-ebdec8e96b43$9a1b250f-b404-4db3-a4b7-4cd33b79d921$324181f0-b890-4198-9b4b-c36547e6629a$5afad18b-1d87-450e-a0ff-8c1249d663ed$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$269f4505-e807-446c-8fd8-3458482e00ab$898f1b06-a34f-496b-99db-9ca23498cbee$0f37ec0a-b737-478b-bf6a-027899250c4e$f424edac-388d-4465-900f-9459d2a88f79$4494cb61-ee2c-467b-9bf6-0afb59023e91$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7a$5d2abde0-7128-41c3-bd1f-b6940492d1ae$4e1c115a-4020-4a5a-a79a-56056892a953$729197ce-2c27-467d-ba5f-47a1ecd539f2$bb439641-30bd-495d-ba70-06b2e27efdbd$c04c803c-cdca-4b8b-9c9d-e456ee677906$cd139745-1877-43a2-97a0-3333e544cbd8$8dbc76fd-ac73-47ca-983e-0e90023390e3$beae0491-ed11-4edf-a136-d384578b088b$41bb1f78-b83a-4a45-ba5c-faa94e112f45$39ae7727-ea72-48f3-8d63-e03a9f607f87$fb00aedd-e103-4463-b4f8-d0dce6275c64$b3a5adcb-5343-44e9-9466-1c51c1143a0d$77fde69f-2119-41eb-8993-a93b2c47ca7e$eded8b72-70f4-4579-ba69-2eca409fa684$1f7d77a6-d774-436d-a745-5a160cc15f2b$502a7125-4460-4d39-be14-4852fb6d9ad2$5ae2d740-13c7-4568-8f04-25bc82fecbdb$2ff6d187-e06f-47b5-9834-d06bfc820c26$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27$5b688057-06c7-4ae4-95d6-0a2ff451f11c$0dbd2b87-d000-408b-8d04-25fc0fa512d1$cd1980ff-2f35-4599-b08c-2037ddf5e995$c31f4646-aa8a-41e3-9c68-ae8a349d4ed1$db66615e-fbbc-4ea8-b529-bdc14e58a215$562e824c-34b5-415d-b186-d8e2cf1980e7$98547223-05a6-43da-80b2-63c67d2de283$aee1f6a8-de43-402e-b375-86c0f2f9e6b8$f0e88db8-e3ee-4b74-923e-c34038024824$c32d0943-ba8f-438f-83b6-5ed42221f630$1aa76f3d-6041-4886-a6cd-787bdf1ec63c$4b424a47-dfeb-4380-8ab8-8bd24a080c2e$2c587d5b-7b62-4835-ad02-9575c13d5874$6a4116c9-87cf-4ee7-8030-aa1150853984$4b3604db-0c1b-4770-95b1-5f5bb34d071b$39c96fc8-8259-46e3-88a0-a14eb6752b5c$3bf9e526-826d-42b8-84ee-75f1c7f79c69$9d69687a-8df6-4e74-aa99-fbfcc84bcccf$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3$4d4baa61-b5bd-4bcf-a491-9a35a1695f0b$0f9080af-f166-4a78-a003-8df07f6c27d4last_hot_reload_time        shortpath6Chapter_08_Planning_&_Learning_with_Tabular_Methods.jlprocess_statusreadypath/home/runner/work/Reinforcement-Learning-Sutton-Barto-Exercise-Solutions/Reinforcement-Learning-Sutton-Barto-Exercise-Solutions/Chapter-08/Chapter_08_Planning_&_Learning_with_Tabular_Methods.jlpluto_versionv0.20.8last_save_timeANcell_order $516234a8-2748-11ed-35df-432eebaa5162$5afad18b-1d87-450e-a0ff-8c1249d663ed$65818e67-c146-4686-a9aa-d0859ef662fb$c04c803c-cdca-4b8b-9c9d-e456ee677906$39ae7727-ea72-48f3-8d63-e03a9f607f87$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6$d5ac7c6f-9636-46d9-806f-34d6c8e4d4d5$76489f21-677e-4c25-beaa-afaf2244cd94$8dbc76fd-ac73-47ca-983e-0e90023390e3$27d12c1c-ddb0-4bc1-af51-3388ff806705$4d4baa61-b5bd-4bcf-a491-9a35a1695f0b$cd139745-1877-43a2-97a0-3333e544cbd8$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3$cd79ce14-14a1-43c6-93e0-b4a786f7f9fb$e0cc1ca1-595d-44e2-8612-261df9e2d327$4f4551fe-54a9-4186-ab8f-3535dc2bf4c5$5ae2d740-13c7-4568-8f04-25bc82fecbdb$69ff1b72-cb1b-4724-a445-38e4c9846964$8987052b-0828-43a5-982e-5f3d6209f2aa$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27$2ff6d187-e06f-47b5-9834-d06bfc820c26$dab6eac0-7958-4d3a-a1af-781fb57e7adb$db66615e-fbbc-4ea8-b529-bdc14e58a215$b0df4dad-74c7-4469-a13f-5ef6bb81199f$98547223-05a6-43da-80b2-63c67d2de283$562e824c-34b5-415d-b186-d8e2cf1980e7$976ff0c3-54aa-41f0-b963-baf77bea8cb8$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3$0dbd2b87-d000-408b-8d04-25fc0fa512d1$5b688057-06c7-4ae4-95d6-0a2ff451f11c$f0e88db8-e3ee-4b74-923e-c34038024824$aee1f6a8-de43-402e-b375-86c0f2f9e6b8$24efe9b4-9308-4ad1-8ef0-69f6f93407c0$26fe0c28-8f0f-4cff-87fb-76f04fce1be1$340ba72b-172a-4d92-99b2-17687ab511c7$caca8d95-e40e-4592-b29e-a7e8b19faeb5$269f4505-e807-446c-8fd8-3458482e00ab$c31f4646-aa8a-41e3-9c68-ae8a349d4ed1$1aa76f3d-6041-4886-a6cd-787bdf1ec63c$cd1980ff-2f35-4599-b08c-2037ddf5e995$c32d0943-ba8f-438f-83b6-5ed42221f630$1127c36f-9bc0-49b1-9481-8a5861bdf6ca$a3243bc4-7ae7-418a-9881-a265ca95f5ef$08ff749b-f4ff-4639-99f5-48262aa4643e$898f1b06-a34f-496b-99db-9ca23498cbee$dff6f326-ab7e-45e5-8c5e-28bfbb1d99bc$4b424a47-dfeb-4380-8ab8-8bd24a080c2e$466268c4-664d-42dd-84c1-7b8ade49936f$b3a5adcb-5343-44e9-9466-1c51c1143a0d$fb00aedd-e103-4463-b4f8-d0dce6275c64$08e81e30-119d-4f4e-a865-f1f85cbffd31$63bf9d16-4516-4cec-895f-f010275bca16$31072f9b-de1b-42cf-a187-cbff99b49b50$cfdaa9c2-265f-4540-9d04-d1b7a72aee3e$df62fd47-6627-4931-b429-964c65960446$3b0d2c55-2123-4b51-b946-6bc352e3d00a$aab6ca56-57ca-421e-9b71-e3e96681c4c5$72b40384-9ca1-4bc1-8e1a-8b639d39e215$a8ec05ad-8333-4423-ab42-883ab806ebd7$d0b18699-7d3a-418d-9d15-be41f1643f09$81f2f335-6606-4506-bfb3-d0d95e651f24$094321bc-2d44-4e67-9ac6-5216a42e0cd3$6e273f2b-a1af-421f-aca7-772a836b89ef$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6$00c8f62f-dee2-476c-b896-68d3ab57a168$e8a6e672-b860-404f-83c1-62a080f23112$8586d633-7c50-49ba-9b74-b5bdad27c317$fcaddc19-c0c9-4e8e-8f84-adc7a02cc1f5$4b2a4fb1-7395-4293-9ff9-e2f9da50f56b$6778296c-ab05-47e7-86d2-e98c075a8a0c$6605b946-3010-47ed-8d88-3c4dca993cf8$636d768c-670d-4485-a1dd-2bab6cf086d0$04ea981e-337e-4324-a5cc-178eb3c7605b$ee0f55c6-e9c6-4199-9f27-5706f3c84863$f9e4baec-c988-4abd-9bb0-c618c0ec07b9$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96$d4e1e807-7e87-4b43-9c36-f59999dfcd2d$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0a$bf7950f2-05fa-4455-ad08-27735148d95c$f143446c-e44b-4d75-baa7-3b24eafad003$13f08473-f0d8-47d1-aa48-de3e4a083dbf$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cf$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771b$308fd488-a009-4de0-8b27-c1f6b0677fed$cffc9f11-77d7-4076-aa3b-821f1c741f58$f369a092-420d-4660-b802-93f05d5e7972$82e5719c-bbdb-4a18-b2f0-ad746b6acd41$f6486854-4892-4fb6-a805-de56b19b3571$aa898360-f802-438a-9081-a2e517230db2$bc295bb5-addb-4bcf-a3e3-c839ccc346bd$beae0491-ed11-4edf-a136-d384578b088b$6a4116c9-87cf-4ee7-8030-aa1150853984$2c587d5b-7b62-4835-ad02-9575c13d5874$41bb1f78-b83a-4a45-ba5c-faa94e112f45$245d9616-e0d2-497e-bfdd-4729a7215bfd$321bdf5a-bff7-4181-986f-d3884ea96d27$0fff8e1b-d0c2-49b8-93b4-8d1615c26690$e689df6b-d6f0-4928-9212-a940aa00b0ef$b03087e9-e15d-4563-bdae-4d9ba7d2cec6$c1ff1bea-649c-4483-b4be-55134f0e8cb7$6858ef8b-1ca7-4e96-b57e-26553423cc13$037f1804-b24e-46e7-b2a8-6747e669db66$e25ec0d5-f70f-4269-b2a1-efa194936f72$47ce2eda-b2c4-4f81-8d91-955bc35bab49$304e6afd-11e0-4011-9929-85889b988400$c62cc32c-0d29-4ea2-8284-ac4c883df6db$fb5601b0-06d4-43c4-81a6-23a4a8f29f00$1d97325a-8b9a-438d-a5f9-e17638e64627$7ae23e8e-d554-4d26-a08a-83dab507af13$eb9ba23d-bee5-4bb1-b3e1-fe40d9f681dc$618b5f35-2df5-4ffb-a34f-add542691080$3edc09ab-8fa1-440f-8a45-546898a2b2a3$b15f1262-1acf-40e5-87a7-bc4b1b437a42$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8$e43513e8-2517-43b7-9a16-e57d4125edc4$94b339bb-6e2d-422f-8043-615e8be9a217$f8bf29fe-568f-437f-ba82-6b861988a18e$82e1ceb8-b1bb-4dea-b041-bf462041793f$e4f73889-af82-4304-89d5-ee50172eb3da$ecd8742c-2e10-4814-b477-7024e85b7fa6$fc137613-7b4b-414c-93af-eeb2ace5d67f$6c8cd429-2c2e-4515-98b2-d0394962e479$3b4e27e7-8065-44b3-bc2a-e540913aa540$250ea9da-dea3-4bf3-932d-cdda6756ae33$726af565-8905-4409-864f-a5c1b5767e09$33f66659-1a87-4890-9137-dbc7776a19d8$195d2a34-c44c-4088-8ec4-dece3107f16d$16c68a13-c295-4a64-bc2b-2ae8451f332f$44364e7f-1910-421a-b961-63fbbaac8230$80affd41-b5e6-4b9c-b827-4e3b39bd7767$0899f37c-5def-4d15-8ca3-ebdec8e96b43$2fa207dd-749f-4dc0-b4ab-159edf1d9bce$6cf35193-dba5-4f78-a4ac-245dda7a0846$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07$5e49504e-9623-48f9-aeb5-360906b92a09$679b6096-b3ca-422d-9d9a-225832510ab1$0adcbce8-2be5-48ef-af43-04815e10dc5c$9a1b250f-b404-4db3-a4b7-4cd33b79d921$324181f0-b890-4198-9b4b-c36547e6629a$0f37ec0a-b737-478b-bf6a-027899250c4e$f424edac-388d-4465-900f-9459d2a88f79$4494cb61-ee2c-467b-9bf6-0afb59023e91$143fff7d-0bb2-43b4-b810-53784fe848bd$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2$113d2bc2-1f77-479f-86e5-a65b20672d7a$5d2abde0-7128-41c3-bd1f-b6940492d1ae$4e1c115a-4020-4a5a-a79a-56056892a953$729197ce-2c27-467d-ba5f-47a1ecd539f2$bb439641-30bd-495d-ba70-06b2e27efdbd$77fde69f-2119-41eb-8993-a93b2c47ca7e$eded8b72-70f4-4579-ba69-2eca409fa684$1f7d77a6-d774-436d-a745-5a160cc15f2b$502a7125-4460-4d39-be14-4852fb6d9ad2$4b3604db-0c1b-4770-95b1-5f5bb34d071b$39c96fc8-8259-46e3-88a0-a14eb6752b5c$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69$3bf9e526-826d-42b8-84ee-75f1c7f79c69$9d69687a-8df6-4e74-aa99-fbfcc84bcccf$0f9080af-f166-4a78-a003-8df07f6c27d4published_objects 53ee53c46-38f7-11f0-16c9-2b093684d981/ad3aa1d6cffe4c04layoutautosize§padding    xaxisshowgridèshowlineègridwith?  gridcolorblackzerolineètickvals$  ?   @  @@  @  @  @  @   A  Arange  ?   Amirrorèticktextlinecolorblackpaper_bgcolorrgba(0, 0, 0, 0)templatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    heightCH  marginlBH  bBH  rBH  tBp  yaxisshowgridèshowlineégridcolorblackgridwidth?  tickvals  ?   @  @@  @  @  @range  ?  @mirrorèticktextlinecolorblacktitlefontsizeA`  text'Random policy path example in Dyna Mazex?   widthC  configshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdata ׇshowlegend¤modetexttextpositionlefty  @typescattertextSx  ?showlegend¤modetexttextpositionlefty  @typescattertextGx  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @  `@showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  `@  `@showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  `@   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx   @  ?showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey  @  `@typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey  `@   @typescatternameOptimal Pathx   @   @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx   @  ?showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx   @  ?showlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx   @  ?showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx   @  `@showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  `@  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  `@showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  `@  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  @  `@showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  `@  @showlegend¤modelineslinecolorbluey   @  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  `@showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  `@  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  @  `@typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  `@   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  @  Ashowlegend¤modelineslinecolorbluey   @  `@typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  `@  `@typescatternameOptimal Pathx  A  @showlegend¤modelineslinecolorbluey  `@   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  @  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  @  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @  `@typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  `@  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  `@typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  `@   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @  `@typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  `@   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @  `@typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  `@  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  `@typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  `@  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modetexttextpositionlefty  `@typescattertextWx33s@showlegend¤modetexttextpositionlefty  @typescattertextWx33s@showlegend¤modetexttextpositionlefty  @typescattertextWx33s@showlegend¤modetexttextpositionlefty   @typescattertextWx@showlegend¤modetexttextpositionlefty  @typescattertextWxAshowlegend¤modetexttextpositionlefty  @typescattertextWxAshowlegend¤modetexttextpositionlefty  @typescattertextWxA53ee53c46-38f7-11f0-16c9-2b093684d981/b33bcd4825a11f8elayouttemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  configshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ==================================L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ????????????????????????????333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?L?L?fff?fff?fff?fff?fff?fff?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌????????????????ff?33?33?33?33?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?????ff?33?33?33?33?33?33?33?33?33?33?33?33?33?33?   @   @   @ff@ff@ff@ff@ff@ff@@@33@33@33@33@33@33@33@33@33@33@33@33@33@33@   @   @   @   @   @   @   @   @,@,@,@,@,@,@,@333@9@9@9@9@9@9@9@9@9@9@9@9@  @@ffF@ffF@ffF@ffF@L@L@L@L@L@33S@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@Y@fff@fff@fff@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@y@  @  @33@33@33@ff@ff@@@@̌@̌@̌@̌@̌@  @  @  @  @  @  @@@@@@@̜@̜@̜@̜@  @  @33@33@33@33@ff@ff@ff@ff@@@@̬@̬@̬@̬@̬@̬@  @  @  @  @  @  @33@33@33@33@ff@̼@̼@̼@̼@̼@̼@̼@  @  @  @  @33@33@33@33@33@33@33@33@33@33@ff@@@  @33@33@33@33@ff@ff@ff@ff@ff@ff@ff@@@@@@@@@  @33@33@33@33@ff@@@@@@@@@@@@  @33@33@33@33@33@33@ff@ff@ff@ff@ff@ff@ff@@@@@   A   AAAAAAA33A33A33AAAAAA  A  A  A  A	A	A33A33A33AAAAA  A  A  AAAAAAAffAffAffA  A  A  A  AAAAAAAAAffA   A   A   A   A!A!A33#A33#A33#A33#A$A$A$A$A$A$A$A$Aff&A  (A  (A)A)A)A33+A33+A,Aff.Aff.A  0A  0A  0A  0A  0A  0A  0A  0A  0A  0A  0A1A1A1A1A1A1A333A4Aff6Aff6Aff6A  8A33;A33;A33;A33;A33;A33;A33;A33;A33;A33;A<A<A<Aff>Aff>A  @A33CA33CAffFAffFA  HA  HA  HA  HA  HA  HA  HA  HA  HA  HA  HAIA33KA33KAffNA  PAQAQAQAQA33SA33SATATATATATATATATAffVAffVAffVA  XAYAYA33[A33[A33[A33[A\A  `AaAaAaAaA33cA33cA33cAdAdAdAfffAfffAfffAfffA  hA  hAiA33kA33kA33kAlAffnAffnAffnA  pA  pA  pAqAqAqA33sAtAtAtAtAffvAffvA  xA  xAyAyAyA|A|Aff~Aff~Aff~Aff~Aff~A  A  A  A  AAAAAAAAA33A33A33A33A  ĀĀĀĀAAA33A33A33A33A33A  ÄÄÄAAAAAffAffAffAffAffA33A  ǍǍǍǍǍǍǍǍAffA  A  A  A̐A̐A̐A̐A̐A̐AAAffA33A33A33A33A  A  A̔A̔A̔A̔A̔A̔AA33A33A33A33A  A  A  A̘A̘AAAAffA33A33A33A̜A̜A̜A̜A̜A̜A̜A̜AAffAffA33A33A  A  A  A  A̠AAAAffA33A33A33A33A  A  A  AAAffAffAffAffAffA33A33A  ĄĄĄĄĄĄĄAffA  A  A̬AAAAAffAffAffAffAffA33A33A  A  A  AA33A33A33A  A  A  A  A  A  A̴A̴A̴AAAffA33A  A  A  A  A  A  A̸A̸A̸AffAffAffA33A  A  A  AAAffA33A33A  A  A  A  A  A  AAAAAAAAAffAffAffA33A33A  AAAAAAffAffAffAffAffA33A  A  AAAAAAffAffAffAffA33A  A  AAAAAffAffAffA33A  A  A  A  AAAAAffAffA33A  A  A  AAAAffAffAffAffA33AAAAAAAffAffA33A33A33A33A  AAAAAA33A33A33A33AAAAffAffAffAffAffAffAffA33A  A  A  A  AAffA33A  AAAAAAAAAAffAffA33A33A33A33AAA33A33A33A  A  A  AAAAAAAAAAAAffA33A  AffAffAAAAAAAAAAAAAAffAffAffAAAffAffA33A   Bff B B B B B B B B B B33B33BBBffBBB33B33B33BBBffBffBffBffBffBffBffBBB33B33BBB  BffBB33BBBB  B  B  BffBffBBBB33	B33	B	B  
B  
Bff
Bff
Bff
Bff
B
B
B33BB  B  B  BffBBBBB  B  B  BffBffBffBffBffBffBffBffBffBBB33BBB  BffB33BBB  B  B  BffBffBffBffBffBBBBB33BB  BBBBBBBBBffBffBffBffBBBBB33B33BB  BffBffBBB33B33B33B33BBBBffBffBB33B33BB  BffBffBffBffBffBffBBBBBBBB  B  B  BffBB   B   Bff Bff Bff Bff Bff Bff Bff B33!B33!B!B!B!B!B!B!Bff"Bff"B"B"B33#B33#B#B  $B  $B  $B  $B  $Bff$Bff$Bff$B$B$B%B%B%B%B%B%Bff&Bff&B&B&B'B'B  (Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(B(B33)B)B)B  *Bff*Bff*Bff*B*B+B+B+B  ,B  ,B  ,B  ,B  ,Bff,Bff,Bff,B,B,B-B-B-B-B-B  .Bff.B.B.B33/B/B/B  0Bff0Bff0Bff0B0B0B331B331B331B331B  2B  2B  2B2B333B333B3B3B  4B  4B4B4B4B4B4B4B4B335B335B5B5B  6B  6Bff6B6B6B7B7B  8B  8Bff8Bff8Bff8Bff8Bff8Bff8Bff8B8B339B9Bff:Bff:B:B:B33;B  <B  <B  <Bff<Bff<Bff<Bff<Bff<Bff<Bff<Bff<Bff<B<B<B33=B  >Bff>Bff>Bff>B33?B?B?B?B  @B  @Bff@Bff@Bff@Bff@Bff@B@B@B33ABAB  BB  BB  BBffBBBBBBCBCBCBCBCBCBCBDBDBDBDBDBDB33EB33EBEB  FB  FB  FB33GBGBGBGBGBGBGBGBffHBHBHBHBHB33IBIB  JB  JB  JB  JBffJB33KB33KB33KB33KB33KB33KBKB  LBffLB33MB33MB33MB33MB33MBMBMBMB  NBffNBNBNB33OB33OB33OB33OBOBffPBffPBffPBPBPBQBQBQB  RB  RB  RB  RB  RBffRBffRBffRBffRB33SBSBSB  TBffTBTBTBTB33UBUBUB  VB  VBffVBffVBffVBffVBffVBffVBffVBVB33WB33WB33WB  XB  XBffXBXBXBXB33YB33YB  ZB  ZB  ZBffZBffZBZBZBZB33[B33[B[B[B[B  \Bff\B33]B33]B]B]B]B  ^B  ^Bff^Bff^B^B^B^B33_B33_B33_B33_B33_B33_B_B_B  `B`B`B`BaBaB  bBbBbBbBbBbBbBbBbBbB33cBcB  dBffdBdBdBdBdBdBdBdBdBeB  fB  fB  fBfffBfffBfB33gBgB  hBffhBhBhBhBhBhBhBhBhBhB33iBiBiBiBiB  jB  jB  jB33kBkBkBkB  lB  lB  lBfflBlBlBlBlB33mB33mBmBmBmBmBmB  nBnB33oB33oBoB  pB  pB  pB  pBffpBffpBpB33qBqBqBqBqBqBqBqB  rBffrBrBrB33sB33sB33sB33sB33sB  tB  tBfftBtB33uB33uB33uBuBuB  vBffvBffvBvBvBvBvBvBvBvBvB33wBwBwB33yB33yByByByByByByByB  zB  zBffzBffzBzBzB33{B{B{B{B{Bff|Bff|B33}B}B}B}B}B}B}B}B}B}B  ~Bff~Bff~B~B33B33B33B33BBBffBffBBBBBB̀B  B33B33B33B33B33BBB́B  B  B33BffBffBffBBB̂B̂B̂B̂B̂B̂B̂B̂B  B33B33BffBffBB̃B  B  B33B33B33BBBBB̄B̄B̄B̄B̄B  B  B33BBB̅B̅B̅B  B  B  B  B33BffBBBB̆B̆B̆B  BffBffBffḂḂB  B  B33B33B33BffBffBBBB̈B  B33B33B33B33B33B33BffBffBB̉B  B  B33B33B33B33BBBBB̊B  B33B33BffBffBBBBBB̋B33BffBBBBBB̌B  B  B33B33B33B33B33B33BffBffBffBffBffBffB̍B̍B  B33BffBB̎B̎B  B  B33B33B33B33BffBffBffBffBB̏B  BffBffBBBBB̐B̐B̐B  B33B33B33BffBffBffBB̑B33B33BffBffBffBffBB̒B̒B̒B̒B̒B̒B̒B  B33BB̓B  B  B  B  B  B33BffBffBffBffBBBB̔B  B33BffBffBBBB̕B  BffBffBffBffBffBffBffBffBB̖B̖B̖B  BffBffBffBffBffBffB̗B̗B̗B33BffBffBffBffBBB  B  B  BffBffBffBffBffBBB̙B̙B33BffBffBffBffBffBBBBB33B33B33B33BffBffBBB  B  B  B  B  BffBffBffBffBBBB  B  BffBffBffBBBBBB̝B  B33B33B33B33B33B33BB  B  B  B33B33B33B33B33B33B  B  B  B  B  B33B33BffBffBB̠B̠B̠B̠B  B  B  B  BB̡B̡B̡B̡B̡B  B33B33BffBBB  B  B  B  B  B  B33B33B33BffB  B  B  B  B33BffBBBB̤B  B  B  B  B33B33B33B33B33B33BBB̥B̥B  B33B33BffBffB̦B  B  B33B33B33B33B33B33B33B33BffBffBB̧B  B33B33BffBffBffBffB̨B̨B̨B̨B  B  B33B33BffBffBB̩B̩B̩B33B33BffBffBffBBBBBBBB̪B̪B̪BffBffBBB̫B  B33B33BffBffBffBffBffBffBB̬B̬B̬B̬B̬B33B33BBB̭B33B33B33BffBffBffBffBffBBB̮B̮B̮B̮B̮BffBffB̯B  B  B33B33B33BffBBB̰B̰B̰B̰B̰B̰B̰B  B  B33B33B33BffḆB  B  BffBffBBBB̲B̲B  B  B  B  B33B33B33BffBffBBBB̳B̳B33BffB̴B  B  B  B  B  B  B  B33B33B33BffBBBB̵B  B33BffBB̶B̶B̶B̶B  B  B  B  B  B  B  B33B33BffBffB̷B  B  B  BBBBB̸B  B  B  B  B  B  B  B  BffBBB̹B̹B  BffBffBffBB̺B̺B̺B̺B  B  B  B  B  B  B  B33BffBffBffB  B33BffBffBffBB̼B̼B̼B̼B̼B̼B  B  B33B33B33BffBBB̽B33B33B33BBB̾B̾B̾B̾B  B  B  B  B  B  B  B33BBB̿B̿B  B33B33BffBffBBB  B  B  B  B  B  B33B33BffBffBBBB  B33BffBffBBBBBB  B  B  B33B33BffBffBffBBBBB33B33BBB  B  B  B  B  B33B33B33B33BffBffBffBffBBBBBB  B33BffBffBBBB  B  B  B  B33B33B33B33B33B33B33B33B33BffBBBBBB  B  B  B  B  B33B33B33B33BBBBBBB  BffBB  B  B  B  B  B  B  B33B33B33B33BBBBBBB  B  B  B33B33BffBBB  B  B33B33B33B33B33B33B33B33B33BffBffBB33BffBffBffBBBB  B33B33B33B33B33BffBffBffBBBBB  B  BffBffBB  B  B  B  B33BffBffBffBffBffBffBBB  B  B  B  BffBffBffBB33B33B33BffBffBffBffBBBBBB  B  B  B  B33BffBBBB  B33B33B33BffBffBffBffBffBBBB  B33BBBBBBBBBB33BffBffBffBB  B  B33BffBffBBBBBBBB  B  B  B33BffBffBB  B  B33B33B33BffBffBBBBBBBB  BffBffBffBffBffBBBBBB  B  BffBffBffBBB33B33B33B33B33B33BffBffBffBffBffBffBffBBBB  B33B33BBBBB33B33BffBffBffBffBffBffBB  B33B33B33B33B33B33BffBffBB  B33B33BffBffBffBB  B  B  B33B33B33B33B33B33BBBBB  B  B  BffBBBBB33B33B33B33B33B33BffBffBBBBB  B  BffBffBBB33B33B33B33B33B33B33B33BffBBBBBBBB33BffBBBB  B  B33B33B33BffBffBBBBBBB  B  B  B  B  B33BffBB  B  B  B  B  BBBBB  B  B  B  B33B33B33BffBffBffBffBBBBB  B33B33BBBBBBBBBBBBBBBBBB33B33B33BB33B33BBBBBBBBBBB  B  B  B33BBB  B33B33B33B33BffBffBffBBBBBBBB  B33B33B33BffBBBBBB33BBBBBBBB33B33B33B33B33BffBffBffBffBBBB  B  B  B33B33BBB33B33B33B33BffBffBffBffBffBffBBB  B  B  BffBffBBBB  B  B  BffBffBffBffBffBffBBBB  B  B  B33BffBBBBBBB  B33B33BffBffBffBffBffBB  B  B  BffBBBBBBB  B  B33B33B33B33BffBffBBBBB  BffBffBffBffBffBB  B  B  B  B33B33B33B33B33BffB  B33B33B33B33B33BffBBB  B  B  B33B33B33B33B33BBBB   C C C C33 C33 C33 CL CL Cff Cff Cff C  C  C C C C3 C C C  C  CCCC33C33C33CLCffCffC C CCCCCfCfCCCC33C33C33CLCLCLCffCffC C CCfCfCfCfC  C  C  C  C  C  C  C  CC33CLCCCCCfCfCfCfCfCfCfCfCfCfCfC  CC33CffCffCCCCC3C3CCfCfCfCfCfC  CCCCCC33C33C C C C CCCCCCCCfC  CCCCCC33C33C33CLC C3C3C3C3C3C3C3CCCfC  C  C  C  CC33CffCffCC3C3C3C3C3C3C3C3CCfC  C  C  C  C  CC33CLCffC C C CCCCCC3C3CCfCfCfC  	C  	C	CL	Cff	Cff	C 	C	C	C	C	C	C3	C3	C3	C3	C	C	C	C	C	C	C  
C  
CL
Cff
Cff
C 
C 
C 
C
C
C3
C
C
C
C
C
C
C
Cf
Cf
C33C33C33CffCffC C C C C C3C3C3CCCC  C  C  C  C  C  C33CLCffCffCffCCCC3C3C3C3C3C3CfCfC  C  CCCCCCCLCffC C C3C3C3C3C3C3C  CCCCCCCCLCLCLCLCLCffCC3CCfCfCfCfCfCfCfCfC  CC33C33CLCLCLCffC CCC3C3C3C3C3C3C3CfCfCfCfC33CLCffCffC C C CCCC3C3C3C3C3CC  C  C  CCCCC33CffCffC C C CCCC3CCCfC  CCCCCCLCLCLCLC C C C C C C CCfC  C  C  CCCCC33C33C33CffCffC C C C CCCCCfC  C  C  CCCCCffCffCffCffCffCffCC3C3C3CCfC  CCCC33C33CLCLCffCffCffCffC C CCCfCfCfCfCfCfCfCfCC33CLCLCffCffCffCffC CC3C3CfCfCfCfCfCfCC33C33C33CLCLCLCLCffCffCffCffCC3C3CCCfCfC  C  C  C  CCCC33CLCffCffC CCCC3CCCCCfC  C  C  C  C33C33CLCLC C CCC3C3CCCfCfCfC  C  CCCC33C33C33C33C33CffCCC3C3C3C3C3CCfC  CCC33C33C33C33C33C33CLCLCffC CC3CCCfCfCfCfCfCfCC33C33C33C33C33CLCffCffC C C3C3C3CCCCfC  CCCCC33C33C33C33CLC CC3C3C3C3C3CCfCfC  C  C  CC33CLCLCLCLC CCCCCCCCCCfCfCfC  C  C  CLCLC CCCCCC3C3CCCCfCfC   C   C   C C C33 C33 Cff C  C  C  C3 C3 C3 C3 C3 C C C C  !C  !C  !C  !C  !C!C33!Cff!Cff!C !C !C !C !C!C!C3!C3!C!C!C!C!C!C!C!C!C!C  "CL"Cff"Cff"Cff"Cff"C "C3"C3"C3"C3"C"C"C"C"C"C"Cf"C  #C33#C33#Cff#Cff#Cff#Cff#C #C #C #C#C#C3#C3#C3#C3#C#C#C#C  $C$C33$C33$C33$CL$CL$CL$CL$Cff$Cff$C$C$C$C$C3$C$C$Cf$Cf$C  %C  %C%C%C%C%CL%Cff%C %C%C%C%C%C%C%C%C3%Cf%Cf%Cf%C  &C  &C  &C  &C&C&CL&CL&CL&Cff&C&C&C&C&C&C&C&C3&C&Cf&Cf&Cf&C'C33'C33'C33'C33'CL'CL'CL'Cff'Cff'C'C'C3'C3'C3'C3'C'Cf'C  (C  (C  (C  (C(C(C33(C33(CL(Cff(C (C (C (C(C(C(C(C(C(C3(C(C(Cf(Cf(Cf(C  )C33)CL)Cff)Cff)Cff)Cff)C )C )C )C )C )C )C )C )C3)C)C  *C*C*C*C*C33*C33*CL*Cff*C *C *C *C *C *C *C *C3*C3*C*C*C*Cf*C+C+C33+C33+CL+CL+CL+CL+CL+CL+C +C +C+C+C+C+C+C3+C+Cf+C,C33,C33,C33,CL,CL,CL,Cff,Cff,Cff,Cff,Cff,C,C,C,C3,C3,Cf,Cf,C  -C  -C33-CL-CL-CL-CL-CL-Cff-Cff-Cff-Cff-C -C-C-C-C3-C3-C3-C3-Cf-C  .C33.C33.C33.C33.Cff.Cff.Cff.Cff.Cff.Cff.C .C .C .C.C3.C3.C.Cf.C  /C/C/C/CL/CL/CL/Cff/Cff/Cff/Cff/Cff/Cff/Cff/Cff/C/C/C/C3/Cf/Cf/Cf/Cf/C  0C  0CL0CL0Cff0Cff0Cff0Cff0Cff0Cff0Cff0Cff0Cff0Cff0C 0C0C30C30Cf0C  1C1C331CL1Cff1Cff1Cff1Cff1Cff1Cff1Cff1Cff1Cff1Cff1Cff1C 1C1C31C31C1Cf1C  2C332CL2CL2Cff2Cff2Cff2Cff2Cff2Cff2Cff2Cff2Cff2Cff2C 2C2C2C32C32C  3C3C333C333C333C333C333Cff3Cff3Cff3Cff3Cff3Cff3C 3C 3C 3C3C3C33C3C3Cf3C  4C4C334C334C334CL4CL4Cff4Cff4Cff4Cff4C 4C 4C 4C 4C4C4C4C4C4C4C  5C  5C5C5C5C5CL5Cff5Cff5Cff5Cff5Cff5C 5C 5C5C5C35C35C5C5Cf5C  6C  6C  6C  6C  6C336C336CL6Cff6Cff6C 6C 6C 6C6C6C36C36C36C36C36C6C6C7C7C7C7CL7Cff7Cff7Cff7C 7C7C7C37C37C37C37C37C37C7Cf7Cf7C  8C  8C  8C8C338C338C338C338Cff8Cff8Cff8C38C38C38C38C38C38C38C38C38C38C38C8Cf8C  9C339C339CL9Cff9C 9C 9C9C9C39C39C39C39C39C39C39C39C39C39C9C9Cf9C33:C33:C33:CL:Cff:C:C:C:C:C:C:C:C:C3:C3:C3:C3:C3:Cf:Cf:C  ;C;C33;CL;Cff;Cff;Cff;Cff;C ;C ;C ;C ;C;C;C;C;C;C;C3;Cf;Cf;C  <C  <C<CL<Cff<Cff<Cff<Cff<C<C<C<C<C<C<C<C<C<C<Cf<Cf<Cf<C  =C=C33=C33=C33=C33=CL=C=C=C=C=C=C=C=C=C3=C  >C  >C>C>C>C>C>C>CL>CL>CL>Cff>Cff>C >C >C >C>C>C>C>C  ?C  ?C  ?C  ?C?C?C?CL?CL?CL?CL?Cff?Cff?Cff?C ?C3?C?Cf?Cf?Cf?Cf?Cf?C  @C  @C33@C33@C33@C33@C33@C33@C33@C33@C33@Cff@C@C@C@C@C@Cf@Cf@Cf@Cf@CACACACAC33AC33ACLACLACLACffACffACACAC3ACACfAC  BC  BC  BC  BC  BC  BC  BCBC33BC33BC33BCLBCffBCffBCffBC BCBCBCBCBCfBCfBC  CC  CCCCCCCCCC33CC33CCLCCLCCLCCffCCffCC CC3CC3CCCCCCCCfCC  DC  DC  DC  DC  DC  DC  DCDCDC33DCLDCffDC DC3DC3DC3DC3DC3DCfDCfDCfDCfDCfDC  EC  EC  ECECEC33ECLECLECffECffEC ECECEC3ECECECECECECEC  FC  FC  FC  FCFCFCLFCLFCLFCLFCffFC FCFCFC3FC3FC3FC3FC3FC3FCFCFCfFC  GCGCGC33GC33GC33GC33GC33GC33GCffGCGCGCGCGCGC3GC3GC3GC3GC3GCGCGC  HCHCHC33HC33HCLHC HCHCHCHCHCHC3HC3HC3HC3HCfHCfHCfHC  ICIC33ICffICffICffIC IC IC IC IC ICICICIC3ICfICfIC  JCJCJC33JCLJCLJCffJC JC JC JC JC JC JC JCJCJCJC3JCJCJCJCKC33KC33KC33KC33KCLKCLKCffKCffKCKCKCKCKCKCKCKC3KCKCfKCLC33LC33LC33LCLLCLLCLLCLLC LC LCLCLCLCLCLCLCfLC  MCMCMCMCMCMC33MC33MCLMCffMCffMC MCMCMCMCMCMCMCMC  NC  NC  NC  NC  NCNCLNCLNCffNCffNCffNCffNCffNC NC NC NC NCNCfNCfNCfNC  OC  OCOCOCOCLOCLOCLOCLOCffOCffOCffOC OCOC3OCOCfOCfOCfOC  PCPCPC33PC33PC33PC33PC33PCLPCLPCffPC PCPCPCPCPCPCfPC  QC  QCQCQCQCQCQC33QCLQCLQCLQC QC QC QC QC QCQC3QC3QCQCQCfQC  RCRCRCRCRCRC33RCLRCLRCLRCLRC RC RC RCRCRC3RC3RC3RC3RCRCfRC  SCSCSCSC33SC33SC33SCLSCLSCffSC SC SC SC3SC3SCSCSC  TC  TC  TC  TC  TCTCTCTCTCTC33TCLTCffTCffTC TC TC TC3TC3TCfTCfTCfTCfTCfTCfTC  UC  UC  UCUC33UC33UCffUCffUC UCUCUCUCUCUC3UCfUCfUCfUCfUCfUC  VCVC33VCLVCLVC VCVCVCVCVCVCVCVCVCVCfVCfVCfVCWC33WCLWCffWCffWCffWC WC WC WC WC WCWC3WC3WCWCWCWCfWC  XC  XCXCXC33XCLXCLXCffXCffXC XC XC XCXC3XCXCXCXCfXCfXCfXCfXC  YC33YCLYCLYCffYCffYCffYCffYCffYCffYCYCYCYCYCYCYCYC3YCfYCfYC  ZC33ZC33ZCLZCLZCLZCLZCffZC ZC ZCZCZCZCZCZCZCZCZC[C[C[C33[CL[CL[CL[Cff[Cff[Cff[Cff[Cff[C [C [C[C3[C[C[Cf[C\C33\C33\CL\CL\CL\CL\CL\CL\CL\CL\Cff\C \C\C\C\C3\C3\C\C  ]C33]CL]CL]CL]CL]CL]CL]CL]CL]CL]CL]C ]C]C]C3]C3]C3]C3]C3]Cf]Cf]C^C^C^C^CL^CL^CL^Cff^C ^C^C^C^C^C^C3^C^C^Cf^C  _C_C_C33_C33_CL_CL_Cff_Cff_Cff_Cff_C _C _C _C _C3_C3_C_Cf_Cf_Cf_Cf_C  `C  `CL`CL`Cff`Cff`Cff`Cff`C `C `C `C `C`C3`C3`C`Cf`Cf`Cf`Cf`Cf`C  aC  aCaC33aCLaCLaCffaCffaC aC aC aCaCaCaCfaCfaCfaCfaC  bC  bCbCbC33bC33bC33bC33bC33bCLbCffbCffbCbCbCbCbCfbCfbC  cC  cC  cCcCcCcC33cC33cC33cCLcCLcCLcCLcCffcC cC cC3cC3cC  dCdCdCdCdCdCdCdCdCdC33dCLdCLdCLdCffdCffdCffdC dC dCdCdCdCdC  eC  eC  eCeCeC33eC33eC33eC33eC33eCLeCLeCLeCffeC eCeC3eC3eCeC  fC  fC  fC  fC  fCfC33fCLfCLfCLfCLfCLfCfffCfffCfffC fC fCfCfCfC3fC3fCfCfCfCffC  gCgCgCgC33gC33gC33gCLgCffgCffgCgC3gCgCgCgCgCgCgCgCfgC  hC  hChChC33hC33hCLhCffhC hC hC hC hC hChChC3hC3hCfhCfhC  iCiCiCiCiC33iC33iC33iC33iC33iCLiCLiCLiCffiCiCiCiCfiC  jC  jC  jC  jC  jC  jCjCjC33jC33jC33jCLjCLjCLjCffjCffjCffjCffjC jCjCjC  kC  kC  kCkCkCkCkCkCkCLkCLkCffkCffkCffkCffkCffkCffkCffkC kC3kCkCfkCfkC  lC  lClClC33lC33lCLlCLlCLlCLlCLlCLlCLlCfflC lC lClC3lC3lClClCflCflC  mCmC33mC33mC33mC33mC33mCLmCLmCLmC mC mCmCmCmC3mCmCmCfmC  nCnC33nC33nC33nC33nC33nC33nC33nCLnCLnCffnCnCnCnCnCfnCfnCfnCfnCfnC  oC  oC  oCoCoCoCoCLoCLoCLoCoCoC3oC3oCoCfoCfoCfoCfoCfoC  pCpCpCpCpCpCpCpC33pC33pC33pC33pC pC3pC3pC3pCfpCfpCqCqCqCqCqCqCqC33qC33qC33qC33qCLqCffqC qCqCqC3qC3qCqCqCqCqCfqCfqC33rC33rC33rC33rC33rC33rCffrC rC rC rC rC rC3rC3rCrCrCrCfrCfrCsCsCsCsCsCsC33sC33sCLsC sC sCsCsC3sCsCfsC  tC  tC  tCtCtCtCtCtCtCtCLtCfftC tC tCtCtC3tC3tCftCftC  uC  uC  uC  uCuCuCuCuC33uCLuCLuCLuCffuCffuCffuC3uC3uCuCfuC  vC  vC  vCvCvCvCvCvCvC33vC33vC33vC33vCLvC vC vC3vCvCvCvC  wC  wC  wC  wC  wCwCwCwCwCwC33wCLwCffwC wC wC wC wC wC wCwC3wCwCfwCfwCfwC  xC  xCxC33xCffxCffxCffxCffxCffxC xC xC xC xC xCxCxCxCxCxCfxCfxCfxCfxC33yC33yCffyCffyCffyCffyCffyCffyC yCyCyCyCyC3yCyCyCyCyCyCzCLzCffzCffzCffzCffzCffzCffzC zCzCzCzCzC3zCzCzCzCzCzCzC  {C{C33{C33{C33{C33{C {C {C {C {C {C {C{C3{C3{C{C{C{C{C{C  |C  |C|C33|Cff|Cff|C |C |C|C|C|C|C|C|C3|C|C|Cf|Cf|C  }C  }C}C}C}C33}C33}CL}Cff}Cff}Cff}Cff}Cff}C }C }C3}C3}C3}C3}C}Cf}Cf}C  ~C  ~C  ~C~C~C33~C33~Cff~Cff~Cff~Cff~Cff~C ~C ~C3~C3~C3~Cf~Cf~C  C  C  CCC33C33C33C33CLCffCffC C C C3CCCCCfCfC  C  C  CCCCf&Cf&Cf&CLCYCYCYCffCffCffCffCffC3sC3sC3sC͌C͌CCCC3C3C C C C C C C C C CـCـC3C  C  C  CCCCf&Cf&Cf&Cf&Cf&Cf&Cf&C33C33C33C33CLCYCffCffC3sC3sC C C C͌C͌C͌CCCCC3C3C ĆĆCفCfCfCfC3C3C3C3C  CCCCCf&Cf&Cf&C33CYCYCYCffCffCffCffC3sC C͌C͌CCCCfCfCfC3C ĈCقCقCقCfC3C  C  CCCCf&Cf&Cf&C33C33C33C33C33C @C @C @CYCYCYC3sC CCCfCfC3C3C3C3C3C3C3C3C C C̃CfC3C3CCCCCCCCf&Cf&Cf&Cf&C33C @C @CLCLCLCLCYCffC C C C CCCCCfCfCfCfC3C3C3C3C3C3C3C̄C3C3C  C  C  CCCtypescatternameDyna-Qx]  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;E ;E ;E ;E ;E ;E ;E ;E  <E <E  <E 0<E @<E P<E `<E p<E <E <E <E <E <E <E <E <E  =E =E  =E 0=E @=E P=E `=E p=E =E =E =E =E =E =E =E =E  >E >E  >E 0>E @>E P>E `>E p>E >E >E >E >E >E >E >E >E  ?E ?E  ?E 0?E @?E P?E `?E p?E ?E ?E ?E ?E ?E ?E ?E ?E  @E @E  @E 0@E @@E P@E `@E p@E @E @E @E @E @E @E @E @E  AE AE  AE 0AE @AE PAE `AE pAE AE AE AE AE AE AE AE AE  BE BE  BE 0BE @BE PBE `BE pBE BE BE BE BE BE BE BE BE  CE CE  CE 0CE @CE PCE `CE pCE CE CE CE CE CE CE CE CE  DE DE  DE 0DE @DE PDE `DE pDE DE DE DE DE DE DE DE DE  EE EE  EE 0EE @EE PEE `EE pEE EE EE EE EE EE EE EE EE  FE FE  FE 0FE @FE PFE `FE pFE FE FE FE FE FE FE FE FE  GE GE  GE 0GE @GE PGE `GE pGE GE GE GE GE GE GE GE GE  HE HE  HE 0HE @HE PHE `HE pHE HE HE HE HE HE HE HE HE  IE IE  IE 0IE @IE PIE `IE pIE IE IE IE IE IE IE IE IE  JE JE  JE 0JE @JE PJE `JE pJE JE JE JE JE JE JE JE JE  KE KE  KE 0KE @KE PKE `KE pKE KE KE KE KE KE KE KE KE  LE LE  LE 0LE @LE PLE `LE pLE LE LE LE LE LE LE LE LE  ME ME  ME 0ME @ME PME `ME pME ME ME ME ME ME ME ME ME  NE NE  NE 0NE @NE PNE `NE pNE NE NE NE NE NE NE NE NE  OE OE  OE 0OE @OE POE `OE pOE OE OE OE OE OE OE OE OE  PE PE  PE 0PE @PE PPE `PE pPE PE PE PE PE PE PE PE PE  QE QE  QE 0QE @QE PQE `QE pQE QE QE QE QE QE QE QE QE  RE RE  RE 0RE @RE PRE `RE pRE RE RE RE RE RE RE RE RE  SE SE  SE 0SE @SE PSE `SE pSE SE SE SE SE SE SE SE SE  TE TE  TE 0TE @TE PTE `TE pTE TE TE TE TE TE TE TE TE  UE UE  UE 0UE @UE PUE `UE pUE UE UE UE UE UE UE UE UE  VE VE  VE 0VE @VE PVE `VE pVE VE VE VE VE VE VE VE VE  WE WE  WE 0WE @WE PWE `WE pWE WE WE WE WE WE WE WE WE  XE XE  XE 0XE @XE PXE `XE pXE XE XE XE XE XE XE XE XE  YE YE  YE 0YE @YE PYE `YE pYE YE YE YE YE YE YE YE YE  ZE ZE  ZE 0ZE @ZE PZE `ZE pZE ZE ZE ZE ZE ZE ZE ZE ZE  [E [E  [E 0[E @[E P[E `[E p[E [E [E [E [E [E [E [E [E  \E \E  \E 0\E @\E P\E `\E p\E \E \E \E \E \E \E \E \E  ]E ]E  ]E 0]E @]E P]E `]E p]E ]E ]E ]E ]E ]E ]E ]E ]E  ^E ^E  ^E 0^E @^E P^E `^E p^E ^E ^E ^E ^E ^E ^E ^E ^E  _E _E  _E 0_E @_E P_E `_E p_E _E _E _E _E _E _E _E _E  `E `E  `E 0`E @`E P`E ``E p`E `E `E `E `E `E `E `E `E  aE aE  aE 0aE @aE PaE `aE paE aE aE aE aE aE aE aE aE  bE bE  bE 0bE @bE PbE `bE pbE bE bE bE bE bE bE bE bE  cE cE  cE 0cE @cE PcE `cE pcE cE cE cE cE cE cE cE cE  dE dE  dE 0dE @dE PdE `dE pdE dE dE dE dE dE dE dE dE  eE eE  eE 0eE @eE PeE `eE peE eE eE eE eE eE eE eE eE  fE fE  fE 0fE @fE PfE `fE pfE fE fE fE fE fE fE fE fE  gE gE  gE 0gE @gE PgE `gE pgE gE gE gE gE gE gE gE gE  hE hE  hE 0hE @hE PhE `hE phE hE hE hE hE hE hE hE hE  iE iE  iE 0iE @iE PiE `iE piE iE iE iE iE iE iE iE iE  jE jE  jE 0jE @jE PjE `jE pjE jE jE jE jE jE jE jE jE  kE kE  kE 0kE @kE PkE `kE pkE kE kE kE kE kE kE kE kE  lE lE  lE 0lE @lE PlE `lE plE lE lE lE lE lE lE lE lE  mE mE  mE 0mE @mE PmE `mE pmE mE mE mE mE mE mE mE mE  nE nE  nE 0nE @nE PnE `nE pnE nE nE nE nE nE nE nE nE  oE oE  oE 0oE @oE PoE `oE poE oE oE oE oE oE oE oE oE  pE pE  pE 0pE @pE PpE `pE ppE pE pE pE pE pE pE pE pE  qE qE  qE 0qE @qE PqE `qE pqE qE qE qE qE qE qE qE qE  rE rE  rE 0rE @rE PrE `rE prE rE rE rE rE rE rE rE rE  sE sE  sE 0sE @sE PsE `sE psE sE sE sE sE sE sE sE sE  tE tE  tE 0tE @tE PtE `tE ptE tE tE tE tE tE tE tE tE  uE uE  uE 0uE @uE PuE `uE puE uE uE uE uE uE uE uE uE  vE vE  vE 0vE @vE PvE `vE pvE vE vE vE vE vE vE vE vE  wE wE  wE 0wE @wE PwE `wE pwE wE wE wE wE wE wE wE wE  xE xE  xE 0xE @xE PxE `xE pxE xE xE xE xE xE xE xE xE  yE yE  yE 0yE @yE PyE `yE pyE yE yE yE yE yE yE yE yE  zE zE  zE 0zE @zE PzE `zE pzE zE zE zE zE zE zE zE zE  {E {E  {E 0{E @{E P{E `{E p{E {E {E {E {E {E {E {E {E  |E |E  |E 0|E @|E P|E `|E p|E |E |E |E |E |E |E |E |E  }E }E  }E 0}E @}E P}E `}E p}E }E }E }E }E }E }E }E }E  ~E ~E  ~E 0~E @~E P~E `~E p~E ~E ~E ~E ~E ~E ~E ~E ~E  E E  E 0E @E PE `E pE E E E E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȀE ЀE ؀E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȁE ЁE ؁E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȂE ЂE ؂E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȃE ЃE ؃E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȄE ЄE ؄E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȅE ЅE ؅E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȆE ІE ؆E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȇE ЇE ؇E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȈE ЈE ؈E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȉE ЉE ؉E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȊE ЊE ؊E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȋE ЋE ؋E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȌE ЌE ،E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȍE ЍE ؍E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȎE ЎE ؎E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȏE ЏE ؏E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȐE АE ؐE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȑE БE ؑE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȒE ВE ؒE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȓE ГE ؓE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȔE ДE ؔE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȕE ЕE ؕE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȖE ЖE ؖE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȗE ЗE ؗE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȘE ИE ؘE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E șE ЙE ؙE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȚE КE ؚE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E țE ЛE ؛E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȜE МE ؜E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȝE НE ؝E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȞE ОE ؞E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȟE ПE ؟E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȠE РE ؠE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȡE СE ءE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȢE ТE آE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȣE УE أE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȤE ФE ؤE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȥE ХE إE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȦE ЦE ئE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȧE ЧE اE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȨE ШE بE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȩE ЩE ةE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȪE ЪE تE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȫE ЫE ثE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȬE ЬE جE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȭE ЭE حE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȮE ЮE خE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȯE ЯE دE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȰE аE ذE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȱE бE رE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȲE вE زE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȳE гE سE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȴE дE شE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȵE еE صE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȶE жE ضE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȷE зE طE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȸE иE ظE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȹE йE عE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȺE кE غE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE Ey]                                                                                                                                                                                                                                                                                                                    ===================L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>>>>>>>   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ???????????????????????333?333?333?L?L?L?L?L?L?L?L?L?L?L?L?L?fff?fff?fff?fff?fff?fff?fff?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?̌?̌?̌?????????ff?ff?ff?  ?  ?  ?  ??????ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?33?33?33?33?33?   @   @   @   @ff@@@@33@33@33@33@33@@@   @   @   @   @   @   @   @ff&@,@333@333@333@9@9@9@9@9@  @@  @@ffF@ffF@ffF@ffF@ffF@ffF@ffF@ffF@L@L@L@L@L@33S@33S@33S@Y@  `@  `@fff@fff@33s@33s@33s@33s@y@y@  @  @  @  @  @  @  @  @ff@ff@̌@̌@  @  @33@33@ff@ff@ff@@@@@@@@@@̜@  @  @  @  @  @33@̬@̬@  @  @  @  @  @  @  @  @  @33@33@ff@ff@ff@@@@̼@33@33@33@33@33@@@@@@@@  @  @33@33@33@33@33@@  @  @33@ff@ff@ff@@@@@  @33@33@33@33@33@ff@@@@@@@   A33A33A33A33AAAA  A	A	A	A33A33A33A33A33AAAAAffA  A  A  A33A33A33A33AAA  A  A  A  AA33A33A33A33AAffAffA!A!A!A!A!A!A33#A$A$Aff&Aff&Aff&A  (A33+A33+A33+A33+A33+A,Aff.A  0A1A1A333A333A333A333A333A4Aff6A  8A  8A9A9A9A9A33;A33;Aff>AAAAA33CA33CA33CADADADADADADAffFAffFA  HA  HA  HAIA33KAffNAffNAffNA  PAQAQATATATATATATATAffVA  XA  XA  XAYA33[A33[A33[A\Aff^A  `A  `AaA33cA33cA33cA33cAdAdAdAdAdA  hA  hA33kAlAlAlAffnA  pAqAqAqAqAqAqA33sA33sA33sA33sA33sAtAffvAffvAffvA  xA|Aff~Aff~Aff~A  ÀÀÀÀÀÀAAAffAffAffA33A33A33A  A  AAAffAffAffAffAffA33A33A  ÄÄÄÄAffAffAffAffA33A33A33A  ǍAffAffA33A33A  A  A  A  A  A̐AAAAA33A33A33A33A33A33A̔AAffAffA  A  A  A  A  A  A̘A̘A̘A̘AffAffA  A  A  A̜AAAAAA33A33A33A̠A̠A̠A̠A̠A̠AffA33A33A33A33A̤AAAAAA33A33A  A  ĄĄĄAAAffAffAffA33A33A  A̬A̬A̬A̬A̬A̬AAAffA  A  A  A  A  A  A̰AffAffA33A33A  A  A  A  A  A  A  A  A̴AffAffA33A33A33A  A̸AffAffA33A33A33A33A33A  A  A  A  A  A̼A̼A̼AffA33A33A33A33AAAAAffA  A  A  A  AAAAAAAAffA33A  A  AAAffAffA33A  A  A  A  AAAAAAAAAAAA33A  AAAAffA  A  A  A  AAAAAAAffAffA33A33A33A33A33A  A  AAAffA33A  A  A  A  AAAA33A33A33A33A33A33A  A  AAAAffAffAffAffAAAAAffAffAffAffAffA  AAAAAAffAffAffAffA33A  AAAffAffA33A33A33A33A  A  AAAAAAAAAA33A33A33AAA33A33A33A33A33A33A33A33AAAAAAAAffAffA33A  AAAffAffAffAffAffA33A33A33Aff Bff Bff Bff Bff Bff B33B  B  BffB33B33B33B33B33B33B33B33BBBBBB  BBBBBffBBBBB33B33B33B33B33B33BBBffBffBffB33	B33	B	B  
B  
Bff
Bff
Bff
Bff
B
B33B33BBBBBBB  B  B  BffBBB33BffBffBffBB33BBBBBBB  B  B  B  B  BffBffBffB33BB  BBBBB33B33B33B33B33B  B  B  BffBffBffB33BBBB  BffB33B33B33B33B33B33BBBBBB  BBB33BBBB  B  BffBffB33B33B33B33B33B33BBBffBffBBB33BB  B  B  B  BffBffBffBffBB33B33B33BBBBB   B B33!B33!B!B  "B  "B  "Bff"B"B33#B33#B33#B33#B33#B33#B#B#B#B#B  $B$B%B%B%B%B%B  &Bff&Bff&B&B&B33'B33'B'B'B'B'B'B  (Bff(Bff(B(B33)B)Bff*Bff*Bff*Bff*B*B*B*B33+B33+B33+B33+B+B+B+Bff,Bff,Bff,Bff,B,B33-Bff.Bff.Bff.B.B33/B33/B33/B33/B33/B33/B33/B/B  0B  0B  0B  0B  0B  0Bff0B331B331B  2Bff2Bff2Bff2B2B2B2B333B333B333B3B3B  4B  4B4B4B5B5B5B5B5B  6Bff6B6B6B6B6B6B6B6B6B337B7B  8Bff8B339B339B339B339B9Bff:Bff:B:B:B:B:B:B:B:B:B:B33;B;B;B  <Bff<Bff<Bff<B33=B33=B=Bff>Bff>Bff>Bff>B>B>B>B>B>B33?B?B?B?B?B  @B  @B@B33ABABABABABffBBffBBBBBBBB33CB33CB33CB33CB33CBCBCBCB  DB  DBffDBDBEBEB  FB  FB  FB  FBFBFBFB33GB33GB33GB33GB33GB33GB33GBGB  HBHBHB33IB33IB33IB33IB  JB  JBffJBffJBJBJBJBJBJB33KB33KBKB  LB  LBLBLBLB33MB33MB33MBMB  NBffNBffNBNBNBNBOB  PB  PB  PB  PB  PB  PB  PB  PBffPBffPBffPBffPBPBQB  RBffRBRBRB33SBSB  TB  TB  TB  TB  TB  TB  TB  TBffTBffTBTBTBTBTB33UB33UB33UBffVBVB33WBWBWBWBWBWB  XB  XB  XB  XB  XBffXBXBXBXBXB33YB33YB33YBffZBffZBZBZB33[B33[B33[B[B[B[B[B[B[B  \B  \Bff\B33]B]B]B]B]B  ^B  ^Bff^Bff^Bff^B^B^B^B33_B33_B33_B_Bff`Bff`Bff`Bff`B33aBaB  bB  bB  bB  bB  bB  bB  bBffbBbB33cB33cB33cBcBcB  dB  dB  dB  dB  dBffdB33eB33eB33eB33eB33eBeBfffBfBfB33gB33gBgBgB  hB  hB  hB  hBffhBhBhBhBhBhBhBiBiBiBiB  jBffjBffjBjBkBkB  lB  lB  lB  lBlBlB33mB33mB33mB33mBmBffnBffnBffnBffnBffnBffnBnB33oBoBoBoBffpBffpBpBpBpBpBpBpB33qB  rB  rBffrBffrBrBrBrBrBrBrBsB  tBfftBfftBfftBfftBfftBtBtB33uBuBuBffvBffvBffvBvB33wB33wBwBwBwBwBwB  xB  xB  xB  xBffxB33yB33yByByByB  zBffzBffzBzB33{B33{B33{B{B{B{B{B{B  |B|B|B|B33}B33}B}B}B}B}B}B}Bff~Bff~B~B33B33BBB33BffBffBffBBB̀B̀B̀B̀B̀B̀B̀B̀B̀B33B33BB́B  BffBffBffBffBffBBBBBBB̂B  B33B33B33B33BffBB̃B̃B̃B̃B̃B  BffBffBffBB̄B33B33B33B33B33BffBffBBBBB̅B̅B  B33BffB̆B̆B  B  B33B33B33B33B33B33BffBffBḂḂḂB  B33B33B33BffBffBffBBB  B  B33B33BffBBB̉B̉B  B  BffBffBffBBBBBBBBB  B  B33B33B33BffBffBffB̋B̋B̋B̋B33B33B33BffBffBB̌B̌B̌B̌B̌B  B33BffBffBffBffBffB̍B  B  B  B33B33BffBffBBBBB̎B̎B  B33BffBffBB̏B̏B  B  B  BffBffBffBffBffBffBBB̐B̐B  B  B  B  B  B  B  BB̑B̑B  B  B33BffBffBffBffBB̒B̒B̒B̒B̒B̒B  B  B  BffBB  B  B33B33B33B33B33BffBffBffBB̔B  B  BffBffBffBffB̕B̕B̕B̕B̕B̕B  B33B33BffBffBB  B  B  B  BffBBBBB̗B̗B̗B  B33B33B33B33BffBffBBBB̘BffBBBBBB̙B  B  B33B33B33B33B33B33B33BffBBBB  B33BffBffBffB̛B̛B33B33B33B33B33B33B33B33B33BffBffBB̜B  B33B33BffBBB̝B  B  B  B  B  B33B33B33B33BBB̞B33B33B33B33B33B33BB̟B  B  B  B  B  B33B33BffBffBffBBB  B33B33B33B33B33BffBB̡B  B33B33B33BffBBB̢B  B  B  B  B33B33B33B33B33BffBBḄB  B  B  B  BffB̤B̤B̤B  B33B33B33B33B33BffBffBffBB̥B̥B̥B33B33BBBB̦B  B  B33B33B33BffBffBffBffBffBB̧B̧B̧B̧B  B33BffBffBffB̨B  B  B  B33BffBffBffBBBBBB̩B̩B  B33BffBB̪B33B33B33BffBffBffBBBBBB̫B̫B  B  BB̬B̬B̬B̬B  B  B33B33B33B33B33BffBffBBB̭B  B  B33B33B33B33BffB  B  B  B  B  B  B33B33BffBB̯B̯B  B  B  B  B  B33BffBffBBBBB̰B̰B  B  B  BffBffBffBBBBḆB  B33BffBffBBBBBBB̲B33BffBffBBBBBBB̳B  B33B33B33BffBffBffBBB  B  B  B  B33B33B33BffBB̵B  B  B  B  BffBffBffBBB̶B̶B̶B̶B  B  B  B33B33B33B33BBBB̷B33BffBffBffB̸B̸B̸B  B  B  B  B33B33BffBffBffBffBB  B  B33B33B33BBB̺B̺B  B  B  B  B  B33BffBffBffBBB̻B  B33BffBffBffBffBffBffBB̼B  B  B  B  BffBBB̽B̽B33B33B33BffBffBB̾B̾B̾B  B  B  B33B33BBBB  B33B33B33B33B33B33B33BBBBB  B33B33B33BBBB  B33B33B33B33B33B33B33BffBffBBB  B  B33BffBBBBBB  B  B  B  B  B  B  B33B33B33B33B33BffBBBB33BffBBBBBBBBBBBBBBBB33BffBffBBBB  B  B33BBBBBBBB  B  B  B  BffBBBB  B  B33B33B33BffBffBffBffBBBBB  B  B  B33B33BB  B33B33B33BffBffBffBffBBBBBBBBB  B33BBBBB  B  B  B33BffBffBBBBBBBB  BffBffBBBB  B  B  B  B  B33B33B33B33BffBBB33B33B33B33BffBBB  B  B  B  B33B33B33B33B33BffBffBBBB  B  B33BffBffBBBBB  B33B33B33BffBffBffBffBBBBBB  B33B33B33B33B33BffBBBBBB  B  B33B33BffBB  B  B  B33B33B33B33B33B33B33BffBffBffBB  B33B33B33B33BffBffB  B33B33B33B33B33B33B33B33B33B33B33BBB  B33BffBffBffBffBffBBB  B  B  B  B  BffBBBBB  B33B33BffBffBffBBBBBBB  B33B33B33BffBffBffBBBBB33B33B33B33B33B33B33BBBBBB33B33B33BBBBBB  B  B  B  B33B33BffBB  B  B33B33B33B33B33BffBffBBBBBB  B  B  B33B33BffBBBB  B33BffBBBBBBB  B  B  B33B33B33B33BBB33B33BffBffBffBBBBBBBBBB  B  B  BB  B  B  B  BffBBBBBBBBBBB33B33BffBBBBB  B  B  B  B  B  B33B33BffBffBB  B33B33B33B33BffBffBffBBBBBBBBB33B33B33BffBBBBB33B33B33BBBBBBBBB  B  B  B  B  B  B33BffBB  B  B33BffBffBBBBBBBB  B  B  B  B33BffBffBB  B  B  BffBffBffBffBffBBB  B  B  B  B  B  B33BffBffBBBBBB  B33B33B33BBBBB  B33B33BffBffBffBffBBBBB  B  B  B  B33BffBffBBB  B  B33B33B33B33B33B33BffBffBBBBB  B33BffBB  B  B  B  B  B  B  B  B  B33B33B33B33BffBffBBBB  B33B33B33BBBBBB  B  B  B  B  B33BffBffBffBBBB  B33BBBBBBBBB  B  B  B33B33B33BffBffBBBffBffBffBffBffBBBBBBBBBB  B33B33B33BB  B33BffBffBffBffBffBBBBBBBBB  B  B33BBB  B  B33BffBffBBBBBBBBB C C C33 CL CL Cff C  C  C  C  C  C  C C C C C3 C C  C33C33C33C33CLCLCLCLCLCffC C C C C CC3CCCfCfCC33C33C33C33C33C33CLCLCLC C C CC3CCCC  C33C33C33C33C33C33C33C33CLC C C C C C C CCCCC  CCCCCCCC33CffCffCffCffCffCffCffCffCffCffCffCffCffCffCffCffCffCffCffCffC C C C C C C C C C C CCCCCCC3C3C3CCCCCCCCCCCCCCCCCCCCCCCCCCfCfCfC  CCC33C33C33C33CLCLCLCffCffC CCCCCCCCCCC3C3CfCfCfCfCfCfCfCfCfC  CCC33C33C33C33C33C33C33C33C33C C C C CC3C3C3C3C3C3CfCCCCCCCLCLCLCffCffCffC CCCCCfCfC  C  CC33C33C33CLCLC C C C CC3C3C3CCCCfCfC  	C  	C33	C33	Cff	Cff	C 	C	C3	Cf	Cf	Cf	Cf	Cf	C  
C
C
C
C33
C33
CL
CL
Cff
Cff
Cff
C 
C
C
C  C  C  C  C  CCC33CLCffCCCCCCCCCC3CfCfC33CLCffCffC C C C CC3CfCfCCC33C33C33CLCLCffCCC3C3CCfCCCCC33CLCLC C C C C C3CCCfC  C  CCLCffCffCCC3C3C3C3CfCfCCC33CLCffCffC C CCCC  CCCCC33CLCffC CCC3CCCCfC  C33C33CLCLCLCLCffC3C3CCCfC  C  CCC33C33C CC3C3C3CfC  C  C  C  C33C33CffCffCffCCC3C3C3CfC  CC33C33C33C33CffC CCCCfCfCfCfC  CCCC33CLCLCLCLCCCCCCfC  C  C  CCLCffCffC C C CfCfC  C  CC33CLCLCLCffC C C3CCCC  CCC33C33C33C33C33CLCLCC3CC  C  C  C  C  C  CCLCLC C C CCCCfC  CC33CffCffCffCCCC3C3C3C3CC  CCCCLCffCffCffC C CCfCfCfCCC33C33C33CLCffCffC CCCCfCfC  C  CCC33C33CLC CCCCCfCfCfCfC  C  CLCLCCC3CCCCCC   C C C C C CL Cff Cff C3 C C C Cf C  !C  !C  !C  !C!C33!C33!CL!Cff!C!C3!C3!C!C!C!C!C!Cf!C  "C"C33"CL"C "C"C3"C3"C3"Cf"Cf"C  #C#C#C33#Cff#Cff#Cff#Cff#C#C#C#C#C3#C3#Cf#C  $C33$C33$CL$Cff$Cff$Cff$C $C$C$C3$C%C%C%C%C%C%C33%C33%CL%CL%CL%C3%C%Cf%C  &C  &C  &C  &C&C33&CL&CL&Cff&Cff&C&C&C&C&Cf&Cf&C'C'C'C'C 'C 'C 'C 'C3'C3'C'C'Cf'C  (C  (C(C33(C33(CL(Cff(Cff(Cff(C (C3(C(C(C  )C  )C  )C  )C)C)C33)CL)CL)CL)Cff)C )C)C3)C)Cf)Cf)Cf)C  *C  *C  *C  *C33*CL*CL*Cff*C3*C3*C*C*C*C*Cf*C  +C+C33+CL+CL+CL+Cff+C +C +C +C +C+C3+C  ,C,C,C33,CL,CL,Cff,Cff,C ,C,C3,C,Cf,C  -C-C-C-C33-C33-C33-CL-Cff-Cff-C-Cf-Cf-C  .C.C.C.C.C.C33.C33.C33.CL.Cff.C.C3.C3.Cf.Cf.C  /C/C/C/CL/CL/C /C /C/C/C3/C/C/C/C/C/C0C 0C0C0C0C0C0C30C0C0C0Cf0Cf0C  1C1C331C331Cff1C 1C 1C 1C 1C1Cf1C  2C2C332CL2CL2CL2CL2CL2Cff2C 2C 2C 2C32C32C2C3C3C333C333C333CL3C 3C 3C 3C 3C3C33C33C3C3Cf3Cf3C334CL4CL4C 4C4C4C4C4C4C4C4C  5C5C335C335Cff5Cff5Cff5C5C5C5C35C35C35Cf5C6C336CL6CL6CL6CL6Cff6Cff6Cff6C36C6C  7C  7C  7C  7C7C7C337C337Cff7C7C7C7C7C7C7C7Cf7Cf7C8C338CL8CL8C 8C 8C8C8C8C8C8C  9C  9C  9C9C339CL9CL9CL9Cff9C9C9C9C39C9C9C9Cf9Cf9C:CL:CL:Cff:C :C :C :C :C:C3:C:Cf:C  ;C  ;C  ;C  ;C  ;C33;CL;C ;C ;C;C3;C3;Cf;Cf;Cf;C  <C  <C<C<CL<Cff<Cff<C<C<C<C<C<C<C<C<Cf<Cf<C33=CL=CL=CL=C =C =C3=C3=C3=C3=C=Cf=C>C>C>CL>CL>Cff>Cff>Cff>C >C >C>C>C>Cf>Cf>C?CL?CL?CL?Cff?C ?C ?C?C3?C3?C?C?C  @C  @C  @C  @C@CL@Cff@Cff@C3@C3@C@C@C@C  AC  AC  ACACACAC33ACLACffAC AC ACACACAC  BC  BCBCBC33BC33BCLBCLBCffBC BC3BC3BC3BC3BCBCfBCfBCfBC  CC  CCCCCC33CC33CCLCCCCCCCCCCCCfCCfCC  DC  DC33DCLDCLDCffDCffDCffDCffDCffDC DCDCDC3DCDC  EC  ECEC33EC33ECffEC EC EC ECEC3ECECECECECEC  FC  FC  FC  FCFCLFCffFCffFCFC3FCfFCfFCfFCfFCfFCfFCGCLGC GCGCGCGC3GC3GCGCGCGCGC  HCHC33HCffHCffHCffHCffHCffHCffHC HC HC HC HCfHC33IC33ICLICLICLIC IC IC IC IC3IC3ICICICfICJCJCJC33JC33JCffJCffJCffJC JCJC3JCJCfJC  KC  KCKC33KC33KCLKCLKCLKCLKC KCKC3KCKCfKC  LC  LCLCLCLCLC33LCLLCLCLCLCLCfLCfLCfLC  MCMC33MCLMCLMCffMC MCMCMCMCMC  NC  NC  NC  NC33NCLNCLNCffNC NC NCNCNCNCNCNCfNC  OCOCOCLOCLOC OCOCOCOC3OC3OCOC  PC  PC  PCPCLPCffPCffPCffPC PC PC PCPCPC  QCQC33QC33QCLQCLQCffQCffQCffQC QC3QCQCQCQCQCQC  RCRC33RC33RC RC RCRCRC3RCRCRCRCfRCfRCLSCLSCLSCffSC SC SC SC SC SC SC3SCfSCfSC  TC33TC33TCLTCffTCffTC TC TCTCTCTC3TCTCfTC  UCUC33UCLUCffUCffUCUC3UC3UC3UCUCUCUC  VC  VCVC33VCffVCffVCffVC VCVCVC3VCfVCWC33WC33WCLWCLWCLWCffWC WC WCWCWCWCWCfWCfWC  XCXCXCXCffXC XC XCXCXCXCXCXCXCXCYCYC33YC33YCffYCffYC YC3YC3YCYCYCfYCZCZCLZCLZCffZCffZCffZCffZC ZC ZCZCZCZCfZC  [C[C33[C33[C33[Cff[C [C [C[C3[C3[C[C[C[C  \C  \C\C\C33\C33\CL\C3\C\C\Cf\Cf\C  ]C  ]C]C]C]C]C33]CL]Cff]C ]C]C3]C]Cf]Cf]Cf]C  ^C^C33^C33^C33^C33^CL^C ^C^C3^C3^C3^Cf^Cf^Cf^C_C_C_C33_C33_C _C _C _C_C_C3_C_C_Cf_Cf_C`C33`C33`CL`CL`Cff`C `C3`C3`C3`C3`C3`C`C`CaC33aCLaCLaCffaCffaCffaCffaC aCaCaC3aCaCbC33bC33bCLbCffbCffbCffbC bC bC3bCbCbCbCfbC  cCcC33cCLcCLcC cC cC3cCcCcC  dC  dC  dC  dC33dC33dC33dCLdC dCdCdC3dCfdCfdC33eC33eC33eC33eC33eC33eCffeC eCeCeC3eCeCeCfeCfeCfeCfeCfCLfCLfC fC fCfCfCfCfCffCffC  gC  gC33gC33gC33gC33gCffgC gC3gC3gCgCfgC  hChC33hC33hCLhCLhCffhC hC3hC3hChCfhCfhCfhC  iCiCiC33iC33iC33iCLiCffiC iC3iC3iCiCfiC  jC  jCjCjC33jCLjCffjCffjCjC3jC3jCjC  kC  kC  kCkCkCkC33kCLkCLkC kC kC kC kCkCkC  lC  lC  lC33lC33lCLlC lC lClC3lClClClClCflC  mC  mC  mC33mCffmCffmC mC3mCmCmCmCfmCfmC  nCnCLnCffnC nC nC nCnCnC3nC3nCnCfnCfnC  oC  oC33oCLoCffoCffoC oCoC3oC3oC3oCoCfoCfoC  pCpC33pCLpCffpC pCpC3pC3pC3pC3pCpCfpCfpC  qC33qCffqC qC qCqCqCqCqC3qCqCqCqCrC33rCLrCLrCffrC rCrCrCrCrCrCrCfrCfrC33sC33sC33sCLsCLsCffsCffsCsC3sC3sCsCsCfsC  tCtCLtCLtCfftCfftC tCtCtC3tC3tC3tCftCftC33uCLuCLuCLuCffuCffuCffuCffuCffuCuCuCfuCfuCfuCvC33vCLvCLvCLvC vC vCvCvCvC3vC3vCvCfvC  wCwCwCLwCffwC wC wCwCwC3wC3wCfwCfwCfwC  xCxCxCLxCffxC xC xCxCxCxCxCfxCfxCfxCyCLyCffyC yCyCyC3yC3yC3yCyCyCfyC  zCzCLzCLzCLzC zC zC zCzCzCzCzC3zCzCfzC{C33{C33{CL{Cff{C{C{C{C3{C3{C3{C3{Cf{Cf{C  |C|C33|C33|CL|Cff|C |C |C |C3|Cf|Cf|C  }C}C33}C33}C33}CL}Cff}C}C3}C3}C3}C3}Cf}C~C~C~C33~CL~CL~CL~C ~C ~C~C~C~Cf~Cf~Cf~Cf~Cf~Cf~C  CLCffCCCCCCCCfCfC  CCCCf&Cf&CLCLCLCYCYC3sC3sC͌C͌CCfCfC3C3C3C C̀C3C  CCCCCCf&Cf&Cf&C @CLCffCffC͌C͌C͌CCCCCfC3C3ĆCfC  C  C  C  CCCCCf&Cf&C @C @CLCLCffCffCffCffC3sC C͌CCfCfC3C3ĈĈCقCfCfC3CCCf&Cf&C33C @CLCLCLCLCLCLCffC C͌CCfC C C C C C C C CfC3C3C3CCCCCf&C @CYCYCYCYC3sC3sC3sC3sC C͌CfCfC3C C C CلCلCلCلC  C  CCCCf&Cf&C33C @C @CLCffC3sC3sC͌CCCfCfC3C3C CمCfCfCfC3C3C  C  CCCf&Cf&Cf&C33CLCYC3sC3sC3sC C CCCfCfCfC3C̆C̆C̆CfC  CCCCCC33C33CLCLCLCLCYCffCffC3sC3sC͌CCCCCfC3C ĊĊCfC3C  C  C  CCf&Cf&Cf&Cf&C33C33C33CYCYCffC3sC3sC C C͌CCfC3C3C CوCوCوCوCوC  CCCCf&Cf&C33C33C33C @CLCLCLCLC3sC CCCfC3C3C3C̉C̉CىCىCىCfC3C  C  C  CCC @C @CLCLCYCffC3sC3sC3sC3sC C͌C͌CfCfCfC3C C C̊CfCCCCCCCf&C33C @CYC3sC3sC3sC3sC C C C C C3C C C̋C̋CًCfC  C  C  CCCf&Cf&Cf&Cf&Cf&C33CLCffC3sC CCCfCfCfCfCfC3ČCٌCٌCfC3C3CCCCCf&C33C33C @CLCffC3sC C͌C͌C͌CCCC3C3C̍CٍCٍCfCfC3C3C  C  C  CC @CLCYCYCffC3sC3sC3sC3sC3sC͌C͌CfCfC3C̎CَCَCَCَCَCَC  CCCf&Cf&C @CLCLCLCLCYCYCffCffC3sC C͌CfC3C3C C̏CُCfCfCfC  CCCCCCf&Cf&Cf&Cf&C33CYC3sC3sC3sC C͌CfCfCfCfC3C3C̐C̐C̐C̐C3C  C  CCf&Cf&Cf&C33C33C @CLCYCYC3sCCCCCfC3C C C C̑C̑CfCfC3C  CCCC33C33C33C @C @C @CYC3sC C͌CCCfCfCfC3C3C CfCfCfC3C  C  C  CCCf&Cf&C33CLCYCffCffCffC3sC3sC3sC CCfC3C3C̓CٓCٓCٓCfCfC3CCf&Cf&Cf&Cf&C33CLCLCLCffC3sC͌C͌CCCCfCfCfCfCfC̔CٔC3C  C  CCCCf&Cf&C33C33C33C33C @CLCffC3sC3sC͌CfCfCfCfC3C3C̕CٕCٕCfCfC3C3C  C  C  CCCf&CLCYCffCffCffCffCffC3sC C C͌CCfC C C C C̖CfC3C  C  CCCCf&C33C @C @C @CLCYCffCffC3sC3sC C͌C͌CC3C̗C̗C̗C̗C̗CfCfC  C  CCf&Cf&C33C33C33C @C @CLCYCffCffC͌C3C3C3C C C C̘C٘C٘C٘C٘C٘C٘CfCCf&C33C33C @C @C @CLCLCYCffCffCffCCCfCfCfC C C C̙C̙C̙CٙC3CCCCCCCCf&Cf&CYCYCffC3sC C C CCCCfC3C C CٚCٚCfCfC  C  CCCf&Cf&C @CYCYCYCffCffC3sC CCCfC3C3C3C3C C̛C̛CfC3C3C3CC33C33C33C33C @C @C @C @C @CYCYCffC3sC C͌CC3C3C3C3CٜCٜCfCfC3CCCCCC33C33C33C @C @CYCffCffC C͌C͌C͌CfC3C3C C̝C̝C̝CٝCٝCfC3C  C  C  C  CCC33C33CLCYCYCYCYCffC3sC C͌C͌CfCfCfC C̞C̞C̞CٞC3C  CCCCCCCCf&C33CLCYCffC͌C͌C͌C͌C͌C͌C͌CCfC CٟCٟCfCfC3C3C3C  C  CCCCCf&C @C @C @CYCffCffCffC3sC C͌C3C3C3C C C̠C٠C٠CfCfC  CCf&C33C33C33C @C @C @C @CLCLCLCYCffC C͌CfCfC3C C̡C̡C١C١CfCfC  C  C  CCCC33C @CLCLCffCffC3sC͌C͌C͌C͌C͌CCCfC3C3CfCfC3C3C3C3CCCCC33C33C33C @CLCLC3sC C C C͌C͌C͌CCfCfC٣C٣C3C3C3C3C3C3C  C  C  C  Cf&C33CLCffCffC3sC3sC3sC3sC C C C C͌C͌CfC3C3C̤C٤CfCfCfCfC3CCCf&C33C @C @C @C @C @CLCYCYCffC3sC3sCfCfCfCfCfC3C3C3C٥CfCfC3C3C3CCCC33C @C @CLCYCYCYCYC C C͌C͌CfC3C̦C̦C̦C̦C̦C٦C3C3C3C3CCCf&C33C @C @CLCLCLCLCYCYC3sC͌CCCfC3ÇÇÇÇÇÇC٧C٧C3C3CCCC33C33C33C @C @CLCLCffC C CCCfCfCfC3C C̨CfCfC3C  C  C  CCf&Cf&C33C @C @CLCffCffCffC3sC3sCCCfC3C3C C̩C̩C٩CfCfCfCfC3C3CCf&C33C33C33CLCLCLCYCffC3sC͌CfCfCfCfCfC3C C̪C̪C̪CtypescatternameDyna-Q+x]  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;E ;E ;E ;E ;E ;E ;E ;E  <E <E  <E 0<E @<E P<E `<E p<E <E <E <E <E <E <E <E <E  =E =E  =E 0=E @=E P=E `=E p=E =E =E =E =E =E =E =E =E  >E >E  >E 0>E @>E P>E `>E p>E >E >E >E >E >E >E >E >E  ?E ?E  ?E 0?E @?E P?E `?E p?E ?E ?E ?E ?E ?E ?E ?E ?E  @E @E  @E 0@E @@E P@E `@E p@E @E @E @E @E @E @E @E @E  AE AE  AE 0AE @AE PAE `AE pAE AE AE AE AE AE AE AE AE  BE BE  BE 0BE @BE PBE `BE pBE BE BE BE BE BE BE BE BE  CE CE  CE 0CE @CE PCE `CE pCE CE CE CE CE CE CE CE CE  DE DE  DE 0DE @DE PDE `DE pDE DE DE DE DE DE DE DE DE  EE EE  EE 0EE @EE PEE `EE pEE EE EE EE EE EE EE EE EE  FE FE  FE 0FE @FE PFE `FE pFE FE FE FE FE FE FE FE FE  GE GE  GE 0GE @GE PGE `GE pGE GE GE GE GE GE GE GE GE  HE HE  HE 0HE @HE PHE `HE pHE HE HE HE HE HE HE HE HE  IE IE  IE 0IE @IE PIE `IE pIE IE IE IE IE IE IE IE IE  JE JE  JE 0JE @JE PJE `JE pJE JE JE JE JE JE JE JE JE  KE KE  KE 0KE @KE PKE `KE pKE KE KE KE KE KE KE KE KE  LE LE  LE 0LE @LE PLE `LE pLE LE LE LE LE LE LE LE LE  ME ME  ME 0ME @ME PME `ME pME ME ME ME ME ME ME ME ME  NE NE  NE 0NE @NE PNE `NE pNE NE NE NE NE NE NE NE NE  OE OE  OE 0OE @OE POE `OE pOE OE OE OE OE OE OE OE OE  PE PE  PE 0PE @PE PPE `PE pPE PE PE PE PE PE PE PE PE  QE QE  QE 0QE @QE PQE `QE pQE QE QE QE QE QE QE QE QE  RE RE  RE 0RE @RE PRE `RE pRE RE RE RE RE RE RE RE RE  SE SE  SE 0SE @SE PSE `SE pSE SE SE SE SE SE SE SE SE  TE TE  TE 0TE @TE PTE `TE pTE TE TE TE TE TE TE TE TE  UE UE  UE 0UE @UE PUE `UE pUE UE UE UE UE UE UE UE UE  VE VE  VE 0VE @VE PVE `VE pVE VE VE VE VE VE VE VE VE  WE WE  WE 0WE @WE PWE `WE pWE WE WE WE WE WE WE WE WE  XE XE  XE 0XE @XE PXE `XE pXE XE XE XE XE XE XE XE XE  YE YE  YE 0YE @YE PYE `YE pYE YE YE YE YE YE YE YE YE  ZE ZE  ZE 0ZE @ZE PZE `ZE pZE ZE ZE ZE ZE ZE ZE ZE ZE  [E [E  [E 0[E @[E P[E `[E p[E [E [E [E [E [E [E [E [E  \E \E  \E 0\E @\E P\E `\E p\E \E \E \E \E \E \E \E \E  ]E ]E  ]E 0]E @]E P]E `]E p]E ]E ]E ]E ]E ]E ]E ]E ]E  ^E ^E  ^E 0^E @^E P^E `^E p^E ^E ^E ^E ^E ^E ^E ^E ^E  _E _E  _E 0_E @_E P_E `_E p_E _E _E _E _E _E _E _E _E  `E `E  `E 0`E @`E P`E ``E p`E `E `E `E `E `E `E `E `E  aE aE  aE 0aE @aE PaE `aE paE aE aE aE aE aE aE aE aE  bE bE  bE 0bE @bE PbE `bE pbE bE bE bE bE bE bE bE bE  cE cE  cE 0cE @cE PcE `cE pcE cE cE cE cE cE cE cE cE  dE dE  dE 0dE @dE PdE `dE pdE dE dE dE dE dE dE dE dE  eE eE  eE 0eE @eE PeE `eE peE eE eE eE eE eE eE eE eE  fE fE  fE 0fE @fE PfE `fE pfE fE fE fE fE fE fE fE fE  gE gE  gE 0gE @gE PgE `gE pgE gE gE gE gE gE gE gE gE  hE hE  hE 0hE @hE PhE `hE phE hE hE hE hE hE hE hE hE  iE iE  iE 0iE @iE PiE `iE piE iE iE iE iE iE iE iE iE  jE jE  jE 0jE @jE PjE `jE pjE jE jE jE jE jE jE jE jE  kE kE  kE 0kE @kE PkE `kE pkE kE kE kE kE kE kE kE kE  lE lE  lE 0lE @lE PlE `lE plE lE lE lE lE lE lE lE lE  mE mE  mE 0mE @mE PmE `mE pmE mE mE mE mE mE mE mE mE  nE nE  nE 0nE @nE PnE `nE pnE nE nE nE nE nE nE nE nE  oE oE  oE 0oE @oE PoE `oE poE oE oE oE oE oE oE oE oE  pE pE  pE 0pE @pE PpE `pE ppE pE pE pE pE pE pE pE pE  qE qE  qE 0qE @qE PqE `qE pqE qE qE qE qE qE qE qE qE  rE rE  rE 0rE @rE PrE `rE prE rE rE rE rE rE rE rE rE  sE sE  sE 0sE @sE PsE `sE psE sE sE sE sE sE sE sE sE  tE tE  tE 0tE @tE PtE `tE ptE tE tE tE tE tE tE tE tE  uE uE  uE 0uE @uE PuE `uE puE uE uE uE uE uE uE uE uE  vE vE  vE 0vE @vE PvE `vE pvE vE vE vE vE vE vE vE vE  wE wE  wE 0wE @wE PwE `wE pwE wE wE wE wE wE wE wE wE  xE xE  xE 0xE @xE PxE `xE pxE xE xE xE xE xE xE xE xE  yE yE  yE 0yE @yE PyE `yE pyE yE yE yE yE yE yE yE yE  zE zE  zE 0zE @zE PzE `zE pzE zE zE zE zE zE zE zE zE  {E {E  {E 0{E @{E P{E `{E p{E {E {E {E {E {E {E {E {E  |E |E  |E 0|E @|E P|E `|E p|E |E |E |E |E |E |E |E |E  }E }E  }E 0}E @}E P}E `}E p}E }E }E }E }E }E }E }E }E  ~E ~E  ~E 0~E @~E P~E `~E p~E ~E ~E ~E ~E ~E ~E ~E ~E  E E  E 0E @E PE `E pE E E E E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȀE ЀE ؀E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȁE ЁE ؁E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȂE ЂE ؂E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȃE ЃE ؃E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȄE ЄE ؄E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȅE ЅE ؅E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȆE ІE ؆E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȇE ЇE ؇E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȈE ЈE ؈E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȉE ЉE ؉E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȊE ЊE ؊E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȋE ЋE ؋E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȌE ЌE ،E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȍE ЍE ؍E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȎE ЎE ؎E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȏE ЏE ؏E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȐE АE ؐE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȑE БE ؑE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȒE ВE ؒE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȓE ГE ؓE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȔE ДE ؔE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȕE ЕE ؕE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȖE ЖE ؖE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȗE ЗE ؗE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȘE ИE ؘE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E șE ЙE ؙE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȚE КE ؚE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E țE ЛE ؛E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȜE МE ؜E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȝE НE ؝E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȞE ОE ؞E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȟE ПE ؟E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȠE РE ؠE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȡE СE ءE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȢE ТE آE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȣE УE أE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȤE ФE ؤE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȥE ХE إE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȦE ЦE ئE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȧE ЧE اE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȨE ШE بE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȩE ЩE ةE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȪE ЪE تE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȫE ЫE ثE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȬE ЬE جE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȭE ЭE حE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȮE ЮE خE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȯE ЯE دE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȰE аE ذE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȱE бE رE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȲE вE زE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȳE гE سE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȴE дE شE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȵE еE صE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȶE жE ضE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȷE зE طE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȸE иE ظE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȹE йE عE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȺE кE غE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E53ee53c46-38f7-11f0-16c9-2b093684d981/dc5f2c047336b14alayouttemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  configshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay.                                                                                                                                                                                                                                                                                                                                                                                                                    L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>>>>>>>>>>>>>>>>>>>   ?   ?   ?   ????333?333?333?333?333?333?333?333?333?333?L?L?L?L?fff?  ?̌???????????33?33?33?33?33?33?33?  ????ff?ff?33?33?33?33?   @   @ff@ff@ff@@@@33@   @   @   @   @   @ff&@,@,@333@  @@  @@ffF@L@L@33S@33S@Y@Y@Y@fff@l@33s@y@  @ff@ff@@@@@̌@ff@ff@ff@ff@  @33@33@33@33@ff@̬@̬@  @  @@@̼@̼@̼@  @@@@@  @ff@@@@@33@33@ff@@@@  @  @33@ff@ff@@@   A   A   A33AAffAffA  A  A  A	AA  A  AAA33A33AAA  AA33AAffAffA33#A33#A33#A33#Aff&A  (A)A)A)A)A1A1A333A333A333A4A  8A  8A  8A  8A33;A33;A<Aff>AAAAAffFAffFAffFA  HAIAIA33KA33KALALA33SATAffVA  XAYAYA33[A33[A33[A33[Aff^Aff^AaAdA  hA  hAiAiAiAiA33kAlAlA  pA  pA  pAtAtAffvA  xA33{A33{A33{Aff~Aff~A  A  A  AA33ĀĀĀĀĀAAffA33A33A  AAffA  A  ǍǍǍAffAffA33A33A  AAffA33A̔A̔AffAffAffAffA  A  A̘A̘AAffA  A̜AAA33A33A̠A̠AAAAAffA33A̤AffA33A33ĄĄAAAffAffA33A33A  A̬AffAffAffA33A̰AAffAffA  A̴AAAAffAffAffA33A̸A33A  A̼A̼A̼A̼AAffA33A  AffAffAffAffAffA  A  AAAffAAAAAAAAffAffAAffAffA33AAAAAAA  AffAffAffA33A33A  AAAAAAAAffAffAffA33A33A33A  AAA  A  A  A  AAAffA33A  AAAA  A  A  A  AAffAffAffA  AAAffA33A  A  AAAA33A  AAffAffAffAffA  A  AAffA33A   Bff Bff B B B33B33B  BffB33B33B  B  BffBffBBBB  BffBBB33B  B  BffBffB33	B  
B  
Bff
Bff
B33B33B33BB  BB33BB  BffBB33B33B33BBBBffBBBBffBBB33B33B33BBB33BBB  BffBffBB33BBB  BffBffB33BBBBBB33BB  BffB33BBBBB  B  B33B   Bff B33!B33!B33!B33!B33!B!B!Bff"B#Bff$Bff$Bff$B33%B33%B33%B33%B%B  &B&B33'B'Bff(Bff(B33)B33)B33)B33)B33)B33)Bff*Bff*B+B+B  ,Bff,B33-B33-B33-B33-B-B  .Bff.Bff.B.B33/Bff0B0B0B331B331B331B  2B  2Bff2B2B3B3B3B  4B4B335B  6B  6B  6B6B337B337B337B7Bff8Bff8B8B339B9B:B:B33;B33;B33;B  <B  <Bff<B<B<B33=B  >Bff>B>B33?B  @B  @B  @Bff@B@B@B33ABAB  BBBBCB  DB  DB  DBDBDB33EBEB  FBffFBffFBFB33GB  HBffHBffHBffHBHB  JB  JB  JB  JB  JBJBKBKBKBffLB33MB33MB33MBMB  NB  NBffNBNB33OB  PBffPBPBPBQBQBQBQB  RBffRB33SBSB  TBffTBTBTB33UBUBUBUBffVBVBVBWBWBXB33YB33YBYBYBYBYB  ZB  ZBZB  \Bff\B\B33]B]B]B]B  ^B  ^B  ^Bff^B_B  `Bff`B33aB33aBaB  bB  bB  bBffbBbB33cB  dBffdBffdBdBeBeBeB  fB  fBfffBfBgBffhBffhBhBhB33iB33iB33iB33iB  jB33kB33kB  lBfflBfflBlBlBlBlBmBffnBffnB33oBoB  pBpBpBpBpB33qB  rB  rB  rBrB33sB  tBfftBfftBtB33uBuB  vB  vB  vB  vBvBwB  xB  xBffxB33yByB  zB  zB  zBffzB33{B33{B{Bff|B|B33}B33}B}B  ~Bff~B33B33BB  B33B33B33BffBffB  BffBB́B́B́B33B33BffBffBB  B33B33BffB̃B  B  BffBffBffBB̄B  B33B33B̅B  B33B33BffBB̆B  B33B33B33BḂḂB  B  BffBffBBB  BffBBB̉B  BffBffBffBffBB  B33B33BB̋B̋B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33BffBffBffBffBffBffBffBffBffBBBBBBBBB̌B̌B̌B̌B̌B̌B̌B̌B̌B̌B  B  B  B  B  B  B  B33B33B33B33B33B33B33B33BffBffBffBffBffBffBffBffBffBffBBBBBB̍B  B  B  B  B  B  B  B  B  B  B33B33B33B33B33B33BffBBBBBBBBBBB̎B̎B̎B̎B̎B̎B̎B̎B̎B̎B̎B̎B̎B  B  B  BffBffBffBffBffBffBffBffBffBffBffBffBffBBB̏B  B  B  B  B  B  B  B  B  B33B33B33B33BffBffBffBBBBBBBBBBBB̐B̐B̐B̐B̐B  B33B33B33B33B33B33B33B33B33B33B33B33B33BffBffBffBffB̑B̑B̑B  B  B  B  B  B  B  B  B  B  B  B33B33B33BffBffBffBBB̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B  B  B  B33B33BffBBBBBBB̓B̓B̓B̓B̓B̓B̓B  B  B  B33BffBffBBBBBBBBBBB̔B̔B̔B  B  B  B33B33B33B33B33BffBffBffBffBffBffBffBffBBB̕B̕B̕B  B  B  B33B33B33BffBffBffBffBffBffBffBBBBB̖B  B33B33B33B33B33B33B33BffBffBB̗B̗B̗B̗B  B  B  B  B  B  B  B  BffBffBffBffBB̘B̘B  B  B  B  B  B33B33B33B33B33B33B33B33BffBffBffBBB̙B̙B̙B  B  B33BffBffBffBffBffBffBBBBBBB̚B  B  B33BffBffBffBffBBB̛B̛B̛B̛B̛B̛B̛B̛B̛B  B  BffBffBffBffBffBffBffB̜B̜B̜B̜B  B  B  B  B  B  B  BffBBBBBBBBBB̝B  B33B33B33B33B33B33BffBffB̞B̞B̞B̞B̞B̞B̞B  B33B33B33B33BffBffBffBffBB̟B  B  B  B  B33BffBB̠B̠B̠B̠B̠B̠B  B  B  B33B33B33BffBffB̡B̡B33B33B33B33B33B33B33BffBffBffBBB̢B̢B33BffBBḄḄḄB  B  B  B  B  B  B  B  B  BffB̤B  B  B33B33B33B33B33BffBffBffBBBBB̥B̥B33B33BB  B  B  B  B  B  B33BffBffBffBffBffBffB̧B̧B  B33BffB  B  B  B  B  B33BffBffBffBffBffBBBB̩B  B33BffBffB̪B̪B  B33B33B33B33BffBffBffBB̫B̫B̫B̫B  B  B33BffB̬B  B  B  B33B33B33B33BffBBBB̭B  B  B33BffBffBBBBBB33B33B33B33BffBffBB̯B̯B33BffBffBffBffBffBffBB̰B̰B̰B̰B̰B33B33BffḆḆḆḆḆBffBffBBBBBB̲B  B  B  B33BffBffBB̳B̳B  B33BffBffBffBBB̴B  B  B33B33B33BffBffBffBB  B  B33BffBffBffBBBB̶B33B33B33B33B33B33BBBBBB̷B  B  B33B33BffBB  B  B  B  B  B  B33B33BBBBB̹B  B33B33BffBffBB̺B  B  B  B  B33B33B33B33BffBffBffBffB̻B  B  B33B̼B̼B̼B  B  B  B33B33B33B33B33B33BB̽B̽B̽B̽B̽BffBffBB̾B̾B̾B  B33B33B33BffBffBBB̿B̿B̿B̿B33B33B33B33BBBB  B  B  BffBBBBBB  B  B  B  B33BffBffBBBB  B33B33BffBffBBBB  B  B33B33B33BffBffBBBBB  B  B33BffBffBffBffBBB  B33B33B33BffBBBBB  B  B33B33BffBffBffBffBffBB  B  B  B33BffBBBBBB  B  B33B33BffBffBBBBBB  BffBffBffBffBffBB  B  B  B  BBBBBBB  B  B  B  B  BffBffBffBBBffBffBffBffBBBBBBBB  B33BffBffBffBBB  B  B  B  B33BffBffBBB  B33B33B33BffBffBffBBBBB  B  B  B  B  B33BBBB  B  B  B33B33BffBBBB  B  B  B  BBBB  B  B  B  B  B  B33BffBffBBBBB33BffBffBBBBBBBB33B33BffBBBB  B  B  B  BffBBBBBB  B  B33B33B33BffBBB  B  B  B33BffBBBBBBBBB  B33B33BBBBBffBffBBBBBBBBB  B  B33B33BBB  B33B33B33BBBBBBB  B  B  B  B33BffBBBB  B33B33BffBffBffBBB  B  B  B  B33BffBffBffBBB  B33B33B33BffBffBBBBBB  B  B  BffBffBB  B33B33B33B33BffBffBffBffBBBBB33BffBBBBBB  B33BffBffBffBffBffBffBffBB  B  B33B33BffBffBBB33BffBffBffBffBffBffBBBBBB33B33BffBffBffBBB  B33B33BffBffBffBffBffBffBffBBffBffBffBffBffB  B  B  B  B  B33B33B33B33B33B33BffB  B  B  BffBffBffBffBB  B  B33B33B33B33B33B33B33B33BB33BffBffBffBBBBBB  B  B33B33B33B33BffBB  BffBffBBBBBBBB  B  B  B  B  B33BBB  B  B33BBBBBBBB  B  B  B  B  B33BffBffBBBBffBffBBBBBBBBB  B  B  BffBBBB  B  B  B  B  B33BffBBB  B  B  B33BffBffBBBBBBB  BffBffBffBffBffBB  B  B33B33B33BffBffBBBB33BffBffBffBffBBBBB  B  B  B  B  B  B  BffBB  B33BffBBBBBBBBBBBB33BffBBBffBBBBBBBBBBBBBBBffBffBB   C   C   C33 C33 C33 CL CL Cff Cff Cff Cff Cff C  C C3 C3 Cf C  CC33C33C33C33CLCffCffCffCffCffCffCffCffC3CCfCfC  C  C  C33C33CLCLCLCffCffCffCffC C C CC3C3CCfCfCfCfC  CLCffCffCffCffCffCffCffC CC3CCCCCfC33CLCLCffCffCffCffCffCffCffCC3C3C3C3CC  C  CCLCLCffCffCffCffCffCffC C CC3C3C3CfCfC  C  C33CLCLCLCLCLCffCffCffC C3C3C3C3CCCC  CC33C33CLCLCLCLCLCC3C3C3C3C3CCCfC  CC33C33CLCLCLC C CC3C3C3CCCfCfCfC	C	C	C	CL	CL	CL	Cff	Cff	C	C	C3	C3	C3	C	C	Cf	Cf	Cf	C  
C
C
C
C33
C33
Cff
Cff
C 
C 
C3
C3
C3
C3
C3
Cf
C  CCCCCCffCffCffC C C C C CCC3CfCfC  C  C  CC33C33CLCLCLCffCffC C C CCCCC  C  C  CC33C33CLCLCLC C C C CCCCCCCfC  C  CCC33C33CLCLCffC C CC3C3C3CCCCfC  C  C33C33C33C33CLCLCffCCC3C3C3C3CCfCfC  CCCCC33C33C33C33CLCffCCC3C3CfCfCfC  C  C  CCCCC33CLCLCLCLC C3C3CCCfC  CCCCC33C33CLCLCLCLC C3C3C3C3CCfC  CCC33C33C33CLCLCLCLCffC CC3C3C3CCfC  CC33C33C33C33CLCLCffCffCffCffC C C C3C3C  CC33C33C33C33C33C33C33CffCffCffCffCffC C C CCCfC  CCCCC33C33C33C33C33CLCffC CC3C3C3CCfCCCCC33C33C33C33CLCLCffC CC3C3C3CCfC  C  CC33C33C33C33C33C33C33CLC C3C3CCCfCfCfC  CCCCC33C33C33C C3C3CCCfCfCfCfCfC  C  C  CCC33CLCffC CC3CCCfCfCfCfCfCfCCCC33CLCLC C C3CCfCfCfCfCfCfC  C  C  CC33CLCtypescatternameDyna-Q+x.  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;Ey.                                                                                                                                                                                                                                                        =======================================L>L>L>L>L>L>L>L>L>L>>>>>>>>>>>>>>>>>>>>>   ?   ?   ?   ?   ?   ?   ?   ?   ?   ???????????333?333?333?333?333?333?333?333?L?L?fff?fff?fff?fff?  ?  ?  ?  ?  ?  ?̌?̌?????????ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?33?33?33?33?33?33?33?33?33?33?  ?  ?  ?  ?  ?  ??????33?33?33?33?33?33?33?   @   @ff@@33@@@@@@@@ff&@,@,@,@,@9@9@9@9@9@  @@ffF@L@L@L@L@L@33S@33S@33S@  `@fff@fff@fff@l@l@l@l@l@33s@  @33@33@33@33@ff@@@@@  @ff@ff@ff@ff@@@̜@  @  @ff@@@̬@̬@  @  @  @  @33@̼@  @  @  @  @ff@ff@ff@ff@@  @ff@@@@@@  @  @  @ff@@@  @ff@@@@@@A33A33A33A33AffA  A  A  A  A33AffAffA  A  AAA33AAA  AAAAAffAffAffAffA   A$Aff&Aff&A  (A  (A33+A33+A,A,A,A1A4Aff6A  8A  8A9A9A<A<A<A  @AAAAADA  HAIAIA33KA33KALA  PAQAQA33SA33SAffVA  XAYA33[A33[Aff^AaAaA33cA33cAdAdA  hAiAiAlAffnA  pA33sA33sAtAtAffvAffvA  xA|Aff~Aff~A  A  AAffA33A33A33ĀAffA33A  A  ÄÄAffAffAffǍAAA33A  A̐A̐AAAffA  A̔A̔AAffA  A̘AAAA33A̜A̜AAAffAffA  AAA33A  A  AAAffAffA33A33A  AffA33A  A̬A̬AffAffA33A33A33A̰AffA33A  A  A̴AA33A33A33A̸AAA33A  A̼A̼AAAffAAAAffAffA  AAAAA33AAAAffA33A33AAAA33A  A  AAAffAffA33A  AA33A  A  AAAffAffA33A33A33AAffA  AAAAA33A33A33AAAA33A  AAAffAffA33AAAAffAffA  AAAAA  AAAffAffA33A33AAAA33A  A  AAffA33A33A   B   Bff BB  B  BffBffB33B33BB  B  BBB  BffBffBBBBBBffBB33	B  
Bff
B
B
B33B33BBffBBB33B33B  BB33B33B33B  BBB33B33BBBffBBB  BffBffB33B33BBB  B  BffBB  B  BffBBBB  B  B  BBB  BffBffBBBB  B  BB33B33B   Bff B B B33!B33!B!Bff"B"B33#B#B#Bff$B$B33%B33%B33%B  &B&B&B33'B33'B'B  (B(B33)B33)B  *Bff*Bff*B33+B33+B+B+B  ,B  ,Bff,B  .Bff.Bff.B.B.B/B/B  0B  0B  0B0B1B  2Bff2B2B333B333B  4B  4B  4B4B335B335B  6Bff6B6B6B337B7B  8B8B339B339B9B9Bff:B:B33;B33;B33;B  <B<B33=B=B=B  >B  >B>B33?B33?B  @Bff@Bff@B33AB33ABAB  BBffBBffBBBB  DBffDBffDBDBDBEBEB  FB  FB  FB33GB  HBffHBHBHB33IB33IB  JB  JB  JBJB33KB33KB  LBLB33MB33MBMBMB  NBNB33OB33OBOBOBffPBPB33QBQBQBffRB33SB33SBSBSB  TB  TBTB33UB33UB  VBffVBVBWBWB  XB  XBffXBffXBXB  ZBffZBffZBZBZB[B  \Bff\Bff\Bff\B33]B  ^Bff^B^B^B33_B33_B  `B  `B  `B33aBaBaBffbBbB33cB33cBcBcB  dBdB33eB33eBeB  fBfB33gBgBgBgBffhB33iB33iBiBiB  jB  jBjBkBkBfflBlBlBmBmB  nB  nBffnBffnBnB  pBffpBpB33qB33qB  rB  rBffrBffrBffrB33sB  tBfftBtBtB33uBuBffvBffvBffvB33wBwBwBffxBxB33yB33yByByB  zB33{B{B{B  |B  |B|B33}B}B}B}Bff~B33B33BB  B33B33BB̀B̀B33BffBffB́B́B  B  B33BffBB33BffBffBBB  B  B33B33B33BB  BffBBB̅B̅B33B33B33BB̆B̆B33BffBḂB  B  B33BB̈B̈B  B  BffBB̉B̉B̉BffB̊B̊B  B  B33B33BB̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B̋B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B33BffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBBBBBBBBBBBBBBB̌B̌B̌B̌B  B  B  B  B  B  B  B  B  B  B  B  B  B  B33B33B33B33BffBffBffBffBffBffBffBffBffBffBffBffBffBffBBBBB̍B̍B̍B̍B̍B̍B  B  B  B  B  B  B  B  B33B33B33B33BffBffBffBffBffBffBffBffBffBffBffBffBffBffBBBBB̎B̎B̎B̎B̎B̎B̎B̎B̎B̎B̎B̎B̎B̎B  B  B  B33BffBffBffBffBffBffBffBffBffBffBffBffBffBffBBBB̏B  B  B  B  B  B  B  B  B  B  B  B  B  B  B33B33B33BffBBBBBBBBBBBBBBB̐B̐B̐B  BffBffBffBffBffBffBffBffBffBffBffBffBffBffBBBB̑B  B  B  B  B  B  B  B  B  B  B  B  B  B  B33B33B33BffB̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B̒B33B33B33BffBBBBBBBBBBBB̓B̓B̓B33B33B33BffBBBBBBBBBB̔B̔B̔B̔B̔B33B33B33BffBBBBBBBB̕B̕B̕B̕B̕B̕B̕B33B33B33BffBBBBBB̖B̖B̖B̖B̖B̖B̖B̖B̖B33B33B33BffBBBB̗B̗B̗B̗B̗B̗B̗B̗B̗B̗B̗B33B33B33BffBB̘B̘B̘B̘B̘B̘B̘B̘B̘B̘B̘B̘B̘B33B33B33BB̙B̙B̙B̙B̙B̙B̙B̙B̙B̙B̙B̙B̙B̙B33BffBffBB̚B̚B̚B̚B̚B̚B̚B̚B̚B̚B̚B̚B̚B  BffBffBffBB̛B̛B̛B̛B̛B̛B̛B̛B̛B̛B̛B  B  B  BffBffBffBB̜B̜B̜B̜B̜B̜B̜B̜B̜B  B  B  B  B  BffBffBffBB̝B̝B̝B̝B̝B̝B̝B  B  B  B  B  B  B  BffBffBffBB̞B̞B̞B̞B̞B33B33B33BffBffBffBffBffBffB̟B̟B̟B  B33B33B33BffBffBffBffBffBffBffBffBffBffBffB̠B̠B̠B  B33BffBffBffBffBffBffBffBffBffBffBBBB  B  B  BffBBBBBB̢B̢B̢B̢B  B  B  B  B  BffBBḄB  B  B  B33B33B33B33BffBffBffBffBffBffBB  B  B  B33BffBBBBB̥B̥B̥B̥B̥B̥B  B  B  BffBffBffB̦B  B  B  B33B33B33B33B33B33BffBBBBB  B33B33BffBB̨B̨B  B  B  B  B33B33B33B33B33B33BffB̩B̩B̩B33BffBffBffBffBffBBBBBBB̪B̪B̪B33BffBffBB̫B̫B̫B  B  B  B  B  B  B33B33B33B33BB  B  B  B33BffBBBBBBB  B  B  B  B33B33B33BBBB  B33BffBffBffBffB̯B̯B̯B̯B  B  B  B  B  BffBBB  B33B33B33BBBBḆḆḆḆḆḆB  BffBBB̲B  BffBffBffBffBBBBBBB̳B̳B  BffBffBffB  B33B33B33BffBffBffBffBffBffBBB̵B̵B̵B33BBB̶B  B33B33B33B33B33B33BffBffBBBBB  BffBffBffB̸B  B  B  B  B  B33B33BffBffBffBffB̹B̹B̹B33BffBffBB̺B̺B̺B  B  B33B33B33B33BBBBB̻B33B33B33BffBB̼B̼B  B  B  B  BffBffBffBffBBBB  B  B  BffBB̾B̾B̾B̾B33B33B33B33BffBffBffBffBffB̿B  B  BffBBBB  B  B  B  B33B33B33B33B33B33BffBB  B  B33BffBBBBB  B  B  B  B  B  B33B33BffBBBBffBBBBBBBBBB  B  B33B33B33BB  B  B33BffBBBBBBBBB  B  B  B  BffBBBB33BffBffBffBffBffBBBBBBB33B33B33BBBB  B33B33BffBBBBBBB33B33B33B33BffBBBB  B33BffBffBBBBB  B  B  B  B33B33B33BBBB  B33BffBffBffBffBBBBB  B  B  B  B  BffBBB  B33B33B33BBBBBBBBBBB  BffBBBB  BffBffBffBffBBBBBBBBB  BffBffBffB  B33B33B33BffBffBffBffBffBBBB  B  B  BffBBB  B33BffBffBffBffBffBffBBB  B  B  B  BffBBBB33BffBffBffBffBffBBBB  B  B  BffBffBffBB  B  B33BffBffBffBBBBBB  BffBffBffBffBB  B  B  B33BffBBBBBBB33BffBffBffBBBB  B  B  BffBBBBBB33B33B33BffBBBBBB  B33B33BBBBB33B33B33B33BffBBBBBBB33BffBffBBB33B33B33B33BffBffBffBBBBBB  BffBffBffB  B33B33B33BffBffBffBffBffBBBB  B  B  BffBBB  B33BffBffBffBffBffBffBBB  B  B  B  BffBBBB33BffBffBffBffBffBBBB  B  B  BffBffBffBB  B  B33BffBffBffBBBBBB  BffBffBffBffBB  B  B  B33BffBBBBBBB33BffBffBffBBBB  B  B  BffBBBBBB33B33B33BffBBBBBB  B33B33BBBBB33B33B33B33BffBBBBBBB33BffBffBBB33B33B33B33BffBffBffBBBBBB  BffBffBffB  B33B33B33BffBffBffBffBffBBBB  B  B  BffBBB  B33BffBffBffBffBffBffBBB  B  B  B  BffBBBB33BffBffBffBffBffBBBB  B  B  BffBffBffBB  B  B33BffBffBffBBBBBB  BffBffBffBffBB  B  B  B33BffBBBBBBB33BffBffBffBBBB   C   C   C33 CL Cff Cff Cff Cff C C C C3 C C C C C C  CCCLCffCffCffCCCCC3CCCCCCfCC33C33CLCffCCCCC3C3C3CCCCfCfC  C33C33C33C CCCC3C3C3C3C3CCfCfC  C  C  C33CffCffC CC3C3C3C3C3C3CCfC  C  C  C  C33CffCffCffCC3C3C3C3C3CCCfC  C  C  C33C33C33CffC C CC3C3C3CCCfCfCfC  C33C33C33C33CLC C C CC3CCCfCfCfCfCC33C33C33CLCLCLC C C C3CCfCfCfCfC	C	C	C33	CL	CL	CL	CL	CL	C 	C	C	C	Cf	Cf	Cf	C
C
C
C
C33
CL
CL
CL
CL
CL
Cff
C
C3
C3
C
Cf
CCCCC33C33C33CLCLCLCffCffC C3C3C3C  CCCC33C33C33C33C33CLCffCffC C C C3CfCfC  CC33C33C33C33C33C33CLCffC C C C C3CfCfCfCC33C33C33C33C33CLCLCffC C C C3C3C3CfC  C  CC33C33C33CLCLCffCffCffC C3C3C3C3CC  C  C  CC33CLCLCffCffCffCffCC3C3C3CCCC  C  C  C33CLCffCffCffCffCCCC3CCCCCC  CCCLCffCffCffCCCCC3CCCCCCfCC33C33CLCffCCCCC3C3C3CCCCfCfC  C33C33C33C CCCC3C3C3C3C3CCfCfC  C  C  C33CffCffC CC3C3C3CtypescatternameDyna-Q+′x.  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;E53ee53c46-38f7-11f0-16c9-2b093684d981/8abe7fb8cc2fd548layouttemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  configshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay]                                                                                                                                                                                                                                                                                                                                                                                                                                                            ====================================================================================================L>L>L>L>L>L>L>L>L>>>>>>>>>>>>>>>>>>>>>>   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?????????333?333?333?333?333?333?333?333?333?333?333?333?L?L?L?L?L?L?L?L?L?L?L?L?L?fff?fff?  ?  ?  ?  ?  ?̌????ff?ff?ff?ff?ff?ff?ff?33?33?33?33?33?33?33?33?33?  ?  ?  ?  ?  ???????????????????ff?ff?ff?ff?   @   @ff@@@@@@@@@@@33@@@@@@   @   @ff&@ff&@ff&@ff&@,@,@,@,@,@,@,@333@9@9@  @@  @@ffF@ffF@ffF@ffF@L@33S@33S@33S@33S@33S@33S@33S@33S@  `@fff@fff@33s@y@y@y@y@y@  @  @ff@ff@ff@ff@@̌@  @33@ff@ff@ff@ff@@@̜@̜@33@33@ff@ff@@̬@  @  @33@ff@ff@ff@ff@ff@ff@ff@̼@  @  @  @@@  @  @33@33@33@ff@ff@ff@ff@ff@@@@@33@ff@@@33@33@33@33@33@ff@ff@ff@@@@@   AAAA  A  A	A	A	A	A	A33AAffAffAffA  AAAAAAffAffAAAAA33AffAffAffA   A!A!A!A$A$A$A$Aff&Aff&A  (A  (A)A,A,Aff.A  0A  0A  0A1A4A4A4A4A4A4Aff6Aff6A9A33;A33;A33;A33;Aff>A  @AAA33CA33CADADADADADADAffFA  HA33KA33KA33KA33KA33KAffNAQA33SATATATATATATAffVA  XA  XA  XA33[A33[A33[A\A  `AaA33cA33cA33cAdAdAdAfffA  hA  hA  hA  hA  hA33kAlAffnA  pAqA33sA33sA33sA33sA33sAtA  xA  xA  xA  xA  xA  xAyAff~A  ÀÀÀAAAAffA33A33A33A33A  A  ĀAAffA  A  ÄÄÄÄAA33A33A33A33A33A33A  ǍAffA33A33A  A  A̐A̐AAffAffA33A33A33A33A  A̔AAffAffAffA33A  A  AAffAffAffAffA33A33A  A̜AAffAffAffAffAffAffA  A̠AAffAffAffAffA33A  AAAAffAffAffAffA33A33A  ĄAAffAffAffA  A̬A̬AAffAffAffAffA33A33A33A  A̰A̰AAA33A̴A̴A̴AAffAffAffA33A33A33A  A  A  A̸A̸A33A  A  A  A̼A̼A̼AffAffA33A33A  A  A  A  A  AffA33A33A33AAAAAAffAffA  A  A  A  A  AAffA33A33A  A  AAAAAA33A33A33A33A  AAAAA33A  A  A  AAAAffAffA33A33A33A  AAAAAffA33A  A  A  AAffAffAffAffA33A  AAAAAAAAffA  A  AAffAffAffAffA33AAAAAAAAffAffAffAAAAffAffA33A  A  AAAAAAffAffAffA  A  AAAAffA33A33A  AAAAAffAffAffA  A  A  A  AAAAAffA   Bff Bff B B33B33B33B  B  B  B  B  B  BffBffB33BBB  B  BffB33B33BBB  B  B  B  B  B  B33BBBBBffBffBffB33	B33	B  
B  
B  
B  
B  
B  
B
B33B33B33BB  B  BffBBB33B33BBBBB  BB33B33BB  B  B  BffBBBB33B33BBB  B  B  BffBB33BBBffBffBffBB33B33B33B33B  B  B  B  BffB33B33B33B33BBffBffBB33B33B33BBB  B  BffB33B33B33B33BB  B  BffBffBB33BBBBB  B33B33B33B33BB   B   Bff Bff Bff Bff B B B33!B!B!Bff"Bff"B"B33#B33#B#B  $Bff$Bff$Bff$Bff$B$B$B$B$B$B%B%Bff&Bff&Bff&B33'B  (Bff(Bff(Bff(Bff(B(B(B(B(B(B33)B)B  *B  *Bff*B*B33+B+B+B  ,Bff,B,B,B,B,B,B33-B-B  .B  .B  .Bff.B33/B33/B33/B  0B  0Bff0Bff0Bff0B0B0B331B1B1B1B  2Bff2B2B2B333B3B3Bff4Bff4Bff4Bff4Bff4Bff4B335B335B335B5B  6B6B6B6B337B7B  8B  8B  8B  8Bff8Bff8B339B339B339B339B9B  :B  :Bff:B33;B33;B;B  <B  <B  <B  <B  <B33=B33=B33=B33=B=B  >B  >Bff>B>B>B33?B33?B?B  @B  @B  @B@B@B33AB33ABAB  BB  BBffBBffBBffBB33CB33CB33CB33CB33CBCB  DBDBDBDB33EBEB  FBffFBffFBffFBFBFB33GB33GB33GB33GBGBffHBffHBffHBHB33IB33IB  JBffJBffJBJBJB33KB33KB33KB33KBKB  LB  LBffLBLB33MB33MBMBMBMB  NBffNB33OB33OB33OB33OBOBOBOB  PB  PBffPBPBQBQBQB  RB  RBffRBffRBRB33SB33SB33SBSB  TB  TBffTBTB33UB33UBUB  VB  VBffVBffVBffVBffVBVBVBVBWB  XBffXBffXBXB33YB33YBYB  ZBffZBffZBffZBffZBffZBffZBZBZB33[B[B[B\B33]B33]B]B]B]B  ^B  ^Bff^Bff^Bff^Bff^Bff^B33_B_B_B_B  `B`B`BaBaB  bB  bB  bB  bBffbBffbBffbBbB33cBcBcBcBffdBffdB33eB33eBeBeB  fB  fB  fB  fBfffBfB33gB33gB33gBgB  hB  hB33iB33iBiBiBiBiBiBiB  jBffjB33kB33kB33kB33kBkB  lB33mB33mB33mB33mB33mB33mBmBmBmB  nB  nB  nB33oB33oBoBoBpB33qB33qB33qB33qB33qBqBqBqB  rB  rB  rBffrBffrB33sB33sBfftBfftBtB33uB33uB33uBuBuBuBuBuBuBffvBffvBvBvBwBwBffxBffxBffxB33yByByByByByByBffzBffzBffzBffzB{B{B  |B  |Bff|Bff|Bff|B|B33}B}B}B}B  ~B  ~Bff~Bff~BBB  B  B  B  B33B33BffBBBB̀B  B33B33B́B́B  B  B  B  B  B  BffBffBffBB̂B̂B  B  BB̃B  B  B  B  B  B  B33B33BffBffBB̄B  B  BBB̅B̅B̅B̅B̅B̅B  B  B  B  B33B33BB̆BffBffBBBBḂḂB  B  B  B  B33B33BffBffB33BffBBBBBBBB̉B  B  B33B33BffBffB  B  BffBBBBBBB̋B̋B̋B̋B̋BffBffB  B  B33B33B33BBBBB̍B̍B̍B̍B̍B  B  B̎B̎B  B  B33B33B33BffBffBB̏B̏B̏B̏B  B  B̐B̐B̐B̐B  B  B33B33B33BffBB̑B̑B̑B  B  B̒B̒B̒B̒B  B  B  B  B  B  B33BffBBB̓B  B̔B̔B̔B̔B  B  B  B  B  B  B  B  B33BffB̕B̕BB̖B̖B̖B  B  B  B  B  B  B  B  B33B33BffBB  B33BffBB  B  B  B  B  B  B  B  B33B33BffBffB̙B33BffBffBB̚B̚B̚B̚B̚B̚B̚B33B33BffBffB̛B  B33BffBBBB̜B̜B̜B̜B̜B  B  B33B33BB̝B33B33BffBBBBB̞B̞B̞B  B  B33B33BffBB  B  BffBffBffBffBffBBBB̠B̠B  B  BffBB  B  B33B33B33B33BffBffBffBB̢B̢B  B  B33BffB  B  B33B33B33B33B33B33B33B33BB̤B  B  B33BffB̥B̥B  B33B33B33B33B33B33B33BffBffBBB  B33BBB  B  B  B33B33B33B33B33B33B33BBB̨B  BffBffB̩B̩B  B  B  B33B33B33B33B33BBB̪B  B33B33BffBffBBB̫B̫B̫B̫B̫B̫B33BffBB̬B  B  B33B33BffBffBffBffBBBBB  B  B33BffBB̮B  B  B  B  B33B33B33B33B33BffB  B  B33BffBBB̰B  B  B  B33B33B33B33B33B33BḆB  B33BBB̲B̲B̲B  B33B33B33B33B33B33BBB̳B33B33BffBBB̴B̴B̴B33B33B33B33B33BBB̵B̵B̵B33BBBBBB̶B  B33B33B33BBBBB̷B̷B33BffBBBB̸B̸B̸B̸B̸B33B33BBB̹B̹B  B  BffBBB̺B̺B̺B̺B̺B  B  B33B33B33BffB̻B̻B33BffBffBBB̼B̼B̼B  B  B33B33B33B33BB̽B  B  B33BffBffBBB̾B  B  B  B33B33B33BBB̿B  B33B33BffBffBffBffBBB  B33B33B33BBBBB  B33BffBffBffBffBBBB  B  B  BffBBBB  B  B33B33B33BffBBBBBB  BffBffBBBBB  B33B33B33BffBBBBBB33B33BBBBB  B  B  B  B33BffBffBBBB  B  B33B33BffBB  B  B  B  B33B33B33BffBffBBB  B33B33BffBBBB  B  B33B33B33BffBffBffBffBB  B33BffBBBBBB33B33B33BffBffBffBffBBBB33BffBBBBB  B  B33BffBffBffBffBBBBB33BffBffBBBB  B  B33B33BffBffBBBBB  B33B33BffBffBffBBBBB  B  BffBffBffBBB  B33BffBffBffBBBBBBB  B  B33B33BffBBBB33B33BffBffBffBBBBBBBB  B33BffBBBB  B33B33BffBffBffBffBffBBBB33B33BffBffBffBBB  BffBffBffBffBffBBBBBB33B33BffBBBB  B  B  BffBffBBBBBB  B  BffBBBB  B  B  B  B  BffBffBBBB  B  B  B33BffBB  B  B  B  B  B33B33BBBBBB  B  B  BffBBBB  B  B33B33BffBffBffBffBBBBB33BffBBB  B  B33B33B33BffBffBffBffBBBBB  BffBffBBB  B  B  BffBffBffBffBBBBB  BffBffBBBBB  B33B33BffBffBffBBBBB33B33BBBBBB  B  B  B33B33BffBffBBB33B33BffBffBffBffBB  B  B  B  B  B33B33BffBB  B  B33BffBffBffBBB  B  B  B  B  B  B  B33BBB33BffBffBffBffBBBB  B  B  B  B  B33BffBBB  B33B33B33BBBBBB  B  B  B33BffBffBffB  B  B  B  B33B33BffBBBBBB33BffBffBffB  B  B  B  B33B33B33BffBBBBBB  B33BffB  B  B  B  B33B33B33B33B33BffBBBB  B  B  BffBffBB  B33B33B33B33B33BffBffBffBB  B  B  B  B33BBB  B  B  B33B33BffBffBffBBB  B  B  B33BffBBBB  B  B  B33B33BffBffBBBB  B33BffBBBBBB   C C C C CL CL CL CL C  C3 C C C C C Cf C  CCCCLCLCLCLCLCffC CC3C3C3CCCfCfCfC  C  C  C  C  CC33C33C33C33C33CLCLCffCffCffCffCCC3C3CCfCfCfCfCfC  C  CCCC33CLCLC C C3CCCfCfCfC  C  CCCCC33CLC C CC3C3C3CCfC  C  C  C  CCC33C33CffC C CCCCCC3CCfCfC  C  CCCLCLCLC C C C C C CCCC3CC  C  CC33C33CLCLCLCffCffCffC C C CCCCCfCfC  C33C33C33C33C33CLCffCffCffC C CC3CCfCfC	C	C	C33	C33	C33	CL	Cff	Cff	C 	C 	C	C3	C	C	C	C
C
C
C
C
C
C33
CL
CL
Cff
C 
C
C3
C
C
C
Cf
Cf
C  C  C  CCC33C33C33CLCC3CCCCfCfCfC  C  C  C  C33C33C33CLCffC C3C3C3CfCfCfCfCfC  C  CCC33CLCffC CCC3C3CCCCfCfCfCCCC33CffC CCCCCCCCCCCCfCfC  C  CCLCffCffCffC C C3C3C3C3C3CCCCCfC  CCLCLCffCffC C CCCCC3C3C3CCCCCCLCLC C C C CCC3C3C3CCC  C  CC33C33CffCffCffCffC C CC3C3C3C3CfCfC  CCC33C33C33C33CLCLCffC CC3C3CfCfC  CCC33C33C33C33C33C33CLC C C CCCCfC  CC33C33C33C33C33C33CLCffCffC C CCC3CfC  CCCC33C33C33CLCLCLCffCffCCC3C3CC  C  CCCCC33CLCLCffCffC C CCC3C3CfC  C  CCC33C33C33C33C33CffCffC C CCC3CCfCfCfCCCCCC33C33CLCLCffCffC CC3C3CC  C  CCCC33C33CLCLCffCffCffCffCffCffCffCffCffCffCffCffCffCffCffCffCffC C C C C C C C C C CCCCCCCCCC3C3C3CCCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfCfC  C  CCCCCCCCCC33CLCLC C C C C C C C CCC3C3C3C3C3C3C3C3C3CCfCfC  C  C  CCCLCffCffCffCffCffCffC C C C CCCCCCC3C3C3CCfC  C  C  C  C  CCCCC33CLCffC C C C C C C CCCC3C3C3CC  C  CLCffCffCffCffCffCffCffC C C C CCCCfCfCfCfCfCfC  C  CCLCffCffCffC CC3C3CCCCCCCfCfC   C33 C33 C33 C33 CL Cff Cff C  C  C  C C C C C C Cf Cf Cf C  !C!C!C!C33!C33!C33!C33!Cff!C !C !C !C !C!C!C3!Cf!Cf!Cf!Cf!Cf!C  "C  "C  "C"C33"CL"CL"C "C "C "C"C3"C3"C3"C3"C3"C3"C"C"C  #C#C33#C33#C33#CL#CL#Cff#C #C #C #C #C#C#C3#C#C  $C  $C$C33$C33$CL$CL$Cff$C$C$C$C$C3$C3$C$C  %C33%C33%C33%C33%Cff%Cff%C %C%C3%C%C%C%C%C%Cf%C  &CL&CL&Cff&C &C&C&C&C3&C&C&C&C&C  'C'C33'CL'C 'C 'C 'C 'C'C'C3'Cf'C(C(C(C(C(C(C33(CL(C(C3(C3(C3(Cf(Cf(Cf(C  )C)C)C33)CL)CL)CL)Cff)Cff)C3)C)C)C)C  *C*C*C33*C33*C33*CL*CL*Cff*Cff*C*C3*Cf*C  +C  +C  +C+C+C+C+Cff+C +C3+C3+C3+C3+C3+C3+Cf+C  ,C,C33,Cff,Cff,C ,C ,C,C,C3,C3,C,Cf,Cf,Cf,C33-CL-Cff-Cff-C -C -C-C3-C-C-Cf-Cf-C  .C  .C.C.Cff.C.C.C.C3.C3.C3.C3.C.C.C/C33/CL/CL/CL/CL/C /C/C/C/Cf/C  0C0C0C0C0C330C330CL0CL0Cff0C 0C0Cf0C  1C  1C1C1C1C1C331CL1Cff1Cff1C 1C 1C31C31Cf1C  2C2C332CL2CL2CL2CL2Cff2Cff2C2C2C32C2Cf2Cf2C3C333C333C333Cff3Cff3C3C33C33C33C3C3C3C3Cf3Cf3CL4C 4C4C4C34C34C34C34C34C34Cf4C  5C5C5C335C335C 5C5C5C5C5Cf5Cf5Cf5C  6C  6C336C336C336C336CL6Cff6C36C6C6C6C  7C  7C7C7C337CL7Cff7Cff7Cff7Cff7Cff7Cff7C7Cf7C8C338CL8CL8CL8CL8CL8CL8Cff8Cff8C8C38C8C8Cf8C  9C9C339CL9CL9Cff9C 9C9C9C9C9C9C9C9C9C  :C33:CL:Cff:C:C:C3:C3:C3:C3:Cf:C  ;C  ;C  ;C  ;C  ;C33;CL;Cff;C ;C3;Cf;Cf;Cf;Cf;Cf;C<C<C<C<C<CL<Cff<C<C3<C<C  =C  =C  =C  =C  =C33=CL=CL=Cff=Cff=C =C =C =C3=C=Cf=C>C33>C33>C33>Cff>Cff>C >C >C >C>C>C3>C3>C3>C  ?C?CL?Cff?Cff?C ?C ?C?C3?C3?C?C?C?C?C?C  @C33@Cff@C@C@C3@C3@C3@C3@C@Cf@Cf@CACACAC33AC33ACLAC AC3ACACACfACfAC  BC33BC33BC33BC33BC33BCLBCLBCffBC BC3BC  CCCCCCCCCC33CCLCCffCCffCCffCC CC CC CCCC3CC  DC33DCLDCLDCLDCffDCffDC DC DC DC3DC3DCDCDCDCfDCECffECffECffEC EC EC3ECECECECECfECfECfEC  FCFCffFCFC3FC3FC3FCFCFCfFC  GC  GCGCGCGCGC33GCffGCGCGCfGCfGC  HC  HC  HCHCHC33HCLHCLHCffHCffHC HCHCHCfHC  ICICICICLICffIC IC IC IC IC ICICIC3ICICJCLJCLJCffJCffJCffJC JC JCJC3JC3JCJCJCJCfJC  KCLKCffKC KCKCKC3KCKCKCKCKCKCfKC  LCLC33LCLLCLC3LC3LC3LC3LC3LCfLCMCMC33MC33MC33MC33MC33MCLMCLMC3MCfMCfMCNCNCNCNCNC33NC33NCLNCffNCffNC NCNC3NCfNCOCOCOCOC33OCLOCffOC OC OC OCOCOCOC3OCOCPCffPCffPCffPCffPCffPCffPC PC PCPCPC  QC  QC  QC  QC  QC33QCffQCffQCQC3QCQCQCQCQCQCfQC  RC  RCRCRCLRCRC3RC3RCRCRCRCRCfRCfRC  SC33SCLSCLSCLSCLSCffSCSCSCSC  TCTC33TC33TC33TC33TC33TCLTC TC TCTC3TC3TC  UCUCUC33UC33UCLUCLUC UCUCUC3UCUCUCUCUCfUCVCLVCffVCVC3VC3VC3VC3VC3VCVCVC  WCWCWC33WCLWC WCWCWCWCWCfWC  XC  XCXCXCXC33XC33XCffXCffXC XC3XCXC  YCYCYCYCYCLYCLYCffYC YC YCYCYCYC3YCYC  ZCZCffZC ZC ZCZCZCZCZCZC3ZC3ZCZCfZC[CL[Cff[C [C[C[C3[C3[C[C[C[C  \C\C\C\C\CL\CL\C \C3\C\C  ]C  ]C  ]C]C]C33]C33]CL]CL]CL]C ]C ]C ]C ]C]C33^C33^CL^CL^CL^C ^C ^C ^C ^C ^C^C^C^C^C^CL_C _C _C _C _C _C _C3_C3_C_C  `C  `C  `C  `C  `C  `C33`C`C3`C3`C`C  aC  aC  aC  aC  aC  aC33aC33aC33aCLaCffaCaCfaC  bC  bC  bC33bC33bC33bCLbCffbCffbCffbCffbC bC bC3bCbC  cCLcCffcCffcCffcCffcCffcCffcC3cC3cC3cCcCfcCfcCfcCfcCdCffdCdCdC3dCdCfdCfdCfdCfdCfdCfdCeCeCeC33eCeCfeCfeCfeCfeCfeCfCfCfC33fCLfCLfCfffCfffCfffCfffCfCgCgC33gCLgCLgCLgCLgCffgCffgCgCgCgCgC3gCgC  hCLhCLhCLhC hC hChChC3hChChChChChCfhCfhCLiCffiCiCiCiCiCiCiCfiCfiC  jC  jC33jCLjCLjCLjC jCjCjCfjC  kC  kCkC33kCLkCLkCLkCLkCffkCffkC kC kCkC  lC  lClCLlCLlCfflCfflC lC lClC3lC3lC3lC3lC3lC  mCmC33mCLmC mC3mC3mC3mC3mC3mCmCmCfmCfmC  nCnCLnCffnCffnCnC3nC3nCfnCfnC  oCoCoCoCoC33oC33oC33oC oCoC3oC  pC  pC  pCpCpCpC33pCLpCLpCLpC pCpCpCpCpCpCfpC  qC33qCLqC qCqCqCqCqCqCqCqC3qCfqCrCLrCffrC rC rCrCrCrC3rC3rCrC  sCsCsCsCLsCLsCLsC sCsC3sC  tC  tC  tCtCtCtCtC33tC33tC33tCtC3tC3tCtCtCftCuC33uC33uC33uCffuC uC uC uC uC uC3uCfuCfuCfuCvCLvC vC vC vC vC vCvCvC3vCvCfvCwC33wC33wC33wC33wCffwCffwCffwC3wCfwC  xC  xC  xC  xC  xCxC33xCLxCffxC xCxCxCxCxC  yCyCyCyC33yCLyCffyCffyC yCyC3yCyCyCfyC  zCzCffzCffzCffzCffzCffzCffzCzCzC3zC  {C{C{C{C{C{C33{C {C {C3{C{Cf{Cf{Cf{Cf{Cf{C|C33|C33|CL|Cff|C |C3|Cf|Cf|Cf|Cf|C  }C  }C}C33}C33}C }C}C}C}C}C3}C}C~C33~C33~CL~CL~CL~Cff~Cff~Cff~C~C3~C~C~Cf~C  CCLCLCffCffC CCC3CC  C  C  C  C  CC33CLCLCffCffCffCffCffCffC3sC͌CfCfC C C C̀CfCfC3C  C  C  Cf&Cf&Cf&Cf&C33C @CLCYCYCffCCCfCfCfCfC3C C C CفCfC3C3C  CC33C @C @C @CYCYCYCYCYCYC3sC͌CCC3C3ĈCقCقCقCقCfC3C3CCCCf&C33C33C33C @CYCffC͌C͌C͌C͌CCCCC3C CfCfCfCfCfC3CCC33C33CLCLCLCLCLCYCffCffC3sC3sCfC3C̄C̄C̄C̄C̄C̄CلCلC  CCf&Cf&Cf&Cf&Cf&C33CYCYC3sC3sC3sC3sC C C͌CC3C3C̅C̅C̅CمC3C3CCCCC33C33C33C33C @CLCYCYC3sC C3C3C3C3C3C3C C C̆C̆C  CCCCCC33C @CLCLCffCffC3sC3sC3sC3sC C͌CfCfC ĊCهCfC3C3C3C3CCCCC33C @C @C @CLCYC C͌CCCfCfCfCfCfCfCوCfC3C3C3C  CCf&Cf&Cf&C @C @CYCYCYCYC3sC C C CCfC C̉CىCىCfCfCfCfC  C  CCf&Cf&Cf&C @C @CLCffC C C͌C͌C͌C͌CCCfC3C̊C̊CيCيCfC  CCCCC33C33C @C @C @CLCffC3sC3sC3sC͌CCfC3C3C3C̋CًCًCًCfCfC  CCCCf&C @CLCYCffCffCffC3sC3sC3sC C͌CCfC C ČCfCfC3C  C  C  CCCCf&C33C @CLCYCYCffC C͌CCCfC3C3C C C C̍CfC3C3C  CCC33C @C @CLCYCYCYCffCffCffC3sC CCfC C̎C̎CfCfCfC3C3C3C  CCCC33C33C @CYCffCffC C͌C͌CCfCfCfC3C3C3C C CُC3C  CCf&C33C33C33C @C @C @CLCLCLCYC3sC͌CC3C3C3C C̐C̐C̐CfCfC3C  C  C  CCf&C33C @CYCYCYC3sC C C͌C͌C͌C͌CfCfCfC̑CّCfC  C  C  CCf&Cf&Cf&C33C33C33C @C @CLCffC CCCfCfC3C C C C CfCfCfC3C3CCC33C33C33CLCYCffC3sC3sC3sC C C C CCfCfC̓CٓCٓC3C  C  C  CCCCCf&Cf&C33C @CLCffC͌C͌C͌CCfCfC3C3C3C3CٔCٔCٔCfC3CCf&Cf&Cf&C33CLCLCYCYCffCffC3sC3sC3sC CC3C C CٕCfC3C3C3C3CCCCCCC33CLCYCYC C͌C͌C͌CCCfCfCfCfC C CٖC3CCCCf&Cf&Cf&C @C @C @C @CYCYCffCffC3sC͌C3C3C3C C̗C̗CfCfCfCfC  C  C  C  CC33CLCLCYCYC3sC C C C͌C͌C͌C͌CCC̘CfC3C3C  C  C  CCCC33C33C @C @CLCLCYC3sC͌C͌CfCfCfCfC C̙C̙C̙CٙCٙCfCfC3CCf&Cf&C33C33C @C @CYCffCffCffC3sC3sC C CC3C̚C̚CٚCٚCfCfC3C  CCCCCCC @CYC3sC3sC C C͌C͌C͌C͌CCC3C3C C CٛC3C  C  C  C  CCC33C33C @C @C @C @C @C @CYC CCfC C C C C C CٜCٜCٜCٜC3C3C  Cf&C33C @CYCYCYCYC3sC3sC3sC3sC C CCCC CٝCfCfCfCfCfCCCCCf&Cf&Cf&Cf&Cf&CLC C͌C͌CCfCfCfCfCfCfC̞C̞C̞C̞CٞC  CCf&Cf&Cf&CLCLCLCLCYCYCYCffCffCffC CfC3C̟CٟCٟCٟCٟCٟCfC  CCCCCCCf&C33CLCffC C C C͌C͌C͌C͌C͌C͌CfC3C3C̠CfC  C  C  C  C  CCf&Cf&Cf&C33C @C @CLCLCYC CCfCfCfCfCfC3C3C3C١C١CfC3C3C  C  Cf&Cf&C33CYCYCffCffCffCffCffCffCffCffC CfC3C̢C̢C٢C٢C٢CfCfC  CCCCCCCf&C33CYCffC C͌C͌C͌C͌CCCfCfC3C C̣C٣C٣C3C3CCf&Cf&C33C @CLCLCLCLCLCLCYCffC3sCfC3C̤C̤C̤C̤C̤C٤C٤C٤C3C  C  C  CCC33C33CLCYC3sC3sC C C C C C͌C͌CC3C3CfCfC  C  C  C  C  CCf&Cf&C @C @C @C @CLCLCffC3sCCfCfCfC C C C C C̦C٦C٦CfC3Cf&Cf&C @C @C @CLCYCYCYCYC3sC C C C͌CC C C٧C٧C3C3C3C  C  CCCCCC @C @CYCYC3sC͌CCCCC3C3C3C3C3C C٨CfC  C  C33C33C33C33C33C @C @C @CLCYCffC3sC C C͌CfC C C̩C̩C̩C٩CfCfCfC3C  C  CCCf&C33CYCffCffC3sC3sC3sC C C͌CCfCfC3C C̪C̪C3C  C  CCf&Cf&Cf&C33C33C33C @C @CLCYCffC3sC͌CCfC3C C C C̫C٫C٫C٫C٫C  C  CCCf&C33CLCLCYCYCffCffC C C C͌CfCfCfC3C̬C̬C٬CfC  CCCCCCf&Cf&C @C @C @CYC C C C͌CCC3C3C3C3C C CfCfCfC3CCCCf&C33C33CLCLCYCYC3sC3sC C C͌CC3C3C3C3CfCfC3C3C  C  CCCCC33C @CYCYCffCffC C C C CfCfCfCfC̯C̯CٯCfC3C3C  C  CCCf&Cf&CLCLCLCLCffCffC3sC CCCfCfC C C̰C̰CfCfC3C3C3CCCC @C @CLCLCffCffCffC3sC C C͌C͌CfC3C C̱CٱCfCfCfC  C  CCC33C33C33C @C @CLCYCffC C C͌C͌CfC3C3C3C̲C̲CٲCٲCfC3C3CCf&Cf&C33C33C @C @CLCLCLCYCffCffC͌CCCfC C C C̳CٳCٳC3C3C  C  CCCC33C33C33CYCffCffCffC C͌C͌CCCC C C C̴C̴CٴC3CCCCf&C33C33C33C33C @CLCYCffC3sC C͌CCfCfC3C3C̵C̵C̵CfC3C  C  C  CCCf&C33C @CLCYCffC3sC3sC C C͌CCCfC C C CٶCfC3C  C  C  CCf&Cf&Cf&C33C33CLCffCffCffC CCCCCCC3C C CٷCfC3C  C  C  CCf&Cf&Cf&C @C @CLCffCffCffC3sC C C͌CCC C̸C̸C̸C̸CٸCٸCٸCfC3CCCf&C33C33C @CLCYCffCffC3sC C C C͌CfC3C3C3C̹CٹCfC3C  C  CCCCCf&C33CLCYCYCYC3sC3sC3sC C͌C3C C C C C̺C̺CٺCٺCfC3CCf&Cf&C33C33C33C33C @CLCtypescatternameDyna-Q+x]  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;E ;E ;E ;E ;E ;E ;E ;E  <E <E  <E 0<E @<E P<E `<E p<E <E <E <E <E <E <E <E <E  =E =E  =E 0=E @=E P=E `=E p=E =E =E =E =E =E =E =E =E  >E >E  >E 0>E @>E P>E `>E p>E >E >E >E >E >E >E >E >E  ?E ?E  ?E 0?E @?E P?E `?E p?E ?E ?E ?E ?E ?E ?E ?E ?E  @E @E  @E 0@E @@E P@E `@E p@E @E @E @E @E @E @E @E @E  AE AE  AE 0AE @AE PAE `AE pAE AE AE AE AE AE AE AE AE  BE BE  BE 0BE @BE PBE `BE pBE BE BE BE BE BE BE BE BE  CE CE  CE 0CE @CE PCE `CE pCE CE CE CE CE CE CE CE CE  DE DE  DE 0DE @DE PDE `DE pDE DE DE DE DE DE DE DE DE  EE EE  EE 0EE @EE PEE `EE pEE EE EE EE EE EE EE EE EE  FE FE  FE 0FE @FE PFE `FE pFE FE FE FE FE FE FE FE FE  GE GE  GE 0GE @GE PGE `GE pGE GE GE GE GE GE GE GE GE  HE HE  HE 0HE @HE PHE `HE pHE HE HE HE HE HE HE HE HE  IE IE  IE 0IE @IE PIE `IE pIE IE IE IE IE IE IE IE IE  JE JE  JE 0JE @JE PJE `JE pJE JE JE JE JE JE JE JE JE  KE KE  KE 0KE @KE PKE `KE pKE KE KE KE KE KE KE KE KE  LE LE  LE 0LE @LE PLE `LE pLE LE LE LE LE LE LE LE LE  ME ME  ME 0ME @ME PME `ME pME ME ME ME ME ME ME ME ME  NE NE  NE 0NE @NE PNE `NE pNE NE NE NE NE NE NE NE NE  OE OE  OE 0OE @OE POE `OE pOE OE OE OE OE OE OE OE OE  PE PE  PE 0PE @PE PPE `PE pPE PE PE PE PE PE PE PE PE  QE QE  QE 0QE @QE PQE `QE pQE QE QE QE QE QE QE QE QE  RE RE  RE 0RE @RE PRE `RE pRE RE RE RE RE RE RE RE RE  SE SE  SE 0SE @SE PSE `SE pSE SE SE SE SE SE SE SE SE  TE TE  TE 0TE @TE PTE `TE pTE TE TE TE TE TE TE TE TE  UE UE  UE 0UE @UE PUE `UE pUE UE UE UE UE UE UE UE UE  VE VE  VE 0VE @VE PVE `VE pVE VE VE VE VE VE VE VE VE  WE WE  WE 0WE @WE PWE `WE pWE WE WE WE WE WE WE WE WE  XE XE  XE 0XE @XE PXE `XE pXE XE XE XE XE XE XE XE XE  YE YE  YE 0YE @YE PYE `YE pYE YE YE YE YE YE YE YE YE  ZE ZE  ZE 0ZE @ZE PZE `ZE pZE ZE ZE ZE ZE ZE ZE ZE ZE  [E [E  [E 0[E @[E P[E `[E p[E [E [E [E [E [E [E [E [E  \E \E  \E 0\E @\E P\E `\E p\E \E \E \E \E \E \E \E \E  ]E ]E  ]E 0]E @]E P]E `]E p]E ]E ]E ]E ]E ]E ]E ]E ]E  ^E ^E  ^E 0^E @^E P^E `^E p^E ^E ^E ^E ^E ^E ^E ^E ^E  _E _E  _E 0_E @_E P_E `_E p_E _E _E _E _E _E _E _E _E  `E `E  `E 0`E @`E P`E ``E p`E `E `E `E `E `E `E `E `E  aE aE  aE 0aE @aE PaE `aE paE aE aE aE aE aE aE aE aE  bE bE  bE 0bE @bE PbE `bE pbE bE bE bE bE bE bE bE bE  cE cE  cE 0cE @cE PcE `cE pcE cE cE cE cE cE cE cE cE  dE dE  dE 0dE @dE PdE `dE pdE dE dE dE dE dE dE dE dE  eE eE  eE 0eE @eE PeE `eE peE eE eE eE eE eE eE eE eE  fE fE  fE 0fE @fE PfE `fE pfE fE fE fE fE fE fE fE fE  gE gE  gE 0gE @gE PgE `gE pgE gE gE gE gE gE gE gE gE  hE hE  hE 0hE @hE PhE `hE phE hE hE hE hE hE hE hE hE  iE iE  iE 0iE @iE PiE `iE piE iE iE iE iE iE iE iE iE  jE jE  jE 0jE @jE PjE `jE pjE jE jE jE jE jE jE jE jE  kE kE  kE 0kE @kE PkE `kE pkE kE kE kE kE kE kE kE kE  lE lE  lE 0lE @lE PlE `lE plE lE lE lE lE lE lE lE lE  mE mE  mE 0mE @mE PmE `mE pmE mE mE mE mE mE mE mE mE  nE nE  nE 0nE @nE PnE `nE pnE nE nE nE nE nE nE nE nE  oE oE  oE 0oE @oE PoE `oE poE oE oE oE oE oE oE oE oE  pE pE  pE 0pE @pE PpE `pE ppE pE pE pE pE pE pE pE pE  qE qE  qE 0qE @qE PqE `qE pqE qE qE qE qE qE qE qE qE  rE rE  rE 0rE @rE PrE `rE prE rE rE rE rE rE rE rE rE  sE sE  sE 0sE @sE PsE `sE psE sE sE sE sE sE sE sE sE  tE tE  tE 0tE @tE PtE `tE ptE tE tE tE tE tE tE tE tE  uE uE  uE 0uE @uE PuE `uE puE uE uE uE uE uE uE uE uE  vE vE  vE 0vE @vE PvE `vE pvE vE vE vE vE vE vE vE vE  wE wE  wE 0wE @wE PwE `wE pwE wE wE wE wE wE wE wE wE  xE xE  xE 0xE @xE PxE `xE pxE xE xE xE xE xE xE xE xE  yE yE  yE 0yE @yE PyE `yE pyE yE yE yE yE yE yE yE yE  zE zE  zE 0zE @zE PzE `zE pzE zE zE zE zE zE zE zE zE  {E {E  {E 0{E @{E P{E `{E p{E {E {E {E {E {E {E {E {E  |E |E  |E 0|E @|E P|E `|E p|E |E |E |E |E |E |E |E |E  }E }E  }E 0}E @}E P}E `}E p}E }E }E }E }E }E }E }E }E  ~E ~E  ~E 0~E @~E P~E `~E p~E ~E ~E ~E ~E ~E ~E ~E ~E  E E  E 0E @E PE `E pE E E E E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȀE ЀE ؀E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȁE ЁE ؁E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȂE ЂE ؂E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȃE ЃE ؃E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȄE ЄE ؄E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȅE ЅE ؅E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȆE ІE ؆E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȇE ЇE ؇E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȈE ЈE ؈E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȉE ЉE ؉E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȊE ЊE ؊E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȋE ЋE ؋E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȌE ЌE ،E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȍE ЍE ؍E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȎE ЎE ؎E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȏE ЏE ؏E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȐE АE ؐE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȑE БE ؑE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȒE ВE ؒE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȓE ГE ؓE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȔE ДE ؔE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȕE ЕE ؕE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȖE ЖE ؖE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȗE ЗE ؗE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȘE ИE ؘE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E șE ЙE ؙE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȚE КE ؚE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E țE ЛE ؛E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȜE МE ؜E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȝE НE ؝E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȞE ОE ؞E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȟE ПE ؟E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȠE РE ؠE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȡE СE ءE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȢE ТE آE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȣE УE أE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȤE ФE ؤE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȥE ХE إE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȦE ЦE ئE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȧE ЧE اE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȨE ШE بE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȩE ЩE ةE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȪE ЪE تE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȫE ЫE ثE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȬE ЬE جE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȭE ЭE حE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȮE ЮE خE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȯE ЯE دE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȰE аE ذE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȱE бE رE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȲE вE زE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȳE гE سE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȴE дE شE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȵE еE صE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȶE жE ضE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȷE зE طE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȸE иE ظE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȹE йE عE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȺE кE غE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE Ey]                                                                                                                                                                                                                                                                                        ==================================================================L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   ?   ?   ?   ?   ?   ???????????????????333?333?333?333?333?333?333?333?333?333?333?333?L?L?L?L?L?L?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌???ff?ff?33?33?33?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ????????33?33?33?   @   @   @   @   @   @   @   @ff@ff@ff@ff@ff@@@33@@@@@@@@@@@   @   @   @   @   @   @ff&@,@,@,@,@,@,@,@,@,@,@,@333@333@333@333@9@9@  @@ffF@ffF@ffF@L@L@L@L@L@L@L@L@33S@33S@Y@Y@  `@  `@  `@fff@l@l@l@33s@33s@33s@33s@33s@33s@33s@  @  @33@ff@ff@ff@@̌@̌@  @  @  @  @  @  @  @33@33@@̜@̜@̜@  @  @  @ff@ff@ff@ff@@@@̬@̬@  @33@ff@ff@@@@̼@̼@  @  @  @  @  @33@33@ff@@@@  @  @  @33@33@33@33@ff@ff@ff@@@@  @  @  @33@33@ff@@@@@@@@  @  @33@ff@ff@ff@@@@@   A   A   A   A   AA33AA  A	A	A	A33A33A33AAAAffAffAffAffA  A  A33AffA  A  AAAA33A33A33A33A33AAAffAffA!A33#A33#A$Aff&Aff&Aff&A  (A  (A  (A  (A  (A  (A  (A33+A33+Aff.A  0A  0A  0A1A4A4Aff6Aff6Aff6Aff6Aff6Aff6Aff6A  8A  8A<Aff>Aff>Aff>A  @A  @AAADADADADADADADAffFAffFAIA33KALALAffNAffNA  PA33SA33SATATATATATAffVAffVAYA33[A33[A33[Aff^Aff^A  `A33cA33cA33cA33cAdAdAdAfffAfffAiA33kA33kA33kAlAlA  pA33sA33sA33sA33sA33sA33sAtAffvAffvAyA33{A33{A33{A|A|Aff~ÀAAAAAAAffA33ĀAAAAffAffA33ÄÄÄAAAAAffAffA  AAAAffAffA33A̐A̐A̐A̐A̐AAAffAffA  A̔A̔AAffAffA33A̘A̘A̘A̘A̘A̘A̘AffAffA  A̜A̜A̜AAffA33A̠A̠A̠A̠A̠A̠A̠AAA  A̤A̤A̤AAAffĄĄĄĄĄĄĄAAA33A  A̬A̬AAAffA  A  A̰A̰A̰A̰A̰AAA33A  A  A  AAAffA  A  A  A  A̸A̸A̸AAA33A  A  A  A̼A̼AffA  A  A  A  A  A  AAAA33A  A  A  AAAA33A  A  A  A  A  A  AAA33A  A  A  AAAA33A33A33A  A  A  A  AAAffA  A  A  AAAA33A33A33A33A33A33A  AAAffA33A33A  AAAA33A33A33A33A33A33A33A  AAffA33A33A33A  AAA33A33A33A33A33A33A33A  A  AAffA33A33A  A  AA33A33A33A33A33A33A33A  A  AAffAffAffA  A  AAffAffA33A33A33A33A33A  A  AAffAffAffA33A33A  AffAffAffAffA33A33A33A   B   B B33B33B33BBB  BBB33B33B33B33BB  B  BB33B33B33BBB  BBBBBBBB33BBffB33	B33	B33	B	B	B  
B
B
B
B
B
B
B
B33B33B  BBBBBB  BBBBBBBB33B33B  BffBffBB33B33B  BBBBBBBB33B33B  BffBffBffBBBBffBBBBBBB33B33B  BffBffBffBBB33B  BffBffBffBffBffBB33B33B  BffBffBffBBB33B  B  B  B  BffBffBffBBB   Bff Bff Bff B B B33!B  "B  "B  "B  "B  "B  "B  "B"B"B#B  $B  $Bff$B$B$B33%B  &B  &B  &B  &B  &B  &B  &Bff&Bff&B33'B  (B  (B  (Bff(B(B33)B  *B  *B  *B  *B  *B  *B  *Bff*Bff*B33+B+B+B  ,Bff,Bff,B,B  .B  .B  .B  .B  .B  .B  .B  .Bff.B33/B/B/B/B  0Bff0B0B1B1B  2B  2B  2B  2B  2B  2Bff2B333B3B3B3B  4B  4Bff4B335B5B5B5B  6B  6B  6B  6Bff6B337B7B7B7B  8B  8Bff8B339B339B339B339B339B9B  :B  :Bff:B:B;B;B;B  <B  <Bff<B33=B33=B33=B33=B33=B33=B33=B=B  >B>B?B?B?B?B  @Bff@B33AB33AB33AB33AB33AB33AB33AB33AB33AB  BBBBCBCBCBCBffDB33EB33EB33EB33EB33EB33EB33EB33EB33EBEBffFBFBFBFBFB  HBHB33IB33IB33IB33IB33IB33IB33IB33IBIB  JBJBJBJBJBKB  LBLB33MB33MB33MB33MB33MB33MB33MBMB  NBNBNBNBNB33OB  PBffPBffPBPB33QB33QB33QB33QB33QBQBQBffRBRBRBRB33SB  TB  TBffTBffTBffTBTB33UB33UB33UBUBUBUBVBVBVB33WB  XB  XB  XBffXBffXBffXBffXBffXB33YBYBYBYB  ZBffZBZB33[B[B  \B  \Bff\Bff\Bff\Bff\Bff\Bff\B\B]B]B  ^B  ^Bff^B33_B_B  `B  `B  `Bff`Bff`Bff`Bff`Bff`Bff`B`B`B33aB33aB33aBffbBcB  dB  dB  dBffdBffdBffdBffdBffdBffdBdBdB33eB33eB33eBfffBfBfB33gBgBffhBffhBffhBffhBffhBffhBffhBhB33iB33iB33iB  jBjBjBjB33kBkBkB  lB  lBfflBfflBfflBlB33mB33mB33mB  nBnBnBnBnB33oBoBoBoB  pB  pBffpBpBpB33qB33qBqBrBrBrBrB33sBsBsBsBsBsB  tB  tBtBtB33uBuB  vBvBvBvBvBwBwBwBwBwBwBwBffxBffxB33yB33yByBffzBzBzBzB33{B{B{B{B{B{B{B  |B  |Bff|Bff|B33}B}Bff~Bff~B~B33B33BBBBBBB  B33B33B33BB  B  B  B33BffBffB́B́B́B́B́B  B  B33B33BffB̂B  B  B33B33B33BffBB̃B̃B̃B  B  B33B33BffB̄B  B  B33B33B33BffBffBffBBB  B  B33B33BffB̆B  B  B33B33B33BffBffBffBffBffḂḂB33B33BffBB  B  B33B33B33BffBffBffBffBffBBB̉B̉BffBB̊B  B33B33B33BffBffBffBffBffBffBBBB  B33BffB̌B33B33B33BffBffBffBffBffBffBffBBB̍B  B  BffBB  B  B33B33B33BffBffBffBffBBB̏B  B  B33BffBB̐B33B33B33B33B33B33B33BffBffB̑B  B  B33BffBffB̒B  B  B  B33B33B33B33B33B33B̓B  B  B33BffBffB̔B̔B  B  B  B  B33B33B33B33BB̕B  B33BffBffB̖B̖B  B  B  B  B  B  B  B33BB̗B̗B  BffBffB̘B̘B  B  B  B  B  B  B  B  BffB̙B̙B  B  B33BB̚B  B  B  B  B  B  B  B  BffBffBB̛B̛B̛B33BffB̜B̜B  B  B  B  B  B  BffBffBBBBB33BffBBB̞B̞B̞B̞B  B  BffBffBffBBBB  B33BffBffBBB̠B̠B  B  B  B33BffBBBB  B33BffBffBffBffBffBB̢B  B  B33BffBBBḄB33B33BffBffBffBffBffBB̤B̤B  B  BBBB̥B33B33BffBffBffBffBffBBBB  B  B33B33BB̧B33B33BffBffBffBffBffBffBBB̨B̨B  B33BffBffB  B33BffBffBffBffBffBffBBB̪B̪B  B  B33BffB̫B  B33BffBffBffBffBffBBB̬B̬B  B  B33B33BB  B  B33B33BffBffBffBBBB̮B  B  B33B33BB̯B̯B33B33B33B33B33BffBffBffB̰B̰B̰B  B  BffBffBffḆḆB  B33B33B33B33BffBB̲B̲B  B  BffBffBffBBB̳B̳B  B  B33B33BffBBB  B  B33BffBffBBB̵B̵B  B  B  B  B  B  B  BffBBB33BffBBB̷B̷B  B  B  B  B  B  B  B33B33BffB  B33BBB̹B̹B  B  B  B  B  B  B  B33B33BffB̺B  B33BffB̻B̻B̻B  B  B  B  B  B  B33B33BffBB  B33B33B33BB̽B  B  B  B  B  B  B33B33BffBB  B33B33B33BffBffB̿B  B  B  B  B  B33B33BffBB  B33B33B33BffBffBBBB  B  B  B  B33BffBB  B33B33B33BffBffBffBBBBB  B  B  BffBBB  B  B  B33BffBffBffBBBBBBB33B33BffBB  B  B33BffBffBffBffBffBffBffBffBB  B  B  BffBBB  BffBffBffBffBffBffBffBffBBBB  B33BBBB33B33B33BffBffBffBffBffBffBBB  B33BffBBB  B33B33B33B33B33B33B33B33BBBB33B33BBB  B  B33B33B33B33B33B33B33BffBffBB33B33BBB  B  B33B33B33B33B33B33B33BffBffBffBB33BBB  B  B33B33B33B33B33B33B33BffBffBffBBBffBB  B  B33B33B33B33B33B33B33BffBffBffBffBBffBffBBB33B33B33B33B33B33B33BffBffBffBffBBffBffBBB  B  B33B33B33B33B33BffBffBffBffBB  BffBBB  B  B  B  B33B33B33BffBffBffBffBBB  BBBBBBBBB33B33B33BffBffBffBffB  B33BBBBBBBBB  B  B  B33BffBffBB  B33BBBBBBBB  B  B  B  B33B33B33BBB33B33BBBBBBB  B  B  B  B33B33BBB33B33BffBBBBBB  B  B  B  B  B33BBB  B33BffBBBBBBBBBBBBffBBB33BffBBBBBBBBBBBB33BffBB  B  BffBBBBBBBBBBB33B33BffBB  BffBBBBBBBBBBB  B33BffBBB33BffBffBffBBBBBBBB  B33BffBBB  BffBffBffBffBffBffBBBBBBBffBBBBffBffBffBffBffBffBBBBBBBBffBffBBffBffBffBffBffBffBBBBBBBBffBffBB  B33BffBffBffBffBffBBBBBBB33BffBffBffB  B  BffBffBffBffBBBBBBB  B33B33B33BBBB33B33B33BBBBBBBB33B33B33BffBffBB33B33B33BffBffBffBffBffBffBB  B33B33BffBffBB  B33B33BffBffBffBffBffBffBBB  B  B33BffBBB C C33 C33 C33 C33 C33 C33 C33 CL Cff C  C C C3 C C  C  C33C33C33C33C33C33C33C33CffC C C CC3C  C  CCCCCCC33C33CffCffC C CC3C  C  C  CCCCCCCCLCLCLCffCCCfC  C  CCCCCCCCLCLCLCffC C C3C  C  CCCCCCCCLCLCLCffC C CCfCfC  C  CCCCCC33C33CLCffCffC C CCfCfCfC  C  C  CCC33C33C33CffCffCffC CCfCfCfCfCfCfCfC  CCCCLCLCffC CCfCfCfCfCfCfCfCfC  	C	C	C33	CL	CL	Cff	C 	C 	C	C	C	Cf	Cf	Cf	Cf	C  
C  
C  
C
C33
C33
CL
Cff
Cff
C
C
C
C
C
Cf
Cf
C  C  C  C  C  CCCLCffCffCffCCC3CCCfC  C  C  C  CCCLCLCLCLCffC CCC3CfC  C  C  C  CCCLCLCLCLCLCffC CC3CCfC  C  C  C  CC33CLCLCLCLCffC CC3CCfCfCfCfCfCfCCLCLCLCLCLC CC3CCfCfCfCfCfCfCC33C33CLCLCLC CC3CCfCfCfCfCfCfCC33C33C33C33CLCffCC3CCfCfCfCfCfCfCCC33C33C33C33CLCC3CCfCfCfCfCfCfCCC33C33C33C33CLC CC3CCfCfCfCfCfCCC33C33C33C33CLC CC3C3CCCfCfCfCCC33C33C33C33C33CffCCC3C3CCCCfCCC33C33C33C33C33CffC CC3C3CCCCCfCC33C33C33C33C33C33CffC C3C3C3CCCCfC  C  C33C33C33C33C33CffC C3C3C3C3C3C3CfC  C  CCCC33C33C33CLC CC3C3C3C3C3C3CfC  CCCCC33CLCLCffC CCCCC3CfC  C  C  C  CCCC33CLC C C C C C C3CfC  C  C  CCCC33CLCffCffCffC C C CCfC  C  C  C  C  CC33CLCLCffCffCffCffCffCffC3CfC  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C CCCfCfC  C  C  C  C  C  C  C  C  C  C  CLC C C3C3C   C   C   C   C   C   C   C   C   C   C   C33 C  C  C3 C3 Cf Cf C  !C  !C  !C  !C  !C  !C  !C  !C  !C33!C !C !C3!C3!Cf!Cf!Cf!Cf!C  "C  "C  "C  "C  "C  "C  "C"C33"C "C3"C3"C"C"Cf"Cf"Cf"Cf"Cf"C  #C  #C  #C  #C  #C33#CL#C#C3#C#C#Cf#Cf#Cf#Cf#Cf#Cf#Cf#C  $C  $C  $C33$CL$C$C3$C3$C$C$C$C$C$C$C$C$C$C$C$Cf$C%C %C%C3%C3%C3%C%C%C%C%C%C%C%C%C%Cf%Cf%CL&C &C&C&C&C3&C3&C3&C3&C&C&C&C&C&Cf&Cf&C'CL'Cff'Cff'C 'C 'C'C'C3'C'C'C'C'C'C'Cf'Cf'C33(C33(C33(CL(CL(C (C(C3(C3(C3(C3(C(C(C(Cf(Cf(C33)C33)C33)CL)CL)CL)CL)Cff)C )C)C3)C)C)C)Cf)Cf)C  *C*C33*C33*C33*C33*C33*CL*CL*C*C*C*C*C*C*C*C*C+C+C33+C33+C33+C33+C33+C33+Cff+C +C+C3+C+C+C+C+C  ,C  ,C,C,C33,C33,C33,C33,CL,C ,C ,C,C3,C3,C,C,C  -C  -C  -C  -C  -C33-C33-C33-C33-C -C -C -C -C-C-C-Cf-C  .C  .C  .C  .C33.C33.C33.C33.Cff.Cff.C .C .C.C3.C3.Cf.Cf.Cf.Cf.Cf.C33/C33/C33/C33/Cff/Cff/C /C /C /C/C3/C3/C/C/C/Cf/C0C0C330C330CL0Cff0C 0C 0C 0C0C30C30C30C30C0C0Cf0C  1C  1C  1C331CL1C 1C 1C 1C 1C1C1C31C31C31C31C31C31Cf1C  2C2CL2CL2CL2C 2C 2C2C2C2C32C32C32C32C32C2C2Cf2C3C3CL3CL3Cff3C3C3C3C3C33C33C33C33C3C3C3C3Cf3C334C334CL4C 4C4C4C4C34C34C34C34C34C34C4C4Cf4C5C5CL5Cff5C 5C 5C5C5C5C5C5C35C35C35C35C5C5Cf5C6Cff6C 6C 6C 6C 6C6C6C6C36C36C36C36C36C36Cf6C7C337C 7C 7C 7C 7C 7C 7C7C37C37C37C37C37C37C7C  8C  8C338Cff8C 8C 8C 8C 8C 8C8C38C38C38C38C38C8C  9C  9C339CL9Cff9C 9C 9C 9C 9C9C9C9C39C39C39C9C  :C  :C33:CL:CL:Cff:C :C :C :C:C:C:C:C:C3:C:C:Cf:C33;CL;CL;Cff;Cff;Cff;C ;C ;C;C;C;C;C;C3;C;Cf;C  <C33<CL<CL<Cff<Cff<C <C <C<C<C<C<C<C3<C3<C<C  =C33=CL=CL=Cff=Cff=C =C =C=C=C=C=C=C=C3=C3=C=C>CL>CL>CL>CL>C >C >C>C>C>C>C>C>C3>C3>C>C?C?C33?CL?CL?C ?C ?C?C?C?C?C?C?C?C3?C?C@C@C33@C33@C33@C @C @C@C@C@C@C@C@C@C@C3@C  ACAC33AC33AC33ACffACffACACACACACACACACAC3AC  BCBC33BC33BC33BCffBCffBCffBC BC BC BCBCBCBCBC3BCfBCCC33CC33CC33CCffCCffCCffCC CC CC CC CC CCCCCC3CC3CCfCC33DC33DC33DCLDCffDCffDCffDCffDCffDCffDC DC DC DCDC3DC3DC33EC33EC33EC33ECffECffECffECffECffECffECffEC EC EC EC EC3EC3EC  FCFCFC33FCLFCffFCffFCffFCffFCffFCffFC FC FC FCFCFCFC  GCGC33GC33GCLGCLGCLGCffGCffGCffGC GC GC GC GC GCGCGC  HCHC33HCLHCLHCLHCffHCffHCffHC HC HC HC HC HC HC3HCHC  IC  IC  ICICICLICLICLIC IC IC IC IC IC ICICICfICfICfICfICfIC33JC33JCLJC JC JC JC JC JC JC JC JCJCfJCfJCfJCfJCKC33KC33KCffKC KC KC KC KC KC KC KCKCKCKCfKCfKCLC33LC33LCLLCffLCffLCffLCffLC LC LC LCLC3LCLCLCLC  MC33MC33MC33MCLMCffMCffMCffMCffMCffMC MCMCMCMCMCMCfMC  NC33NC33NCLNCffNCffNCffNCffNCffNCffNCffNCNC3NCNCNCfNC  OC33OC33OCLOCffOCffOCffOCffOCffOCffOCffOCffOCOCOCOCOCfOC33PC33PCLPCffPCffPCffPCffPCffPCffPCffPCffPCPC3PC3PC3PCPC  QCQCLQCffQCffQCffQCffQCffQCffQCffQCffQCQCQC3QC3QCQC  RC  RCRCLRCLRCffRCffRCffRCffRCffRCffRC RCRCRC3RCRCfRC  SCSC33SCLSCLSCLSCLSCffSCffSCffSCffSCffSC SCSC3SCfSC  TC  TCTCLTCLTCLTCLTCLTCLTCLTCLTCffTCffTCTC3TCTC  UC  UC  UC33UCLUCLUCLUCLUCLUCLUCLUCLUCLUCUC3UC3UCfUC  VC  VCVC33VC33VCLVCLVCLVCLVCLVCLVCLVCffVC VC3VCfVCfVC  WCWC33WC33WCLWCLWCLWCLWCLWCLWCLWCffWCffWC WCWCfWC  XCXC33XC33XCLXCLXCLXCLXCLXCLXCLXCLXCLXC XCXCXCfXCfXCYC33YC33YC33YCLYCLYCLYCLYCLYCLYCLYCLYCYC3YCYCYCfYCZC33ZC33ZCLZCLZCLZCLZCLZCLZCLZCLZC ZCZCZCZCfZC  [C  [C[CL[CL[CL[CL[CL[CL[CL[CL[Cff[C[C3[C[Cf[Cf[Cf[C\C33\C33\CL\CL\CL\CL\CL\CL\Cff\C\C\C\Cf\Cf\Cf\C  ]C33]C33]C33]C33]CL]CL]CL]CL]CL]Cff]Cff]C]Cf]Cf]Cf]C  ^C33^C33^C33^C33^C33^C33^C33^C33^CL^Cff^Cff^C^C3^C^Cf^Cf^C_C33_C33_C33_C33_C33_C33_C33_C33_CL_Cff_C _C3_C_C_Cf_C  `C33`C33`C33`C33`C33`C33`C33`C33`CL`CL`Cff`C`C3`C3`Cf`Cf`C33aC33aC33aC33aC33aC33aC33aC33aCLaCLaCLaC aCaCaCfaCfaC33bC33bC33bC33bC33bC33bC33bC33bCLbCLbCLbCffbCbCbC3bCbCcCcC33cC33cC33cC33cC33cC33cC33cCLcCLcCffcCcCcC3cCcC  dC  dCdC33dC33dC33dC33dC33dC33dCLdCLdCffdCdCdC3dCdC  eC  eCeCeCeC33eC33eC33eC33eCLeCLeCffeC eCeCeCeC  fC  fCfCfCfCfCfCfC33fCLfCLfCfffCfffC fCfCfC  gC  gC  gCgCgCgCgCgCgC33gCLgCffgCffgC gC gCgCfgCfgC  hC  hChChChChChChC33hCLhCLhCffhC hChChCfhC  iC  iCiCiCiCiCiCiC33iCLiCLiCffiCffiC3iC3iCiCfiC  jCjCjCjCjCjCjC33jCLjCLjCffjCffjC3jC3jC3jCjCfjC  kCkCkCkCkCkC33kC33kCLkCffkCffkC3kC3kC3kCkCkCfkClClClClClC33lC33lCLlCfflCfflClClC3lClClCflCflC  mCmCmCmC33mC33mCLmCffmCffmCmCmCmCmCmCfmCfmC  nC  nC  nCnC33nC33nCLnCffnCffnCnCnCnCnC3nCfnCfnC  oC  oC  oC  oC  oC33oCLoCffoCffoCoCoCoCoC3oCfoCfoC  pC  pC  pC  pC  pC  pC33pCLpCffpCpCpCpCpC3pCfpCfpC  qC  qC  qC  qC  qC  qCqCqCLqC qCqCqCqC3qCfqCfqC  rC  rC  rC  rC  rC  rCrCrC33rC33rCffrCrCrC3rCfrCfrC  sC  sC  sC  sC  sC  sC  sCsC33sC33sCffsC sC sC sCsCsC  tC  tC  tC  tC  tC  tC  tC  tC33tC33tCLtCfftC tC tC3tC3tCftC  uC  uC  uC  uC  uC  uC  uC33uC33uC33uCffuC uC uCuC3uCuCfuC  vC  vC  vC  vC  vC  vC33vC33vC33vCLvCffvCffvCffvCvCvCfvCfvCfvC  wC  wC  wC  wCwC33wC33wC33wCLwCffwCffwCwCwCfwCfwCfwCfwCfwC  xC  xCxC33xC33xC33xCLxCffxCffxCxCxCfxCfxCfxCfxCfxCfxCfxC  yCyC33yC33yCLyCLyCffyCyC3yCyCfyCfyCfyCfyCfyCfyC  zCzCzCzC33zC33zCLzCzC3zC3zCfzCfzCfzCfzCfzCfzCfzC  {C{C{C{C{C33{C {C{C3{Cf{Cf{Cf{Cf{Cf{Cf{Cf{C  |C|C|C|C|C|C |C |C|C|Cf|Cf|Cf|Cf|Cf|Cf|Cf|C}C}C}C}C}C }C }C}C}C}C}Cf}Cf}Cf}Cf}Cf}C  ~C~C~C~C~Cff~C ~C~C~C3~C3~C~C~Cf~Cf~Cf~Cf~Cf~CCCCffC C C C C3CCCCCCCfCCCC33C @C @C @C @CYCffCffCffCffCffCffCffC3sC͌C͌CC3C3C3C3CـCfCfCfCfCfCfCfC3C  C  CCf&C33C33C33CYCffCffCffCffCffCffCffC3sC C C C C͌CCfĆCفCفCfCfCfCfCfC3C  C  C  C  CCCC @CLCYCffCffCffCffCffCffC C C C C͌C͌CCC3CقCfCfCfCfCfCfC3C3C3C3CCCCCf&CLCYCffCffCffCffCffC3sC3sC3sC3sC͌C͌CCCfCfCكCكCكCfCfCfC3C3C3C3C  CCCCCf&CLCYCYCYCYCYCYCffCffCffC C͌CCCCfC̄CلCلCلCلCلCلCfCfCfC3C3CCCCC @CYCYCYCYCYCYCffCffCffC3sC3sC C͌C͌CC3C̅CمCمCمCمCمCمCfCfCfCfC  C  CCCf&CLCYCYCYCYCYCYCYCffCffCffC C C C CC C C CنCنCنCنCنCfCfCfC3C  C  C  CC @C @C @CLCLCYCYCYCYCYCffC3sC3sC C C͌CfC3C3ĊĊĊĊCهCهCهCfC3C3C  C  C  CC33C33C @CLCLCLCLCLCLCYC3sC3sC C C CC3C3C C̈C̈C̈C̈C̈C̈C̈CfCfC3C  C  CCCC33CLCLCLCLCLCLCLCffCffC3sC3sC3sC C͌C͌CC C C̉C̉C̉C̉C̉CfCfC3C3C3C  CCCC33C33C @C @CLCLCLCffCffC3sC3sC3sC C C͌C͌CfC3C C C C C̊CfCfC3C3C3C  C  C  C  Cf&C33C @C @C @C @C @CYCYCYC3sC3sC C C C C͌CfC C C C C CًCًCًCfCfC3C3C  C  C  CC33C33C @C @C @CYCYCYCffCffC3sC3sC3sC3sC C͌C3C3C3C C C CٌCٌCfCfC3C3C3C3C3C  CC33C33C @C @C @CYCYCffCffC3sC3sC3sC3sC3sC CCfCfC3C C C̍CٍCfCfC3C3C3C3C3C  CCf&Cf&Cf&C33C33C @CYCffCffC3sC3sC3sC3sC3sC3sCCfCfCfC3C3C C̎CَCَCَCfC3C3C3C3CCf&Cf&Cf&C33C33C @CLCYCYCYCYCYC3sC3sC3sC͌CCfCfC3C3C C̏C̏C̏CُCُCُCfCfC3C  CCf&Cf&C33C33C33C @CLCLCYCYCYCYCffCffCffC CfCfC3C3C3C C̐C̐C̐C̐C̐CِCِCِCfC  CCCf&Cf&C33C @C @CLCLCLCLCYCYCYCffC3sC͌C͌CCCfC3C C C C̑C̑CّCّCّCfC3CCCCCf&Cf&C33C33C @CLCLCYCYCYCffC3sC͌C͌CCCfCfC3C3C3C C̒CْCْCْCfC3CCCCCCC33C33C33C @C @CLCYCYCffC3sC͌C͌C͌CCCC3C3C3C C C̓C̓C̓CٓCfCCCCCCCf&Cf&C33C33C33C @C @C @CYCffC3sC C͌CCCCfCfCfCfC3C C C CٔCfC3C  C  CCCCf&Cf&Cf&Cf&Cf&C @C @C @CYCffCffC C C͌C͌C͌C͌CfCfCfCfC C C C C̕CٕC3C  C  C  C  CCCCCf&C @C @C @C @CLCLC3sC C C C C C͌CCCCfC3C C C̖C̖C3C3C  C  C  C  CCCCCf&Cf&C33C @CLCLCffC3sC3sC3sC3sC3sC͌CCCCfCfCfCfCfC3CٗC3C3C3C3C3CCCCCf&Cf&Cf&Cf&Cf&Cf&C33CYCffCffC3sC3sC C C͌C͌CfCfCfCfCfCfC3C̘CfCfCfCfC3C3CCCf&Cf&Cf&Cf&Cf&Cf&Cf&C33CYCYCffCffC3sC3sC C CCfCfCfCfCfCfCfC C CٙCٙCfC3C3C  C  CCCf&Cf&Cf&Cf&Cf&Cf&C33CLCYCYCffC3sC C CCCCCfCfCfCfCfC̚CٚCٚCfC3C  C  CCCCCCCCf&Cf&C @CYCYCffC3sC C CCCCCCCCCC3C CٛCfCfC  C  C  CCCCCCCCCC33CLCffCffC3sC C CCCCCCCCCC3C C̜CٜCٜC3C3C  CCCCCCCCCf&Cf&C @CLCLCffCffC C͌C͌C͌CCCCCCfCfC C̝C̝CfCfC3C3CCCCCCCCCC @C @CLCffCffCffC3sC3sC3sCCCCCCCC3C C̞CfCfCfC3C3C3C3C3CCCCCC33C @CLCYCffCffC3sC3sC3sC3sC3sC͌C͌C͌CCCC C̟CٟCfCfC3C3C3C3C3CCCCCCC33C33CLCYCYC3sC3sC3sC3sC3sC3sC C͌C͌C͌C͌CC3C̠C٠C٠C3C3C3C3C3C3C3CCCCCCf&C33C @CYC3sC3sC3sC3sC3sC3sC3sC C͌C͌C͌CCC3C C C١C3C3C3C3C3C3C3C  C  CCCCf&C @C @CYCffCffC3sC3sC3sC3sC3sC3sC C͌CCCfCfC C̢C٢CfCfCfCfC3C3C3C  CCCCCf&C @C @C @CffCffCffCffCffCffC3sC C͌CCCCfC3C C C̣CfCfCfCfCfCfCfC3C  CCCCC33C @C @CYCffCffCffCffCffCffCffC3sC C͌CCC3C3C3C٤CfCfCfCfCfCfCfC3C  CCCC33C33C33C @CYCYCYCffCffCffCffCffC C C͌C͌CCC3C C̥C٥C٥C٥C٥CfCfCfC3C  CCCCCCC33CYCYCYCYCYCYCffC3sC C͌C͌C͌C͌CCCfC C̦C̦C٦C٦C٦CfC3C  C  C  C  C  C  CCCf&C @CLCLCLCYCffC3sC C C C C C C͌C͌CfC3C ÇÇÇC٧C٧CfC  C  C  C  C  CCCf&C33C @CLCLCLCYCYCYCffCffC3sC C C C͌CCCfCtypescatternameDyna-Q+′x]  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;E ;E ;E ;E ;E ;E ;E ;E  <E <E  <E 0<E @<E P<E `<E p<E <E <E <E <E <E <E <E <E  =E =E  =E 0=E @=E P=E `=E p=E =E =E =E =E =E =E =E =E  >E >E  >E 0>E @>E P>E `>E p>E >E >E >E >E >E >E >E >E  ?E ?E  ?E 0?E @?E P?E `?E p?E ?E ?E ?E ?E ?E ?E ?E ?E  @E @E  @E 0@E @@E P@E `@E p@E @E @E @E @E @E @E @E @E  AE AE  AE 0AE @AE PAE `AE pAE AE AE AE AE AE AE AE AE  BE BE  BE 0BE @BE PBE `BE pBE BE BE BE BE BE BE BE BE  CE CE  CE 0CE @CE PCE `CE pCE CE CE CE CE CE CE CE CE  DE DE  DE 0DE @DE PDE `DE pDE DE DE DE DE DE DE DE DE  EE EE  EE 0EE @EE PEE `EE pEE EE EE EE EE EE EE EE EE  FE FE  FE 0FE @FE PFE `FE pFE FE FE FE FE FE FE FE FE  GE GE  GE 0GE @GE PGE `GE pGE GE GE GE GE GE GE GE GE  HE HE  HE 0HE @HE PHE `HE pHE HE HE HE HE HE HE HE HE  IE IE  IE 0IE @IE PIE `IE pIE IE IE IE IE IE IE IE IE  JE JE  JE 0JE @JE PJE `JE pJE JE JE JE JE JE JE JE JE  KE KE  KE 0KE @KE PKE `KE pKE KE KE KE KE KE KE KE KE  LE LE  LE 0LE @LE PLE `LE pLE LE LE LE LE LE LE LE LE  ME ME  ME 0ME @ME PME `ME pME ME ME ME ME ME ME ME ME  NE NE  NE 0NE @NE PNE `NE pNE NE NE NE NE NE NE NE NE  OE OE  OE 0OE @OE POE `OE pOE OE OE OE OE OE OE OE OE  PE PE  PE 0PE @PE PPE `PE pPE PE PE PE PE PE PE PE PE  QE QE  QE 0QE @QE PQE `QE pQE QE QE QE QE QE QE QE QE  RE RE  RE 0RE @RE PRE `RE pRE RE RE RE RE RE RE RE RE  SE SE  SE 0SE @SE PSE `SE pSE SE SE SE SE SE SE SE SE  TE TE  TE 0TE @TE PTE `TE pTE TE TE TE TE TE TE TE TE  UE UE  UE 0UE @UE PUE `UE pUE UE UE UE UE UE UE UE UE  VE VE  VE 0VE @VE PVE `VE pVE VE VE VE VE VE VE VE VE  WE WE  WE 0WE @WE PWE `WE pWE WE WE WE WE WE WE WE WE  XE XE  XE 0XE @XE PXE `XE pXE XE XE XE XE XE XE XE XE  YE YE  YE 0YE @YE PYE `YE pYE YE YE YE YE YE YE YE YE  ZE ZE  ZE 0ZE @ZE PZE `ZE pZE ZE ZE ZE ZE ZE ZE ZE ZE  [E [E  [E 0[E @[E P[E `[E p[E [E [E [E [E [E [E [E [E  \E \E  \E 0\E @\E P\E `\E p\E \E \E \E \E \E \E \E \E  ]E ]E  ]E 0]E @]E P]E `]E p]E ]E ]E ]E ]E ]E ]E ]E ]E  ^E ^E  ^E 0^E @^E P^E `^E p^E ^E ^E ^E ^E ^E ^E ^E ^E  _E _E  _E 0_E @_E P_E `_E p_E _E _E _E _E _E _E _E _E  `E `E  `E 0`E @`E P`E ``E p`E `E `E `E `E `E `E `E `E  aE aE  aE 0aE @aE PaE `aE paE aE aE aE aE aE aE aE aE  bE bE  bE 0bE @bE PbE `bE pbE bE bE bE bE bE bE bE bE  cE cE  cE 0cE @cE PcE `cE pcE cE cE cE cE cE cE cE cE  dE dE  dE 0dE @dE PdE `dE pdE dE dE dE dE dE dE dE dE  eE eE  eE 0eE @eE PeE `eE peE eE eE eE eE eE eE eE eE  fE fE  fE 0fE @fE PfE `fE pfE fE fE fE fE fE fE fE fE  gE gE  gE 0gE @gE PgE `gE pgE gE gE gE gE gE gE gE gE  hE hE  hE 0hE @hE PhE `hE phE hE hE hE hE hE hE hE hE  iE iE  iE 0iE @iE PiE `iE piE iE iE iE iE iE iE iE iE  jE jE  jE 0jE @jE PjE `jE pjE jE jE jE jE jE jE jE jE  kE kE  kE 0kE @kE PkE `kE pkE kE kE kE kE kE kE kE kE  lE lE  lE 0lE @lE PlE `lE plE lE lE lE lE lE lE lE lE  mE mE  mE 0mE @mE PmE `mE pmE mE mE mE mE mE mE mE mE  nE nE  nE 0nE @nE PnE `nE pnE nE nE nE nE nE nE nE nE  oE oE  oE 0oE @oE PoE `oE poE oE oE oE oE oE oE oE oE  pE pE  pE 0pE @pE PpE `pE ppE pE pE pE pE pE pE pE pE  qE qE  qE 0qE @qE PqE `qE pqE qE qE qE qE qE qE qE qE  rE rE  rE 0rE @rE PrE `rE prE rE rE rE rE rE rE rE rE  sE sE  sE 0sE @sE PsE `sE psE sE sE sE sE sE sE sE sE  tE tE  tE 0tE @tE PtE `tE ptE tE tE tE tE tE tE tE tE  uE uE  uE 0uE @uE PuE `uE puE uE uE uE uE uE uE uE uE  vE vE  vE 0vE @vE PvE `vE pvE vE vE vE vE vE vE vE vE  wE wE  wE 0wE @wE PwE `wE pwE wE wE wE wE wE wE wE wE  xE xE  xE 0xE @xE PxE `xE pxE xE xE xE xE xE xE xE xE  yE yE  yE 0yE @yE PyE `yE pyE yE yE yE yE yE yE yE yE  zE zE  zE 0zE @zE PzE `zE pzE zE zE zE zE zE zE zE zE  {E {E  {E 0{E @{E P{E `{E p{E {E {E {E {E {E {E {E {E  |E |E  |E 0|E @|E P|E `|E p|E |E |E |E |E |E |E |E |E  }E }E  }E 0}E @}E P}E `}E p}E }E }E }E }E }E }E }E }E  ~E ~E  ~E 0~E @~E P~E `~E p~E ~E ~E ~E ~E ~E ~E ~E ~E  E E  E 0E @E PE `E pE E E E E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȀE ЀE ؀E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȁE ЁE ؁E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȂE ЂE ؂E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȃE ЃE ؃E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȄE ЄE ؄E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȅE ЅE ؅E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȆE ІE ؆E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȇE ЇE ؇E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȈE ЈE ؈E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȉE ЉE ؉E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȊE ЊE ؊E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȋE ЋE ؋E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȌE ЌE ،E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȍE ЍE ؍E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȎE ЎE ؎E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȏE ЏE ؏E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȐE АE ؐE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȑE БE ؑE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȒE ВE ؒE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȓE ГE ؓE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȔE ДE ؔE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȕE ЕE ؕE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȖE ЖE ؖE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȗE ЗE ؗE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȘE ИE ؘE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E șE ЙE ؙE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȚE КE ؚE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E țE ЛE ؛E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȜE МE ؜E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȝE НE ؝E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȞE ОE ؞E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȟE ПE ؟E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȠE РE ؠE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȡE СE ءE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȢE ТE آE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȣE УE أE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȤE ФE ؤE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȥE ХE إE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȦE ЦE ئE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȧE ЧE اE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȨE ШE بE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȩE ЩE ةE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȪE ЪE تE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȫE ЫE ثE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȬE ЬE جE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȭE ЭE حE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȮE ЮE خE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȯE ЯE دE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȰE аE ذE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȱE бE رE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȲE вE زE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȳE гE سE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȴE дE شE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȵE еE صE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȶE жE ضE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȷE зE طE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȸE иE ظE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȹE йE عE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȺE кE غE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E53ee53c46-38f7-11f0-16c9-2b093684d981/195acae2fa071a1alayoutxaxistitletextEpisodestemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  yaxistitletextSteps per episodeconfigshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatayٚD 
D  #C  TC C33?C  +C̺BBB  BB CBB33BLBBffBffB  BA33AAA33A  A33AA33A  AA̔A33sA  AAffA̔AAffA|AffAffA33A  A33ĀA33A  Atypescattername0 planning stepsx   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HByffC  PB33BAA  AAyAyAiA  AǍAyAAyA  A|AA  A|A  pA  AlA33AA|A|AyAffvA33sAyA  pA  AA33A  pĀAffvAiA  A|ĀA33sAĀAffvAyAyAtypescattername5 planning stepsx   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HBy33BAyĀǍA33A  AyAA33A33ǍAA  A|A33AAAyAffvǍA  pA  AA  A  ĀA  A33A  A|AAffA  A33AffAffvAĀA33ĀĀA33ǍAA  A  ǍĀAtypescattername50 planning stepsx   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB53ee53c46-38f7-11f0-16c9-2b093684d981/f514ba9bca5ec68dlayoutautosize§padding    xaxisshowgridèshowlineègridwith?  gridcolorblackzerolineètickvals$  ?   @  @@  @  @  @  @   A  Arange  ?   Amirrorèticktextlinecolorblackpaper_bgcolorrgba(0, 0, 0, 0)templatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    heightCH  marginlBH  bBH  rBH  tBp  yaxisshowgridèshowlineégridcolorblackgridwidth?  tickvals  ?   @  @@  @  @  @range  ?  @mirrorèticktextlinecolorblacktitlefontsizeA`  text Optimal policy <br> path examplex?   widthC  configshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdata showlegend¤modetexttextpositionlefty  @typescattertextSx  ?showlegend¤modetexttextpositionlefty  @typescattertextGx  Ashowlegend¤modelineslinecolorbluey  @  `@typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  `@  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  `@typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  `@  @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  @  `@typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey  `@   @typescatternameOptimal Pathx  ?  ?showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  ?   @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx   @  `@showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  `@  @showlegend¤modelineslinecolorbluey   @   @typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey   @  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  @showlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  @  Ashowlegend¤modelineslinecolorbluey  ?  ?typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  ?   @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey   @  `@typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  `@  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modelineslinecolorbluey  @  @typescatternameOptimal Pathx  A  Ashowlegend¤modetexttextpositionlefty  `@typescattertextWx33s@showlegend¤modetexttextpositionlefty  @typescattertextWx33s@showlegend¤modetexttextpositionlefty  @typescattertextWx33s@showlegend¤modetexttextpositionlefty   @typescattertextWx@showlegend¤modetexttextpositionlefty  @typescattertextWxAshowlegend¤modetexttextpositionlefty  @typescattertextWxAshowlegend¤modetexttextpositionlefty  @typescattertextWxA53ee53c46-38f7-11f0-16c9-2b093684d981/95a7829c5a22024flayoutxaxistitletext%Computation time, in expected updatestemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  yaxistitletext(Value of start state under greedy policyconfigshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay,    ew=?J@ω@k@-@<@i@^@@typescatternameb = 1, uniformx,     DF DG fjG DG UG fGH DH/H UCHy,    M$>>D?jϊ?7? ?Fp??a?6  @typescatternameb = 3, uniformx,     DF DG fjG DG UG fGH DH/H UCHy,    8>@r@@@_@b@*@@@typescatternameb = 1, on-policyx,      ? BF AG ajG@GPG`G@H@@H@/Hy,    ^>c??T?#J?щ@i@G@uQ@f@typescatternameb = 3, on-policyx,      ? BF AG ajG@GPG`G@H@@H@/H53ee53c46-38f7-11f0-16c9-2b093684d981/d28007b66490ffa3layoutxaxis1showlineégridcolorblacktickvals$  ?   @  @@  @  @  @  @   A  Arange  ?   Adomain    ff>ticktextlinecolorblackshowgridègridwith?  zerolineæmirroræanchory1yaxis1showlineégridcolorblackgridwidth?  tickvals  ?   @  @@  @  @  @range  ?  @domain      ?ticktextlinecolorblackshowgridæmirroræanchorx1templatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    xaxis2showlineégridcolorblacktickvals$  ?   @  @@  @  @  @  @   A  Arange  ?   Adomain?  ?ticktextlinecolorblackshowgridègridwith?  zerolineæmirroræanchory2marginlBH  bBH  rBH  tBp  yaxis2showlineégridcolorblackgridwidth?  tickvals  ?   @  @@  @  @  @range  ?  @domain      ?ticktextlinecolorblackshowgridæmirroræanchorx2annotationsyanchorbottomxanchorcentery?  fontsizeA  showarrow¤yrefpapertextBlocking Maze Steps <= 1000xrefpaperx>fffyanchorbottomxanchorcentery?  fontsizeA  showarrow¤yrefpapertextBlocking Maze Steps > 1000xrefpaperx?FffconfigshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatamshowlegend¤modetextxaxisx1textpositionlefty  ?typescattertextSyaxisy1x  @showlegend¤modetextxaxisx1textpositionlefty  @typescattertextGyaxisy1x  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  `@typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  `@   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  `@typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  `@   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  Ashowlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y   @  `@typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  `@  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1xff?showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x333@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x33s@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1xAshowlegend¤modetextxaxisx2textpositionlefty  ?typescattertextSyaxisy2x  @showlegend¤modetextxaxisx2textpositionlefty  @typescattertextGyaxisy2x  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y   @  `@typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  `@  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  @showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  @  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x333@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x33s@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2xAshowlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2xA53ee53c46-38f7-11f0-16c9-2b093684d981/e3f0ea7a069278b6layoutxaxistypelogtitletextMaze Statestemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  yaxistypelogtitletextUpdates until optimal solutionconfigshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay  4C  C D hDtypescatternameprioritized sweepingx  XB  B  B  XCy 8E G F `jGtypescatternameDyna-Qx  XB  B  B  XC53ee53c46-38f7-11f0-16c9-2b093684d981/69fe4d8c476440b4layoutxaxis1showlineégridcolorblacktickvals$  ?   @  @@  @  @  @  @   A  Arange  ?   Adomain    ff>ticktextlinecolorblackshowgridègridwith?  zerolineæmirroræanchory1yaxis1showlineégridcolorblackgridwidth?  tickvals  ?   @  @@  @  @  @range  ?  @domain      ?ticktextlinecolorblackshowgridæmirroræanchorx1templatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    xaxis2showlineégridcolorblacktickvals$  ?   @  @@  @  @  @  @   A  Arange  ?   Adomain?  ?ticktextlinecolorblackshowgridègridwith?  zerolineæmirroræanchory2marginlBH  bBH  rBH  tBp  yaxis2showlineégridcolorblackgridwidth?  tickvals  ?   @  @@  @  @  @range  ?  @domain      ?ticktextlinecolorblackshowgridæmirroræanchorx2annotationsyanchorbottomxanchorcentery?  fontsizeA  showarrow¤yrefpapertextShortcut Maze Steps <= 3000xrefpaperx>fffyanchorbottomxanchorcentery?  fontsizeA  showarrow¤yrefpapertextShortcut Maze Steps > 3000xrefpaperx?FffconfigshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatashowlegend¤modetextxaxisx1textpositionlefty  ?typescattertextSyaxisy1x  @showlegend¤modetextxaxisx1textpositionlefty  @typescattertextGyaxisy1x  Ashowlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y   @  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  ?  ?typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  ?   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y   @  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  `@  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  @  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  A  Ashowlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x333@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x33s@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x@showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1xAshowlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1xAshowlegend¤modetextxaxisx2textpositionlefty  ?typescattertextSyaxisy2x  @showlegend¤modetextxaxisx2textpositionlefty  @typescattertextGyaxisy2x  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  Ashowlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  Ashowlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  A  @showlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @  `@typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  `@   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  @showlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  @  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?  ?typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  ?   @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y   @  `@typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  `@  `@typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  `@  `@typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  `@  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  A  Ashowlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x333@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x33s@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  `@typescattertextWyaxisy2xA53ee53c46-38f7-11f0-16c9-2b093684d981/8b0fca3c029bef9blayouttemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  configshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ====================================================L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>>>>>>>>>>>>>   ?   ?   ?   ?   ?   ?   ?   ?   ?????????????????????L?L?L?L?L?L?L?L?L?L?L?fff?fff?fff?  ?  ?  ?  ?  ?  ?  ?̌?̌?̌?̌?̌?̌????????ff?33?33?33?33?  ?  ?  ?  ?  ?  ?  ?  ?  ???????????ff?ff?ff?ff?33?33?33?33?33?33?33?33?33?33?33?   @   @   @   @   @   @ff@ff@@@@@33@33@33@33@33@33@33@33@33@33@@   @   @   @   @ff&@ff&@ff&@ff&@ff&@ff&@ff&@,@,@,@333@333@333@333@333@333@333@333@333@333@333@9@9@  @@ffF@ffF@ffF@ffF@ffF@ffF@ffF@L@L@L@L@L@33S@33S@33S@33S@33S@33S@33S@33S@33S@  `@fff@fff@fff@fff@fff@fff@fff@fff@fff@fff@fff@fff@fff@l@33s@33s@y@y@  @  @  @  @  @  @  @  @33@33@ff@@@@̌@̌@̌@̌@̌@  @  @  @ff@@@@@@@@@@̜@̜@  @33@33@33@33@33@ff@@@@̬@̬@  @  @33@33@ff@@@@@@̼@  @33@33@ff@ff@ff@ff@ff@ff@@@@  @33@ff@ff@ff@@@@@@  @  @33@33@33@ff@ff@@@@@  @33@ff@ff@@@@@@@@   AAAffAffAffA  A  A  A  A	A33A33AAAffAffAffAAAAAffA  A  A  A  A  AAAAA   A   A   A   A   A   A   A!A!A!A$Aff&A)A)A)A33+A33+A33+A33+A,Aff.Aff.A  0A1A333A4A4A4Aff6Aff6A  8A9A9A33;A33;A<Aff>A  @A  @A  @A  @A  @A  @AAA33CA33CAffFAIA33KA33KA33KA33KA33KALAffNAffNAffNAffNA33SAffVAffVAffVAffVAffVAffVA  XA  XA  XA  XAYAff^AaAaAaAaAaAaAaAaA33cAdA  hAiAiAiAiAiA33kAlAffnAffnA  pA  pAqAqA33sA33sAtAtAffvA  xA  xA  xA33{A|A|Aff~Aff~Aff~A  A  A  A  AAffA33A  A  A  A  A  ĀĀAAAffA  ÄAAAAAAAA33A33AAAA33A33A33A33A33A33A33A33A̐AA33A  A  A  A  A  A̔A̔A̔AAffA33A  A̘AAffAffAffAffAffA  A̜AAffAffAffA33A33A  A  A  A̠AAffA33A33A  A  A  A̤AffAffA33A33ĄAAffA33A33A33A33A  AAAffA  A  A  A̰A̰AAffA33A  AAAffA33A33A33A33AAffAffA33A33A  AAffAffAffA33A  AAAffAffA  A  A  AAAffAffA  AAAAA33A33AAAAAffAffA  A  AA33A33A33A  A  A  AAffAffA33A  AAAA33A33AAAAAffA33A  AAAAffA33A33A  AAAAffA  A  A  A  AAAffAffAffAAAA33A  AAAAAAffAffA33AAAA33AAAAAAAAffA33A  A  AA33A33A   Bff B B B B B B BffBB33BBffBBBBBBBB  BffB33B  B  B  BffBffBffBffBB	B  
B  
Bff
B
BB  BffBffBBBB33BBffBBB33BBBBBBB33B  BffBBBBBBBBBBBBB33B  BB33BBBBBB  B  BBBBffBBBBB  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  BffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBBBBBBBBBBBBBBBBBBBBBBBBB33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33BBBBBBBBBBBBBBBBBBBBBBBBBBB  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  BffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBBBBBBBBBBBBBBBBBBBBBBBBBBB33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33BBBBBBBBBBBBBBBBBBBBBBBBB   B   B   B   B   B   B   B   B   B   B   B   B   B   B   B   B   B   B   B   B   B   Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff Bff B B B B B B B B B B B B B B B B B B B B B B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B33!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "B  "Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B"B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B33#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B#B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $B  $Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$Bff$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B33%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B%B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &B  &Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&Bff&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B&B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B33'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B'B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(Bff(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B(B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B33)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B)B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *B  *Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*Bff*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B33+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B+B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,Bff,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B  .B  .B  .B  .B  .B  .B  .B  .B  .B  .B  .B  .B  .B  .B  .B  .B  .B  .Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B33/B33/B33/B33/B33/B33/B33/B33/B33/B33/B33/B33/B33/B33/B33/B33/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B/B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0B  0Bff0Bff0Bff0Bff0Bff0Bff0Bff0Bff0Bff0Bff0Bff0Bff0Bff0B0B0B0B0B0B0B0B331B331B331B331B331B331B331B331B331B331B331B331B331B331B331B331B331B331B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B  2B  2B  2B  2B  2B  2B  2Bff2Bff2Bff2Bff2Bff2Bff2Bff2Bff2Bff2Bff2Bff2Bff2Bff2Bff2Bff2B2B2B2B2B2B2B2B2B2B2B2B2B333B333B333B333B333B333B333B333B333B333B333B3B3B3B3B3B3B3B3B3B3B3B3B3B3B  4B  4B  4B  4B  4B  4B  4B  4B  4B  4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4B4B335B335B335B335B335B335B335B335B335B335B335B335B335B335B335B335B335B335B335B335B335B335B5B5B  6B  6B  6B  6B  6B  6B  6B  6B  6B  6B  6B  6B  6B  6B  6Bff6Bff6Bff6Bff6Bff6Bff6Bff6Bff6Bff6Bff6Bff6Bff6B6B6B6B6B6B6B6B6B6B6B6B6B6B6B337B337B337B337B337B337B337B337B337B337B337B7B  8B  8B  8B  8B  8B  8B  8B  8B  8B  8B  8B  8B  8B  8B  8B  8B  8Bff8Bff8Bff8Bff8Bff8Bff8Bff8Bff8Bff8Bff8B8B8B8B8B8B8B8B8B8B8B9B9B9B9B9B9B9B9B9B9B9B9B9B  :B  :B  :Bff:Bff:Bff:Bff:Bff:Bff:Bff:Bff:Bff:Bff:Bff:Bff:Bff:B:B:B:B:B33;B33;B33;B33;B;B;B;B;B;B;B;B;B;B;B;B  <B  <B  <B  <B  <B  <B  <B<B<B<B<B<B<B<B<B<B<B<B<B<B<B<B33=B33=B33=B=B=B=B=B=B=B=B=B=B=B=B  >B  >B  >B  >B  >B  >B  >B>B>B>B>B>B>B>B>B>B>B>B>B>B33?B33?B33?B33?B33?B33?B33?B?B?B?B?B?B?B  @B  @B  @B  @B  @B  @B  @B  @B  @B  @Bff@Bff@B@B@B@B@B@B@B@B@B33AB33AB33AB33AB33AB33AB33AB33AB33AB33AB33AB33ABABAB  BB  BB  BB  BB  BBffBBffBBffBBffBBffBBffBBffBBffBBffBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB33CB33CB33CB33CBCBCBCBCBCBCBCBCBCBCB  DB  DB  DB  DB  DB  DBffDBffDBffDBffDBffDBffDBffDBffDBffDBffDBDBDBDBDB33EB33EB33EB33EB33EB33EB33EBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEBEB  FB  FBffFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBGBGBGB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HBffHBffHBHBHBHB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB33IB  JB  JB  JBffJBffJBffJBffJBffJBffJBffJBJBJBJBJBJBJBJBJBJBJBKBKBKBKBKB  LB  LB  LB  LB  LB  LB  LB  LB  LB  LB  LB  LB  LBffLBffLBtypescatternameDyna-Qx.  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;Ey.                                                                                                                                                                                                                            ====================L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>>>>>>>>>>>   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?333?333?333?333?333?333?333?333?333?333?333?333?333?L?L?L?fff?fff?  ?  ?  ?  ?  ?̌?̌?̌?̌??????ff?ff?ff?ff?33?  ?  ?  ?  ?  ???????ff?ff?ff?   @   @   @   @   @   @   @   @   @   @   @ff@@@@@   @   @   @   @   @ff&@ff&@ff&@ff&@ff&@,@,@333@9@  @@ffF@ffF@ffF@ffF@ffF@33S@Y@Y@Y@Y@Y@fff@l@33s@  @  @  @  @  @  @33@ff@ff@@@  @33@ff@ff@@̜@̜@̜@̜@̜@  @33@33@ff@̬@  @  @  @33@33@ff@ff@ff@@  @33@@@@@@  @  @  @  @  @ff@@  @33@ff@ff@ff@@@@@@@@33@ff@@@   AAAA33AAAffA  A33A33AAffA  A  A  A  AAA33AAffA  A  AAAffA   A   A   A!A!A!A!A33#A33#A$Aff&A  (A)A,A,Aff.Aff.A  0A1A1A333A4A4A4A4Aff6Aff6A  8A9A33;A  @AAAAADADADAffFAffFAffFA  HA  HA  HAIAIAffNA  PA  PA  PAQA33SATAffVA  XAYA33[A33[A\A\Aff^Aff^A  `A  `A  `AaA  hA  hA  hA33kA33kA33kAlAlAlAlA33sA33sAtAffvAffvA  xAyAyA33{A|A|A|A  AA33A  A  A  A  ĀAAAAffA  A  A33A33A33A  A  A  A  ǍǍAAffA33A  AAffA  A  A  A  A  A  A̔A̔A33AA  A  A  A  A  A  A  A  AAA33A33AAAA33A33A33A33A33A33A̤AAAffA33A  ĄĄAAffA33A33A  A̬A̬A̬AffA33A  A̰AffAffAffA33A  A̴A̴AffA33A  A  A  A̸AA33A33A33A̼AAffAffA33A33A33A  A  AAA  AAAAffAffAffAffA33A33A  AAffA  AAAffAffA33A33A33A33A  AA33A33A33AAAA33A33A33A33AAAAffA33A  A  AffA33A33A  A  A  AAAAA33AAAAffA33A33A  A  A  AAffA33A  AAAAffAffA33A  AAAA33A33A33A  AffAffAffAffAffA33A  AA33A33A33A33A  AAffAffAffAffAffAff Bff Bff Bff Bff Bff BffBffBffBffB33B33BBBBBB  BBBffBffBffBB33BBBB  BffB33	B33	B	B  
Bff
Bff
Bff
B
B33BB  B  BffBffB33B33BBBffBffB33B33B  B  BffB33B33B33BBBB  B  BBB  BffBBBB33B33B33B33B33B  BBBBBBB  B  B  B  BB  B  B  BffBB33BBBBffB33B33B33BB  B  B  BBB   B   Bff Bff Bff B B33!B33!B33!B  "B  "Bff"B"B33#B  $B$B$B33%B33%B%B%B  &B  &B  &B  &B&B&B&B33'B(B33)B)B)B)B  *Bff*B*B*B*B*B33+B+B33-B-B-B-B-B  .Bff.Bff.B33/B33/B33/B  0Bff0B0B331B1B1B1Bff2Bff2Bff2B2B2B2B2B  4B4B4B5B5B  6B6B6B6B6B337B7B7B  8B  8Bff8B8B9Bff:Bff:B:B33;B33;B33;B33;B33;B;B  <B<B33=B  >B  >Bff>B>B33?B33?B?B?B  @B  @B@B33AB33ABAB  BBffBBBBBBCBCBCBffDBDBDBDB33EB  FBffFBFBFB33GBGBGBGBffHBffHBHB33IB  JBJBJBJB33KB33KB33KB33KB  LBLBLB  NB  NB  NBffNBNB33OB33OBOBOBffPBPBPB33QB33QB  RBffRBRBRB33SB  TBffTBffTBTB33UBUB  VB  VB  VB  VBVB33WB33WB  XBffXBXB33YBYB  ZB  ZB  ZBffZBZBZB33[B33[B  \B\B\B33]B33]B]Bff^Bff^Bff^Bff^B^B_B  `Bff`Bff`Bff`B`B33aB33aB  bB  bBbB33cB  dBffdBffdBdBdB33eB33eB33eBeBeB  fBgB  hBffhBffhBffhBhB33iB33iB33iBiBffjBffjB33kBkBkB  lBfflB33mB33mB33mB33mBmBffnBffnBffnBffnBnB33oB  pBffpB33qB33qB33qB  rB  rBffrBffrBffrBffrBrBrBsBfftBfftB33uB33uBuB  vB  vB  vB  vBvB33wBwB  xB  xBxB33yB33yByB  zBffzBzB33{B33{B33{B{B  |Bff|Bff|B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B}B  ~B  ~B  ~B  ~B  ~B  ~B  ~B  ~B  ~B  ~B  ~Bff~Bff~Bff~Bff~Bff~Bff~Bff~Bff~Bff~B~B~B~B~B~B~B~B~B~B~B~B33B33B33B33B33BBB  B  B  B  B  B  B  B  B  B  B  B  B33B33B33B33B33B33B33BffBffBffBffBffBBBBB̀B̀B̀B̀B̀B̀B̀B̀B̀B̀B̀B̀B̀B  B33B33B33B33B33BffBffBffBffBBB́B́B́B́B  B  B  B  B  B  B  B  B  B  B  B  B33B33B33B33BBBBBBBBBBBBBB̂B̂B̂B  B33B33B33B33BffBffBffBffBffBffBffBffBffBffBBBB  B  B  B  B  B33B33B33B33B33B33B33B33B33B33B33B33BffBffBB̄B̄B̄B  B  B  B  B  B  B  BffBffBffBB̅B̅B  B  B  B  B33B33B33B33B33B33B33BffBffBffBBB̆B̆B  B  B  B33B33B33B33BffBffBBBḂḂḂḂḂḂḂḂḂḂḂḂB  B  B  B  B33BB̈B  B  B  B  B  B  B33B33B33B33B33BffBffBffBffBffBBB̉B  B  BffBffBffBffBffBBBBBBBBB̊B̊B  B  B  B33BffBffBffBffB̋B̋B̋B  B  B  B  B  B33BffBffBffBffBffBBBBBB  B  B  B33B33B33B33BffBffBffBffBffBffB̍B  B  B  B  B  B33B33BffBffBB̎B  B  B  B  B  B  B  B  B  B  BffBffBB̏B  B  BffBffBffBBBBBBB̐B̐B̐B̐B̐B̐B̐B  BffBffBB̑B̑B  B  BffBffBffBffBffBffBffBffBffBBBB̒B  B33B33B33B33B33BB̓B  B  B  B33B33B33B33B33BffBffBffBffBffB̔B  B  B33BffBffBBB̕B  B  B  B  B  B  B  B33BffB̖B33B33B33BffBffBBBBB̗B̗B̗B  B  B  B  B  B  B33BB̘BffBffBffBffBffBffBffBffBffBBB̙B̙B̙B  B  B33BB̚B  B33B33B33B33BffBffBffBffBffBffBffB̛B̛B̛B̛B̛B  B  B  B33BffB̜B̜B  B  B33B33B33BBBBBBB̝B̝B̝B̝B  BBB̞B̞B  B33B33B33B33B33B33B33B33BffBffBffBffB̟B  B33BffBB̠B  B  B33B33B33B33B33B33B33B33B33B33BBBB  B33B33BffBBB̢B  B33B33B33B33B33B33B33BffBffBffBḄB  B33B33B33BffBffBffBBB  B33B33B33B33B33B33B33B33B33B33B33BB  B  B  B33B33B̦B  B  B33B33B33B33B33B33B33B33BffBffBffB̧B̧B̧B  B  B  B  BffB̨B  B33B33B33B33B33B33B33BffBB  B  B  B  B  B  B33BffBB̪B̪B  B  B  B33BffBffBBBB̫B̫B̫B  B  B  B  B33B33BffB̬B  B  B33B33B33BBBBBBB̭B̭B  B33B33B33B33BBBBBffBffBffBffBBBBB̯B̯B  B  B  BffBBBBB  B33B33BffBffBffBffḆḆḆḆB  B  B33B33B33B33BffBB̲B̲B̲B̲B̲B33B33B33B33B33B33BffBffBffBB̳B  B33B33BffB̴B̴B̴B̴B  B  B  B  B  B33B33BffBffBBBB̵B33BffBffBffBBBBBBBB̶B  B  B33B33B33BffBB̷B  B  B  B  B  B  B33BffBffBffBffBffBffBB̸B  B  BB̹B̹B̹B̹B̹B̹B̹B̹B̹B̹B̹B  B33B33BffBffB̺B  B  B  B̻B̻B̻B̻B̻B̻B̻B̻B  B  B  B  BB̼B  B  B  B  B33B33BffBB̽B̽B̽B̽B̽B̽B33BffBBB̾B̾B̾B  B  B33B33B33BffBB̿B̿B̿B̿B̿B33B33B33B33B33BffBffBBBB33BffBBBBB  B  B33B33B33B33BffBffBffBffBB  B  B33B33B33BBBBB  B  B  B  B  B  B  B  B33BBB  B  B  B33B33BffBBBBB  B  B  B  B  B33BffBBBBB33BffBBBBBBBBB  B  B  B  B33BffBBBBB  B33BffBffBffBffBBBB  B  B  B33B33B33BffBBBBBBB  B  B33B33BffBB  B  B  B33B33B33B33B33B33B33BffBBBBB  B  B33B33BffBBBBB  B  B33B33B33B33B33B33BffBffBffBB  B  B  B33BffBBBBB  B  B  B  B  B33B33BffBffBB  B  B  B  B33BffBffBB  B  B  B  B  B  B  B  B33BBBB  B  B33BffBBBBBBBB  B  B  B  B  B  B  BffB  B33B33B33B33BffBBBBBBBBBB  B33BffBffBffBBB33B33B33B33BffBBBBBBB  B  B  B  B33B33B  B  B  B  B  B33B33BBBBBBBBBBB33BffBffBBBB33B33BffBBBBBBBBBBBB  BffBffBBB33B33B33BBBBBBBBBBBBB33B33B33B33BffBffBffB  B33B33BBBBBBBBBB33B33B33B33B33BffBffBB33B33B33BffBffBffBffBffBBB  B  B  B33B33B33B33BBBB  B  B  BffBffBffBffBffBffBB  B  B  B33B33B33B33B33BBBBB  B33B33B33B33BffBffBBBBBBBB33B33B33BffBffBffBffB  B33B33BffBffBffBffBffBffBffBffBBB  B33B33BffBffBBB  B33B33B33B33B33B33B33BBBB  B33B33B33B33B33B33BBBBB33B33BffBffBBBBBB  B  B  B  B33B33B33BBBBBBBB  B33B33BffBBBBB  B  B  B  B  B33B33BBBBBB  B33BffBBBBBBBB  B33B33B33B33BffBffBBBB  B  B33BffBffBBBBBB  B  B33B33BBBBB  B  B  B  B  B33BffBBBB  B  B33BffBffBBBBBBB33B33B33B33B33B33BffBBBB  B  B33BffBffBBBBBBBBB33BffBBBBBBBBB  B33B33B33B33B33BffBBB  B  BffBffBffBffBBBBBB  B  B33BBBBBBBBB  B33B33BBBBBB33B33B33BffBffBffBffBBBB  B  B  B  B  B  BffBffBBB  B  B  BffBffBffBffBffBBBBBBBB33B33BBBBBB   C   C CL CL CL CL CL CL CL CL CL Cff C  C C3 C3 C C Cf Cf Cf Cf C  C  CC33C33C33CLCLCLCLC CCC3CCfCfCfC  C  C  CCCCLCLCLCLCLCLCffCffC C C C3CCfCfCCCCCCCC33C33CLCLCLCffCffCffC CCC  CCCCCCC33C33C33C33C33CLCLCLC CCCCCCCCC33C33C33C33C33C33C33C33C33CLCLC C C CCCfC  C  CC33C33C33C33C33C33C33C33C33CLCLC C CCCC3CfCfC  C  CCCCCCCC33CLCLCLCffC C C CC3CCCfCfC  C  C  C  CCCCC33CLCLC CCCCCCCCfCfCfCfC  	C  	C  	C	C33	CL	Cff	Cff	Cff	C 	C 	C	C3	C3	C3	C3	C	C	C	Cf	C  
C  
C  
C
C
C
C
CL
Cff
C 
C
C
C
C
C
C3
C3
C3
C  C  C  C  C  CCffCffC C C C C CCCC3C3CCCfCfCfCC33CLCLCLCLCffCffCffC C C C C3C3CfC  C  C  C  C  C  C  C  CCLCLCffCffCffCffC C C C CCCCC  C  C  C  C  C  C  CC33C33CLCffCffCffCffCffCffCffCCC  C  C  C  CCCC33C33CLCLCLCLCLCtypescatternameDyna-Q+x.  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;E53ee53c46-38f7-11f0-16c9-2b093684d981/cb4cbc067ea31403layoutxaxistickvals      ?   @titleNumber of max Q computationsticktext    1b2btemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  yaxistitletextRMS error in value estimatesconfigshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay  ?5?   ?>>typescatternameb = 2x       ?  ?  ?   @yT  ?r?+?7?>$9>K>M>㺫>>>s>7>S>Ё>z>r>k>.d>^>$9Y>typescatternameb = 10xT    =L>>>   ??333?L?fff?  ?̌??ff?33?  ???ff?33?   @y$  ?~?4??>\>><>>ϩ>>>>J>&>>~>w>8&p>i>\c>U^>$9Y>rT>O>K>G>D><@>2=>:>s6>4>\1>.>Q8,>)>0'>6H%>9&#>!>>6>3`>>=>I9>>>m>>>J>>w
>Ob	>&>>>,>>s>qe>}] >====={P=K==8&===L==8=\=UC=\=8j===U===w=$9===Ӝ=r=M=-=/=======	=======-=TJ=i=<==پ==2={c==~̺==?=|==s=B=*=Ѵ==i==	=\===Xa==k=v=֬=Q8== =fg=ϩ=9=㤨==0==\a=ԥ=6H==4==9&= =
=T===z===-=(=C=6==~I=Vԛ=3`==z=	==]*==N===v==7=I9=4ѕ=i===.9=1Փ=q==譒=M==m=.=А=s==typescatternameb = 100x$    
#<
ף<<
#=L=u=)\=
ף=Q==G==>)\>>
#>{.>Q8>\B>L>=
W>Ga>k>u>  >>q=>)\>z>>R>
ף>>{>33>Q>p>\>>>>=
>(>G>ff>>ף>>H>   ?\???q=
??)\??z?=
??(?R?G!?
#?ff&?(?+?{.?ף0?333?5?Q8?H:?p=?  @?\B?E?G?q=J?L?)\O?Q?zT?=
W?Y?(\?R^?Ga?
c?fff?h?k?{n?ףp?33s?u?Qx?Hz?p}?  ?G?\?
׃??ff???q=??̌?{?)\?ף??33?z??=
?Q??H?(?p?R?  ?G?\?
ף??ff???q=??̬?{?)\?ף??33?z?µ?=
?Q??H?(?p?R?  ?G?\?
??ff???q=???{?)\?ף??33?z??=
?Q??H?(?p?R?  ?G?\?
??ff???q=???{?)\?ף??33?z??=
?Q??H?(?p?R?   @yD  ?9?4?N?9>>)>k>>є>ӡ>K>N>>Ĉ>!>9>v;x>=q>j>d>W_>V5Z>wiU>)P>L>H>hD>kA>>>:>7>4>*2>׆/>C ->є*>B(>&>#>!>>x>>K>>>J>N>j6>8>%Q>>=>pG>
>>u>c>,?>!>P>> >9=f===v;=Km==k=====I]==HF===M==q==N=W=='=vu=V5==+=Ԕ=wi=B="!==)======I=̱====|=h==+=TJ=k=3====4>=|p=^=ܺ==S=Б=ҷ=K=[=ţ==9==Yز=*=~=԰=,=׆==
@=J=C =b=Dǫ==-=є==h=Ԩ=B=ޱ="===|=4=j==]=A٢=U=ӡ=S=[Ӡ=T=ן=Z[=J=Uf=x=u==A===K.==K=1ܙ=em===&=`=Q==$=o==J=D=Ԁ=-=N=4X==D=j6=Kב=x=4=8=a=S=f=%Q===OF===7A=l===A==C=pG=0==bR==ʱ=Ob=]=Ĉ=w=)=܇=u=D===^=c==Ѕ==,?="==ih=!=xۃ==EP=P=Ƃ==>==ɸ=Mv=74==8=Mp=/=9=_=~=b~=f}=h}=|=q|={=L}{=*{=z=z=՜y=c&y=x=v;x=w=Sw=v=Kmv=Qu=u=5u=t=9t=s=3\s=kr=8r=r=q==q=p=gp=o=o=+o=n=[n=m=m='m=cl=I]l=k=k=0k=j=Bkj=	j=wi=HFi=h=Th=%h==g=agg=g=f=Mf=qe=Гe=7e=d=d=%d=&c=qc=qc=5b=ceb=b=a=W]a= a=N`=X`=`=-_=W_=_=~^=YZ^=^=-]=$`]=w]='\=3i\=\=[[=vu[=$[=Z=ۄZ=V5Z=(Y=PY=HY=X=ƬX=?_X=X=+W=xW=^,W=qV=ԔV=IV=U=ٳU=wiU=cU=T= T=BT=S=uS='iS="!S=gR=R=JR=R=OQ=vQ=0Q=)P=P=l`P=uP=O=SO=(NO=?
O=N=5N=@N=3M=M=3xM=6M=5L=L=3qL=0L=+K=K=nK=-K=J=IJ=nJ=/J=I=̱I=?sI=4I=H=H=O{H==H= H=G=G=ZJG=G=F=F=DZF=F=|E=hE=mE=2E=hD=%D=D=:JD=D=C=םC=dC=+C=8B=B=oB=TJB=iB=A=$A=kA=4A=@=@=3@=Y@=#@=j?=?=Ɂ?=<L?=?=>=>=w>=C>=>=:====r==4>==
==<=<=|p<=w=<=
<=;=^;=r;=@;=;=:=
:=qy:= H:=:=9=9=9=S9="9=%8=8=Б8=a8=28=j8=7=7=Pt7=;E7=K7=~6=ո6=O6=[6=-6=5=5=ţ5=v5=H5=5=4=4=4=f4=94=A4=3=\3=3=[3=/3=3=Y2=2=82=U2=*2=v1=t1=1=~1='T1=)1=90=0=Ī0=0=V0=,0=B0=/=3/=׆/=]/=x4/=s/=.=.=.=h.=
@.=.=r-=P-=J-=_w-=O-='-=C -=,=c,=,=b,=;,=,=+=D+=+=z+=S+==-+=+=*=ƺ*=є*=n*=3I*=#*=)=)=#)=ݍ)=h)=C)=)=(=(=7(=(=g(=B(=R(='='=ޱ'='=j'=:F'="'=&=e&=&=&=[q&=/N&=+&=&=1%=^%=%=|%=hZ%=7%=%=4$=$=Ѯ$=$=j$=H$=
'$=M$=#=#=#=&#=]#=<#=`#=F"=A"=P"=r"=v"=U"=Q5"="=H!=!=!=L!=s!=S!=2!=
!=) =[ = = =at =T =m5 = ===c=N=Kz=Z[={<===J==-==Uf=H=)==x=k=p==u=W=.:===m===A=k=N=1====ý==0=~g=J=K.==V===]=(=h=K=/==	=1=g===em=Q=X6===4===={w=q\=uA=&====`==!=k=Q=6=J===z=P=3=$=#e=/K=I1=o===4===o}=c=J=1===D===ݙ=Ԁ=g=N=6=-=c===N==(=p=4X=?=p'= ===x=X=D=<~=?f=ON=j6====K== =m=x=ga=I=2=4===f=8===x=a=J=4=*=S====f=Ɣ=0~=g=%Q=:=D$===A==ȴ==y=ar=S\=OF=V0=g=====R===Wl=V=7A=+=>= =l===z===
=k=V=A=,=======C==p=\=pG=2=>=	=0
=
=G
=
=
=,
=z
=f
=bR
=0>
=*
=
=
=	=	=	=ʱ	=ޝ	=	=!v	=Ob	=N	=:	='	=]	=====l==z=w=c=MP=<=)=j=.======u=r}=wj=W=D=1=====y==
=^===v=c=uQ=>=,===L===Z==ߙ==u=^c=AQ=,?=-==	="=2=I=g===='z=ih=V=E=Z3=!====x=====D=r=a=EP=>=-==P=$========q=`=O=>=.=D=u===-=x=ɸ= =~==Mv=e=5U=D=74=#=R== =) = = =8 = = = =Mp ="` =O =? =/ = = =;<9<C<Y<{<_<?<) <z <<@<<6<b<YC<#<<f<,<<ۇ<h<I<*<<<<&<^<q<R<I4<<<<<<L}<^<@<b"<*<<<ĩ<<m<O<1<<<N<<՜<)<a<C<c&<<j<<<A<u<X<v;<G<"<<<<<p<S<?6<l<<<.<<<Km<P<:4<<Q<<<=<<m<Q<V5<5<<<<<<7q<YU<9<<<?<<<O<w<3\<@<=%<	<k<<<w<8<f<J</<<<}<~<<<r<W<=<?"<~<<<r<՜<A<g<3M<2<H<<<(<ڮ<<Wz<#`<E<+<<<<<<<u<[<B<G(<<<<`<<<t<Z<{A<'<<!<<c<<Ə<v<I]<D<*<<<<<<<{<b<I<0<+<`<<<.<<ރ<Bk<R<!:<!<	<<;<տ<w< <v<^<HF<.<<<<x<d<Y<T<Xm<bU<t=<%<<<<=<{<<<ag<O<8< <<q<<w<<<5|<d<M<36<<<q<><<<Г<|<e<N<7< <	<<<<%<T<<i<S<Q<<%<<W<<&<<<<q<Z<7D<-<q<<<z<5<<<{<ce<>O< 9<	#<<<<<<<<5s<W]<G<1<< <b<<<N<<
<rn<X<SC<-<N<<b<<<-<җ<~</m<W<B<h-<2<<<<<~<l<_<Yo<YZ<_E<k0<|<<<<<-<b<<t<$`<pK<6<"<w<<D<<'<<"<}<3i<T<[@<+<<B<<<[<<ޝ<<vu<Ka<%M<9<$<<<<<<<ʘ<ۄ<p<]</I<V5<!<<<(<j<<<P<<p<f\<H<:5<!<#<<!<<4<Ƭ<\<<r<?_<K<8<Q%<<<<\<+< <ٞ<<x<e<sR<f?<^,<[<^<e<q<<<<Ԕ<<$o<S\<I<6<#<A<<<'<}<ٳ<9<<|<wi<V<cD<1<c<<v<<<6<԰<x< <y<g<6U<B<0<v<@<<<<<u<Z<E<3{<'i<W<E<3<"!<-<;<O<g<<<ˣ<<$<Wn<\<J<9<Q'<<<<<<<O<<<<v<re<S<lB<0<w<<<)<<_<<<R<<q<l`<(O<=<,<u<B
<<<<<<h<S<B<5p<,_<(N<'=<+,<3<?
<O<d<|<<<ߤ<<5<gr<a<P<@<U/<<<3<<<5<<<[<ň<3x<g<W<F<6<%<<<5<<]<<<6<ܑ<<3q<`<P<S@<0<<<^<+<<<<<d<G</~<n<	^<M<=<-<<<<<
<<0<I<e<<~<n<^<+O<^?</<<<M <<<(<x<̱<#<~<݂<?s<c<T<|D<4<a%<<U<<W<<g<<<<<O{<k<\<7M<=<.<?<< <g<&<<<x<D<<<w<h<yY<ZJ<?;<(,<<<<<<<<<<<<x<,i<DZ<_K<~<<-<<<<J<|<<<(<h<<<<|<m<^<-P<A<2<<$<< <h<<@<<%<<<<<u<"g<X<:J<;<_-<<</<<t<<<s<$<ם<<H<s<d<V<PH<:<+<<<_<8<<<<<<<}<o<dt<[f<VX<TJ<T<<X.<_ <i<v<<<<<<<$<H<p<y<k<]<-P<cB<4<&<<[<<<3<<<&<}<ם<3<<t<Zg<Y<-L<><1<#<<o<<j<߿<qҿ<Ŀ<<<<3<Ɂ<bt<f<Y<<L<><1<0$<<	<<<<<bԾ<Ǿ<߹<<f<.<<w<j<i]<>P<C<5<(<<<y<a<L<:ڽ<+ͽ<<<<	<<<r<e<X<%K<4><D1<X$<n<
<<<<׼<*ʼ<R<}<<ۖ<<D}<|p<c<V<4J<w=<0<$<N<
<<<<<׻<A˻<<<^<<(<<r<jf<Y<NM<@<<4<'<3<<5<<A<ܺ<Wк<ú<v<
<<9<ԅ<qy<m<`<XT< H<;<V/<#<<i
<<<<Oٹ<͹<<<]<&<<<w<dk<9_<S<F<:<.<"<l<R
<:<%<<ڸ<͸<<޵<ש<ӝ<Б<Ѕ<y<m<a<U<I<><2<%&<9<Q<j<<<޷<ҷ<Ƿ<4<^<<<鋷<<Pt<h<\<P<;E<|9<-<"<K<typescatternameb = 1000xD    o:o;D;o;
ף;;B`;o<t<
#<X94<D<T<B`e<u<o<C<t<㥛<
ף<1<X9<j<<<</<B`<h<<<o=+=C=)\=t=P==w=
#='=1,= 0=X94=Q8=j<=@=D=9H=L=`P=T=Y=/]=Ga=B`e=xi=hm=q=u=#y=}=%=o==+=L7=C=O=)\=sh=t==P==㥛=-=w=ʡ=
ף=T===1={= =-=X9=E=Q=5^=j=v==\===9====`====
=="=/=d;=G=S=B`=l=x==h===F===#=m==   >%>J>o>>>$>+>'1>L7	>q=
>C>I>O>V>)\>Nb>sh>n>t>z>>+>P>u>>>>>->R>w> >!>">
#>/$>T%>y&>'>(>)>+>1,>V->{.>/> 0>&1>-2>333>X94>}?5>E6>K7>Q8>X9>5^:>Zd;>j<>p=>v>>|?>@>7A>\B>C>D>ˡE>F>G>9H>^I>J>K>L>M>N>;O>`P>Q>R>S>T>V>=
W>bX>Y>Z>"[>(\>/]>?5^>d;_>A`>Ga>Mb>Sc>Zd>B`e>fff>lg>rh>xi>~j>k>Dl>hm>n>o>ףp>q>!r>Fs>jt>u>v>w>x>#y>Hz>m{>|>}>~>  >>%>7>J>\>o>>>>>ˡ>$>>+>>'1>9>L7>^>q=>>C>Ƌ>I>̌>O>ҍ>V>َ>)\>;ߏ>Nb>`>sh>>n>>t>>z>>>>+>=
>P>b>u>>>>>">㥛>(>>/>->?5>R>d;>w>A>Ġ>G>ʡ>M>Т>S>
ף>Z>/ݤ>B`>T>ff>y>l>>r>>x>>~>>>1>D>V>h>{>>>> >ף>&>>->!>33>F>X9>j>}?>µ>E>ȶ>K>η>Q>Ը>X>#۹>5^>H>Zd>m>j>>p>>v>>|>  >>%>7>J>\>o>>>>>ˡ>$>>+>>'1>9>L7>^>q=>>C>>I>>O>>V>>)\>;>Nb>`>sh>>n>>t>>z>>>>+>=
>P>b>u>>>>>">>(>>/>->?5>R>d;>w>A>>G>>M>>S>
>Z>/>B`>T>ff>y>l>>r>>x>>~>>>1>D>V>h>{>>>> >ף>&>>->!>33>F>X9>j>}?>>E>>K>>Q>>X>#>5^>H>Zd>m>j>>p>>v>>|>   ?A ? ? ?%?G?7??J?M?\??o?S??
??Z??/??B`?ˡ?T?$?ff??y?+?l???'1?r?9??L7	?x	?^	?	?q=
?~
?
??C???1?I?D??V?O?h??{?V????)\??;? ?Nb?ף?`?&?sh???-?n?!??33?t?F??X9?z?j??}?????E?+??=
?K?P??b?Q?u???X??#??5^??H?"?Zd??m?(?j???/?p?-???5?v?R??d;?|?w?   ?A ? ? ?%!?G!?7!?!?J"?M"?\"?"?o#?S#?#?
#?$?Z$?$?/$?%?B`%?ˡ%?T%?$&?ff&?&?y&?+'?l'?'?'?'1(?r(?9(?(?L7)?x)?^)?)?q=*?~*?*?+?C+?+?+?1,?I,?D,?,?V-?O-?h-?-?{.?V.?.?.?/?)\/?/?;/? 0?Nb0?ף0?`0?&1?sh1?1?1?-2?n2?!2?2?333?t3?F3?3?X94?z4?j4?4?}?5?5?5?6?E6?+6?6?=
7?K7?P7?7?b8?Q8?u8?8?9?X9?9?#9?:?5^:?:?H:?";?Zd;?;?m;?(<?j<?<?<?/=?p=?-=?=??5>?v>?R>?>?d;??|??w??  @?A@?@?@?%A?GA?7A?A?JB?MB?\B?B?oC?SC?C?
C?D?ZD?D?/D?E?B`E?ˡE?TE?$F?ffF?F?yF?+G?lG?G?G?'1H?rH?9H?H?L7I?xI?^I?I?q=J?~J?J?K?CK?K?K?1L?IL?DL?L?VM?OM?hM?M?{N?VN?N?N?O?)\O?O?;O? P?NbP?ףP?`P?&Q?shQ?Q?Q?-R?nR?!R?R?33S?tS?FS?S?X9T?zT?jT?T?}?U?U?U?V?EV?+V?V?=
W?KW?PW?W?bX?QX?uX?X?Y?XY?Y?#Y?Z?5^Z?Z?HZ?"[?Zd[?[?m[?(\?j\?\?\?/]?p]?-]?]??5^?v^?R^?^?d;_?|_?w_?  `?A`?`?`?%a?Ga?7a?a?Jb?Mb?\b?b?oc?Sc?c?
c?d?Zd?d?/d?e?B`e?ˡe?Te?$f?fff?f?yf?+g?lg?g?g?'1h?rh?9h?h?L7i?xi?^i?i?q=j?~j?j?k?Ck?k?k?1l?Il?Dl?l?Vm?Om?hm?m?{n?Vn?n?n?o?)\o?o?;o? p?Nbp?ףp?`p?&q?shq?q?q?-r?nr?!r?r?33s?ts?Fs?s?X9t?zt?jt?t?}?u?u?u?v?Ev?+v?v?=
w?Kw?Pw?w?bx?Qx?ux?x?y?Xy?y?#y?z?5^z?z?Hz?"{?Zd{?{?m{?(|?j|?|?|?/}?p}?-}?}??5~?v~?R~?~?d;?|?w?  ? ?A?Nb??ף?Ā?`?%?&?G?sh?7??ʁ??J?-?M?n?\?!?Ђ??o?33?S?t??F?
׃???X9?Z?z??j?/݄???}??B`??ˡ??T??$?E?ff?+??Ȇ?y?=
?+?K?l?P??·??b?'1?Q?r?u?9?Ԉ???L7?X?x??^?#ۉ???q=?5^?~???H??"?C?Zd??㥋?Ƌ?m?1?(?I?j?D??̌??V?/?O?p?h?-?ҍ??{??5?V?v??R?َ???d;?)\?|??w?;ߏ?  ? ?A?Nb??ף?Đ?`?%?&?G?sh?7??ʑ??J?-?M?n?\?!?В??o?33?S?t??F?
ד???X9?Z?z??j?/ݔ???}??B`??ˡ??T??$?E?ff?+??Ȗ?y?=
?+?K?l?P??Η??b?'1?Q?r?u?9?Ԙ???L7?X?x??^?#ۙ???q=?5^?~???H??"?C?Zd??㥛?ƛ?m?1?(?I?j?D??̜??V?/?O?p?h?-?ҝ??{??5?V?v??R?ٞ???d;?)\?|??w?;ߟ?  ? ?A?Nb??ף?Ġ?`?%?&?G?sh?7??ʡ??J?-?M?n?\?!?Т??o?33?S?t??F?
ף???X9?Z?z??j?/ݤ???}??B`??ˡ?¥?T??$?E?ff?+??Ȧ?y?=
?+?K?l?P??Χ??b?'1?Q?r?u?9?Ԩ???L7?X?x??^?#۩???q=?5^?~???H??"?C?Zd??㥫?ƫ?m?1?(?I?j?D??̬??V?/?O?p?h?-?ҭ??{??5?V?v??R?ٮ???d;?)\?|??w?;߯?  ? ?A?Nb??ף?İ?`?%?&?G?sh?7??ʱ??J?-?M?n?\?!?в??o?33?S?t??F?
׳???X9?Z?z??j?/ݴ???}??B`??ˡ?µ?T??$?E?ff?+??ȶ?y?=
?+?K?l?P??η??b?'1?Q?r?u?9?Ը???L7?X?x??^?#۹???q=?5^?~???H??"?C?Zd??㥻?ƻ?m?1?(?I?j?D??̼??V?/?O?p?h?-?ҽ??{??5?V?v??R?پ???d;?)\?|??w?;߿?  ? ?A?Nb??ף??`?%?&?G?sh?7????J?-?M?n?\?!???o?33?S?t??F?
???X9?Z?z??j?/???}??B`??ˡ??T??$?E?ff?+???y?=
?+?K?l?P????b?'1?Q?r?u?9????L7?X?x??^?#???q=?5^?~???H??"?C?Zd????m?1?(?I?j?D????V?/?O?p?h?-???{??5?V?v??R????d;?)\?|??w?;?  ? ?A?Nb??ף??`?%?&?G?sh?7????J?-?M?n?\?!???o?33?S?t??F?
???X9?Z?z??j?/???}??B`??ˡ??T??$?E?ff?+???y?=
?+?K?l?P????b?'1?Q?r?u?9????L7?X?x??^?#???q=?5^?~???H??"?C?Zd????m?1?(?I?j?D????V?/?O?p?h?-???{??5?V?v??R????d;?)\?|??w?;?  ? ?A?Nb??ף??`?%?&?G?sh?7????J?-?M?n?\?!???o?33?S?t??F?
???X9?Z?z??j?/???}??B`??ˡ??T??$?E?ff?+???y?=
?+?K?l?P????b?'1?Q?r?u?9????L7?X?x??^?#???q=?5^?~???H??"?C?Zd????m?1?(?I?j?D????V?/?O?p?h?-???{??5?V?v??R????d;?)\?|??w?;?  ? ?A?Nb??ף??`?%?&?G?sh?7????J?-?M?n?\?!???o?33?S?t??F?
???X9?Z?z??j?/???}??B`??ˡ??T??$?E?ff?+???y?=
?+?K?l?P????b?'1?Q?r?u?9????L7?X?x??^?#???q=?5^?~???H??"?C?Zd????m?1?(?I?j?D????V?/?O?p?h?-???{??5?V?v??R????d;?)\?|??w?;?   @y 8  ??5?V?>@>?>>>{>>]>V˓>>Ԉ>0>>Xx>Xq>j>@d>q_>~NZ>U>?Q>.L>H>E>A>|$>>V:>7>5>"?2>/>5->{*>V(>?&>#>!>>>&>]>+>>[>V>EG>>a>>r>W>
>>>ys>N>0>l>
>c>==*=0=X==E=m
=X=3=2=x==-a==h=@=O='=5=q=- ==Î=~N=====j[=y9= =?==p=K=.=======M==,'=fB=`==f=Ϳ==|$=T=6= =V=*,=oh===f+=p===N=͜=="?=C=R=EA=== T=N=5=v=۫=@={==7|=b=V=3ŧ=5=ҧ=?==8=}==p==h==e==Zg==m==x==ԇ==M=&=㲛=/@=wΚ=]===*=+=8=̗=b==~=(==[=o==@.=V˓=0i==+=EG===+=ΐ=r===a===V===Q==r=Q==[=W=5=}=Tb===&r=*#=Ԉ=Ɇ=`9=z==2T==彆=ys=)===N=v=ؾ=w=0==Ӥ=i_=l=Ղ==M=
=ǁ=:=C=c===>==}=:~=~=~=}=
}=|=*|=J{=!{=z=0z=y=Cy=Ex=Xx=w=ow=Zv=v=v=Du=w5u=Et=Ut=s=Bxs=m
s=-r=0r=dq=Xq=p=mp=p=3o=gGo=#n=gwn=2n=m=WCm=l=xl=l=k=Lk=j=Ij=$j=gi=-ai=l i=#h=Q@h=g=g=#g=f=hf=
f=He=Re=@d=d=?d=ic=Oc=1c=Yb=|b='b=a=Swa= a=5`=r`=`=_=q_=_=*^=s^=- ^=]=y]=&]=\=\=0\=[=Î[=.>[=Z=Z=~NZ=GY=fY=aY=Y=X=1xX=*X=W=sW=-EW=7V=V=;bV=4V=|U=U=7U=%T=T=j[T=~T=S=S=y9S=R=<R=
cR= R=}Q="Q=IQ=?Q=P=rxP=s3P=O=AO=fO="O=pN=N=WN=N=KM=M=MM=M=.L=ňL=GL=L=K=K=ZEK=bK=J='J=FJ=J=I=yI=LI=I=H=lH=TH=H=G=G=TaG=$G=F=ݬF="qF=5F=ME=2E=LE=IE=E=D=D=`D=,'D=C=eC=M{C=fBC=	C=.B=ܘB=`B=(B=A=wA=A=JA=A=@=f@=o@=9@=@=?=ݗ?=Jb?=,?=>=>=>=Y>=|$>=======T==R ==<=j<=6<=*S<=H <=;= ;=;=ZV;=D$;=V:=:=:=y]:=*,:=9=9=#9=oh9=79=w9=58=8= w8=NG8=8=7=7=w7=]Z7=f+7=6=6=[6=p6=B6=6=5=5=5=g]5=/5=5=r4=d4=x{4=N4="4={3=3=͜3=p3=D3=3=2=R2=͕2=gj2="?2=2=1=1=C1=h1=>1=1=R0="0=0=k0=EA0=0=/=t/=/=q/=H/=/=.=.=2.=|.= T.=+.=.=Y-=N-=_-=c-=;-=5-=,=L,= ,=v,=O,=(,=,=+=e+=ҍ+=Yg+=@+=+=*=u*={*=*=\*='7*=*=)=)=i)=7|)=W)=2)=3)=b(=(=(=z(=V(=1(=q(=G'=3'=7'=Q}'=Y'=5'=+'=&=.&=ҧ&=&=\a&=B>&=?&=R%=z%=%=%=xm%=J%=(%=8%=$=$=$=}$=[$=9$=6$=#=#=n#=#=p#=_O#=..#=#="="=1"=c"=h"=H"=r'"="=!=1!=!=!=e!=E!=%!=!= =& =z = =Zg =G =( =5	 =====m=N=0=H== =w==x=CZ= <======ԇ=	j=NL=.=====M=~=`=C=&=	=====iy=\=/@=#=4==w=0==y=]=A=%=	==!=c===c=H=,=*===U=+==n=S=8=0=\===5==}=b=H=-=`=====~=zv=\=B=(==-=y==8==+u=[=SB=(==o======x= `=G=@.=s===V==+==0i=P=g8= ===d=A=+= = w=-_=EG=i/====m=˸=5==*r=Z=LC=+==U===·===r=[=D=-==  =]===T==.x=a=2K=4=a===v=<===͂=l=V=@=*===0=g===G=|=g=Q=;=&===O===r=<=|=f=Q=<='=====*=[==ۀ=(l=W=B=H.==5=
=G
=
=}
=%
=׊
=v
=Tb
= N
=9
=%
=
=	=	=	=	=	=י	=	=&r	=Z^	=J	=6	=*#	=	==G==/==8=Ɇ=bs=`=L=`9=&===z=U=8=#===z=g=2T=LA=o.====I===>===ys=`=qN=;=)===c====F===r=`=N=y<=q*=p=v====ؾ==4=m=w=e=BT=B=0=W==3==+==?=Ӥ=n==p=i_=N=<=+=l=>	=========o=^=M===D,=s=
==&=o===o=ѕ=:=t=d=S=C=2=3"==c= = =Z = =ɯ = =O = =n =^ =N => =w. =h =_ =<<Ҽ<<}<Q]<=<<:<<<<<`<JA<!<<n<<<<<f<G<(<
<<H<|<<p<]Q<2<*<<$<<J<{<]<V?<!<<<<<<l<N<0<<<W<<<G~<`<C<%<<<E<<<Qu<X<:<< <<<<<o<R<5<<Z<<<N<<#m<P< 4<<D<<<D<<m<Q<w5<\<K<C<E<P<e<q<U<9<<]<<<d<Γ<Bx<\<EA<%<m
<<<o<-<<f<K<0<k<`<]<d<s<<s<X<><H#<<<2<<<m<h<jN<3<<(<<|<3<<{<a<gG<I-<4<'<#<'<4<I<gw<]<C<)<2<y<<"<<<\v<\<WC<)<s<<<Y<<Ǒ<x<T_<'F<-<<<<<<˖<}<d<L<E3<x<<<=<<<I<m<"U<<<$<<1<<g<<<py<-a<H<0<<l <O<9<*<#<#<+p<;X<Q@<o(<<<<1<s<<<gj<R<.;<#<<<<<.<ǖ<h<h<P<s9<0"<
<<<i<H</<<i<R<;<$<)<@<^<<<<<Zm<V<?<D)<<<i<<O<̡<O<t<j^<H<1<D<<<Y<<ޫ<<|<Ui<5S<=<'<<<<<<<3<Sw<ya<K<5< <Q
<<<5<<<R<r<.]<G<$2<<3<<Z<<<B<<q<b\<#G<1<<<e<D<*<<<<s<^<J<5<- <H<i<<<<'<e<y<d<CP<;<&<U<<(<<<<<<+n<Y<ZE<0<<K<<<n</<<Î<z<nf<KR<.><*<<<<<<<<!<:v<Zb<~N<:<&<<G<<<<f<<<uu<a<EN<:<)'<<# <<1<<U<<<1x<d<Q<<><*<<v<><<<<<s<Z~<Fk<7X<-E<(2<(<-<7<F<Z<s<<<܇<	u<;b<rO<<<)<4<<<#<|<ڹ<=<<<o<\<uJ<7<z%<< <%<<Z<<<M<<m<j[<(I<6<$<~<O <$<<<<<<<|o<w]<vK<y9<'<<<<<<<<<h<<t<
c<IQ<?<-< <q
<<<}<<G<<"<}<l<Z<I<7<&<<?<<q<<<^<<<rx<,g<U<D<s3<>"<<<<<t<Y<A<.<<w<f<U<D<3<"<,<? <U<p<<<٫<<4<gy<h<W<G<^6<%<<B<<<K<<<w<<T<n<A^<M<==<,<I<<f<<<.<ι<q<<ň<tx<(h<W<G<Y7<'<<<|<O<%<<ݵ<<<<{u<le<aU<ZE<V5<W%<Z<b<n<}<<<<<<'<Qv<~f<V<F<7<X'<<<!<l<<<b<<<y<z<Ek<[<L<<<-<<<<<<<<;<ҡ<l<	<s<Od<T<E<R6<'<<t<1<<<~<I<<<<<tp<Ta<7R<C<4<$<<<<<<<Ի<ݬ<<<<"q<<b<YS<yD<5<&<<	<M<<<<2<s<< <L<u<f<BX<I<:<U,<<< <<a<<I<·<?<<A<}<Oo<`<kR<C<5<,'<<g
<
<<X<<<e<<ӗ<<M{<m<^<P<fB<54<&<<	<<j<J<.<<<<ܘ<ϊ<|<n<`<R<D<6<(<<<<<<9<V<w<<<<<Dt<vf<X<J<=<\/<!<<'<p<<<^<<<f<Ę<%<}<o<Yb<T<4G<9<,<<<<<<ۿ<Ϳ<)<<I<ݗ<t<}<o<Jb<T<G<9:<,<<A<<<b<ݾ<Ͼ<¾<`<&<<<<[s</f<Y<K<><1<|$<`<H
<1<<<ս<Ƚ<뻽<宽<᡽<<⇽<z<m<`<T<G<&:<;-<R <l<<<<߼<Ӽ<>Ƽ<j<<˟<<6<oy<l<_<*S<nF<9<,<H <<<:<<<CԻ<ǻ< <b<ǡ</<<|<to<b<ZV<I<J=<0<D$<<H<<V<<mٺ<̺<<$<<U<<<0v<i<y]<"Q<D<z8<*,<<<G<<<{<<ֹ<ɹ<Ľ<<W<#<<Ā<t<oh<G\<"P< D<7<+<<<w<c<Q<B<5׸<*˸<"<<<<<< w<(k<3_<?S<NG<`;<s/<#<<<<<<=ܷ<cз<ķ<<㬷<<C<w<}<q< f<]Z<N<B< 7<f+<<<E<<<8<ٶ<Ͷ<@¶<<<[<<#<|<p<_e<Y<=N<B<$7<+< <<	<<<<۵<ϵ<)ĵ<<E<ա<h<<<.t<h<g]<R<F<M;</<$<G<<<S<<<rմ<,ʴ<羴<<d<&<ꑴ<<x{<Bp<e<Y<N<C<T8<+-<"<<< <{<^<C߳<*Գ<ɳ<<첳<ۧ<͜<<<{<p<e<Z<O<D<9<.<#<<<<<<< ײ<8̲<R<n<<<͕<<<>u<gj<_<T<I<"?<U4<)<<<7	<t<<<7ޱ<|ӱ<ȱ<<W<<<C<<}<As<h<]<OS<H<><o3<(<9<<
	<u<<R<ް<6԰<ɰ<"<<<<<<<u<k<`<-V<K<EA<6<e,<!<<#<<V<<</ٯ<ί<tį<<<i<<<o<|<q<g<:]<R<H<f><"4<)<<d<(< <<~<J<خ<ͮ<î<<\<2<
<㐮<<|<zr<Zh<<^< T<J<?<5<+<!<<<<s<i<`<Yۭ<Sѭ<Pǭ<N<N<O<S<X<_<g<qw<}m<c<Y<O<E<;<1< (<<5<R
<q <<<<ج<#Ϭ<LŬ<w<<Ч< <1<d<<v<m<@c<{Y<O<E<6<<x2<(<<G<<<&<s<<۫<eѫ<ǫ<<e<<<t<ҍ<1<z<p<Yg<]<&T<J<@<e7<-<B$<<&<<<< <{<ת<uΪ<Ī<u<<{<<<<<'y<o<Df<\<gS<I<@<'7<-<Z$<<<1<<s<<<b٩<
Щ<Ʃ<^<<<i<<͎<<7|<r<i<a`<W<M<D<Z;<2<(<<k<3<<<<b<2ߨ<֨<̨<è<<V<.<<䕨<<<z<aq<Ch<(_<V<L<C<:<1<(<<<q<e<Y<O<G<?<:ק<6Χ<3ŧ<2<2<3<7<;<A<H<Q}<\t<gk<tb<Y<P<G<><5<,<#<<+<G	<c <<<<ܦ<	Ԧ<.˦<U¦<}<<ҧ<<,<[<<{<r<&j<\a<X<O<G<B><5<,<#<?<<	<<R<<<.ޥ<zե<̥<ĥ<g<<<a<<<f<~<v<xm<d<5\<S<J<[B<9<&1<(<<`<<8<<<<<lۤ<Ҥ<Vʤ<<F<<<<<6<<6<}<<u<l<Fd<[<VS<J<kB<9<1<)< <6<<]<<<!<<Uݣ<ԣ<̣<-ģ<ͻ<n<<<Y<<<P<x<p<Rh< `<W<_O<G<><x6<..<%<<V<<<<H<<<ۢ<MӢ<ˢ<¢<<g<1<<ș<<c<3<y<p<h<`<UX<,P<H<?<7</<r'<Q<0<<<<<<<qޡ<Z֡<EΡ<1ơ<<<<<ߝ<ҕ<ƍ<<}<u<m<e<]<U<M<E<=<5<-<%<<<<<<<<<ݠ<֠<Π<&Ơ<:<N<d<z<<<Ǝ<ᆠ<~<w<:o<Zg<{_<W<O<G<@<38<[0<(< <<<5	<d<<<<+<`ڟ<ҟ<ʟ<ß<><y<<</<n<<<1}<uu<m<e<F^<V<N<!G<m?<7<0<U(< <<H<	<<E<<<K<۞< Ԟ<\̞<Ğ<<w<׭<8<<<c<ɇ<0<x<q<li<a<CZ<R<K<C< <<r4<,<Y%<<D<<3<<'<<<<ڝ<ҝ<˝<Ý<!<<+<<8<<J<ԇ<`<x<zq<	j<b<)[<S<NL<D<w=<6<.<<'<<p<<	<E<<<#<<gݜ<֜<Μ<Uǜ<<<L<<<M<<<W<~<v<jo<h<`<Y<<R<J<C<e<<5<-<&<S<<<	<R<<<<a<(ޛ<֛<ϛ<ț<K<<㲛<<~<N<<<<<iy<>r<k<c<\<U<xN<SG</@<9<1<*<#<<m<P<4< <<<<<ܚ<՚<wΚ<dǚ<R<A<0<!<<<<펚<㇚<ـ<y<r<k<d<]<V<O<H<A<:<3<,<%<<<<	<<<<<<<ٙ<!ҙ<0˙<@ę<Q<c<v<<<<˓<㌙<<</x<Kq<gj<c<\<U<N<H<$A<G:<j3<,<%<<<*<T
<~<<<</<^<ژ<Ә<̘<!Ƙ<U<<<<+<b<<ԏ<<J<{<t<n<Ag<`<Y<S<EL<E<><8<X1<*<#<0<z<<	<\<<<F<<<9ڗ<ӗ<̗<3Ɨ<<޸<5<<夗<?<<<Q<<}<jv<o<*i<b<[<QU<N<H<A<:<N4<-<'< <<`<<:<<<<<j<ޖ<Pؖ<і<:˖<Ė<&<<<<
<<<~<<z<|<zv<o<}i<b<\<V<O<I<B<!<<5<3/<(<H"<<a<<}<<<-<<Q<<yە<Օ<Ε<:ȕ<<j<<<8<ӡ<p<<<J<違<{<+u<n<ph<b<[<^U<O<H<SB<;<5<O/<(<"<R< <<]	<<<o<!<<<=ݔ<֔<Д<_ʔ<Ĕ<н<<D<<<w<4<<<q<2<x<r<xl<<f< `<Y<S<RM<G<@<:<v4<@.<(<!<<s<B<	<<<<W<*<<ݓ<ד<ѓ<V˓<.œ<<ณ<<<q<M<+<	<荓<Ǉ<<{<ju<Mo<0i<c<\<V<P<J<D<}><g8<Q2<<,<(&< <<<<<<<<<<z<oݒ<dג<Zђ<Q˒<IŒ<A<;<4</<+<'<$<!< <<<}< w<"q<%k<)e<-_<2Y<8S<>M<EG<MA<V;<_5<i/<t)<#<<<<<<<<<<</<Cܑ<X֑<mБ<ʑ<đ<<˸<岑<<<5<Q<n<<<Ƀ<}<	x<*r<Ll<nf<`<Z<T< O<&I<LC<t=<7<1<+<&<D <p<<<<&<U<<<<<L<ڐ<Ԑ<ΐ<ɐ<TÐ<<·<<3<m<<㚐<<[<<փ<~<Sx<r<l<g<Wa<[<U<!P<fJ<D<><89<3<-<(<Y"<<<:<<<  <n<<<]<<ݏ<R؏<ҏ<̏<LǏ<<<M<<<T<<<`<<<s<}<.x<r<l<Jg<a<\<mV<P<2K<E<?<_:<4<*/<)<#<a<<3<<<s<<L<<(<<<vێ<Վ<WЎ<ʎ<<Ŏ<<#<<<<<p<蘎<`<ٍ<S<͂<H}<w<@r<l<:g<a<7\<V<7Q<K<9F<@<=;<5<D0<*<N%<<Z<<i<	<z<<<<<0<<Jލ<؍<gӍ<͍<ȍ<Í<<9<̲<_<<<<<G<݌<u<<|<>w<q<sl<g<a<F\<V<Q<L<F<\A<;<6<>1<+<&<%!<<m<<<]<<<S<<<O<<ی<O֌<Ќ<ˌ<Vƌ<<<a<<«<r<$<֛<<<<<<Z<|<v<}q<5l<f<a<_\<W<Q<L<JG<B<<<7<?2<,<'<}"<=<<<<E<<<<V<<<<pދ<8ً<ԋ<΋<ɋ<_ċ<*<<<<[<)<<ǚ<<g<7<	<ۀ<{<v<Tq<(l<f<a<\<W<VR<.M<H<B<=<8<m3<H.<$)< $<<<<w<V
<5< <<<<<<c<G܊<,׊<Ҋ<̊<Ǌ<<<<}<f<P<:<%<<<ꏊ<׊<ą<<{<v<q<ql<bg<Tb<F]<9X<,S< N<I<	D<><9<4</<*<%< <<<<<<<<<<<<<߉<ډ<Չ<Љ<ˉ<Ɖ<<<<<<¨<ȣ<Ϟ<י<ߔ<珉<<<<|<w<&r<2m<?h<Lc<Z^<iY<wT<O<J<E<@<;<6<1<-<(<*#<?<U<j<<
<< <<<<,<G<b<~ވ<و<Ԉ<ψ<ʈ<ƈ</<N<n<<<Ѩ<<<8<\<<<Ɇ<<}<;x<bs<n<i<d<`<.[<XV<Q<L<G<C<3><`9<4</<*<&<J!<{<<<<A	<t<<<<E<z<<<އ<Uه<ԇ<χ<ʇ<8Ƈ<r<<緇<#<_<<ؤ<<T<<ё<<Q<<~<z<Vu<p<k<g<cb<]<X<2T<xO<J<F<LA<<<7<&3<o.<)<%<N <<<2<<<<i<<<W<<<I<ކ<ن<@Ն<І<ˆ<;ǆ<<彆<:<<篆<><<<F<<<S<<<d<|<x<ys<n<4j<e<`<Q\<W<S<qN<I<4E<@<;<\7<2<$.<)<$<S <<<<<U	<<& <<<c<<9<<<}ۅ<օ<X҅<ͅ<4Ʌ<ą<<<<c<ԭ<F<<+<<<<<o<䄅<Z<{<Gw<r<6n<i<'e<`<\<W<S<N<J<E<@<y<<7<t3<.<q*<%<p!<<p<<r<
<v<<|< <<<<<<ބ<ل<-Մ<Є<=̄<Ǆ<OÄ<ؾ<b<쵄<w<<<<<4<<P<ލ<m<<<|<w<>s<n<bj<e<a<]<X<BT<O<lK<G<B<.><9<\5<0<,<%(<#<W<<<&<<]	<< <3<<n<<<K<<݃<+ك<ԃ<mЃ<̃<ǃ<TÃ<<<?<㱃<<-<Ӥ<y< <Ǘ<n<<<g<<}<dy<u<p<dl<h<c<i_<[<V<qR<N<I<}E<-A<<<8<>4</<+<S'<#<<l< <<<>	<< <_<<<<=<<<hނ<!ڂ<Ղ<т<Q͂<ɂ<Ă<<A<<<y<7<<<u<5<<<w<9<<<|<Cx<t<o<k<Tg<c<^<Z<lV<3R<M<I<E<SA<=<8<4<z0<D,<(<#<<s<@<<<
<v<E<<<<<U<&<<<܁<o؁<Bԁ<Ё<ˁ<ǁ<Á<h<=<<鲁<<<o<G<<<ѕ<<<_<:<<|<x<t<p<cl<Ah<d<_<[<W<S<zO<ZK<;G<C<><:<6<2<.<k*<O&<3"<<<<<<	<|<c<K<3<<<<<<<܀<؀<nԀ<ZЀ<G̀<4Ȁ<!Ā<<<뷀<ٳ<ɯ<<<<<z<k<]<O<B<5<(<<{<w<r<n<j<f<b<^<Z<V<R<N<J<F<B<><:<6<|2<w.<s*<o&<k"<h<e<c<a<_<^
<]<]<<<<<<<<<Ҽ<ش<<<<<<<}<'u<4m<Be<Q]<`U<pM<E<=<5<-<%<<<<"<:~<R~<k~<~<~<~<~<~<~<.~<M~<m~<~<~<Џ~<~<~<:x~<^p~<h~<`~<X~<P~<!I~<JA~<s9~<1~<)~<!~<"~<O~<}
~<~<}<}<=}<n}<}<}<}<<}<r}<}<ެ}<}<N}<}<}<}<6~}<rv}<n}<f}<)_}<hW}<O}<G}<(@}<i8}<0}<(}<2!}<v}<}<
}<G}<|<|<|<h|<|<|<H|<|<|<.|<||<˥|<|<k|<|<|<`|<w|<p|<[h|<`|<Y|<]Q|<I|<B|<d:|<2|<+|<s#|<|<*|<|<|<C{<{<{<b{<{<${<{<{<M{<{<{<}{<{<J{<{<{<{<{{<Yt{<l{<0e{<]{<
V{<xN{<F{<V?{<7{<70{<({<!{<{<{<u
{<{<`z<z<Mz<z<=z<z</z<z<%z<z<z<z<z<z<z<z<z<{z<tz<lz<ez<]z<%Vz<Nz<0Gz<?z<>8z<0z<N)z<!z<az<z<vz<z<y<y<y<8y<y<Wy<y<xy<
y<y</y<êy<Wy<y<y<y<y<G~y<vy<yoy<hy<`y<HYy<Qy<Jy<Cy<;y<Y4y<,y<%y<7y<y<zy<y< y<cx<x<x<Qx<x<x<Ex<x<x<@x<x<x<@x<x<x<Ex<x<|x<Qux<nx<fx<c_x<Xx<Px<zIx<.Bx<:x<3x<M,x<%x<x<rx<*x<x< x<Vw<w<w<w<Ew<w<w<w<>w<w<w<w<Bw<w<Ǔw<w<Ow<~w<vw<ow<ghw<.aw<Yw<Rw<Kw<SDw<=w<5w<.w<'w<N w<w<w<
w<w<Zv<+v<v<v<v<uv<Iv<v<v<ɻv<v<vv<Nv<'v< v<ِv<v<v<j{v<Ftv<#mv<fv<^v<Wv<Pv<|Iv<]Bv<>;v< 4v<-v<%v<v<v<v<w	v<]v<Du<+u<u<u<u<u<u<u<u<|u<hu<Vu<Du<2u<"u<u<u<u<{u<tu<mu<fu<_u<Xu<Qu<Ju<Cu<<u<w5u<o.u<h'u<b u<\u<Wu<Ru<Nu<Kt<Ht<Et<Dt<Ct<Bt<Ct<Ct<Et<Gt<It<Lt<Pt<Ut<Zt<_t<et<lt<st<{xt<qt<jt<ct<\t<Ut<Nt<Gt<@t<9t<2t<+t<	%t<t<)t<:t<K	t<]t<ps<s<s<s<s<s<s<s<s<2s<Ks<ds<~s<s<s<Γs<s<s<$s<Bxs<`qs<js<cs<\s<Us<Os<"Hs<EAs<h:s<3s<,s<%s<s< s<Fs<m
s<s<r<r<r<9r<dr<r<r<r<r<Ar<or<r<ͪr<r<-r<^r<r<r<r<'{r<[tr<mr<fr<_r<0Yr<fRr<Kr<Dr<>r<F7r<0r<)r<"r</r<kr<r<r<"r<`q<q<q<q<]q<q<q<!q<dq<q<q</q<sq<q<q<Eq<q<Ӈq<q<dzq<sq<lq<Bfq<_q<Xq<$Rq<qKq<Dq<>q<Z7q<0q<)q<H#q<q<q<;q<q<q<3p<p<p<0p<p<p<2p<p<p<:p<p<p<Fp<p<p<Wp<p<p<mp<|p<)vp<op<hp<Gbp<[p<Up<jNp<Gp</Ap<:p<3p<Z-p<&p<$ p<p<p<Xp<p<(o<o<o<co<o<8o<o<o<|o<o<Wo<Ŷo<3o<o<o<o<o<eo<ֈo<Io<{o</uo<no<ho<ao<[o<yTo<Mo<gGo<@o<W:o<3o<I-o<&o<= o<o<4o<o<,o<n<'n<n<$n<n<#n<n<$n<n<'n<n<-n<n<4n<n<>n<×n<In<Њn<Wn<}n<gwn<pn<yjn<dn<]n<Wn<Pn</Jn<Cn<I=n<6n<d0n<)n<#n<n<n<2n<	n<Un<m<ym<m<m<5m<m<_m<m<m<"m<m<Qm<m<m<m<m<Pm<m<m<"m<|m<\vm<om<im<6cm<\m<uVm<Pm<Im<WCm<<m<6m<=0m<)m<#m<)m<m<sm<
m<m<el<l<l<]l<l<l<Yl<l<l<Yl<l<l<_l<l<l<hl<l<Ǒl<wl<'l<~l<xl<;rl<kl<el<T_l<Yl<Rl<rLl<'Fl<?l<9l<J3l<-l<&l<r l<+l<l<l<Yl<l<k<k<Hk<k<k<k<?k<k<k<}k<>k<k<k<k<Ek<k<˖k<k<Tk<k<}k<wk<jqk<1kk<dk<^k<Xk<RRk<Lk<Ek<?k<z9k<E3k<-k<&k< k<xk<Ek<k<k<k<j<Rj<"j<j<j<j<jj<=j<j<j<j<j<dj<:j<j<j<j<j<pj<Ij<"j<yj<sj<mj<gj<iaj<E[j<"Uj< Oj<Hj<Bj<<j<z6j<Y0j<:*j<$j<j<j<j<j<j<ii<Mi<1i<i<i<i<i<i<i<~i<gi<Oi<9i<#i<i<i<i<Ηi<i<i<i<i<pyi<^si<Mmi<=gi<-ai<[i<Ui< Oi<Hi<Bi<<i<6i<0i<*i<$i<i<i<i<~i<ui<l i<dh<\h<Uh<Oh<Hh<Ch<=h<9h<4h<0h<-h<*h<(h<&h<$h<#h<"h<"h<#h<#h<%h<&|h<)vh<+ph<.jh<2dh<6^h<;Xh<?Rh<ELh<KFh<Q@h<X:h<_4h<g.h<o(h<x"h<h<h<h<
h<h<g<g<g<g<g<g<g<g<!g<1g<Ag<Qg<bg<sg<g<g<g<g<ѓg<g<g<g<$|g<:vg<Ppg<gjg<~dg<^g<Xg<Rg<Lg<Fg<Ag<.;g<H5g<d/g<)g<#g<g<g<g<g<0g<N g<nf<f<f<f<f<f<3f<Vf<yf<f<f<f<	f<.f<Tf<zf<f<ǖf<f<f<?f<hf<yf<sf<mf<hf<:bf<e\f<Vf<Pf<Jf<Ef<E?f<s9f<3f<-f< (f<0"f<`f<f<f<
f<%f<Xe<e<e<e<&e<[e<e<e<e<2e<ie<e<׹e<e<He<e<e<e</e<je<e<e<e<Yze<te<ne<ie<Oce<]e<We<Re<MLe<Fe<@e<;e<Q5e</e<)e<$e<\e<e<e<)e<ne<e<d<@d<d<d<d<^d<d<d<9d<d<d<d<cd<d<d<Gd<d<d</d<}d<ˉd<d<j~d<xd<
sd<Zmd<gd<ad<O\d<Vd<Pd<GKd<Ed<?d<D:d<4d<.d<D)d<#d<d<Gd<d<d<Od<d<c<Zc<c<c<ic<c< c<|c<c<6c<c<c<Oc<c<c<lc<̡c<,c<c<c<Oc<c<c<vzc<tc<=oc<ic<dc<j^c<Xc<5Sc<Mc<Hc<hBc<<c<77c<1c<,c<q&c< c<Dc<c<c<
c<c<[b<b<4b<b<b<|b<b<Yb<b<8b<b<b<b<b<lb<ޫb<Pb<àb<6b<b<b<b<b<|b<yb<htb<nb<Uib<cb<D^b<Xb<5Sb<Mb<'Hb<Bb<=b<7b<2b<,b<'b<!b< b<}b<b<xb<b<u b<a<sa<a<sa<a<ta<a<xa<a<|a<a<a<a<a<a<a<a<a<%a<a<3a<a<Ba<|a<Swa<qa<ela<fa<yaa<\a<Va<Qa<Ka<1Fa<@a<K;a<5a<f0a<*a<%a< a<a<0a<a<Q
a<a<s`<`<`<)`<`<O`<`<w`<`<`<5`<`<``<`<`<%`<`<T`<`<`<`<`<R`<`<}`<!x`<r`<Ym`<g`<b`<.]`<W`<iR`<M`<G`<EB`<<`<7`<$2`<,`<e'`<"`<`<J`<`<`<3`<`<z_<_<_<h_<_<_<Z_< _<_<O_<_<_<G_<_<_<C_<_<_<B_<_<_<E_<_<_<K|_<v_<q_<Ul_<g_<a_<b\_<W_<Q_<rL_<#G_<A_<<_<87_<1_<,_<P'_<"_<_<l_<!_<_<_<A_<^<^<e^<^<^<^<D^<^<^<p^<*^<^<^<Z^<^<ѭ^<^<J^<^<Ę^<^<@^<^<^<|~^<<y^<s^<n^<}i^<>d^<^^<Y^<T^<EO^<J^<D^<?^<S:^<5^</^<*^<g%^<- ^<^<^<^<H^<^< ^<]<i]<2]<]<]<]<Z]<%]<]<]<]<U]<!]<]<]<]<X]<']<]<Ř]<]<e]<6]<]<~]<y]<{t]<Mo]< j]<d]<_]<Z]<nU]<CP]<K]<E]<@]<;]<o6]<E1]<,]<&]<!]<]<|]<U]<.]<]<]<\<\<q\<L\<(\<\<\<\<\<x\<U\<4\<\<\<е\<\<\<p\<Q\<2\<\<\<׌\<\<\<}\<cx\<Gs\<+n\<i\<c\<^\<Y\<T\<O\<sJ\<ZE\<B@\<);\<6\<0\<+\<&\<!\<\<\<t\<_\<K\<6\<"[<[<[<[<[<[<[<[<[<~[<n[<^[<N[<>[</[<![<[<[<[<[<ܘ[<Г[<Î[<[<[<[<z[<u[<p[<wk[<nf[<da[<\\[<SW[<KR[<CM[<<H[<5C[<.>[<(9[<"4[</[<*[<%[< [<	[<[<[<[<[<[<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<Z<!Z<'Z<-Z<4{Z<:vZ<BqZ<IlZ<QgZ<ZbZ<b]Z<kXZ<uSZ<~NZ<IZ<DZ<?Z<:Z<5Z<0Z<+Z<&Z<!Z<Z<Z<Z<Z<)	Z<8Z<GY<WY<fY<wY<Y<Y<Y<Y<Y<Y<Y<Y<Y<*Y<>Y<RY<fY<{Y<Y<Y<Y<їY<Y<Y<Y<-Y<EY<]zY<uuY<pY<kY<fY<aY<\Y<XY<*SY<ENY<`IY<|DY<?Y<:Y<5Y<0Y<,Y<)'Y<G"Y<fY<Y<Y<Y<	Y<Y<# Y<CX<dX<X<X<X<X<X<1X<UX<xX<X<X<X<
X</X<UX<{X<X<ȣX<X<X<=X<eX<X<X<߁X<}X<1xX<[sX<nX<iX<dX<`X<1[X<]VX<QX<LX<GX<CX<<>X<j9X<4X</X<*X<$&X<S!X<X<X<X<X<E	X<vX<W<W<W<>W<qW<W<W<W<?W<tW<W<W<W<IW<W<W<W<#W<ZW<W<ʟW<W<;W<sW<W<W< W<Z~W<yW<tW<pW<FkW<fW<aW<\W<7XW<tSW<NW<IW<-EW<k@W<;W<6W<(2W<g-W<(W<#W<(W<iW<W<W<-W<oW<W<V<7V<zV<V<V<FV<V<V<V<ZV<V<V<-V<sV<V<V<IV<V<ڨV<"V<kV<V<V<HV<V<܇V<'V<r~V<yV<	uV<UpV<kV<fV<;bV<]V<XV<$TV<rOV<JV<FV<_AV<<V<7V<N3V<.V<)V<@%V< V<V<4V<V<V<,	V<V<U<&U<zU<U<#U<xU<U<#U<yU<U<%U<|U<U<+U<U<ڹU<3U<U<U<=U<U<U<KU<U< U<[U<U<U<n}U<xU<&tU<oU<jU<>fU<aU<\U<XXU<SU<OU<uJU<EU<4AU<<U<7U<V3U<.U<*U<z%U< U<>U<U<U<gU<	U<.U< U<T<[T<T<%T<T<T<WT<T<$T<T<T<ZT<T<*T<T<T<dT<έT<8T<T<T<wT<T<MT<T<$T<T<T<i{T<vT<CrT<mT<iT<dT<_T<j[T<VT<IRT<MT<(IT<DT<	@T<z;T<6T<\2T<-T<@)T<$T<% T<T<T<~T<T<f	T<T<O T<S<9S<S<$S<S<S<S<S<uS<S<eS<S<US<S<GS<S<:S<S<.S<S<#S<S<S<S<S<S<	S<S<}S<xS<sS<|oS<jS<yfS<aS<w]S<XS<vTS<OS<vKS<FS<wBS<=S<y9S<4S<}0S<+S<'S<#S<S<S<S<S<S<S<S<%R<R<0R<R<<R<R<JR<R<XR<R<hR<R<xR<R<R<R<R<'R<R<<R<ƥR<QR<ݜR<hR<R<R<R<R<'R<}R<ByR<tR<^pR<kR<{gR<
cR<^R<)ZR<UR<IQR<LR<jHR<CR<?R<;R<6R<A2R<-R<f)R<$R< R< R<R<HR<R<q
R<R<R<0Q<Q<\Q<Q<Q<Q<Q<NQ<Q<}Q<Q<Q<GQ<Q<yQ<Q<Q<GQ<Q<|Q<Q<Q<NQ<Q<Q<"Q<Q<\Q<Q<}Q<4yQ<tQ<ppQ<lQ<gQ<McQ<^Q<ZQ<,VQ<QQ<lMQ<IQ<DQ<P@Q<;Q<7Q<53Q<.Q<z*Q<&Q<!Q<dQ<Q<Q<PQ<Q<Q<?Q<P<P<0P<P<|P<#P<P<qP<P<P<iP<P<P<cP<P<P<_P<	P<P<^P<	P<P<_P<P<P<cP<P<P<iP<P<|P<rxP< tP<oP<}kP<,gP<bP<^P<:ZP<UP<QP<JMP<HP<DP<]@P<<P<7P<s3P<%/P<*P<&P<>"P<P<P<YP<P<P<vP<+P<O<O<LO<O<O<oO<&O<O<O<LO<O<O<tO<-O<O<O<YO<O<ͲO<O<AO<O<O<sO<.O<O<O<cO<O<܃O<O<W{O<wO<rO<nO<OjO<fO<aO<]O<LYO<UO<PO<LO<MHO<DO<?O<;O<R7O<3O<.O<*O<[&O<"O<O<O<hO<,O<O<O<zO<? O<N<N<N<UN<N<N<N<pN<7N<N<N<N<WN< N<N<N<{N<EN<N<٫N<N<nN<9N<N<ЖN<N<hN<4N< N<́N<}N<gyN<5uN<qN<lN<hN<ndN<<`N<\N<WN<SN<zON<JKN<GN<BN<>N<:N<^6N<02N<.N<)N<%N<y!N<LN<N<N<N<N<nN<BN< N<M<M<M<lM<BM<M<M<M<M<sM<KM<"M<M<M<M<M<]M<6M<M<M<èM<M<wM<RM<-M<M<M<M<M<xM<TM<1{M<wM<rM<nM<jM<fM<bbM<A^M<ZM<UM<QM<MM<IM<|EM<]AM<==M<9M<4M<0M<,M<(M<$M<g M<IM<,M<M<M<M<M<M<L<fL<JL</L<L<L<L<L<L<L<xL<_L<FL<.L<L<L<L<ιL<L<L<L<qL<[L<EL</L<L<L<L<ٌL<ňL<L<L<|L<txL<atL<MpL<:lL<(hL<dL<`L<[L<WL<SL<OL<KL<GL<CL<y?L<i;L<Y7L<J3L<:/L<++L<'L<#L<L<L<L<L<L<
L<L<L<K<K<|K<qK<eK<ZK<OK<DK<:K</K<%K<K<K<K<K<K<K<K<ݵK<ձK<έK<ƩK<K<K<K<K<K<K<K<K<K<K<}K<yK<{uK<wqK<smK<piK<leK<iaK<f]K<dYK<aUK<_QK<]MK<[IK<ZEK<YAK<X=K<W9K<V5K<V1K<V-K<V)K<W%K<W!K<XK<YK<ZK<\K<^K<`	K<bK<eK<hJ<kJ<nJ<qJ<uJ<yJ<}J<J<J<J<J<J<J<J<J<J<J<J<J<ɱJ<ЭJ<ةJ<J<J<J<J<J<J<J<J<'J<1J<<~J<FzJ<QvJ<\rJ<gnJ<rjJ<~fJ<bJ<^J<ZJ<VJ<RJ<NJ<JJ<FJ<BJ<>J<;J<7J<*3J<9/J<H+J<X'J<g#J<wJ<J<J<J<J<J<J<J<I<I<!I<4I<FI<YI<lI<I<I<I<I<I<I<I<I<"I<7I<LI<bI<xI<I<I<I<ҥI<I<I<I<0I<HI<`I<yI<I<I<~I<zI<vI<sI<+oI<EkI<_gI<zcI<_I<[I<WI<SI<PI<LI<<HI<XDI<u@I<<I<8I<4I<0I<-I<&)I<E%I<c!I<I<I<I<I<I<
I<?I<`I<H<H<H<H<H<'H<IH<kH<H<H<H<H<H<<H<`H<H<H<ͼH<H<H<;H<`H<H<H<ҡH<H<H<EH<lH<H<H<H<	H<1H<Y{H<wH<sH<oH<kH<%hH<OdH<x`H<\H<XH<TH<!QH<LMH<wIH<EH<AH<=H<&:H<R6H<~2H<.H<*H<'H<2#H<_H<H<H<H<H<EH<tH<H< H<G<1G<aG<G<G<G<#G<TG<G<G<G<G<LG<~G<G<G<G<IG<|G<G<G<G<LG<G<G<G<G<TG<G<G<G<+G<aG<G<{G<xG<=tG<tpG<lG<hG<eG<TaG<]G<YG<UG<7RG<qNG<JG<FG<CG<X?G<;G<7G<4G<C0G<,G<(G<$G<2!G<nG<G<G<$G<aG<
G<G<G<WF<F<F<F<PF<F<F<F<MF<F<F<F<NF<F<F<F<QF<F<ԻF<F<XF<F<ݬF< F<cF<F<F<-F<qF<F<F<=F<F<ǃF<F<Q|F<xF<tF<"qF<hmF<iF<eF<<bF<^F<ZF<WF<YSF<OF<KF<1HF<yDF<@F<
=F<S9F<5F<1F<0.F<z*F<&F<#F<XF<F<F<9F<F<F<	F<hF<F< E<ME<E<E<4E<E<E<E<jE<E<E<VE<E<E<CE<E<E<2E<E<ҷE<#E<sE<ĬE<E<gE<E<
E<\E<E< E<SE<E<E<LE<E<|E<GyE<uE<qE<CnE<jE<fE<BcE<_E<[E<BXE<TE<PE<DME<IE<EE<HBE<>E<:E<N7E<3E</E<U,E<(E<%E<_!E<E<E<jE<E<E<wE<E<+E< E<D<<D<D<D<MD<D<D<aD<D<D<wD<D<1D<D<D<ID<D<D<dD<·D<!D<D<߬D<?D<D<D<^D<D<D<D<D<AD<D<D<eD<}D<(zD<vD<rD<OoD<kD<hD<xdD<`D<?]D<YD<VD<kRD<ND<4KD<GD<CD<b@D<<D<-9D<5D<1D<_.D<*D<,'D<#D<D<aD<D<0D<D<D<g
D<D<8D<C<
C<sC<C<FC<C<C<C<C<XC<C<-C<C<C<oC<C<GC<C<C<C<C<eC<ҰC<?C<C<C<C<C<dC<ӗC<AC<C<C<C<C<mC<~C<M{C<wC<-tC<pC<mC<iC<eC<bbC<^C<E[C<WC<)TC<PC<MC<IC<EC<fBC<>C<M;C<7C<54C<0C<-C<)C<&C<{"C<C<eC<C<PC<C<;C<	C<(C<C<B<B<B<{B<B<jB<B<ZB<B<JB<B<<B<B<.B<B<!B<B<B<B<
B<B<B<zB<B<pB<B<gB<B<_B<ܘB<XB<ՑB<RB<ϊB<LB<ɃB<GB<|B<CyB<uB<?rB<nB<=kB<gB<;dB<`B<9]B<YB<9VB<RB<9OB<KB<:HB<DB<<AB<=B<?:B<6B<B3B</B<F,B<(B<K%B<!B<QB<B<WB<B<^B<B<f	B<B<oB<A<xA<A<A<A<A<A<A<A<A<,A<A<9A<A<GA<A<VA<A<fA<A<wA<A<A<A<A<#A<A<6A<A<JA<ԖA<^A<A<tA<A<A<A<~A<,{A<wA<DtA<pA<]mA<iA<vfA<cA<_A<\A<XA<9UA<QA<UNA<JA<qGA< DA<@A<=A<9A<<6A<2A<\/A<+A<|(A<%A<!A<-A<A<OA<A<qA<A<	A<'A<A<K@<@<p@<@<@<)@<@<P@<@<x@<@<@<5@<@<^@<@<@<@<@<I@<ߺ@<u@<@<@<9@<ϩ@<f@<@<@<-@<Ę@<\@<@<@<%@<@<W@<@<}@<"z@<v@<Us@<o@<l@<$i@<e@<Yb@<^@<[@<*X@<T@<aQ@<M@<J@<4G@<C@<m@@<	=@<9@<C6@<2@<~/@<,@<(@<W%@<!@<@<1@<@<o@<@<@<L
@<@<@<+ @<?<k?<?<?<M?<?<?<0?<?<s?<?<?<Y?<?<?<@?<?<?<)?<̼?<p?<?<?<\?< ?<?<I?<?<?<8?<ݗ?<?<(?<΍?<t?<?<?<g?<}?<y?<\v?<s?<o?<Rl?<h?<e?<Jb?<^?<[?<CX?<T?<Q?<>N?<J?<G?<;D?<@?<=?<9:?<6?<3?<90?<,?<)?<:&?<"?<?<=?<?<?<A?<?<?<G?<?<?<O><><><X><><><b><><><o><><><|><,><><><<><><><M><><><`><><î><u><&><ؤ><><=><><><U><><><o><"><փ><><>}><y><v><[s><p><l><zi></f><b><_><P\><Y><U><rR><)O><K><H><ME><B><>><s;><+8><4><1><S.><+><'><|$><5!><><><`><><><><H
><><><w ><1=<=<=<b=<=<=<=<Q=<=<=<=<B=<=<=<y=<6=<=<=<o=<-=<=<=<g=<&=<=<=<c=<"=<=<=<`=< =<=<=<a=<"=<=<=<d=<&~=<z=<w=<jt=<,q=<m=<j=<sg=<6d=<`=<]=<~Z=<BW=<T=<P=<M=<PJ=<G=<C=<@=<a==<&:=<6=<3=<u0=<;-=< *=<&=<#=<R =<=<=<=<l=<3=<=<	=<=<P=< =<<<<<p<<8<< <<<<<<[<<$<<<<<<<<K<<<<<<<<t<<><<	<<Կ<<<<j<<6<<<<ͯ<<<<e<<2<<<<˟<<<<e<<2<<<<̏<<<<h<<6<<<<<<|<<oy<<>v<<s<<o<<l<<zi<<Jf<<c<<_<<\<<Y<<ZV<<*S<<O<<L<<I<<nF<<?C<<@<<<<<9<<6<<X3<<+0<<,<<)<<&<<u#<<H <<<<<<<<<<j<<><<
<<<<<< <<e;<:;<;<;<;<;<e;<;;<;<;<;<;<l;<C;<;<;<;<;<x;<O;<(;< ;<ط;<;<;<b;<;;<;<;<ǡ;<;<{;<U;</;<	;<;<;<;<t;<O;<*;<|;<x;<u;<r;<to;<Pl;<-i;<	f;<b;<_;<\;<}Y;<ZV;<7S;<P;<L;<I;<F;<C;<k@;<J=;<):;<7;<3;<0;<-;<*;<d';<D$;<$!;<;<;<;<;<;<g;<H;<);<
;<;<:<:<:<s:<V:<8:<:<:<:<:<:<:<m:<Q:<5:<:<:<:<:<:<:<t:<Y:<>:<$:<	:<:<ժ:<:<:<:<n:<U:<;:<":<	:<:<؋:<:<:<:<w:<_|:<Hy:<0v:<s:<p:<l:<i:<f:<c:<`:<y]:<cZ:<MW:<7T:<"Q:<N:<J:<G:<D:<A:<>:<;:<z8:<f5:<Q2:<=/:<*,:<):<&:<":<:<:<:<:<:<~:<k:<Y
:<G:<5:<$:<9<9<9<9<9<9<9<9<9<{9<k9<[9<K9<<9<,9<9<9<9<9<9<9<Ľ9<9<9<9<9<9<q9<d9<W9<J9<=9<09<#9<9<9<9<9<9<ۆ9<Ѓ9<Ā9<}9<z9<w9<t9<q9<n9<yk9<oh9<ee9<[b9<Q_9<G\9<>Y9<5V9<+S9<"P9<M9<J9<G9< D9<@9<=9<:9<79<49<19<.9<+9<(9<%9<"9<9<9<9<9<9<9<9<}
9<w9<r9<m9<h8<c8<_8<Z8<V8<Q8<M8<I8<F8<B8<>8<;8<88<58<28</8<-8<*8<(8<&8<$8<"8< 8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<}8<z8< w8<"t8<$q8<&n8<(k8<+h8<-e8<0b8<3_8<6\8<9Y8<<V8<?S8<CP8<FM8<JJ8<NG8<RD8<WA8<[>8<`;8<d88<i58<n28<s/8<x,8<~)8<&8<#8< 8<8<8<8<8<8<8<8<8<8<8<7<7<7<7<7< 7<7<7<7<"7<+7<47<=7<F7<P7<Y7<c7<m7<w7<7<7<7<7<7<7<7<̲7<ׯ7<7<7<7<7<7<7<*7<77<C7<P7<]7<j7<w7<7<7<7<}7<z7<w7<t7<q7<n7<l7<i7< f7</c7<>`7<M]7<]Z7<lW7<|T7<Q7<N7<K7<H7<E7<B7<?7<<7<:7< 77<247<C17<U.7<f+7<x(7<%7<"7<7<7<7<7<7<7<7<27<E7<Y7<l7<6<6<6<6<6<6<6<6<#6<86<N6<c6<x6<6<6<6<6<6<6<6<)6<@6<W6<m6<6<6<6<˰6<6<6<6<*6<C6<[6<s6<6<6<6<א6<6<	6<#6<=6<V6<p6<|6<y6<v6<s6<p6<n6<)k6<Dh6<_e6<{b6<_6<\6<Y6<V6<T6<!Q6<=N6<ZK6<vH6<E6<B6<?6<<6<:6<$76<B46<_16<}.6<+6<(6<%6<"6< 6<26<Q6<p6<6<6<6<6<	6<,6<L6<l 6<5<5<5<5<5<.5<O5<p5<5<5<5<5<5<95<[5<}5<5<5<5<5<)5<L5<o5<5<5<ٵ5<5<!5<E5<i5<5<5<ա5<5<5<C5<h5<5<5<؍5<5<#5<I5<o5<5<|5<y5<w5<.t5<Uq5<|n5<k5<h5<e5<c5<@`5<g]5<Z5<W5<T5<R5<0O5<XL5<I5<F5<C5<@5<$>5<M;5<w85<55<25</5<-5<H*5<r'5<$5<!5<5<5<G5<r5<5<5<5<5<J5<v5<5<4<4<&4<S4<4<4<4<4<34<`4<4<4<4<4<D4<r4<4<4<4<,4<Z4<4<4<4<4<F4<u4<4<԰4<4<44<d4<4<Ţ4<4<&4<W4<4<4<4<4<M4<~4<4<4<4<F~4<x{4<x4<u4<s4<Bp4<um4<j4<g4<e4<Bb4<u_4<\4<Y4<W4<ET4<yQ4<N4<K4<I4<KF4<C4<@4<=4<;4<T84<54<24</4<+-4<a*4<'4<$4<"4<:4<q4<4<4<4<M4<4<4<4<*4<b4< 4<3<
3<C3<{3<3<3<%3<^3<3<3<
3<C3<}3<3<3<*3<d3<3<3<3<N3<3<3<3<:3<u3<3<3<(3<d3<3<ۧ3<3<T3<3<͜3<
3<F3<3<3<3<;3<x3<3<3<13<o~3<{3<x3<*v3<hs3<p3<m3<$k3<ch3<e3<b3<!`3<`]3<Z3<W3< U3<`R3<O3<L3< J3<aG3<D3<A3<#?3<d<3<93<63<(43<i13<.3<+3<.)3<p&3<#3< 3<73<y3<3<3<B3<3<3<3<N3<3<3< 3<]2<2<2<)2<n2<2<2<<2<2<2<2<P2<2<2< 2<f2<2<2<82<~2<2<2<R2<2<2<'2<n2<2<2<D2<2<Ө2<2<c2<2<2<<2<2<͕2<2<^2<2<2<:2<2<͂2<2<`}2<z2<w2<>u2<r2<o2<m2<gj2<g2<d2<Hb2<_2<\2<*Z2<uW2<T2<R2<XO2<L2<I2<<G2<D2<A2<"?2<n<2<92<72<U42<12<.2<=,2<)2<&2<&$2<t!2<2<2<^2<2<2<J2<2<2<7	2<2<2<$2<t1<1<1<c1<1<1<S1<1<1<E1<1<1<71<1<1<+1<|1<1<1<q1<1<1<g1<1<1<_1<1<1<W1<1<1<P1<1<1<K1<1<1<F1<1<1<C1<1<1<A1<1<1<@1<1<}1<@{1<x1<u1<As1<p1<m1<Ck1<h1<e1<Fc1<`1<]1<J[1<X1<U1<OS1<P1<M1<VK1<H1<F1<]C1<@1<>1<f;1<81<61<o31<01<!.1<z+1<(1<,&1<#1< 1<91<1<1<F1<1<1<U1<1<
	1<e1<1<1<u0<0<,0<0<0<>0<0<0<R0<0<
0<g0<0< 0<|0<0<60<0<0<N0<0<0<f0<0<"0<0<޹0<<0<0<0<W0<0<0<t0<Ӥ0<20<0<0<P0<0<0<o0<Ϗ0<00<0<0<Q0<0<0<s}0<z0<5x0<u0<r0<Xp0<m0<k0<}h0<e0<Ac0<`0<^0<h[0<X0<-V0<S0<P0<UN0<K0<I0<~F0<C0<EA0<>0<<0<p90<60<840<10</0<e,0<)0<.'0<$0<!0<]0<0<'0<0<0<X0<0<#0<
0<0<U0<0<" 0</</<V/</<#/</</<Y/</<(/</</<_/</<//</< /<h/</<9/</</<t/</<F/</</</</<V/</<*/</</<i/<Ԣ/<>/</</</</<U/</<,/</</<o/<ڃ/<F/<~/<|/<y/<v/<dt/<q/<=o/<l/<j/<g/<d/<_b/<_/<:]/<Z/<X/<U/<R/<`P/<M/<<K/<H/<F/<C/<@/<f>/<;/<D9/<6/<"4/<1/<//<q,/<)/<Q'/<$/<1"/</</</</<d/</<E/</<(/</<
/<|/< /<_.<.<C.<.<'.<.<.<~.<.<d.<.<J.<.<0.<.<.<.<.<q.<.<Y.<.<A.<.<*.<.<.<.<.<r.<.<\.<Ѭ.<G.<.<2.<.<.<.<
.<.<.<l.<.<Z.<Ћ.<G.<.<5.<.<$.<|.<z.<w.<u.<zr.<o.<jm.<j.<Zh.<e.<Kc.<`.<<^.<[.<.Y.<V.< T.<Q.<O.<L.<J.<G.<D.<tB.<?.<h=.<:.<\8.<5.<R3.<0.<G..<+.<=).<&.<3$.<!.<*.<.<!.<.<.<.<.<.<
.<.<.<.< .<y-<-<s-<-<n-<-<i-<-<d-<-<`-<-<\-<-<Y-<-<V-<-<S-<-<Q-<-<P-<-<O-<ο-<N-<κ-<N-<ε-<N-<ΰ-<N-<ϫ-<O-<Ц-<Q-<ҡ-<S-<Ԝ-<U-<֗-<X-<ْ-<[-<ݍ-<_-<-<c-<-<g-<~-<l|-<y-<qw-<t-<wr-<o-<}m-< k-<h-<f-<c-<a-<^-<\-<Y-<W-<T-<'R-<O-<0M-<J-<9H-<E-<CC-<@-<M>-<;-<X9-<6-<c4-<1-<n/-<,-<z*-< (-<%-<#-< -<-<-<'-<-<5-<-<C-<-<R
-<-<a-<-<q -<,<,<	,<,<,<,<*,<,<<,<,<N,<,<`,<,<s,<,<,<,<,<#,<,<8,<,<L,<,<a,<,<w,<,<,<,<,<.,<,<E,<Ч,<\,<,<t,< ,<,<,<,<1,<,<J,<׌,<d,<,<~,<,<,<&~,<{,<Ay,<v,<\t,<q,<xo,<m,<j,<#h,<e,<@c,<`,<]^,<[,<{Y,<
W,<T,<(R,<O,<GM,<J,<gH,<E,<C,<A,<>,<6<,<9,<W7,<4,<x2,<	0,<-,<++,<(,<M&,<#,<o!,<,<,<$,<,<G,<,<k,<,<,<"	,<,<G,<,<m+<+<+<&+<+<L+<+<s+<+<+<.+<+<V+<+<~+<+<+<;+<+<e+<+<+<#+<+<N+<+<x+<+<+<9+<϶+<e+<+<+<'+<+<T+<+<+<+<+<F+<ݙ+<t+<+<+<:+<ҍ+<i+<+<+<1+<Ɂ+<a+<|+<z+<*x+<u+<\s+<p+<n+<&l+<i+<Yg+<d+<b+<%`+<]+<X[+<X+<V+<&T+<Q+<ZO+<L+<J+<)H+<E+<^C+<@+<>+</<+<9+<e7+<5+<2+<70+<-+<o++<
)+<&+<B$+<!+<{+<+<+<P+<+<+<&+<+<`+<	+<+<7+<+<r +<*<*<K*<*<*<%*<*<b*< *<*<=*<*<{*<*<*<X*<*<*<6*<*<u*<*<*<T*<*<*<4*<Խ*<u*<*<*<W*<*<*<9*<ڪ*<{*<*<*<`*<*<*<D*<*<*<**<͐*<o*<*<*<V*<*<*<>*<}*<{*<'y*<v*<nt*<r*<o*<Ym*<j*<h*<Df*<c*<a*<0_*<\*<yZ*<X*<U*<gS*<Q*<N*<VL*<I*<G*<EE*<B*<@*<6>*<;*<9*<'7*<4*<s2*<0*<-*<f+*<)*<&*<Z$*< "*<*<N*<*<*<D*<*<*<:*<*<
*<1*<*<*<)*<)<z)<")<)<s)<)<)<m)<)<)<i)<)<)<e)<)<)<b)<)<)<`)<
)<)<^)<	)<)<^)<	)<)<^)<	)<)<`)<)<)<b)<)<)<e)<)<)<i)<)<)<n)<)<Ǖ)<s)< )<͎)<z)<')<ԇ)<)<.)<܀)<~)<7|)<y)<w)<@u)<r)<p)<Jn)<k)<i)<Ug)<e)<b)<a`)<^)<[)<nY)<W)<T)<|R)<+P)<M)<K)<:I)<F)<D)<JB)<?)<=)<Z;)<
9)<6)<k4)<2)</)<~-)<.+)<()<&)<B$)<!)<)<V)<)<)<k)<)<)<)<3)<
)<)<J)<)<)<b(<(<(<{(<.(<(<(<G(<(<(<b(<(<(<~(<2(<(<(<N(<(<(<l(< (<(<(<?(<(<(<^(<(<ɼ(<(<4(<(<(<V(<(<¬(<x(<.(<(<(<R(<(<(<v(<-(<(<(<R(<	(<(<x(<0(<(<(<W(<(<|(<z(<7x(<u(<s(<aq(<o(<l(<j(<Ch(<e(<c(<oa(<(_(<\(<Z(<TX(<V(<S(<Q(<;O(<L(<J(<iH(<#F(<C(<A(<S?(<=(<:(<8(<>6(<3(<1(<o/(<*-(<*(<((<]&(<$(<!(<(<L(<(<(<(<<(<(<(<q(<.(<(<(<e(<"(<'<'<Y'<'<'<'<O'<'<'<'<G'<'<'<'<?'<'<'<{'<:'<'<'<w'<6'<'<'<s'<3'<'<'<r'<2'<'<'<r'<2'<'<'<s'<3'<'<'<v'<7'<'<'<z'<;'<'<'<'<A'<'<Ŋ'<'<H'<
'<́'<'<Q}'<{'<x'<v'<\t'<r'<o'<m'<gk'<*i'<f'<d'<tb'<8`'<]'<['<Y'<GW'<U'<R'<P'<WN'<L'<I'<G'<iE'<.C'<@'<>'<|<'<A:'<8'<5'<3'<V1'</'<,'<*'<m('<3&'<#'<!'<'<K'<'<'<'<e'<+'<'<'<'<G	'<'<'<'<c '<+&<&<&<&<I&<&<&<&<j&<2&<&<&<&<T&<&<&<&<w&<@&<	&<&<&<e&<.&<&<&<&<U&<&<&<&<}&<G&<&<ܲ&<&<q&<<&<&<ҧ&<&<h&<3&<&<ɜ&<&<`&<,&<&<Ñ&<&<[&<'&<&<&<&<X&<$&<}&<{&<y&<Ww&<$u&<r&<p&<n&<Xl&<&j&<g&<e&<c&<\a&<*_&<\&<Z&<X&<aV&<0T&<Q&<O&<M&<iK&<8I&<G&<D&<B&<s@&<B>&<<&<9&<7&<5&<O3&<1&<.&<,&<*&<^(&<.&&<#&<!&<&<o&<?&<&<&<&<&<R&<#&<&<	&<&<h&<9&<&<%<%<%<R%<$%<%<%<%<l%<>%<%<%<%<%<[%<.%<%<%<%<z%<N%<!%<%<%<%<o%<C%<%<%<%<%<g%<<%<%<%<%<%<c%<7%<%<%<%<%<a%<6%<%<%<%<%<b%<8%<%<%<%<%<f%<<%<%<%<~%<|%<mz%<Dx%<v%<s%<q%<o%<xm%<Ok%<'i%<f%<d%<b%<`%<]^%<5\%<Z%<W%<U%<S%<nQ%<GO%<M%<J%<H%<F%<D%<[B%<4@%<>%<;%<9%<7%<s5%<L3%<&1%<.%<,%<*%<(%<g&%<A$%<"%<%<%<%<%<`%<;%<%<%<%<%<
%<]%<8%<%<%<$<$<$<^$<9$<$<$<$<$<$<c$<?$<$<$<$<$<$<l$<I$<&$<$<$<$<$<y$<V$<4$<$<$<$<$<$<h$<F$<%$<$<$<$<$<~$<]$<<$<$<$<١$<$<$<w$<W$<6$<$<$<֐$<$<$<v$<V$<6$<$<$<$<}$<{$<zy$<[w$<<u$<s$<p$<n$<l$<j$<h$<df$<Fd$<(b$<	`$<]$<[$<Y$<W$<sU$<VS$<8Q$<O$<L$<J$<H$<F$<D$<kB$<N@$<1>$<<$<9$<7$<5$<3$<1$<h/$<L-$<0+$<)$<&$<$$<"$< $<$<m$<Q$<6$<$<$<$<$<$<$<x	$<]$<B$<'$<$<#<#<#<#<#<o#<U#<;#<!#<#<#<#<#<#<#<o#<U#<<#<##<
#<#<#<#<#<#<v#<^#<E#<-#<#<#<#<ͻ#<#<#<#<n#<W#<?#<(#<#<#<#<ˤ#<#<#<#<p#<Y#<C#<,#<#<#<#<Ӎ#<#<#<#<{#<e#<P#<:#<%}#<{#<x#<v#<t#<r#<p#<n#<{l#<gj#<Rh#<=f#<)d#<b#< `#<]#<[#<Y#<W#<U#<S#<sQ#<_O#<LM#<8K#<%I#<G#<D#<B#<@#<>#<<#<:#<8#<x6#<f4#<S2#<@0#<..#<,#<	*#<'#<%#<##<!#<#<#<#<y#<g#<V#<D#<3#<"#<#<
#<#<#<#<#< #<"<"<y"<h"<X"<H"<7"<'"<"<"<"<"<"<"<"<"<"<"<{"<l"<]"<M"<>"<0"<!"<"<"<"<"<"<"<"<"<"<"<"<u"<g"<Z"<L"<>"<1"<#"<"<	"<"<"<"<՛"<ș"<"<"<"<"<"<|"<p"<c"<W"<K"<?"<3"<'"<}"<{"<y"<v"<t"<r"<p"<n"<l"<j"<h"<f"<d"<b"<`"<t^"<j\"<_Z"<UX"<JV"<@T"<6R"<,P"<"N"<L"<J"<H"<E"<C"<A"<?"<="<;"<9"<7"<5"<3"<1"</"<-"<+"<{)"<r'"<j%"<a#"<Y!"<Q"<H"<@"<8"<0"<)"<!"<"<"<
"<"<"<"<"<"< "<!<!<!<!<!<!<!<!<!<!<!<!<!<!<}!<w!<q!<k!<e!<`!<Z!<U!<O!<J!<E!<@!<;!<6!<1!<,!<'!<#!<!<!<!<!<!<!<!< !<!<!<!<!<!<!<!<!<ߝ!<ۛ!<ؙ!<՗!<ҕ!<ϓ!<̑!<ɏ!<ƍ!<Ë!<!<!<!<!<!<!<}!<{!<y!<w!<u!<s!<q!<o!<m!<k!<i!<g!<e!<c!<a!<_!<]!<[!<Y!<W!<U!<S!<Q!<O!<M!<K!<I!<G!<E!<C!<A!<?!<=!<;!<9!<7!<5!<3!<1!</!<-!<+!<)!<'!<%!<#!<!!<!<!<!<!<!<!<!<!<!<!<!<	!<!<!<!<!< < < < < < < < < < < < < < < < < < < < <  < < < < < < < <" <& <+ <0 <5 <: <? <D <I <N <S <Y <^ <d <i <o <u <z < < < < < < < < < < < <Ǝ <̌ <ӊ <ڈ < < < < <~ <} <{ <y <w <#u <+s <2q <:o <Bm <Jk <Ri <Zg <be <kc <sa <{_ <] <[ <Y <W <U <S <Q <O <M <K <I <G <E <C <B <@ <> << <): <38 <=6 <G4 <Q2 <[0 <e. <o, <z* <( <& <$ <" <  < < < < < < < < < < <) <5	 <@ <L <X <d <p<|<<<<<<<<<<<<<<+<8<F<S<`<m<{<<<<<<<<<<<<"<0<><M<[<j<y<<<<<é<ӧ<<< <<</<><N<^<n<~<<<<<Έ<߆<< <<!<1}<B{<Sy<dw<uu<s<q<o<m<k<i<g<e<d<"b<4`<F^<X\<jZ<|X<V<T<R<P<N<L<J<I<!G<4E<GC<ZA<m?<=<;<9<7<5<3<1<0<.<.,<B*<U(<i&<}$<"< <<<<<
<<3<H<]<q<<	<<<<< <</<E<Z<p<<<<<<<	<<5<K<b<x<<<<<< <<.<E<\<s<<<<<< <</<G<_<w<<<<׭<<< <8<Q<j<<<<͚<<<<1<J<c<}<<<ɇ<<<<0<J~<d|<~z<x<v<t<r<q<o<6m<Qk<li<g<e<c<a<_<^<(\<CZ<_X<zV<T<R<P<N<M<K<;I<WG<sE<C<A<?<=< <<:<98<U6<r4<2<0<.<,<+<)<<'<Y%<v#<!<<<<	<&<D<b<<<<<
<	<3<R<p<<<<<	<'<F<e<<<<< <<?<^<~<<<<<<<<\<|<<<<<<=<]<~<<<<<!<B<c<<<ǲ<<	<+<L<n<<<ӣ<<<8<Z<|<<<<<'<J<l<<<ԇ<<<=<`<~<|<z<x<w<3u<Ws<zq<o<m<k<	j<-h<Qf<ud<b<`<^<]<)[<NY<rW<U<S<Q<P<)N<NL<sJ<H<F<D<C<,A<R?<w=<;<9<7<6<34<Y2<~0<.<,<*<)<<'<c%<#<!<<<#<I<p<<<<<2<Y<<	<<<<E<l <<<<<3<[<<<<<#<K<t<<<<<?<g<<<<<4<]<<<<<,<U<<<<<&<P<z<<ζ<<"<L<w<<̫<<!<L<v<<̠<<"<M<x<<ϕ<<%<Q<|<<ӊ<<+<W<<<<~<3|<_z<x<v<t<s<=q<jo<m<k<i<h<Jf<wd<b<`<^<+]<Y[<Y<W<U<T<<R<jP<N<L<J<!I<OG<}E<C<A<@<6><e<<:<8<6<5<M3<|1</<-<	,<8*<g(<&<$<"<$!<S<<<<<A<q<<<<1<a<	<<<"<R< <<<<E<v<<<	<:<k<<<<0<a<<<<(<Z<<<<!<S<<<<<N<<<<<K<~<<<<I<|<<<<I<}<<<<K<~<<<<N<<<<<R<<<<$<X<<<<+<`<<~<|<4{<iy<w<u<	t<>r<tp<n<l<k<Ji<g<e<c<"b<X`<^<\<Z<1Y<gW<U<S<
R<AP<xN<L<J<I<SG<E<C<A</@<f><<<:<9<D7<{5<3<1<"0<Z.<,<*<)<9'<q%<#<!< <R<<<<4<m<<<<P<<
<<4<m<<< <R<<<<8<r<<< <Z<<<<B<|<<<+<f<<<<Q<<<<<<w<<<)<d<<<<R<<ɼ<<A<|<<<0<l<<<!<]<<֥<<O<<Ȟ<<B<<<<6<s<<<+<h<<< <^<<ـ<<U}<{<y<x<Mv<t<r<q<Fo<m<k<j<@h<~f<d<b<:a<y_<]<[<6Z<uX<V<T<3S<rQ<O<M<0L<pJ<H<F</E<oC<A<?</><o<<:<8</7<o5<3<1<10<q.<,<*<3)<t'<%<#<6"<w <<<;<|<<<@<<<<F<<	<<M<<<<U<<<<^<<<&<h<<<1<s<<<<<<<<I<<<<V<<<!<e<<<0<t<<<@<<<<Q<<ڹ<<c<<<2<v<< <E<<Ϧ<<Z<<<*<o<<<@<<˓<<W<<<)<o<<<B<<π<<\}<{<y</x<vv<t<s<Kq<o<m< l<gj<h<f<=e<c<a<`<[^<\<Z<2Y<yW<U<	T<QR<P<N<)M<rK<I<H<KF<D<B<$A<m?<=<;<G:<8<6<!5<j3<1</<F.<,<*<")<k'<%<#<G"< <<%<n<<<L<<<*<u<<	<T
<<<3<~<< <^<<<><<< <k<<<M<<</<{<<<^<<<A<<<%<r<<
<V<<<<<<<!<n<<<U<<<<<<ֶ<#<p<<<Y<<<A<<ݥ<+<x<Ơ<<b<<<M<<<8<<ԏ<#<r<<<^<<<J<<~<7}<{<y<%x<tv<t<s<cq<o<n<Ql<j<h<Ag<e<c<0b<`<^<!]<q[<Y<X<bV<T<S<SQ<O<M<EL<J<H<8G<E<C<+B<|@<><=<p;<9<8<d6<4<3<X1</<-<N,<*<(<C'<%<#<9"< <<0<<<'<z<<<r<<<j<
<	<c<<	<\< <<V<<<P<<<K<<<F<<<B<<<><<<;<<<9<<<6<<<5<<<3<<<3<<<3<<ݽ<3<<޸<4<<߳<5<<<7<<<9<<<<<<<?<<<C<<<G<<<K<<<Q<<<V<<<\<~<}<c{<y<x<jv<t<s<rq<o<"n<zl<j<*i<g<e<3d<b<`<=_<]<[<GZ<X<V<QU<S<R<\P<N<M<hK<I<H<sF<D<&C<A<?<3><<<:<@9<7<5<N4<2<1<\/<-<,<k*<(<'<z%<#</"< <<?<<<O<<<`<<<q<<(<	<<:<<<M<<<`<<<s<<+<<<@<<<U<<<j<<#<<<9<<<P<<
<g<<"<<<:<<<R<<<k<ɿ<&<<<@<<<Z<<<u<ӭ<2<<<M<<
<i<Ƞ<'<<<C<<<a<<<~<ގ<=<<<[<<<z<ځ<:<~<|<Z{<y<x<zv<t<:s<q<o<[n<l<k<}i<g<>f<d<b<`a<_<"^<\<Z<EY<W<V<hT<R<+Q<O<M<OL<J<I<tG<E<8D<B<@<]?<=<!<<:<8<G7<5<4<n2<0<3/<-<+<[*<(< '<%<#<H"< <<q<<7<<<a<<(<<<R<<
<}<<D<<<p <<8<< <d<<-<<<Z<<#<<<Q<<<<<I<<<y<<C<<<s<<><<	<o<<:<<<l<<8<<<j<й<6<<<i<б<6<<<j<ѩ<8<<<l<ӡ<:<<<p<י<><<<t<ܑ<C<<<z<<J<<<<<Q<~<"}<{<y<Zx<v<+u<s<q<ep<n<6m<k<j<ph<f<Be<c<b<}`<^<O]<[<"Z<X<V<^U<S<1R<P<O<nM<K<AJ<H<G<E<C<SB<@<'?<=<;<f:<8<:7<5<4<z2<0<O/<-<$,<*<(<e'<%<;$<"<!<|<<R<<)<< <k<<B<<<<
<]	<<5<<<y<<Q<<*<<<o<<H<<!<<<g<<A<<<<<b<<=<<<<<`<<;<<<<<_<<;<<<<<b<н<><<<<<f<ղ<D<<!<<<m<ܧ<K<<)<<<w<<V<ř<4<<<<<b<Ҏ<B<<!<<<q<<Q<<2<}<|<z<x<dw<u<Et<r<&q<o<n<xl<j<Zi<g<<f<d<c<a< `<r^<\<T[<Y<7X<V<U<S<Q<oP<N<RM<K<6J<H<G<E<C<pB<@<U?<=<9<<:<9<7<6<v4<2<[1</<@.<,<&+<)<(<&<$<e#<!<K <<2<<<< <s<<Z<<B<<)<
<	<<<m<<V<<><<'<<<<<m<<W<<@<<*<<<<<s<<]<<H<<3<<<<	<<<j<<V<<B<<.<<<<<}<<i<<V<͵<C<<1<<<<<<<q<<_<֡<M<Ş<<<<+<<<<	<<<p<<_<׊<O<Ǉ<?<</<< <~<}<{<z<yx<v<ju<s<\r<p<Mo<m<?l<j<0i<g<"f<d<c<a<`<^<\<s[<Y<fX<V<YU<S<LR<P<?O<M<3L<J<'I<G<F<D<C<A<@<}><<<r;<9<g8<6<\5<3<Q2<0<F/<-<<,<*<2)<'<(&<$<#<!< <<<<<}<<t<<k<<b<<Z<
<R	<<I<<B<<: <<2<<+<<$<<<<<<<<	<<<<<z<<t<<o<<i<<d<<_<<Z<<V<<Q<<M<<I<<E<<A<<><<;<<7<<4<<2<</<<-<<+<<)<<'<<%<<$<<"<<!<< << <<<<<<<<<<<~<}<{< z<x< w<u<!t<r<"q<o<$n<l<%k<i<'h<f<)e<c<+b<`<-_<]</\<Z<2Y<W<5V<T<8S<Q<;P<N<>M<K<BJ<H<EG<E<ID<B<MA<?<Q><<<V;<9<Z8<6<_5<3<d2<0<i/<-<o,<*<t)<'<z&<$<#<"< <	<<<<<<<<#<<*<<1<<9
<<@<<H<<P<<X<<a<<i<<r<<{<<<<<<<<<%<</<<9<<C<<M<<X<<c<<m<<y<<<
<<<<!<<-<<9<<E<˸<R<ص<^<<k<<x<<<<<<<'<<5<<C<ʜ<Q<ؙ<_<<n<<|<<<<<"<<1<<A<Ƀ<Q<؀<`<}<p|<z<y<	x<v<u<s<*r<p<;o<m<Ll<j<]i<g<nf<d<c<	b<`<_<]<,\<Z<?Y<W<QV<T<cS<Q<vP< O<M<L<J<&I<G<9F<D<LC<A<`@<><t=<;<:<9<7<&6<4<;3<1<O0<.<d-<+<y*<)<'<&<$<.#<!<D <<Z<<p<<<<<'<<><<U<<l
<<<<<&<<= <<U<<m<<<<<)<<B<<[<<s< <<<<2<<L<<e<<<<<&<<@<<[<<u<<<<<9<<T<<o<<<<<4<·<P<޴<l<<<<<3<ª<P<ߧ<m<<<<<6<ŝ<T<<q< <<<<<<̐<[<<y<	<<'<<F<փ<e<<<~<|<4{<y<Sx<v<su<t<r<#q<o<Dn<l<dk<i<h<g<e<6d<b<Wa<_<x^<	]<[<*Z<X<LW<U<nT<R<Q<!P<N<CM<K<fJ<H<G<F<D<<C<A<_@<><=<<<:<89<7<[6<4<3<2<0<5/<-<Y,<*<~)<(<&<4%<#<Y"< <~<<<6<<[<<<<<:<<`<<<
<<?<<f<<<  <<G<<n<<<)<<Q<<y<<<5<<]<<<<<B<<k<<<(<<R<<{<<<9<<c<<<"<<L<<w<<<6<̾<a<<<"<<M<<x<<<:<Э<f<<<(<<T<<<<<C<ٜ<p<<<3<ʕ<`<<<%<<R<<<<<E<܄<s<
<<9<}<h|<z<y<.x<v<]u<s<r<$q<o<Sn<l<k<j<h<Jg<e<{d<c<a<C`<^<s]<\<Z<<Y<W<mV<U<S<7R<P<hO<N<L<2K<I<dH<F<E</D<B<aA<?<><,=<;<_:<8<7<+6<4<^3<1<0<*/<-<^,<*<)<+(<&<_%<#<"<-!<<a<<</<<d<<<3<<h<<<8<
<m	<<<><<s<<<D<<{<<<L<<<<<U<<<(<<_<<<2<<j<<<=<<v<<<J<<<<<W<<<-<<f<<<<<<u<<<L<<<#<<]<<<5<ұ<o<<<G<<< <<[<<<4<ҟ<p<<<J<<<$<<`<<<;<ٍ<w<<<S<<<.<͂<l<
<~<H}<{<z<%y<w<cv<u<s<@r<p<~o<n<l<\k<i<h<:g<e<yd<c<a<X`<^<]<7\<Z<wY<X<V<VU<S<R<7Q<O<wN<M<K<XJ<H<G<9F<D<zC<B<@<[?<=<<<=;<9<8< 7<5<a4<3<1<D0<.<-<(,<*<j)<(<&<N%<#<"<2!<<u<<<Z<<<?<<<%<<i<<<O<	<<6<<z<<<a <<<I<<<1<<v<<<^<<<G<<<0<<w<<<`<<<J<<<5<<|<<<g<<<R<<<><<<*<<r<<<_<<<L<<<9<޶<<'<̲<p<<<_<<<M<<<<<<<,<џ<v<<<f<<<V<<<G<<<8<݌<<)<ψ<u<<<g<<<Y<}<|<L{<y<x<>w<u<t<2s<q<p<%o<m<sl<k<i<gh<g<e<[d<c<a<P`<^<]<F\<Z<Y<;X<V<U<1T<R<Q<(P<N<wM<L<J<mI<H<F<eE<D<B<\A<@<><T=<;<:<L9<7<6<E5<3<2<>1</<.<7-<+<*<1)<'<&<+%<#<|"<%!<<w< <<r<<<m<<<i<<<e<<<a
<
	<<]<<<Z<<<X<<<U<<<S<<<R<<<P<<<O<<<O<<<N<<<N<<<O<<<O<<<Q<<<R<<<T<<<V<<<X<<<[<<<^<
<<a<<<e<<<i<<«<n<<Ƨ<r<<ˣ<x<$<џ<}<*<֛<<0<ܗ<<6<<<<<<<C<<<K<<<R<<<Z<<~<b}<|<z<ky<x<v<tu<"t<r<}q<+p<n<m<5l<j<i<?h<f<e<Id<b<a<T`<_<]<_\<[<Y<jX<W<U<vT<%S<Q<P<1O<M<L<=K<I<H<JG<E<D<WC<B<@<e?<><<<s;<":<8<7<06<4<3<?2<0</<N.<,<+<]*<)<'<m&<%<#<}"<-!<<<=<<<N<<<_<<<p<!<<<3<
<	<E<<<W<<<j <<<}<.<<<B<<<V<<<j<<<<0<<<E<<<[<<<p<"<<<8<<<O<<<f<<<}</<<<G<<<_<<<w<*<ܽ<<B<<<[<<<t<(<۰<<A<<<[<<§<v<)<ݣ<<D<<<_<<ǚ<{</<<<J<<<g<<ύ<<7<<<T<	<<r<&<ۀ<<D~<|<{<bz<y<w<v<5u<s<r<Tq<	p<n<sm<(l<j<i<Hh<f<e<hd<c<a<`<=_<]<\<^[<Z<X<W<5V<T<S<VR<Q<O<xN<.M<K<J<PI<H<F<rE<)D<B<A<L@<?<=<o<<%;<9<8<I7< 6<4<m3<$2<0</<H.<,<+<m*<$)<'<&<I%< $<"<n!<& <<<K<<<r<)<<<P<<<w<.<<<V
<	<<~<5<<<^< <
<
<>
<
<
<g
< 
<
<
<I
<
<
<r
<+
<
<
<U
<
<
<
<8
<
<
<c
<
<
<
<G
< 
<
<s
<,
<
<
<X
<
<
<
<>
<
<
<j
<$
<
<
<Q
<
<
<~
<8
<
<
<f
< 
<ڹ
<
<N
<	
<ô
<}
<7
<
<
<f
<!
<۫
<
<P
<
<Ŧ
<
<:
<
<
<k
<%
<
<
<V
<
<̘
<
<B
<
<
<s
<.
<
<
<`
<
<׊
<
<N
<	
<ą
<
<<
<
<
<n
<*~
<|
<{
<]z
<y
<w
<v
<Mu
<	t
<r
<q
<=p
<n
<m
<ql
<.k
<i
<h
<bg
<f
<d
<c
<Tb
<a
<_
<^
<F]
<\
<Z
<|Y
<9X
<V
<U
<oT
<,S
<Q
<P
<cO
< N
<L
<K
<WJ
<I
<G
<F
<LE
<	D
<B
<A
<A@
<>
<=
<z<
<7;
<9
<8
<p7
<.6
<4
<3
<g2
<%1
</
<.
<^-
<,
<*
<)
<V(
<'
<%
<$
<O#
<"
< 
<
<H
<
<
<
<A
< 
<
<}
<<
<
<
<x
<6
<
<
<s
<2

<
<
<n
<-
<
<
<k
<* 
<	<	<g	<'	<	<	<e	<$	<	<	<b	<"	<	<	<a	<!	<	<	<`	< 	<	<	<_	<	<	<	<_	<	<	<	<`	< 	<	<	<a	<!	<	<	<c	<#	<	<	<e	<%	<	<	<h	<(	<	<	<k	<,	<	<	<o	<0	<	<	<s	<4	<	<	<x	<9	<	<	<}	<?	< 	<¨	<	<E	<	<ȣ	<	<L	<	<Ϟ	<	<S	<	<י	<	<[	<	<ߔ	<	<c	<%	<	<	<l	<.	<	<	<u	<7	<	<	<	<A	<	<	<~	<L}	<|	<z	<y	<Wx	<w	<u	<t	<cs	<&r	<p	<o	<on	<2m	<k	<j	<|i	<?h	<g	<e	<d	<Lc	<b	<`	<_	<Z^	<]	<[	<Z	<iY	<,X	<V	<U	<wT	<;S	<Q	<P	<O	<KN	<M	<K	<J	<[I	<H	<F	<E	<lD	<0C	<A	<@	<}?	<A>	<=	<;	<:	<S9	<8	<6	<5	<f4	<*3	<1	<0	<y/	<>.	<-	<+	<*	<Q)	<(	<&	<%	<e$	<*#	<!	< 	<z	<?	<	<	<	<U	<	<	<	<j	<0	<	<	<	<G	<	<	<
	<^		<#	<	<	<u	<;	<	< 	<<S<<<<l<2<<<<L<<<<f<,<<<<G<<<<b<)<<<~<E<<<<a<(<<<~<E<<<<c<*<<<<H<<<<g</<<<<N<<޹<<n<6<<Ƴ<<W<<<<x<@<<Ѩ<<b<*<<<<L<<ޝ<<o<8<<ʗ<<\<$<<<<I<<ی<<m<7< <Ɇ<<\<%<<<<K~<}<{<z<ry<;x<w<u<t<bs<,r<p<o<n<Tm<l<j<i<|h<Gg<f<d<c<ob<:a<`<^<]<c\<.[<Y<X<W<XV<#U<S<R<Q<MP<O<M<L<yK<DJ<I<G<F<pE<;D<C<A<@<h?<3><<<;<:<`9<+8<6<5<4<Y3<%2<0</<.<T-<,<*<)<(<N'<&<$<#<~"<J!< <<<{<G<<<<x<D<<<<v<B<<<<t
<A	<<<<t<A<< <<t<A<<<<u<C<<<<w<E<<<<z<H<<<<~<K<<<<<P<<<<<U<#<<<<[<)<<<<b<0<<<<i<8<<<<r<@<<޽<<{<J<<<<<T<#<<<<_<.<<̪<<j<:<	<ؤ<<w<F<<<<<T<#<<×<<b<2<<ё<<q<A<<<<<Q<!<<<<a<2<<~<}<s|<C{<z<x<w<v<Vu<&t<r<q<p<io<:n<
m<k<j<}i<Nh<g<e<d<c<cb<4a<`<^<]<x\<J[<Z<X<W<V<`U<2T<S<Q<P<xO<IN<M<K<J<I<aH<3G<F<D<C<{B<LA<@<><=<<<g;<9:<9<7<6<5<T4<&3<1<0</<o.<B-<,<*<)<(<^'<1&<%<#<"<|!<N <!<<<<m<@<<<<<_<2<<<<<R<&<	<<<s<G<<<< <i<<<<<<<_<3<<<<<W<+<<<<{<O<#<<<<u<I<<<<<o<D<<<<<k<@<<<<<h<=<<<<<f<;<<<<<e<:<<<<<e<:<<<<<f<<<<<<<h<><<<<<l<B<<<Ġ<<p<F<<<ə<<v<L<"<<ϒ<<|<S<)< <׋<<<[<2<<߄<<<d<;<<}<|<{<nz<Ey<x<v<u<t<ys<Pr<(q<o<n<m<l<]k<4j<i<g<f<e<jd<Bc<b<`<_<^<y]<Q\<([< Z<X<W<V<`U<8T<S<Q<P<O<qN<IM<"L<J<I<H<G<\F<4E<D<B<A<@<o?<G>< =<;<:<9<8<\7<56<5<3<2<1<q0<J/<$.<,<+<*<)<a(<:'<&<$<#<"<y!<S <,<<<<<l<E<<<<<<`<9<<<<<{
<U	</<	<<<<r<L<& < <<<<j<D<<<<<<c<><<<<<<^<9<<<<<<[<6<<<<<}<X<4<<<<<|<X<3<<<<<}<X<4<<<<<<[<6<<<ʽ<<<^<:<<<ϵ<<<c<?<<<ԭ<<<j<F<#<<ܥ<<<q<N<+<<<<<{<X<4<<<˔<<<b<@<<<׌<<<o<L<)<<<<<}<Z<8<~<|<{<z<y<ix<Gw<%v<u<s<r<q<zp<Xo<6n<m<k<j<i<h<kg<If<'e<d<b<a<`<~_<]^<;]<\<Z<Y<X<W<rV<QU</T<S<Q<P<O<N<hM<GL<&K<J<H<G<F<E<_D<>C<B<@<?<><=<y<<Y;<8:<9<7<6<5<4<t3<T2<31<0<.<-<,<+<q*<Q)<1(<'<%<$<#<"<p!<P <0<<<<<<p<P<0<<<<<<r<S<3<<
<	<<<v<W<8<<< <<<|<]<><< <<<<<e<F<'<<<<<<o<P<1<<<<<<z<\<=<<<<<<<i<K<-<<<<<<y<[<=<<<<<<<l<O<1<<<ؾ<<<<b<E<'<
<<ϴ<<<w<Z<=< <<<Ȫ<<<q<T<7<<<<Ġ<<<n<Q<4<<<ޗ<<<<l<P<3<<<ލ<<<<m<Q<5<<<<Ă<<<p<T~<8}<|< {<y<x<w<v<uu<Zt<>s<"r<q<o<n<m<l<}k<bj<Fi<+h<g<e<d<c<b<a<l`<Q_<5^<]<[<Z<Y<X<W<xV<]U<BT<'S<R<P<O<N<M<L<lK<QJ<7I<H<G<E<D<C<B<}A<c@<H?<.><=<;<:<9<8<7<v6<\5<B4<(3<2<0</<.<-<,<r+<X*<?)<%(<'<%<$<#<"<!<q <W<><$<<<<<<<r<Y<@<&<<<<<<<v
<]	<D<+<<<<<< <}<e<L<3<<<<<<<<n<V<><%<<<<<<<{<c<K<3<<<<<<<<s<[<C<+<<<<<<<<m<V<><'<<<<<<<<k<T<=<&<<<<ɼ<<<<m<V<?<(<<<<̰<<<<q<[<D<-<< <<Ӥ<<<<y<c<L<6< <	<<ݘ<Ǘ<<<<n<X<B<,<< <<ԋ<<<<}<g<Q<;<&<<<<~<}<|<{<yz<dy<Nx<9w<#v<u<s<r<q<p<o<n<ym<dl<Ok<:j<%i<h<f<e<d<c<b<a<~`<i_<T^<?]<*\<[<Z<X<W<V<U<T<S<qR<]Q<HP<4O<N<M<K<J<I<H<G<F<}E<iD<UC<AB<-A<@<?<=<<<;<:<9<8<y7<f6<R5<>4<*3<2<1</<.<-<,<+<*<z)<f(<S'<@&<,%<$<#<!< <<<<<<l<Y<F<3< <<<<<<<<<v<c<P
<>	<+<<<<<<< <<<r<_<M<;<(<<<<<<<<<<s<a<O<=<+<<<<<<<<<<y<h<V<D<3<!<<<<<<<<<<s<b<Q<@<.<<<<<<<<<<<s<b<R<A<0<<<<<ݵ<̴<<<<<y<i<X<H<7<'<<<<<֤<ţ<<<<<u<e<U<E<5<%<<<<<Փ<ƒ<<<<<w<g<X<H<9<)<<
<<<܂<́<<<~<}<|<q{<bz<Ry<Cx<4w<%v<u<t<r<q<p<o<n<m<l<k<j<ri<ch<Tg<Ff<7e<(d<c<b<`<_<^<]<\<[<Z<Y<X<zW<lV<^U<PT<AS<3R<%Q<P<	O<M<L<K<J<I<H<G<F<E<}D<oC<aB<SA<E@<8?<*><=<<<;<9<8<7<6<5<4<3<2<1<z0<l/<_.<R-<D,<7+<**<)<(<'<%<$<#<"<!< <<<<<s<f<Y<L<@<3<&<<< <<<<<<<
<	<<<v<j<^<Q<E<9<- < <<<<<<<<<<<<<<x<l<a<U<I<=<2<&<<<<<<<<<<<<<<<z<o<c<X<M<B<7<+< <<
<<<<<<<<<<<<<}<r<h<]<R<H<=<3<(<<<	<<<<߱<հ<˯<<<<<<<<y<o<e<[<Q<G<=<3<)<<<<<<<<ۖ<ѕ<Ȕ<<<<<<<<{<r<i<_<V<M<C<:<1<(<<<<<}<|<{<z<y<x<w<v<u<t<s<r<q<p<}o<tn<lm<cl<Zk<Rj<Ii<Ah<8g</f<'e<d<c<b<a<_<^<]<\<[<Z<Y<X<W<V<U<T<S<R<Q<P<zO<rN<jM<bL<ZK<SJ<KI<CH<;G<3F<,E<$D<C<B<A<@<><=<<<;<:<9<8<7<6<5<4<3<2<1<0</<.<-<y,<r+<k*<d)<](<V'<O&<H%<A$<:#<3"<,!<& <<<<
<<<<<<<<<<<<<<<<<
<	<<<<|<v<p<j<c<] <W <Q <K <E <? <9 <3 <- <( <" < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <} <x <s <n <i <d <_ <Z <U <P <L <G <B <= <8 <4 </ <* <% <! < < < < <
 < < < < < < < < < <޴ <ٳ <ղ <ѱ <Ͱ <ɯ <Į < < < < < < < < < < < < < < < < < <~ <z <v <s <o <k <h <d <a <] <Z <V <S <O <L <I <E <B <? << <8 <5 <2 </ <, <( <% <" < < <~ <} <| <{ <z <y <x <w <v <t <s <r <q <p <o <n <m <l <k <j <i <h <g <f <e <d <c <b <a <` <_ <^ <] <\ <[ <Z <Y <X <W <V <U <T <S <R <Q <P <O <N <M <L <K <J <I <H <G <F <E <D <C <B <A <@ <? <> <= << <; <: <9 <8 <7 <6 <5 <~4 <}3 <|2 <z1 <y0 <x/ <w. <v- <u, <t+ <s* <r) <q( <p' <o& <n% <m$ <l# <k" <j! <j  <i <h <g <g <f <e <e <d <d <c <b <b <a <a <a <` <` <_ <_ <_ <^ <^
 <^	 <^ <] <] <] <] <] <] <] <]  <;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;о;Ҽ;Ӻ;ո;׶;ش;ڲ;ܰ;ޮ;;;;;;;;;;;;;;;;;;;	;;;;;;};{;!y;$w;'u;*s;-q;1o;4m;7k;;i;>g;Be;Fc;Ia;M_;Q];T[;XY;\W;`U;dS;hQ;lO;pM;tK;xI;}G;E;C;A;?;=;;;9;7;5;3;1;/;-;+;);';%;#;!;;;;;;;;;;;;
;;";(;.;4 ;:;@;F;L;R;X;_;e;k;q;x;~;;;;;;;;;;;;;;;;;;;;	;;;;';.;6;>;F;M;U;];e;m;u;};;;;;;;;;Ǒ;Џ;؍;;;;;;;;~;(|;1z;:x;Cv;Lt;Ur;^p;hn;ql;zj;h;f;d;b;`;^;\;Z;X;V;T;R;P;O;M;K;!I;+G;5E;?C;JA;T?;^=;i;;s9;~7;5;3;1;/;-;+;);';%;#;!;  ;;;";-;8;D;O;Z;f;q;}
;;;;; ;;;;;; ;;;$;0;=;I;U;b;n;{;;;;;;;;;;;;;";/;<;J;W;d;r;;;;;;ð;Ѯ;ެ;;;;;$;2;@;N;\;j;y;;;;;;ϋ;މ;;;	;;';6~;E|;Tz;cx;rv;t;r;p;n;l;j;h;f;d;
c;a;)_;9];H[;XY;hW;wU;S;Q;O;M;K;I;G;E;D;B;(@;8>;H<;Y:;i8;z6;4;2;0;.;,;*;(;&;%;!#;2!;C;T;e;v;;;;;;;;
;;$;5;G;Y ;j;|;;;;;;;;;;1;C;U;h;z;;;;;;;;;";5;H;[;n;;;;;;;;;;;.;A;U;h;|;;;;˥;ߣ;;;;.;B;W;k;;;;;Ќ;;;;";6;K;`;t};{;y;w;u;s;q;p;n;1l;Fj;[h;pf;d;b;`;^;\;Z;Y;W;1U;GS;]Q;rO;M;K;I;G;E;C;B;"@;8>;N<;d:;{8;6;4;2;0;.;-;+;.);E';\%;s#;!;;;;;;;*;A;Y;p;;
;;;;;;+;C;Z;r;;;;;;;;1;I;b;z;;;;;;;$;=;U;n;;;;;;;;4;M;f;;;;˶;;;;0;J;c;};;;ʣ;;;;1;J;d;~;;;̐;;;;5;O;j;;;;};{;	z;#x;>v;Yt;tr;p;n;l;j;h;g;0e;Kc;fa;_;];[;Y;W;
V;&T;AR;]P;xN;L;J;H;F;E;C;:A;V?;r=;;;9;7;5;3;2;70;T.;p,;*;(;&;$;";!;8;T;q;;;;;;;;;X;u
;;;;;;%;B;`;};;;;;;/;M;k;;;;;;;=;[;y;;;;;;/;N;l;;;;;;%;D;b;;;;޳;;;<;[;z;;;ؤ;;;7;V;v;;;Օ;;;5;U;t;;;Ն;;;5;U;v};{;y;w;u;t;8r;Yp;yn;l;j;h;f;e;>c;_a;_;];[;Y;X;%V;FT;hR;P;N;L;J;I;0G;RE;sC;A;?;=;;;:;>8;_6;4;2;0;.;	-;,+;N);p';%;#;!;;;>;a;;;;;;1;S;v;	;;;;%;H ;k;;;;;;?;b;;;;;;8;[;;;;;;3;W;{;;;;;/;T;x;;;;
;.;S;x;;;;
;/;T;y;;ê;;;2;W;};;ǝ;;;7;];;;͐;;;>;d;;;փ;;!;G~;m|;z;x;v;u;,s;Rq;yo;m;k;i;h;9f;`d;b;`;^;\;![;HY;oW;U;S;Q;
P;2N;YL;J;H;F;D;C;DA;k?;=;;;9;	8;16;Y4;2;0;.;,;+;G);o';%;#;!; ;7;`;;;;;);Q;z;;;	;;E;m;; ;;;:;c;;;;;0;Y;;;;;(;Q;z;;;;!;J;t;;;;;E;o;;;;;B;l;;;;;@;j;;;;;?;j;;;;;@;k;;;;;B;m;;Ð;;;E;q;;ȅ;;;K;v~;|;z;x;%w;Qu;}s;q;o;n;-l;Yj;h;f;d;
c;6a;c_;];[;Y;X;AV;nT;R;P;N; M;MK;zI;G;E;D;.B;[@;>;<;:;9;<7;j5;3;1;/;.;M,;z*;(;&;%;1#;^!;;;;;D;r;;;;*;X;;	;;;?;n; ;;;(;V;;;;;@;o;;;;*;Y;;;;;E;u;;;;2;a;;;; ;O;;;;;>;n;;ι;;.;^;;;;;P;;;;;B;r;;Ԝ;;5;f;;Ǔ;;);Z;;;;;O;;;;~;F|;wz;x;v;u;=s;nq;o;m;l;5j;gh;f;d;b;.a;`_;];[;Y;)X;[V;T;R;P;$O;VM;K;I;G; F;SD;B;@;>;=;P;;9;7;5;4;O2;0;.;,;+;N);';%;#;";N ;;;;;P;;;;;R;;
;;!;U;;;;&;Z;;;;+;_;;;;1;e;;;;8;l;;;;@;u;;;;I;~;;;;S;;;;(;^;;ɻ;;4;j;;ղ;;A;v;;;;N;;;;';];;ə; ;6;m;;ِ;;G;};;;!;X;;ƀ;~;3};j{;y;w;v;Ft;~r;p;n;#m;Zk;i;g;f;8d;pb;`;^;];N[;Y;W;U;-T;eR;P;N;M;DK;|I;G;E;%D;]B;@;>;=;>;;v9;7;5; 4;X2;0;.;-;;+;t);';%;$;W"; ;;;;;t;;;;Y;;;;>;w	;;;$;]; ;;
;D;~;;;+;e;;;;M;;;;6;p;;;;Z;;;	;D;~;;;.;i;;;;T;;;;@;|;;;-;h;;߰;;V;;ͩ;;D;;;;2;n;;;";^;;Ւ;;N;;Ƌ;;>;z;;;/;l;};{;!z;^x;v;t;s;Pq;o;m;l;Dj;h;f;d;7c;ta;_;];,\;iZ;X;V;!U;^S;Q;O;N;TL;J;H;G;JE;C;A;@;A>;<;:;8;97;w5;3;1;10;o.;,;*;*);h';%;#;#";b ;;;;\;;;;W;;;;R;	;;;N;; ;;K;;;;H;;;;E;;;;D;;;;C;;;;B;;;;C;;;;C;;;;E;;;;G;;Ⱥ;	;I;;˳;;L;;ά;;P;;ҥ;;U;;מ;;Z;;ܗ;;_;;;$;e;;;*;l;;;2;s;};{;9z;{x;v; u;Bs;q;o;n;Kl;j;h;g;Te;c;a;`;^^;\;Z;'Y;iW;U;S;2R;uP;N;L;>K;I;G;F;JD;B;@;?;W=;;;9;!8;e6;4;2;/1;s/;-;+;>*;(;&;	%;M#;!;;;];;;);m;;;:;~;;;K	;;;;]; ;;+;p;;;>;;;;R;;;!;f;;;6;{;;;K;;;;a;;;2;x;;;I;;;;`;;;2;x;;;K;;ײ;;d;;;7;~;Ħ;;Q;;ޟ;%;l;;;@;;Γ;;\;;;1;x;;;N;;݀;$;k};{;y;Bx;v;t;s;`q;o;m;7l;j;h;g;We;c;a;/`;w^;\;[;OY;W;U;(T;pR;P;O;IM;K;I;"H;kF;D;B;EA;?;=;<;h:;8;6;C5;3;1;0;g.;,;*;B);';%;$;g"; ;;C;;; ;i;;;F;;;#;m
;;;K;;;) ;s;;;R;;;0;{;;;Z;;;9;;;;d;;;D;;;%;p;;;Q;;;2;};;;_;;;A;;ػ;$;o;;;R;;;5;;ͪ;;e;;;I;;;-;y;ř;;^;;;C;;܍;(;u;;;[;;;A;~;|;'{;ty;w;v;[t;r;p;Bo;m;k;*j;wh;f;e;_c;a;_;G^;\;Z;0Y;}W;U;T;fR;P;O;OM;K;I;9H;F;D;#C;qA;?;>;[<;:;8;F7;5;3;12;0;.;-;k+;);(;W&;$;";C!;;;/;~;;;k;;	;X;;;F;	;;3;;;";q;;;`;;;N;;;>;;;-;};;;m;;;];;;N;;;?;;;0;;;!;r;;;d;;;V;;;H;;;;;;ݱ;/;;Ѭ;";s;ŧ;;g;;
;[;;;P;;;E;;;:;;ތ;0;;Ӈ;%;w;ɂ;;n;};|;dz;x;	w;[u;s; r;Rp;n;l;Jk;i;g;Bf;d;b;:a;_;];2\;Z;X;+W;~U;S;$R;wP;N;M;qK;I;H;jF;D;C;eA;?;>;_<;:;9;Z7;5;4;U2;0;.;P-;+;);L(;&;$;H#;!;;D;;;A;;;>;;;;;;;9
;;;7;;;5 ;;;3;;;2;;;1;;;1;;;0;;;0;;;1;;;1;;;2;;;4;;;5;;;7;;;:;;;<;;;?;;;B;;;F;;;I;;;M;;;R;; ;W;;;\;;
;a;;;g;;;m;ā;;s~;|;"{;yy;w;)v;t;r;0q;o;m;7l;j;h;?g;e;c;Gb;`;^;O];[; Z;XX;V;U;aS;Q;P;jN;L;K;sI;G;%F;}D;B;/A;?;=;9<;:;8;D7;5;3;O2;0;/;Z-;+;*;f(;&;%;r#;!;$ ;~;;1;;;=;;;K;;;X;
;	;e;;;s; ;(;;;6;;;E;;;T;;	;c;;;s;;(;;;8;;;I;;;Z;;;k;;!;|;;3;;;D;;;W;;;i;Ŷ; ;|;ر;3;;;G;;;Z;;;n;ʟ;&;;ߚ;;;;;P;;;e;;;z;ֈ;3;;;I;;;_};{;z;ux;v;/u;s;q;Fp;n; m;^k;i;h;uf;d;0c;a;_;H^;\;[;`Y;W;V;yT;R;4Q;O;M;ML;J;	I;gG;E;"D;B;@;<?;=;;;W:;8;7;q5;3;.2;0;.;I-;+;*;d(;&;!%;#;!;= ;;;Y;;;v;;4;;;Q;;;n	;;,;;;J;;	;h;;';;;F;;;e;;$;;;C;;;c;;#;;;C;;;d;;$;;;E;;;f;;';;;I;;
;k;̹;-;;;O;;;r;Ӭ;4;;;W;;;{;ܟ;>;; ;b;×;%;;;I;;;n;Њ;2;;;W;;;};};A|;z;y;gw;u;+t;r;p;Ro;m;l;yj;h;>g;e;d;eb;`;+_;];[;RZ;X;W;{U;S;@R;P;O;iM;K;/J;H;F;YE;C;B;@;>;I=;;;:;s8;6;:5;3; 2;d0;.;+-;+;);V(;&;%;#;!;I ;;;u;;=;;;i;;2;;;_;	;';;;U;; ;;;K;;;y;;C;;;r;;;;;;j;;5;;;d;;/;;;_;;);;;Z;;%;;;V;;";;;S;;;;;Q;;;;;O;;;;;O;;;;;O;;;;;P;;;;;R;; ;;;T;;";;;X~;|;&{;y;w;\v;t;+s;q;o;an;l;0k;i;g;gf;d;6c;a;`;n^;\;=[;Y;X;uV;T;ES;Q;P;}N;L;NK;I;H;F;D;WC;A;(@;>;<;a;;9;28;6;5;l3;1;=0;.;-;x+;);J(;&;%;#;!;V ;;);;;d;;7;;	;s;;E;;
;;;U;;(; ;;e;;9;;;w;;K;;;;;];;1;;;p;;E;;;;;Y;;.;;;n;;C;;;;;Y;;/;;;p;ۺ;G;;;;;_;ʯ;5;;;w;;N;;%;;;h;Ԝ;@;;;;;[;Ǒ;3;;;w;;O;;';;;l;~;D};{;z;x;v;bu;s;;r;p;o;m;k;Zj;h;4g;e;d;zb;`;T_;];.\;Z;Y;uW;U;OT;R;*Q;O;N;rL;J;LI;G;'F;D;C;oA;?;K>;<;&;;9;8;o6;4;J3;1;&0;.;-;p+;);L(;&;(%;#;";r ;;O;;+;;;v;;S;;0;;;|
;;Y;;7;;;;;a;;?;;;;;j;;H;;';;;u;;S;;2;;;;;`;;?;;;;;n;;N;;-;;;};;^;ν;>;;;;;o;;P;;1;;;;;c;Ԥ;E;;&;;;y;;Z;˖;<;;;; ;q;;T;ň;6;;;;;l;};O|;z;2y;w;v;t;r;jq;o;Nn;l;1k;i;h;f;d;jc;a;N`;^;2];[;Z;X;V;mU;S;RR;P;6O;M;L;J; I;rG;E;WD;B;=A;?;">;<;;;z9;7;`6;4;E3;1;+0;.;-;+;);j(;&;Q%;#;7"; ;;;;x;;^;;E;;,;;;;
;o	;;V;;>;;% ;;;;;i;;R;;:;;";;;;;h;;Q;;:;;#;;;;;j;;T;;=;;';;;;;p;;Z;;D;;/;;;;;y;;d;گ;O;Ŭ;:;;&;;;;;r;;^;ԛ;J;;5;;!;;;;;p;;\;Ӈ;I;;6;;";~;};{;y;sx;v;`u;s;Mr;p;;o;m;)l;j;i;g;f;{d;b;ia;_;W^;\;E[;Y;4X;V;"U;S;R;P; O;wM;K;fJ;H;UG;E;DD;B;3A;?;#>;<;;;9;8;z6;4;i3;1;Y0;.;I-;+;:*;(;*';%;$;";!;;;t;;e;;V;;G;;8;;);;
;;;;;w; ;i;;[;;M;;?;;1;;$;;;;	;;;u;;h;;[;;N;;B;;5;;);;;;;;;~;;r;;g;;[;ս;O;ʺ;D;;9;;.;;#;;;;;;;};;r;;h;;^;ٚ;S;Η;I;Ĕ;?;;6;;,;;";;;;;;;;};y|;z;py;w;gv;t;^s;q;Vp;n;Mm;k;Ej;h;=g;e;5d;b;-a;_;%^;\;[;Y;X;V;U;S;R;P; O;|M;K;uJ;H;nG;E;gD;B;`A;?;Z>;<;S;;9;M8;6;G5;3;@2;0;:/;-;4,;*;/);';)&;$;##;!; ;;;;;;;;	;;;; ;~;
;y	;;u;;p;;l ;;h;;d;;`;;\;;Y;;U;;R;;O;;K;;H;;E;;C;;@;;=;;;;;9;;6;;4;;2;;0;;/;;-;;,;;*;;);;(;;';;&;;%;;$;;$;;#;;#;;";;";;";;";;#;;#;;#;;$;;%;;&;};&|;z;'y;w;)v;t;*s;q;+p;n;-m;k;.j;h;0g;e;2d;b;4a;_;6^;\;8[;Y;;X;V;=U;S;?R;P;BO;M;EL;J;HI;G;KF;D;NC;A;Q@;>;T=;;;X:;8;\7;5;_4;2;c1;/;g.;,;k+;);o(;&;s%;#;x"; ;|;;;;;;;;;;;;;;
;"	;;';;-;;2 ;;8;;>;;D;;J;;Q;;W;;^;;d;;k;;r;;y;;;;;;;;;;;!;;);;1;;9;;A;;I;;;Q;ջ;Y;޸;b;;j;;s;typescatternameb = 10000x 8    8Q9RI99o:RI:47:Q:k:o:-:RI:d:4:::::l	:o;'	;-;;RI;
#;d*;|0;47;>;D;_)K;Q;DX;^;B`e;k;{r;l	y;$;o;KY;';;-;t;;u;RI;.;
ף;;d;;|;X9;4;Ǻ;;T;;;_);;p;;;D;;;e;B`;;;4;{;;l	;HP;$; o<o<ݵ<KY<<'	<C<<r<-<N<t<+<<_<u<<RI<<. <3"<
#<xz%<'<U(<d*<1,<-<O/<|0<2<X94<5<47<#9<:<j<<><[?<TA<8B<D<?F<G<I<_)K<L<;pN<P<Q<ZS<T<bV<DX<>Y<[</]<^<u`<eb<Ӽc<B`e<g<h<Jj<k<hm<4o<Ep<{r<!t<u<ew<l	y<ڬz<HP|<}<$<I< o<@<o<&<ݵ<<KY<+<<pΈ<'<q<C<M<<<r<)\<-<<Nё<<t<tF<+<<<P<_<0<u<,Ԛ<㥛<w<RI<	<<w<.<a<3<S<
ף<<xz<0L<<<U<<d<z6<1<٬<<V}<O< <|<3ı<ꕲ<g<X9<<ܵ<}<4<Q<#<Z<Ǻ<Ș<j<6<<<߾<[<<T<&<8<<<]m<?<<<9<<W<_)<<<<;p<A<<`<<Έ<Z<=,<<<b<s<D<<><<<d]</< <<@<u<G<e<<Ӽ<<B`<1<<g<<x<J<C<<<h< c<4<<E<<{<jM<!<<<F<e<7<l	<#<ڬ<~<HP<!<<m<$<n4 =I =%= o==@==o=J{=&=M=ݵ===o=KY='=+=ޓ==e=p=L7	='	=	
=q
=
=C=q=M=(~==O==!=r=M=)\==-===sh=N=*:===t==tF=O=+===R==t$=P=+=_==0==u=Qk=,=====w=v=RI=-=	===U=w=R' =. =	 =a!=!=3"=x"=S#=/n#=
#=?$=$=%=xz%=T%=0L&=&='='='=yX(=U(=0*)=)=)=d*=*=z6+=V+=1,=q,=,=B-=-={.=V}.=2.=O/=/= 0=0=|0=W[1=31=-2=2=2=g3=}3=X94=44=5=s5=5=E6=}6=Y7=47=7=Q8=Ǻ8=#9=~9=Z9=5^:=:=/;=Ș;=<=j<=[<=6<====>=v>=>=H?=[?=7@=@=@=TA=A=&B=\B=8B=aC=C=2D=D=E=]mE=9E=?F=F=G=yG=G=^KH=9H=I=I=I=WJ=J=_)K=:K=K=cL=L=5M=M=_N=;pN=N=AO=ΪO=P=|P=`P=<NQ=Q=R=ΈR=R=ZS=aS==,T=T=T=fU=U=8V=bV==
W=sW=W=DX=X=Y=cY=>Y=QZ=Z="[=[=[=d]\=?\=/]=]= ^=i^=^=d;_=@_=`=u`=`=Ga=a=eb=Ab=b=Sc=Ӽc=%d=d=fd=B`e=e=1f=Ԛf=g=lg=gg=B>h=h=i=xi=i=Jj=hj=Ck=k=k=Vl=l=(m=hm=Dm= cn=n=4o=o=p=iop=Ep= Aq=q=r={r=r=jMs=Fs=!t=t=t=Yu=u=k+v=Fv="v=ew=w=7x=x=l	y=Gry=#y=Cz=ڬz={=~{=m{=HP|=$|=!}=ۊ}=}=\~=m~=I.=$=  =n4=h=I=р=%=:= o=n=ׁ=J=@=%u==ނ=o=F=J{==&==M=o=ݵ=K==&S===o=$=KY=='==+=p_=ޓ=Kȇ=='1=e==pΈ==L7=k='=ԉ=	=q==q=L=ڊ=(=C=x=q==M=I=(~===q=O=M==)=!=V=r=ྎ=M='=)\==ŏ=r=-=Nb==)ː==4=sh==Nё==*:=n==sג==O@=t=*=ݓ==tF=z=O==+=L==t==O=R=+===t$=X=P==+=*=_=u=ǘ=P=0=,e==Ι=u=6=Qk==,Ԛ====vq=㥛=Qڛ==-C=w==v==RI=}=-==	=vO=䃞=R==-!=U=	=w==R'=[=.=Ġ=	=w-=a=S=ʡ=.=3=
h=x=Т=S=9=/n==
ף=x=?=Tt==/ݤ==F=xz=殥=T==0L===y==TR==0==$=yX=猨=U==0*=^==zǩ==U0=d=1=ͪ==z6=j=V=ӫ=1=<=q=z=٬=V=B=2w==={=H=V}=ı=2==O={=鷯=W= =2U===|=&=W[=ŏ=3ı==-=|a=ꕲ=Xʲ==33=g==}г==X9=m=4=ִ==}?=s=X=ܵ=4=E=z=}==Y=K=4===~=Q=Y=Ǻ=5=#=X=~==Z=)=5^==Ǻ==/=Zd=Ș=6ͻ==6=j=ힼ=[Ӽ==6<=p==ٽ==[B=v=6=߾==H=|=[==7=N====\ =T=7===&=Z=\==8=,=a===]=2=8g====8=]m=ˡ=9=
=?=s==]==9E=y====^K==9===Q==^==:#=W====_)=]=:===/=c=_==;=5=j===_=;=;p====A=`v=Ϊ=;==H=|==`==<N=====aT=Έ=<==&=Z==a===,=`====a2=f=====8=l=b===
=>=s===b=D=>y====J=c=г=>==Q===c="=?W====(=d]=ё=?==/=c==d= =?5=i====d;=o=@===A=u=e==@=G=|===e=M=A====S=f=Ӽ=A=%=Z===f=+=B`====1=ff=Ԛ=B==8=l==g=	=B>=r====gD=x=C===J=~=h==C=P====h"=V=D===(=\=h==D=.= c===i =4=Di== ==:=io=ף=E== A=u==j==EG={=!===jM=؁=F==!=S==j==F%=Y="===k+=_=F=="=1=e=k==G=7="l===l	===Gr==#==C=lx=ڬ=H==#J=~==m==HP==$==!=mV=ۊ=H==$(=\= =m==I.=b=$==   >7 >n4 >N >h > >I > > > >%>\ >:>T> o>7>n>>>>J>&>@>Z>%u>\>>>>8>o>,>F>a>J{>>>>&>]>>2>M>8g>o>>ݵ>>K>>>8>&S>]m>>ˡ>>9>o>
>$>?>KY>s>>>'>]>>>+>9E>p_>y>ޓ>>K>>>>'1>^K>e>>>9>p>>	>	>L7	>Q	>k	>	>'	>^	>	>	>	
>:#
>q=
>W
>q
>
>L
>
>
>
>(>_)>C>]>x>:>q>>>>M>/>I>c>(~>_>>>>;>q>5>O>j>M>>>>)>_>!>;>V>;p>r>>>>M>>'>A>)\>`v>>Ϊ>>;>r>>->H>Nb>|>>>)>`>>>4><N>sh>>>>N>>>>*:>aT>n>Έ>><>s>>>&>O@>Z>t>>*>a>>>>=,>tF>`>z>>O>>>>+>a2>L>f>>=>t>>>>O>8>R>l>+>b>>>>=
>t$>>>X>s>P>>>>+>b>*>D>_>>y>u>>>>P>>0>J>,e>c>>г>>>>u>>6>Q>Qk>>>>,>c>>">=>?W>vq>>>>Q>>>(>-C>d]>w>ё>>?>v>>>/>RI>c>}>>->d>> >	>?5>vO>i>>>R>>>>-!>d;>U>o>	>@>w>>> >R' >A >[ >u >. >e > > >	 >@!>w-!>G!>a!>|!>S!>!>!>!>.!>e">3">M">
h">A">x">">">">S#>#>9#>S#>/n#>f#>#>Ӽ#>
#>A#>x$>%$>?$>Z$>Tt$>$>$>$>/$>f$>%>+%>F%>B`%>xz%>%>%>%>T%>%>&>1&>0L&>ff&>&>Ԛ&>&>B&>y&>'>'>8'>TR'>l'>'>'>0'>g'>'>	(>$(>B>(>yX(>r(>(>(>U(>(>(>)>0*)>gD)>^)>x)>)>C)>z)>)>)>*>U0*>J*>d*>~*>1*>h*>*>*>+>C+>z6+>P+>j+>+>V+>+>+>+>1,>h",><,>V,>q,>D,>z,>,>,>,>V->(->B->\->2w->h->->->->D->{.>..>H.> c.>V}.>.>ı.>.>2.>i />/>4/>O/>Di/>{/>/>/> />W/>0> 0>:0>2U0>io0>0>ף0>0>E0>|0>1>&1> A1>W[1>u1>ŏ1>1>31>j1>1>2>-2>EG2>|a2>{2>2>!2>X2>2>2>3>333>jM3>g3>؁3>3>F3>}3>3>4>!4>X94>S4>m4>4>44>j4>4>4>5>F%5>}?5>Y5>s5>"5>X5>5>5>5>46>k+6>E6>_6>z6>F6>}6>6>6>"6>Y7>17>K7>e7>47>k7>7>7>7>G8>~8>78>Q8>"l8>Y8>8>Ǻ8>8>58>l	9>#9>=9>X9>Gr9>~9>9>9>#9>Z9>:>):>C:>5^:>lx:>:>ڬ:>:>H:>:>;>/;>#J;>Zd;>~;>Ș;>;>6;>m;><><>6<>HP<>j<><><>$<>[<><>=>!=>6<=>mV=>p=>ۊ=>=>H=>=>=>>>$(>>[B>>\>>v>> >>6>>m>>>>>>?>I.?>H?>b?>|?>$?>[?>?>?>  @>7@>n4@>N@>h@>@>I@>@>@>@>%A>\ A>:A>TA> oA>7A>nA>A>A>A>JB>&B>@B>ZB>%uB>\B>B>B>B>8B>oC>,C>FC>aC>J{C>C>C>C>&C>]C>D>2D>MD>8gD>oD>D>ݵD>D>KD>E>E>8E>&SE>]mE>E>ˡE>E>9E>oE>
F>$F>?F>KYF>sF>F>F>'F>]F>F>G>+G>9EG>p_G>yG>ޓG>G>KG>G>G>H>'1H>^KH>eH>H>H>9H>pH>H>I>I>L7I>QI>kI>I>'I>^I>I>I>	J>:#J>q=J>WJ>qJ>J>LJ>J>J>J>(K>_)K>CK>]K>xK>:K>qK>K>K>K>ML>/L>IL>cL>(~L>_L>L>L>L>;M>qM>5M>OM>jM>MM>M>M>M>)M>_N>!N>;N>VN>;pN>rN>N>N>N>MN>O>'O>AO>)\O>`vO>O>ΪO>O>;O>rO>P>-P>HP>NbP>|P>P>P>)P>`P>P>Q>4Q><NQ>shQ>Q>Q>Q>NQ>Q>R>R>*:R>aTR>nR>ΈR>R><R>sR>R>S>&S>O@S>ZS>tS>S>*S>aS>S>S>T>=,T>tFT>`T>zT>T>OT>T>T>T>+U>a2U>LU>fU>U>=U>tU>U>U>V>OV>8V>RV>lV>+V>bV>V>V>V>=
W>t$W>>W>XW>sW>PW>W>W>W>+W>bX>*X>DX>_X>>yX>uX>X>X>X>PX>Y>0Y>JY>,eY>cY>Y>гY>Y>>Y>uZ>Z>6Z>QZ>QkZ>Z>Z>Z>,Z>cZ>[>"[>=[>?W[>vq[>[>[>[>Q[>[>\>(\>-C\>d]\>w\>ё\>\>?\>v\>\>]>/]>RI]>c]>}]>]>-]>d]>]> ^>	^>?5^>vO^>i^>^>^>R^>^>^>_>-!_>d;_>U_>o_>	_>@_>w_>_>_>`>R'`>A`>[`>u`>.`>e`>`>`>	`>@a>w-a>Ga>aa>|a>Sa>a>a>a>.a>eb>3b>Mb>
hb>Ab>xb>b>b>b>Sc>c>9c>Sc>/nc>fc>c>Ӽc>
c>Ac>xd>%d>?d>Zd>Ttd>d>d>d>/d>fd>e>+e>Fe>B`e>xze>e>e>e>Te>e>f>1f>0Lf>fff>f>Ԛf>f>Bf>yf>g>g>8g>TRg>lg>g>g>0g>gg>g>	h>$h>B>h>yXh>rh>h>h>Uh>h>h>i>0*i>gDi>^i>xi>i>Ci>zi>i>i>j>U0j>Jj>dj>~j>1j>hj>j>j>k>Ck>z6k>Pk>jk>k>Vk>k>k>k>1l>h"l><l>Vl>ql>Dl>zl>l>l>l>Vm>(m>Bm>\m>2wm>hm>m>m>m>Dm>{n>.n>Hn> cn>V}n>n>ın>n>2n>i o>o>4o>Oo>Dio>{o>o>o> o>Wo>p> p>:p>2Up>iop>p>ףp>p>Ep>|p>q>&q> Aq>W[q>uq>ŏq>q>3q>jq>q>r>-r>EGr>|ar>{r>r>!r>Xr>r>r>s>33s>jMs>gs>؁s>s>Fs>}s>s>t>!t>X9t>St>mt>t>4t>jt>t>t>u>F%u>}?u>Yu>su>"u>Xu>u>u>u>4v>k+v>Ev>_v>zv>Fv>}v>v>v>"v>Yw>1w>Kw>ew>4w>kw>w>w>w>Gx>~x>7x>Qx>"lx>Yx>x>Ǻx>x>5x>l	y>#y>=y>Xy>Gry>~y>y>y>#y>Zy>z>)z>Cz>5^z>lxz>z>ڬz>z>Hz>z>{>/{>#J{>Zd{>~{>Ș{>{>6{>m{>|>|>6|>HP|>j|>|>|>$|>[|>|>}>!}>6<}>mV}>p}>ۊ}>}>H}>}>}>~>$(~>[B~>\~>v~> ~>6~>m~>~>~>>I.>H>b>|>$>[>>>  >>7>R'>n4>A>N>[>h>u>>.>I>e>>Ā>р>ހ>>	>%>@>\ >w->:>G>T>a> o>|>7>S>n>>>ʁ>ׁ>>>.>J>e>&>3>@>M>Z>
h>%u>A>\>x>>>Â>Ђ>ނ>>8>S>o>>,>9>F>S>a>/n>J{>f>>>>Ӽ>Ƀ>
׃>&>A>]>x>>%>2>?>M>Z>8g>Tt>o>>>>ݵ>>Є>/݄>K>f>>>>+>8>F>&S>B`>]m>xz>>>ˡ>殅>>Ʌ>9օ>T>o>>
>>$>1>?>0L>KY>ff>s>>>Ԛ>>>'>Bφ>]܆>y>>>>>+>8>9E>TR>p_>l>y>>ޓ>>>0>Kȇ>gՇ>>>>	>>$>'1>B>>^K>yX>e>r>>猈>>>9>U>pΈ>ۈ>>>>>>0*>L7>gD>Q>^>k>x>>>'>C>^>zǉ>ԉ>>>>	>>:#>U0>q=>J>W>d>q>~>>1>L>h>>͊>ڊ>>>>(>C>_)>z6>C>P>]>j>x>>:>V>q>>Ƌ>Ӌ>>>>1>M>h">/><>I>V>c>q>(~>D>_>z>>>̌>ٌ>>>;>V>q>(>5>B>O>\>j>2w>M>h>>>>ō>ҍ>>)>D>_>{>!>.>;>H>V> c>;p>V}>r>>>ı>ྎ>ˎ>َ>2>M>i >>>'>4>A>O>)\>Di>`v>{>>>Ϊ>鷏>ŏ> ҏ>;ߏ>W>r>>> >->:>H>2U>Nb>io>|>>>ף>>>)ː>Eؐ>`>|>>>>&>4> A><N>W[>sh>u>>ŏ>>>>3đ>Nё>jޑ>>>>>>->*:>EG>aT>|a>n>{>Έ>ꕒ>>!><>Xʒ>sג>>>>>>&>33>O@>jM>Z>g>t>؁>>>*>F>aÓ>}Г>ݓ>>>>>!>=,>X9>tF>S>`>m>z>>>4>O>j>ɔ>֔>>>>>+>F%>a2>}?>L>Y>f>s>>">=>X>t>>ϕ>ܕ>>>>4>O>k+>8>E>R>_>l>z>+>F>b>}>>Ȗ>Ֆ>>>">=
>Y>t$>1>>>K>X>e>s>4>P>k>>>>Η>ۗ>>+>G>b>~>*>7>D>Q>_>"l>>y>Y>u>>>Ǻ>ǘ>Ԙ>>5>P>l	>>#>0>=>J>X>,e>Gr>c>~>>>г>>Ι>#ۙ>>>Z>u>>>)>6>C>Q>5^>Qk>lx>>>>ڬ>>ǚ>,Ԛ>H>c>>>>">/>=>#J>?W>Zd>vq>~>>Ș>㥛>>>6͛>Qڛ>m>>>>>(>6>-C>HP>d]>j>w>>ё>힜>>$>?Ɯ>[Ӝ>v>>>>>!>/>6<>RI>mV>c>p>}>ۊ>>>->H>d̝>ٝ>>> >>	>$(>?5>[B>vO>\>i>v>䃞> >>6>R>mŞ>Ҟ>ߞ>>>>>-!>I.>d;>H>U>b>o>|>	>$>@>[>w>˟>؟>>>  >>7>R'>n4>A>N>[>h>u>>.>I>e>>Ġ>Ѡ>ޠ>>	>%>@>\ >w->:>G>T>a> o>|>7>S>n>>>ʡ>ס>>>.>J>e>&>3>@>M>Z>
h>%u>A>\>x>>>â>Т>ޢ>>8>S>o>>,>9>F>S>a>/n>J{>f>>>>Ӽ>ɣ>
ף>&>A>]>x>>%>2>?>M>Z>8g>Tt>o>>>>ݵ>¤>Ф>/ݤ>K>f>>>>+>8>F>&S>B`>]m>xz>>>ˡ>殥>>ɥ>9֥>T>o>>
>>$>1>?>0L>KY>ff>s>>>Ԛ>>>'¦>BϦ>]ܦ>y>>>>>+>8>9E>TR>p_>l>y>>ޓ>>>0>Kȧ>gէ>>>>	>>$>'1>B>>^K>yX>e>r>>猨>>>9>U>pΨ>ۨ>>>>>>0*>L7>gD>Q>^>k>x>>>'>C>^>zǩ>ԩ>>>>	>>:#>U0>q=>J>W>d>q>~>>1>L>h>>ͪ>ڪ>>>>(>C>_)>z6>C>P>]>j>x>>:>V>q>>ƫ>ӫ>>>>1>M>h">/><>I>V>c>q>(~>D>_>z>>>̬>٬>>>;>V>q>(>5>B>O>\>j>2w>M>h>>>>ŭ>ҭ>>)>D>_>{>!>.>;>H>V> c>;p>V}>r>>>ı>ྮ>ˮ>ٮ>2>M>i >>>'>4>A>O>)\>Di>`v>{>>>Ϊ>鷯>ů> ү>;߯>W>r>>> >->:>H>2U>Nb>io>|>>>ף>>>)˰>Eذ>`>|>>>>&>4> A><N>W[>sh>u>>ŏ>>>>3ı>Nѱ>jޱ>>>>>>->*:>EG>aT>|a>n>{>Έ>ꕲ>>!><>Xʲ>sײ>>>>>>&>33>O@>jM>Z>g>t>؁>>>*>F>aó>}г>ݳ>>>>>!>=,>X9>tF>S>`>m>z>>>4>O>j>ɴ>ִ>>>>>+>F%>a2>}?>L>Y>f>s>>">=>X>t>µ>ϵ>ܵ>>>>4>O>k+>8>E>R>_>l>z>+>F>b>}>>ȶ>ն>>>">=
>Y>t$>1>>>K>X>e>s>4>P>k>>>>η>۷>>+>G>b>~>*>7>D>Q>_>"l>>y>Y>u>>>Ǻ>Ǹ>Ը>>5>P>l	>>#>0>=>J>X>,e>Gr>c>~>>>г>>ι>#۹>>>Z>u>>>)>6>C>Q>5^>Qk>lx>>>>ڬ>>Ǻ>,Ժ>H>c>>>>">/>=>#J>?W>Zd>vq>~>>Ș>㥻>>>6ͻ>Qڻ>m>>>>>(>6>-C>HP>d]>j>w>>ё>ힼ>>$>?Ƽ>[Ӽ>v>>>>>!>/>6<>RI>mV>c>p>}>ۊ>>>->H>d̽>ٽ>>> >>	>$(>?5>[B>vO>\>i>v>䃾> >>6>R>mž>Ҿ>߾>>>>>-!>I.>d;>H>U>b>o>|>	>$>@>[>w>˿>ؿ>>>  >>7>R'>n4>A>N>[>h>u>>.>I>e>>>>>>	>%>@>\ >w->:>G>T>a> o>|>7>S>n>>>>>>>.>J>e>&>3>@>M>Z>
h>%u>A>\>x>>>>>>>8>S>o>>,>9>F>S>a>/n>J{>f>>>>Ӽ>>
>&>A>]>x>>%>2>?>M>Z>8g>Tt>o>>>>ݵ>>>/>K>f>>>>+>8>F>&S>B`>]m>xz>>>ˡ>>>>9>T>o>>
>>$>1>?>0L>KY>ff>s>>>Ԛ>>>'>B>]>y>>>>>+>8>9E>TR>p_>l>y>>ޓ>>>0>K>g>>>>	>>$>'1>B>>^K>yX>e>r>>>>>9>U>p>>>>>>>0*>L7>gD>Q>^>k>x>>>'>C>^>z>>>>>	>>:#>U0>q=>J>W>d>q>~>>1>L>h>>>>>>>(>C>_)>z6>C>P>]>j>x>>:>V>q>>>>>>>1>M>h">/><>I>V>c>q>(~>D>_>z>>>>>>>;>V>q>(>5>B>O>\>j>2w>M>h>>>>>>>)>D>_>{>!>.>;>H>V> c>;p>V}>r>>>ı>>>>2>M>i >>>'>4>A>O>)\>Di>`v>{>>>Ϊ>>> >;>W>r>>> >->:>H>2U>Nb>io>|>>>ף>>>)>E>`>|>>>>&>4> A><N>W[>sh>u>>ŏ>>>>3>N>j>>>>>>->*:>EG>aT>|a>n>{>Έ>>>!><>X>s>>>>>>&>33>O@>jM>Z>g>t>؁>>>*>F>a>}>>>>>>!>=,>X9>tF>S>`>m>z>>>4>O>j>>>>>>>+>F%>a2>}?>L>Y>f>s>>">=>X>t>>>>>>>4>O>k+>8>E>R>_>l>z>+>F>b>}>>>>>>">=
>Y>t$>1>>>K>X>e>s>4>P>k>>>>>>>+>G>b>~>*>7>D>Q>_>"l>>y>Y>u>>>Ǻ>>>>5>P>l	>>#>0>=>J>X>,e>Gr>c>~>>>г>>>#>>>Z>u>>>)>6>C>Q>5^>Qk>lx>>>>ڬ>>>,>H>c>>>>">/>=>#J>?W>Zd>vq>~>>Ș>>>>6>Q>m>>>>>(>6>-C>HP>d]>j>w>>ё>>>$>?>[>v>>>>>!>/>6<>RI>mV>c>p>}>ۊ>>>->H>d>>>> >>	>$(>?5>[B>vO>\>i>v>> >>6>R>m>>>>>>>-!>I.>d;>H>U>b>o>|>	>$>@>[>w>>>>>  >>7>R'>n4>A>N>[>h>u>>.>I>e>>>>>>	>%>@>\ >w->:>G>T>a> o>|>7>S>n>>>>>>>.>J>e>&>3>@>M>Z>
h>%u>A>\>x>>>>>>>8>S>o>>,>9>F>S>a>/n>J{>f>>>>Ӽ>>
>&>A>]>x>>%>2>?>M>Z>8g>Tt>o>>>>ݵ>>>/>K>f>>>>+>8>F>&S>B`>]m>xz>>>ˡ>>>>9>T>o>>
>>$>1>?>0L>KY>ff>s>>>Ԛ>>>'>B>]>y>>>>>+>8>9E>TR>p_>l>y>>ޓ>>>0>K>g>>>>	>>$>'1>B>>^K>yX>e>r>>>>>9>U>p>>>>>>>0*>L7>gD>Q>^>k>x>>>'>C>^>z>>>>>	>>:#>U0>q=>J>W>d>q>~>>1>L>h>>>>>>>(>C>_)>z6>C>P>]>j>x>>:>V>q>>>>>>>1>M>h">/><>I>V>c>q>(~>D>_>z>>>>>>>;>V>q>(>5>B>O>\>j>2w>M>h>>>>>>>)>D>_>{>!>.>;>H>V> c>;p>V}>r>>>ı>>>>2>M>i >>>'>4>A>O>)\>Di>`v>{>>>Ϊ>>> >;>W>r>>> >->:>H>2U>Nb>io>|>>>ף>>>)>E>`>|>>>>&>4> A><N>W[>sh>u>>ŏ>>>>3>N>j>>>>>>->*:>EG>aT>|a>n>{>Έ>>>!><>X>s>>>>>>&>33>O@>jM>Z>g>t>؁>>>*>F>a>}>>>>>>!>=,>X9>tF>S>`>m>z>>>4>O>j>>>>>>>+>F%>a2>}?>L>Y>f>s>>">=>X>t>>>>>>>4>O>k+>8>E>R>_>l>z>+>F>b>}>>>>>>">=
>Y>t$>1>>>K>X>e>s>4>P>k>>>>>>>+>G>b>~>*>7>D>Q>_>"l>>y>Y>u>>>Ǻ>>>>5>P>l	>>#>0>=>J>X>,e>Gr>c>~>>>г>>>#>>>Z>u>>>)>6>C>Q>5^>Qk>lx>>>>ڬ>>>,>H>c>>>>">/>=>#J>?W>Zd>vq>~>>Ș>>>>6>Q>m>>>>>(>6>-C>HP>d]>j>w>>ё>>>$>?>[>v>>>>>!>/>6<>RI>mV>c>p>}>ۊ>>>->H>d>>>> >>	>$(>?5>[B>vO>\>i>v>> >>6>R>m>>>>>>>-!>I.>d;>H>U>b>o>|>	>$>@>[>w>>>>>   ? ? ? ?7 ?  ?R' ?- ?n4 ?: ?A ?H ?N ?2U ?[ ?Nb ?h ?io ?u ?| ? ? ?. ? ?I ?ף ?e ? ? ? ? ?) ? ?E ? ?` ? ?| ?	 ? ?%??@??\ ?&?w-?4?:? A?G?<N?T?W[?a?sh? o?u?|??7?ŏ?S??n?????3??N??j?????.??J??e??&?-?3?*:?@?EG?M?aT?Z?|a?
h?n?%u?{?A?Έ?\??x???!??<??X??s?????8??S??o???&?,?33?9?O@?F?jM?S?Z?a?g?/n?t?J{?؁?f?????*??F?Ӽ?a??}?
??&??A??]??x???!?%?=,?2?X9???tF?M?S?Z?`?8g?m?Tt?z?o?????4??O?ݵ?j?????/??K??f?????+??F%?+?a2?8?}??F?L?&S?Y?B`?f?]m?s?xz???"??=?ˡ?X??t?????9??T??o????
?4??O?$?k+?1?8???E?0L?R?KY?_?ff?l?s?z??+??F?Ԛ?b??}???'??B??]??y???"??=
??Y??t$?+?1?8?>?9E?K?TR?X?p_?e?l?s?y?4??P?ޓ?k?????0??K??g?????+??G?	?b??~?$?*?'1?7?B>?D?^K?Q?yX?_?e?"l?r?>y??Y??u?????9?Ǻ?U??p?????5??P?	?l		?	?	?	?#	?0*	?0	?L7	?=	?gD	?J	?Q	?X	?^	?,e	?k	?Gr	?x	?c	?	?~	?	?	?'	?	?C	?г	?^	?	?z	?	?	?#	?	?>	?	?Z	?	?u
?	
?
?
?
?:#
?)
?U0
?6
?q=
?C
?J
?Q
?W
?5^
?d
?Qk
?q
?lx
?~
?
?
?
?1
?
?L
?ڬ
?h
?
?
?
?
?,
?
?H
?
?c
?
?
???(??C?"?_)?/?z6?=?C?#J?P??W?]?Zd?j?vq?x?~???:?Ș?V??q?????6??Q??m?????1??M??h"?(?/?6?<?-C?I?HP?V?d]?c?j?q?w?(~??D?ё?_??z???$?????[??v?????;??V??q?!?(?/?5?6<?B?RI?O?mV?\?c?j?p?2w?}?M?ۊ?h?????-??H??d?????)??D? ?_??{?	?!?$(?.??5?;?[B?H?vO?V?\? c?i?;p?v?V}??r? ????6?ı?R??m?????2??M??i ?????-!?'?I.?4?d;?A?H?O?U?)\?b?Di?o?`v?|?{?	??$??@?Ϊ?[??w??? ??;??W??r?  ????7? ?R'?-?n4?:?A?H?N?2U?[?Nb?h?io?u?|???.??I?ף?e?????)??E??`??|?	??%??@??\ ?&?w-?4?:? A?G?<N?T?W[?a?sh? o?u?|??7?ŏ?S??n?????3??N??j?????.??J??e??&?-?3?*:?@?EG?M?aT?Z?|a?
h?n?%u?{?A?Έ?\??x???!??<??X??s?????8??S??o???&?,?33?9?O@?F?jM?S?Z?a?g?/n?t?J{?؁?f?????*??F?Ӽ?a??}?
??&??A??]??x???!?%?=,?2?X9???tF?M?S?Z?`?8g?m?Tt?z?o?????4??O?ݵ?j?????/??K??f?????+??F%?+?a2?8?}??F?L?&S?Y?B`?f?]m?s?xz???"??=?ˡ?X??t?????9??T??o????
?4??O?$?k+?1?8???E?0L?R?KY?_?ff?l?s?z??+??F?Ԛ?b??}???'??B??]??y???"??=
??Y??t$?+?1?8?>?9E?K?TR?X?p_?e?l?s?y?4??P?ޓ?k?????0??K??g?????+??G?	?b??~?$?*?'1?7?B>?D?^K?Q?yX?_?e?"l?r?>y??Y??u?????9?Ǻ?U??p?????5??P??l	????#?0*?0?L7?=?gD?J?Q?X?^?,e?k?Gr?x?c??~???'??C?г?^??z???#??>??Z??u?	????:#?)?U0?6?q=?C?J?Q?W?5^?d?Qk?q?lx?~????1??L?ڬ?h?????,??H??c?????(??C?"?_)?/?z6?=?C?#J?P??W?]?Zd?j?vq?x?~???:?Ș?V??q?????6??Q??m?????1??M??h"?(?/?6?<?-C?I?HP?V?d]?c?j?q?w?(~??D?ё?_??z???$?????[??v?????;??V??q?!?(?/?5?6<?B?RI?O?mV?\?c?j?p?2w?}?M?ۊ?h?????-??H??d?????)??D? ?_??{?	?!?$(?.??5?;?[B?H?vO?V?\? c?i?;p?v?V}??r? ????6?ı?R??m?????2??M??i ?????-!?'?I.?4?d;?A?H?O?U?)\?b?Di?o?`v?|?{?	??$??@?Ϊ?[??w??? ??;??W??r?   ? ? ? ?7 ?  ?R' ?- ?n4 ?: ?A ?H ?N ?2U ?[ ?Nb ?h ?io ?u ?| ? ? ?. ? ?I ?ף ?e ? ? ? ? ?) ? ?E ? ?` ? ?| ?	 ? ?%!?!?@!?!?\ !?&!?w-!?4!?:!? A!?G!?<N!?T!?W[!?a!?sh!? o!?u!?|!?!?7!?ŏ!?S!?!?n!?!?!?!?!?3!?!?N!?!?j!?!?!?!?!?.!?"?J"?"?e"?"?&"?-"?3"?*:"?@"?EG"?M"?aT"?Z"?|a"?
h"?n"?%u"?{"?A"?Έ"?\"?"?x"?"?"?!"?"?<"?"?X"?"?s"?"?"?"?"?8"?"?S#?#?o#?#?#?&#?,#?33#?9#?O@#?F#?jM#?S#?Z#?a#?g#?/n#?t#?J{#?؁#?f#?#?#?#?#?*#?#?F#?Ӽ#?a#?#?}#?
#?#?&#?#?A#?#?]#?$?x$?$?$?!$?%$?=,$?2$?X9$??$?tF$?M$?S$?Z$?`$?8g$?m$?Tt$?z$?o$?$?$?$?$?4$?$?O$?ݵ$?j$?$?$?$?$?/$?$?K$?$?f$?$?%?%?%?+%?%?F%%?+%?a2%?8%?}?%?F%?L%?&S%?Y%?B`%?f%?]m%?s%?xz%?%?%?"%?%?=%?ˡ%?X%?%?t%?%?%?%?%?9%?%?T%?%?o%?%?%?&?
&?4&?&?O&?$&?k+&?1&?8&??&?E&?0L&?R&?KY&?_&?ff&?l&?s&?z&?&?+&?&?F&?Ԛ&?b&?&?}&?&?&?'&?&?B&?&?]&?&?y&?&?&?"&?'?=
'?'?Y'?'?t$'?+'?1'?8'?>'?9E'?K'?TR'?X'?p_'?e'?l'?s'?y'?4'?'?P'?ޓ'?k'?'?'?'?'?0'?'?K'?'?g'?'?'?'?'?+'?'?G(?	(?b(?(?~(?$(?*(?'1(?7(?B>(?D(?^K(?Q(?yX(?_(?e(?"l(?r(?>y(?(?Y(?(?u(?(?(?(?(?9(?Ǻ(?U(?(?p(?(?(?(?(?5(?(?P(?)?l	)?)?)?)?#)?0*)?0)?L7)?=)?gD)?J)?Q)?X)?^)?,e)?k)?Gr)?x)?c)?)?~)?)?)?')?)?C)?г)?^)?)?z)?)?)?#)?)?>)?)?Z)?)?u*?	*?*?*?*?:#*?)*?U0*?6*?q=*?C*?J*?Q*?W*?5^*?d*?Qk*?q*?lx*?~*?*?*?*?1*?*?L*?ڬ*?h*?*?*?*?*?,*?*?H*?*?c*?*?*?+?+?(+?+?C+?"+?_)+?/+?z6+?=+?C+?#J+?P+??W+?]+?Zd+?j+?vq+?x+?~+?+?+?:+?Ș+?V+?+?q+?+?+?+?+?6+?+?Q+?+?m+?+?+?+?,?1,?,?M,?,?h",?(,?/,?6,?<,?-C,?I,?HP,?V,?d],?c,?j,?q,?w,?(~,?,?D,?ё,?_,?,?z,?,?,?$,?,??,?,?[,?,?v,?,?,?,?,?;-?-?V-?-?q-?!-?(-?/-?5-?6<-?B-?RI-?O-?mV-?\-?c-?j-?p-?2w-?}-?M-?ۊ-?h-?-?-?-?-?--?-?H-?-?d-?-?-?-?-?)-?-?D-? .?_.?.?{.?	.?!.?$(.?..??5.?;.?[B.?H.?vO.?V.?\.? c.?i.?;p.?v.?V}.?.?r.? .?.?.?.?6.?ı.?R.?.?m.?.?.?.?.?2.?.?M.?.?i /?/?/?/?/?-!/?'/?I./?4/?d;/?A/?H/?O/?U/?)\/?b/?Di/?o/?`v/?|/?{/?	/?/?$/?/?@/?Ϊ/?[/?/?w/?/?/? /?/?;/?/?W/?/?r/?  0?0?0?0?70? 0?R'0?-0?n40?:0?A0?H0?N0?2U0?[0?Nb0?h0?io0?u0?|0?0?0?.0?0?I0?ף0?e0?0?0?0?0?)0?0?E0?0?`0?0?|0?	0?0?%1?1?@1?1?\ 1?&1?w-1?41?:1? A1?G1?<N1?T1?W[1?a1?sh1? o1?u1?|1?1?71?ŏ1?S1?1?n1?1?1?1?1?31?1?N1?1?j1?1?1?1?1?.1?2?J2?2?e2?2?&2?-2?32?*:2?@2?EG2?M2?aT2?Z2?|a2?
h2?n2?%u2?{2?A2?Έ2?\2?2?x2?2?2?!2?2?<2?2?X2?2?s2?2?2?2?2?82?2?S3?3?o3?3?3?&3?,3?333?93?O@3?F3?jM3?S3?Z3?a3?g3?/n3?t3?J{3?؁3?f3?3?3?3?3?*3?3?F3?Ӽ3?a3?3?}3?
3?3?&3?3?A3?3?]3?4?x4?4?4?!4?%4?=,4?24?X94??4?tF4?M4?S4?Z4?`4?8g4?m4?Tt4?z4?o4?4?4?4?4?44?4?O4?ݵ4?j4?4?4?4?4?/4?4?K4?4?f4?4?5?5?5?+5?5?F%5?+5?a25?85?}?5?F5?L5?&S5?Y5?B`5?f5?]m5?s5?xz5?5?5?"5?5?=5?ˡ5?X5?5?t5?5?5?5?5?95?5?T5?5?o5?5?5?6?
6?46?6?O6?$6?k+6?16?86??6?E6?0L6?R6?KY6?_6?ff6?l6?s6?z6?6?+6?6?F6?Ԛ6?b6?6?}6?6?6?'6?6?B6?6?]6?6?y6?6?6?"6?7?=
7?7?Y7?7?t$7?+7?17?87?>7?9E7?K7?TR7?X7?p_7?e7?l7?s7?y7?47?7?P7?ޓ7?k7?7?7?7?7?07?7?K7?7?g7?7?7?7?7?+7?7?G8?	8?b8?8?~8?$8?*8?'18?78?B>8?D8?^K8?Q8?yX8?_8?e8?"l8?r8?>y8?8?Y8?8?u8?8?8?8?8?98?Ǻ8?U8?8?p8?8?8?8?8?58?8?P8?9?l	9?9?9?9?#9?0*9?09?L79?=9?gD9?J9?Q9?X9?^9?,e9?k9?Gr9?x9?c9?9?~9?9?9?'9?9?C9?г9?^9?9?z9?9?9?#9?9?>9?9?Z9?9?u:?	:?:?:?:?:#:?):?U0:?6:?q=:?C:?J:?Q:?W:?5^:?d:?Qk:?q:?lx:?~:?:?:?:?1:?:?L:?ڬ:?h:?:?:?:?:?,:?:?H:?:?c:?:?:?;?;?(;?;?C;?";?_);?/;?z6;?=;?C;?#J;?P;??W;?];?Zd;?j;?vq;?x;?~;?;?;?:;?Ș;?V;?;?q;?;?;?;?;?6;?;?Q;?;?m;?;?;?;?<?1<?<?M<?<?h"<?(<?/<?6<?<<?-C<?I<?HP<?V<?d]<?c<?j<?q<?w<?(~<?<?D<?ё<?_<?<?z<?<?<?$<?<??<?<?[<?<?v<?<?<?<?<?;=?=?V=?=?q=?!=?(=?/=?5=?6<=?B=?RI=?O=?mV=?\=?c=?j=?p=?2w=?}=?M=?ۊ=?h=?=?=?=?=?-=?=?H=?=?d=?=?=?=?=?)=?=?D=? >?_>?>?{>?	>?!>?$(>?.>??5>?;>?[B>?H>?vO>?V>?\>? c>?i>?;p>?v>?V}>?>?r>? >?>?>?>?6>?ı>?R>?>?m>?>?>?>?>?2>?>?M>?>?i ??????????-!??'??I.??4??d;??A??H??O??U??)\??b??Di??o??`v??|??{??	????$????@??Ϊ??[????w?????? ????;????W????r??  @?@?@?@?7@? @?R'@?-@?n4@?:@?A@?H@?N@?2U@?[@?Nb@?h@?io@?u@?|@?@?@?.@?@?I@?ף@?e@?@?@?@?@?)@?@?E@?@?`@?@?|@?	@?@?%A?A?@A?A?\ A?&A?w-A?4A?:A? AA?GA?<NA?TA?W[A?aA?shA? oA?uA?|A?A?7A?ŏA?SA?A?nA?A?A?A?A?3A?A?NA?A?jA?A?A?A?A?.A?B?JB?B?eB?B?&B?-B?3B?*:B?@B?EGB?MB?aTB?ZB?|aB?
hB?nB?%uB?{B?AB?ΈB?\B?B?xB?B?B?!B?B?<B?B?XB?B?sB?B?B?B?B?8B?B?SC?C?oC?C?C?&C?,C?33C?9C?O@C?FC?jMC?SC?ZC?aC?gC?/nC?tC?J{C?؁C?fC?C?C?C?C?*C?C?FC?ӼC?aC?C?}C?
C?C?&C?C?AC?C?]C?D?xD?D?D?!D?%D?=,D?2D?X9D??D?tFD?MD?SD?ZD?`D?8gD?mD?TtD?zD?oD?D?D?D?D?4D?D?OD?ݵD?jD?D?D?D?D?/D?D?KD?D?fD?D?E?E?E?+E?E?F%E?+E?a2E?8E?}?E?FE?LE?&SE?YE?B`E?fE?]mE?sE?xzE?E?E?"E?E?=E?ˡE?XE?E?tE?E?E?E?E?9E?E?TE?E?oE?E?E?F?
F?4F?F?OF?$F?k+F?1F?8F??F?EF?0LF?RF?KYF?_F?ffF?lF?sF?zF?F?+F?F?FF?ԚF?bF?F?}F?F?F?'F?F?BF?F?]F?F?yF?F?F?"F?G?=
G?G?YG?G?t$G?+G?1G?8G?>G?9EG?KG?TRG?XG?p_G?eG?lG?sG?yG?4G?G?PG?ޓG?kG?G?G?G?G?0G?G?KG?G?gG?G?G?G?G?+G?G?GH?	H?bH?H?~H?$H?*H?'1H?7H?B>H?DH?^KH?QH?yXH?_H?eH?"lH?rH?>yH?H?YH?H?uH?H?H?H?H?9H?ǺH?UH?H?pH?H?H?H?H?5H?H?PH?I?l	I?I?I?I?#I?0*I?0I?L7I?=I?gDI?JI?QI?XI?^I?,eI?kI?GrI?xI?cI?I?~I?I?I?'I?I?CI?гI?^I?I?zI?I?I?#I?I?>I?I?ZI?I?uJ?	J?J?J?J?:#J?)J?U0J?6J?q=J?CJ?JJ?QJ?WJ?5^J?dJ?QkJ?qJ?lxJ?~J?J?J?J?1J?J?LJ?ڬJ?hJ?J?J?J?J?,J?J?HJ?J?cJ?J?J?K?K?(K?K?CK?"K?_)K?/K?z6K?=K?CK?#JK?PK??WK?]K?ZdK?jK?vqK?xK?~K?K?K?:K?ȘK?VK?K?qK?K?K?K?K?6K?K?QK?K?mK?K?K?K?L?1L?L?ML?L?h"L?(L?/L?6L?<L?-CL?IL?HPL?VL?d]L?cL?jL?qL?wL?(~L?L?DL?ёL?_L?L?zL?L?L?$L?L??L?L?[L?L?vL?L?L?L?L?;M?M?VM?M?qM?!M?(M?/M?5M?6<M?BM?RIM?OM?mVM?\M?cM?jM?pM?2wM?}M?MM?ۊM?hM?M?M?M?M?-M?M?HM?M?dM?M?M?M?M?)M?M?DM? N?_N?N?{N?	N?!N?$(N?.N??5N?;N?[BN?HN?vON?VN?\N? cN?iN?;pN?vN?V}N?N?rN? N?N?N?N?6N?ıN?RN?N?mN?N?N?N?N?2N?N?MN?N?i O?O?O?O?O?-!O?'O?I.O?4O?d;O?AO?HO?OO?UO?)\O?bO?DiO?oO?`vO?|O?{O?	O?O?$O?O?@O?ΪO?[O?O?wO?O?O? O?O?;O?O?WO?O?rO?  P?P?P?P?7P? P?R'P?-P?n4P?:P?AP?HP?NP?2UP?[P?NbP?hP?ioP?uP?|P?P?P?.P?P?IP?ףP?eP?P?P?P?P?)P?P?EP?P?`P?P?|P?	P?P?%Q?Q?@Q?Q?\ Q?&Q?w-Q?4Q?:Q? AQ?GQ?<NQ?TQ?W[Q?aQ?shQ? oQ?uQ?|Q?Q?7Q?ŏQ?SQ?Q?nQ?Q?Q?Q?Q?3Q?Q?NQ?Q?jQ?Q?Q?Q?Q?.Q?R?JR?R?eR?R?&R?-R?3R?*:R?@R?EGR?MR?aTR?ZR?|aR?
hR?nR?%uR?{R?AR?ΈR?\R?R?xR?R?R?!R?R?<R?R?XR?R?sR?R?R?R?R?8R?R?SS?S?oS?S?S?&S?,S?33S?9S?O@S?FS?jMS?SS?ZS?aS?gS?/nS?tS?J{S?؁S?fS?S?S?S?S?*S?S?FS?ӼS?aS?S?}S?
S?S?&S?S?AS?S?]S?T?xT?T?T?!T?%T?=,T?2T?X9T??T?tFT?MT?ST?ZT?`T?8gT?mT?TtT?zT?oT?T?T?T?T?4T?T?OT?ݵT?jT?T?T?T?T?/T?T?KT?T?fT?T?U?U?U?+U?U?F%U?+U?a2U?8U?}?U?FU?LU?&SU?YU?B`U?fU?]mU?sU?xzU?U?U?"U?U?=U?ˡU?XU?U?tU?U?U?U?U?9U?U?TU?U?oU?U?U?V?
V?4V?V?OV?$V?k+V?1V?8V??V?EV?0LV?RV?KYV?_V?ffV?lV?sV?zV?V?+V?V?FV?ԚV?bV?V?}V?V?V?'V?V?BV?V?]V?V?yV?V?V?"V?W?=
W?W?YW?W?t$W?+W?1W?8W?>W?9EW?KW?TRW?XW?p_W?eW?lW?sW?yW?4W?W?PW?ޓW?kW?W?W?W?W?0W?W?KW?W?gW?W?W?W?W?+W?W?GX?	X?bX?X?~X?$X?*X?'1X?7X?B>X?DX?^KX?QX?yXX?_X?eX?"lX?rX?>yX?X?YX?X?uX?X?X?X?X?9X?ǺX?UX?X?pX?X?X?X?X?5X?X?PX?Y?l	Y?Y?Y?Y?#Y?0*Y?0Y?L7Y?=Y?gDY?JY?QY?XY?^Y?,eY?kY?GrY?xY?cY?Y?~Y?Y?Y?'Y?Y?CY?гY?^Y?Y?zY?Y?Y?#Y?Y?>Y?Y?ZY?Y?uZ?	Z?Z?Z?Z?:#Z?)Z?U0Z?6Z?q=Z?CZ?JZ?QZ?WZ?5^Z?dZ?QkZ?qZ?lxZ?~Z?Z?Z?Z?1Z?Z?LZ?ڬZ?hZ?Z?Z?Z?Z?,Z?Z?HZ?Z?cZ?Z?Z?[?[?([?[?C[?"[?_)[?/[?z6[?=[?C[?#J[?P[??W[?][?Zd[?j[?vq[?x[?~[?[?[?:[?Ș[?V[?[?q[?[?[?[?[?6[?[?Q[?[?m[?[?[?[?\?1\?\?M\?\?h"\?(\?/\?6\?<\?-C\?I\?HP\?V\?d]\?c\?j\?q\?w\?(~\?\?D\?ё\?_\?\?z\?\?\?$\?\??\?\?[\?\?v\?\?\?\?\?;]?]?V]?]?q]?!]?(]?/]?5]?6<]?B]?RI]?O]?mV]?\]?c]?j]?p]?2w]?}]?M]?ۊ]?h]?]?]?]?]?-]?]?H]?]?d]?]?]?]?]?)]?]?D]? ^?_^?^?{^?	^?!^?$(^?.^??5^?;^?[B^?H^?vO^?V^?\^? c^?i^?;p^?v^?V}^?^?r^? ^?^?^?^?6^?ı^?R^?^?m^?^?^?^?^?2^?^?M^?^?i _?_?_?_?_?-!_?'_?I._?4_?d;_?A_?H_?O_?U_?)\_?b_?Di_?o_?`v_?|_?{_?	_?_?$_?_?@_?Ϊ_?[_?_?w_?_?_? _?_?;_?_?W_?_?r_?  `?`?`?`?7`? `?R'`?-`?n4`?:`?A`?H`?N`?2U`?[`?Nb`?h`?io`?u`?|`?`?`?.`?`?I`?ף`?e`?`?`?`?`?)`?`?E`?`?``?`?|`?	`?`?%a?a?@a?a?\ a?&a?w-a?4a?:a? Aa?Ga?<Na?Ta?W[a?aa?sha? oa?ua?|a?a?7a?ŏa?Sa?a?na?a?a?a?a?3a?a?Na?a?ja?a?a?a?a?.a?b?Jb?b?eb?b?&b?-b?3b?*:b?@b?EGb?Mb?aTb?Zb?|ab?
hb?nb?%ub?{b?Ab?Έb?\b?b?xb?b?b?!b?b?<b?b?Xb?b?sb?b?b?b?b?8b?b?Sc?c?oc?c?c?&c?,c?33c?9c?O@c?Fc?jMc?Sc?Zc?ac?gc?/nc?tc?J{c?؁c?fc?c?c?c?c?*c?c?Fc?Ӽc?ac?c?}c?
c?c?&c?c?Ac?c?]c?d?xd?d?d?!d?%d?=,d?2d?X9d??d?tFd?Md?Sd?Zd?`d?8gd?md?Ttd?zd?od?d?d?d?d?4d?d?Od?ݵd?jd?d?d?d?d?/d?d?Kd?d?fd?d?e?e?e?+e?e?F%e?+e?a2e?8e?}?e?Fe?Le?&Se?Ye?B`e?fe?]me?se?xze?e?e?"e?e?=e?ˡe?Xe?e?te?e?e?e?e?9e?e?Te?e?oe?e?e?f?
f?4f?f?Of?$f?k+f?1f?8f??f?Ef?0Lf?Rf?KYf?_f?fff?lf?sf?zf?f?+f?f?Ff?Ԛf?bf?f?}f?f?f?'f?f?Bf?f?]f?f?yf?f?f?"f?g?=
g?g?Yg?g?t$g?+g?1g?8g?>g?9Eg?Kg?TRg?Xg?p_g?eg?lg?sg?yg?4g?g?Pg?ޓg?kg?g?g?g?g?0g?g?Kg?g?gg?g?g?g?g?+g?g?Gh?	h?bh?h?~h?$h?*h?'1h?7h?B>h?Dh?^Kh?Qh?yXh?_h?eh?"lh?rh?>yh?h?Yh?h?uh?h?h?h?h?9h?Ǻh?Uh?h?ph?h?h?h?h?5h?h?Ph?i?l	i?i?i?i?#i?0*i?0i?L7i?=i?gDi?Ji?Qi?Xi?^i?,ei?ki?Gri?xi?ci?i?~i?i?i?'i?i?Ci?гi?^i?i?zi?i?i?#i?i?>i?i?Zi?i?uj?	j?j?j?j?:#j?)j?U0j?6j?q=j?Cj?Jj?Qj?Wj?5^j?dj?Qkj?qj?lxj?~j?j?j?j?1j?j?Lj?ڬj?hj?j?j?j?j?,j?j?Hj?j?cj?j?j?k?k?(k?k?Ck?"k?_)k?/k?z6k?=k?Ck?#Jk?Pk??Wk?]k?Zdk?jk?vqk?xk?~k?k?k?:k?Șk?Vk?k?qk?k?k?k?k?6k?k?Qk?k?mk?k?k?k?l?1l?l?Ml?l?h"l?(l?/l?6l?<l?-Cl?Il?HPl?Vl?d]l?cl?jl?ql?wl?(~l?l?Dl?ёl?_l?l?zl?l?l?$l?l??l?l?[l?l?vl?l?l?l?l?;m?m?Vm?m?qm?!m?(m?/m?5m?6<m?Bm?RIm?Om?mVm?\m?cm?jm?pm?2wm?}m?Mm?ۊm?hm?m?m?m?m?-m?m?Hm?m?dm?m?m?m?m?)m?m?Dm? n?_n?n?{n?	n?!n?$(n?.n??5n?;n?[Bn?Hn?vOn?Vn?\n? cn?in?;pn?vn?V}n?n?rn? n?n?n?n?6n?ın?Rn?n?mn?n?n?n?n?2n?n?Mn?n?i o?o?o?o?o?-!o?'o?I.o?4o?d;o?Ao?Ho?Oo?Uo?)\o?bo?Dio?oo?`vo?|o?{o?	o?o?$o?o?@o?Ϊo?[o?o?wo?o?o? o?o?;o?o?Wo?o?ro?  p?p?p?p?7p? p?R'p?-p?n4p?:p?Ap?Hp?Np?2Up?[p?Nbp?hp?iop?up?|p?p?p?.p?p?Ip?ףp?ep?p?p?p?p?)p?p?Ep?p?`p?p?|p?	p?p?%q?q?@q?q?\ q?&q?w-q?4q?:q? Aq?Gq?<Nq?Tq?W[q?aq?shq? oq?uq?|q?q?7q?ŏq?Sq?q?nq?q?q?q?q?3q?q?Nq?q?jq?q?q?q?q?.q?r?Jr?r?er?r?&r?-r?3r?*:r?@r?EGr?Mr?aTr?Zr?|ar?
hr?nr?%ur?{r?Ar?Έr?\r?r?xr?r?r?!r?r?<r?r?Xr?r?sr?r?r?r?r?8r?r?Ss?s?os?s?s?&s?,s?33s?9s?O@s?Fs?jMs?Ss?Zs?as?gs?/ns?ts?J{s?؁s?fs?s?s?s?s?*s?s?Fs?Ӽs?as?s?}s?
s?s?&s?s?As?s?]s?t?xt?t?t?!t?%t?=,t?2t?X9t??t?tFt?Mt?St?Zt?`t?8gt?mt?Ttt?zt?ot?t?t?t?t?4t?t?Ot?ݵt?jt?t?t?t?t?/t?t?Kt?t?ft?t?u?u?u?+u?u?F%u?+u?a2u?8u?}?u?Fu?Lu?&Su?Yu?B`u?fu?]mu?su?xzu?u?u?"u?u?=u?ˡu?Xu?u?tu?u?u?u?u?9u?u?Tu?u?ou?u?u?v?
v?4v?v?Ov?$v?k+v?1v?8v??v?Ev?0Lv?Rv?KYv?_v?ffv?lv?sv?zv?v?+v?v?Fv?Ԛv?bv?v?}v?v?v?'v?v?Bv?v?]v?v?yv?v?v?"v?w?=
w?w?Yw?w?t$w?+w?1w?8w?>w?9Ew?Kw?TRw?Xw?p_w?ew?lw?sw?yw?4w?w?Pw?ޓw?kw?w?w?w?w?0w?w?Kw?w?gw?w?w?w?w?+w?w?Gx?	x?bx?x?~x?$x?*x?'1x?7x?B>x?Dx?^Kx?Qx?yXx?_x?ex?"lx?rx?>yx?x?Yx?x?ux?x?x?x?x?9x?Ǻx?Ux?x?px?x?x?x?x?5x?x?Px?y?l	y?y?y?y?#y?0*y?0y?L7y?=y?gDy?Jy?Qy?Xy?^y?,ey?ky?Gry?xy?cy?y?~y?y?y?'y?y?Cy?гy?^y?y?zy?y?y?#y?y?>y?y?Zy?y?uz?	z?z?z?z?:#z?)z?U0z?6z?q=z?Cz?Jz?Qz?Wz?5^z?dz?Qkz?qz?lxz?~z?z?z?z?1z?z?Lz?ڬz?hz?z?z?z?z?,z?z?Hz?z?cz?z?z?{?{?({?{?C{?"{?_){?/{?z6{?={?C{?#J{?P{??W{?]{?Zd{?j{?vq{?x{?~{?{?{?:{?Ș{?V{?{?q{?{?{?{?{?6{?{?Q{?{?m{?{?{?{?|?1|?|?M|?|?h"|?(|?/|?6|?<|?-C|?I|?HP|?V|?d]|?c|?j|?q|?w|?(~|?|?D|?ё|?_|?|?z|?|?|?$|?|??|?|?[|?|?v|?|?|?|?|?;}?}?V}?}?q}?!}?(}?/}?5}?6<}?B}?RI}?O}?mV}?\}?c}?j}?p}?2w}?}}?M}?ۊ}?h}?}?}?}?}?-}?}?H}?}?d}?}?}?}?}?)}?}?D}? ~?_~?~?{~?	~?!~?$(~?.~??5~?;~?[B~?H~?vO~?V~?\~? c~?i~?;p~?v~?V}~?~?r~? ~?~?~?~?6~?ı~?R~?~?m~?~?~?~?~?2~?~?M~?~?i ?????-!?'?I.?4?d;?A?H?O?U?)\?b?Di?o?`v?|?{?	??$??@?Ϊ?[??w??? ??;??W??r?  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y??猀?.?u???I??ף??e???9??Ǻ??U?Ā?ǀ?)ˀ?p΀?р?Ԁ?E؀?ۀ?ހ??`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3ā?zǁ?ʁ?΁?Nс?ԁ?ׁ?#ہ?jށ???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\??ꕂ?1?x???L??ڬ?!?h???<??Â?ǂ?Xʂ?͂?Ђ?,Ԃ?sׂ?ڂ?ނ?H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V??㥃?*?q???F??Ӽ??aÃ?ƃ?Ƀ?6̓?}Ѓ?Ӄ?
׃?Qڃ?݃??&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_??힄?4?z???O??ݵ?$?j????Ƅ?Ʉ?̄?Є?[ӄ?ք?ل?/݄?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X??殅?-?t???H??Ņ?Ʌ?d̅?υ?҅?9օ?م?܅??T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}??䃆?+?r?? ?F??Ԛ??b???6?}?ı??R??྆?'?mņ?Ȇ?ˆ?Bφ?҆?Ն?ن?]܆?߆??2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[??鷇?0?w??Ň?Kȇ?ˇ?·? ҇?gՇ?؇?ۇ?;߇????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y??猈?.?u???I??ף??e???9??Ǻ??U?Ĉ?ǈ?)ˈ?pΈ?ш?Ԉ?E؈?ۈ?ވ??`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3ĉ?zǉ?ʉ?Ή?Nщ?ԉ?׉?#ۉ?jމ???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\??ꕊ?1?x???L??ڬ?!?h???<??Ê?Ǌ?Xʊ?͊?Њ?,Ԋ?s׊?ڊ?ފ?H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V??㥋?*?q???F??Ӽ??aË?Ƌ?ɋ?6͋?}Ћ?Ӌ?
׋?Qڋ?݋??&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_??힌?4?z???O??ݵ?$?j????ƌ?Ɍ?̌?Ќ?[ӌ?֌?ٌ?/݌?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X??殍?-?t???H??ō?ɍ?d̍?ύ?ҍ?9֍?ٍ?܍??T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}??䃎?+?r?? ?F??Ԛ??b???6?}?ı??R??ྎ?'?mŎ?Ȏ?ˎ?Bώ?Ҏ?Վ?َ?]܎?ߎ??2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[??鷏?0?w??ŏ?Kȏ?ˏ?Ώ? ҏ?gՏ?؏?ۏ?;ߏ????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y??猐?.?u???I??ף??e???9??Ǻ??U?Đ?ǐ?)ː?pΐ?ѐ?Ԑ?Eؐ?ې?ސ??`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3đ?zǑ?ʑ?Α?Nё?ԑ?ב?#ۑ?jޑ???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\??ꕒ?1?x???L??ڬ?!?h???<??Ò?ǒ?Xʒ?͒?В?,Ԓ?sג?ڒ?ޒ?H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V??㥓?*?q???F??Ӽ??aÓ?Ɠ?ɓ?6͓?}Г?ӓ?
ד?Qړ?ݓ??&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_??힔?4?z???O??ݵ?$?j????Ɣ?ɔ?̔?Д?[Ӕ?֔?ٔ?/ݔ?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X??殕?-?t???H??ŕ?ɕ?d̕?ϕ?ҕ?9֕?ٕ?ܕ??T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}??䃖?+?r?? ?F??Ԛ??b???6?}?ı??R??ྖ?'?mŖ?Ȗ?˖?Bϖ?Җ?Ֆ?ٖ?]ܖ?ߖ??2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[??鷗?0?w??ŗ?Kȗ?˗?Η? җ?g՗?ؗ?ۗ?;ߗ????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y??猘?.?u???I??ף??e???9??Ǻ??U?Ę?ǘ?)˘?pΘ?ј?Ԙ?Eؘ?ۘ?ޘ??`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3ę?zǙ?ʙ?Ι?Nљ?ԙ?י?#ۙ?jޙ???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\??ꕚ?1?x???L??ڬ?!?h???<??Ú?ǚ?Xʚ?͚?К?,Ԛ?sך?ښ?ޚ?H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V??㥛?*?q???F??Ӽ??aÛ?ƛ?ɛ?6͛?}Л?ӛ?
כ?Qڛ?ݛ??&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_??힜?4?z???O??ݵ?$?j????Ɯ?ɜ?̜?М?[Ӝ?֜?ٜ?/ݜ?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X??殝?-?t???H??ŝ?ɝ?d̝?ϝ?ҝ?9֝?ٝ?ܝ??T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}??䃞?+?r?? ?F??Ԛ??b???6?}?ı??R??ྞ?'?mŞ?Ȟ?˞?BϞ?Ҟ?՞?ٞ?]ܞ?ߞ??2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[??鷟?0?w??ş?Kȟ?˟?Ο? ҟ?g՟?؟?۟?;ߟ????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y??猠?.?u???I??ף??e???9??Ǻ??U?Ġ?Ǡ?)ˠ?pΠ?Ѡ?Ԡ?Eؠ?۠?ޠ??`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3ġ?zǡ?ʡ?Ρ?Nѡ?ԡ?ס?#ۡ?jޡ???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\??ꕢ?1?x???L??ڬ?!?h???<??â?Ǣ?Xʢ?͢?Т?,Ԣ?sע?ڢ?ޢ?H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V??㥣?*?q???F??Ӽ??aã?ƣ?ɣ?6ͣ?}У?ӣ?
ף?Qڣ?ݣ??&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_??힤?4?z???O??ݵ?$?j??¤??Ƥ?ɤ?̤?Ф?[Ӥ?֤?٤?/ݤ?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X??殥?-?t???H?¥?ť?ɥ?d̥?ϥ?ҥ?9֥?٥?ܥ??T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}??䃦?+?r?? ?F??Ԛ??b???6?}?ı??R??ྦ?'¦?mŦ?Ȧ?˦?BϦ?Ҧ?զ?٦?]ܦ?ߦ??2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[??鷧?0?w??ŧ?Kȧ?˧?Χ? ҧ?gէ?ا?ۧ?;ߧ????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y??猨?.?u???I??ף??e???9??Ǻ??U?Ĩ?Ǩ?)˨?pΨ?Ѩ?Ԩ?Eب?ۨ?ި??`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3ĩ?zǩ?ʩ?Ω?Nѩ?ԩ?ש?#۩?jީ???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\??ꕪ?1?x???L??ڬ?!?h???<??ê?Ǫ?Xʪ?ͪ?Ъ?,Ԫ?sת?ڪ?ު?H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V??㥫?*?q???F??Ӽ??aë?ƫ?ɫ?6ͫ?}Ы?ӫ?
׫?Qګ?ݫ??&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_??힬?4?z???O??ݵ?$?j??¬??Ƭ?ɬ?̬?Ь?[Ӭ?֬?٬?/ݬ?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X??殭?-?t???H?­?ŭ?ɭ?ḓ?ϭ?ҭ?9֭?٭?ܭ??T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}??䃮?+?r?? ?F??Ԛ??b???6?}?ı??R??ྮ?'®?mŮ?Ȯ?ˮ?BϮ?Ү?ծ?ٮ?]ܮ?߮??2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[??鷯?0?w??ů?Kȯ?˯?ί? ү?gկ?د?ۯ?;߯????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y??猰?.?u???I??ף??e???9??Ǻ??U?İ?ǰ?)˰?pΰ?Ѱ?԰?Eذ?۰?ް??`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3ı?zǱ?ʱ?α?Nѱ?Ա?ױ?#۱?jޱ???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\??ꕲ?1?x???L??ڬ?!?h???<??ò?ǲ?Xʲ?Ͳ?в?,Բ?sײ?ڲ?޲?H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V??㥳?*?q???F??Ӽ??aó?Ƴ?ɳ?6ͳ?}г?ӳ?
׳?Qڳ?ݳ??&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_??ힴ?4?z???O??ݵ?$?j??´??ƴ?ɴ?̴?д?[Ӵ?ִ?ٴ?/ݴ?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X??段?-?t???H?µ?ŵ?ɵ?d̵?ϵ?ҵ?9ֵ?ٵ?ܵ??T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}??䃶?+?r?? ?F??Ԛ??b???6?}?ı??R??ྶ?'¶?mŶ?ȶ?˶?B϶?Ҷ?ն?ٶ?]ܶ?߶??2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[??鷷?0?w??ŷ?Kȷ?˷?η? ҷ?gշ?ط?۷?;߷????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y??猸?.?u???I??ף??e???9??Ǻ??U?ĸ?Ǹ?)˸?pθ?Ѹ?Ը?Eظ?۸?޸??`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3Ĺ?zǹ?ʹ?ι?Nѹ?Թ?׹?#۹?j޹???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\??ꕺ?1?x???L??ڬ?!?h???<??ú?Ǻ?Xʺ?ͺ?к?,Ժ?s׺?ں?޺?H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V??㥻?*?q???F??Ӽ??aû?ƻ?ɻ?6ͻ?}л?ӻ?
׻?Qڻ?ݻ??&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_??ힼ?4?z???O??ݵ?$?j??¼??Ƽ?ɼ?̼?м?[Ӽ?ּ?ټ?/ݼ?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X??殽?-?t???H?½?Ž?ɽ?d̽?Ͻ?ҽ?9ֽ?ٽ?ܽ??T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}??䃾?+?r?? ?F??Ԛ??b???6?}?ı??R??྾?'¾?mž?Ⱦ?˾?BϾ?Ҿ?վ?پ?]ܾ?߾??2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[??鷿?0?w??ſ?Kȿ?˿?ο? ҿ?gտ?ؿ?ۿ?;߿????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y???.?u???I??ף??e???9??Ǻ??U???)?p???E????`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3?z???N???#?j???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\???1?x???L??ڬ?!?h???<????X???,?s???H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V???*?q???F??Ӽ??a???6?}??
?Q???&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_???4?z???O??ݵ?$?j????????[???/?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X???-?t???H????d???9????T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}???+?r?? ?F??Ԛ??b???6?}?ı??R???'?m???B????]???2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[???0?w???K??? ?g???;????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y???.?u???I??ף??e???9??Ǻ??U???)?p???E????`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3?z???N???#?j???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\???1?x???L??ڬ?!?h???<????X???,?s???H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V???*?q???F??Ӽ??a???6?}??
?Q???&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_???4?z???O??ݵ?$?j????????[???/?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X???-?t???H????d???9????T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}???+?r?? ?F??Ԛ??b???6?}?ı??R???'?m???B????]???2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[???0?w???K??? ?g???;????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y???.?u???I??ף??e???9??Ǻ??U???)?p???E????`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3?z???N???#?j???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\???1?x???L??ڬ?!?h???<????X???,?s???H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V???*?q???F??Ӽ??a???6?}??
?Q???&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_???4?z???O??ݵ?$?j????????[???/?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X???-?t???H????d???9????T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}???+?r?? ?F??Ԛ??b???6?}?ı??R???'?m???B????]???2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[???0?w???K??? ?g???;????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y???.?u???I??ף??e???9??Ǻ??U???)?p???E????`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3?z???N???#?j???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\???1?x???L??ڬ?!?h???<????X???,?s???H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V???*?q???F??Ӽ??a???6?}??
?Q???&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_???4?z???O??ݵ?$?j????????[???/?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X???-?t???H????d???9????T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}???+?r?? ?F??Ԛ??b???6?}?ı??R???'?m???B????]???2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[???0?w???K??? ?g???;????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y???.?u???I??ף??e???9??Ǻ??U???)?p???E????`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3?z???N???#?j???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\???1?x???L??ڬ?!?h???<????X???,?s???H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V???*?q???F??Ӽ??a???6?}??
?Q???&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_???4?z???O??ݵ?$?j????????[???/?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X???-?t???H????d???9????T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}???+?r?? ?F??Ԛ??b???6?}?ı??R???'?m???B????]???2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[???0?w???K??? ?g???;????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y???.?u???I??ף??e???9??Ǻ??U???)?p???E????`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3?z???N???#?j???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\???1?x???L??ڬ?!?h???<????X???,?s???H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V???*?q???F??Ӽ??a???6?}??
?Q???&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_???4?z???O??ݵ?$?j????????[???/?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X???-?t???H????d???9????T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}???+?r?? ?F??Ԛ??b???6?}?ı??R???'?m???B????]???2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[???0?w???K??? ?g???;????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y???.?u???I??ף??e???9??Ǻ??U???)?p???E????`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3?z???N???#?j???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\???1?x???L??ڬ?!?h???<????X???,?s???H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V???*?q???F??Ӽ??a???6?}??
?Q???&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_???4?z???O??ݵ?$?j????????[???/?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X???-?t???H????d???9????T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}???+?r?? ?F??Ԛ??b???6?}?ı??R???'?m???B????]???2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[???0?w???K??? ?g???;????W???+?r??  ?G??	??b???7?~? ?$?R'?*?-?'1?n4?7?:?B>?A?D?H?^K?N?Q?2U?yX?[?_?Nb?e?h?"l?io?r?u?>y?|???Y???.?u???I??ף??e???9??Ǻ??U???)?p???E????`???5?|??	?P???%?l	???@????\ ?#?&?0*?w-?0?4?L7?:?=? A?gD?G?J?<N?Q?T?X?W[?^?a?,e?sh?k? o?Gr?u?x?|?c???7?~?ŏ??S???'?n???C??г??^???3?z???N???#?j???>????Z???.?u??	?J????e???:#?&?)?-?U0?3?6?*:?q=?@?C?EG?J?M?Q?aT?W?Z?5^?|a?d?
h?Qk?n?q?%u?lx?{?~?A??Έ??\???1?x???L??ڬ?!?h???<????X???,?s???H????c???8????S???(?o???C??"?&?_)?,?/?33?z6?9?=?O@?C?F?#J?jM?P?S??W?Z?]?a?Zd?g?j?/n?vq?t?x?J{?~?؁??f???:??Ș??V???*?q???F??Ӽ??a???6?}??
?Q???&?m???A????]???1?x???M???!?h"?%?(?=,?/?2?6?X9?<???-C?tF?I?M?HP?S?V?Z?d]?`?c?8g?j?m?q?Tt?w?z?(~?o???D??ё??_???4?z???O??ݵ?$?j????????[???/?v???K????f???;????V???+?q??!?F%?(?+?/?a2?5?8?6<?}??B?F?RI?L?O?&S?mV?Y?\?B`?c?f?j?]m?p?s?2w?xz?}??M??ۊ?"?h???=??ˡ??X???-?t???H????d???9????T???)?o???D?? ??_?
??4?{??	?O?!?$?$(?k+?.?1??5?8?;???[B?E?H?0L?vO?R?V?KY?\?_? c?ff?i?l?;p?s?v?z?V}???+?r?? ?F??Ԛ??b???6?}?ı??R???'?m???B????]???2?y???M???"?i ???=
????Y???-!?t$?'?+?I.?1?4?8?d;?>?A?9E?H?K?O?TR?U?X?)\?p_?b?e?Di?l?o?s?`v?y?|?4?{??	?P??ޓ?$?k???@??Ϊ??[???0?w???K??? ?g???;????W???+?r??   @modelineslinecolorgrayy  ?  ?        typescatternameexpected updatesx      ?  ?   @53ee53c46-38f7-11f0-16c9-2b093684d981/a52c35ad9932b961layouttemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  configshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ================================================L>L>L>L>L>L>L>L>L>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?????????333?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?fff?  ?  ?̌?̌????ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?33?33?33?33?  ????????????ff?ff?ff?ff?ff?ff?ff?ff?ff?33?33?33?33?   @   @   @   @ff@ff@@@@@@@33@33@33@33@33@33@33@33@33@@@@@@@@@@   @   @ff&@ff&@ff&@ff&@ff&@ff&@,@,@,@,@,@,@,@,@,@,@,@,@333@333@333@9@9@  @@ffF@ffF@ffF@ffF@ffF@ffF@ffF@ffF@ffF@ffF@ffF@ffF@L@L@L@L@L@L@Y@  `@  `@  `@fff@fff@fff@fff@fff@fff@fff@fff@fff@fff@l@l@l@l@33s@33s@y@y@  @  @33@33@33@33@33@33@ff@ff@ff@ff@@@̌@̌@  @  @33@33@ff@ff@ff@ff@@@@@@@̜@33@33@33@@@̬@̬@  @  @  @  @33@33@33@33@33@ff@ff@ff@̼@̼@̼@̼@33@33@33@33@33@33@ff@ff@ff@@@@@@@@33@33@ff@ff@ff@ff@ff@ff@ff@ff@ff@@@@@@  @  @  @ff@@@@@@@@@@@@@@  @  @33@@@@@@@@   A   A   A   A   AAAA33A33AA  A  A  A  A  A	A33A33A33A33AAAAAAAffAA33A33A33A33A33AAffAffA  A  A  A  A  A  AAAAAffAffAffA   A   A   A33#A$A$A$A$A$A$A$A$A$Aff&A  (A  (A33+A,A,A,A  0A  0A  0A1A1A1A1A1A1A1A333A333A333A4A  8A9A<A<A<A<A<A<A<Aff>Aff>Aff>Aff>Aff>Aff>Aff>AAA33CADAffFAffFAffFA  HA  HA  HAIAIAIA33KA33KA33KA33KALAffNAffNAQAQAQA33SA33SATATATATATAffVAffVAffVAffVA33[A\A  `A  `A  `AaAaA33cA33cA33cA33cA33cA33cA33cAdAdAdAfffA  hAiA33kAlA  pA  pAqAqAqAqAqAqAqAqAqA33sA33sAtA  xA  xA|Aff~A  A  A  A  A  A  A  A  A  A  A  A  ÀAA33ĀAAAAffA33A33A33A33A33A33A33A33A33A33A  A  ÄA  A  A  AAAAAAAffAffAffAffAffAffAffAffA  A  A̐A33A33A  A  A  A  A  A̔AAAAAAAffAffAAffAffAffAffAffA33A  A  A  A̜A̜A̜A̜AAAffAffA33A  A  A̠AAffAffAffAffA33A33A33A  A  A̤A̤AAAffA  A  ĄAAAAffAffAffAffAffAffAffA33A  A̬A̬AA  A̰A̰A̰AAAAAAAAAAffAffA33A  AAAffA  A  A̸A̸A̸A̸A̸A̸A̸AAAAAffA  A̼AAA33A33A33A  A  A  A  AAAAAAAAffA33AAAffA33A33A33A33A33A33A  A  A  AAAAAffA33A33A  AAAAffAffA33A33A33A  A  A  AAAffAffAffA33A33A  A  A  A  AAAAA33A33A33A  A  A  A  AAAAffA33A33A33A  A  A  AAAA33A  A  AAAAAAffAffA  A  A  A  AAAAAAAAffAffAffAffA33A  A  AAffA33A33A  A  A  A  A  AAAAAffAffAffA33A  A  AAAAAAffA  A  A  A  A  A  A  AA33A33A33A33A33A33A  A  A  AAAAAAffA  AAAAAAA33A33A33A33A   B   B   B   Bff Bff B BB  B  BffBffBffBffBBBB33BBBBB  BffBBB33B33BBBB  B  BffBBBB33B33BBffBffBBBBB33	B	B	B  
Bff
Bff
Bff
Bff
Bff
Bff
Bff
B33BBBffBffBBBBB33BBB  B  B  B  B  BffBB33B33BB  BffBffBffBBB33B33BBBB  BffBBB33B33BBBBBBB  B  B  BffBBB33B33BffBffB33B33B33B33BBBBBBBffBB33B33BBBB  BffBB33BBBBBBBBBffBBBBB  B  B  BffBBBBB33B33B33BBB   B B33!B!B!B!B!Bff"B"B"B"B"B"B33#B33#B33#B33#B  $B  $Bff$B$B$B$B$B%B  &B  &B  &Bff&Bff&Bff&Bff&Bff&B  (B  (B  (B  (Bff(B(B(B(B(B(B33)B)B)B)B)Bff*B+B+B+B+B  ,Bff,Bff,Bff,Bff,Bff,B33-B-B-B-B-B-B-B-B  .Bff.B33/B  0B  0Bff0Bff0Bff0B331B1B1B1B1B1B1B1B  2B  2Bff2B2B3B3B3B3Bff4B4B335B335B335B5B5B5B  6B  6B  6Bff6Bff6B337B7B7B7B7B  8B  8Bff8B8B339B339B339B9B9B  :B  :B33;B33;B33;B33;B33;B;B;B  <B  <B  <B  <B  <Bff<B<B33=B  >Bff>Bff>B>B33?B33?B33?B33?B?B?B?B  @B  @Bff@B@B33AB33AB33ABAB  BBBBBBBB33CB33CB33CBCBCBCB  DB  DBffDBffDBDB33EBEBEBEB  FB  FBFBFBFBFBFBFBFB  HBffHBffHBffHBffHBffHB33IBIBIBIB  JB  JB  JB  JBffJBffJBKB  LB  LBffLBffLBffLBffLBLB33MB33MB33MB33MB33MB33MB  NB  NBffNB33OB33OBOBOBOBOB  PBffPBPBPBPBPBPB33QB33QB33QBffRBffRBffRBRBRBRBRBRB33SB  TBTBTBTB33UB33UB33UBUBUB  VB  VB  VBffVBffVBVBVBVBVBVBWBffXBffXBXB33YB33YBYBYB  ZB  ZB  ZBffZBffZBffZBZBZB33[B[Bff\B\B\B\B\B\B  ^B  ^B  ^Bff^Bff^Bff^Bff^Bff^Bff^Bff^B  `B  `B  `Bff`Bff`Bff`B`B`B`BaBaBaB  bBffbBffbBffbB33cB33cBcB  dB  dB  dBffdBffdBdBdBdB33eBeBfffBfffBfffBfBfBfBfBfBfBfB33gB  hBffhBffhBhBhBhB33iBiB  jB  jBffjBffjBjBjBjB33kB33kBkBkB  lB  lBlB33mB33mBmBmBmBmBffnBffnBffnBffnBffnBnBnBoBoBoB  pBffpB33qB33qB33qBqBqBqBqBqBqB  rB  rBrB33sBsB  tB  tBfftBtB33uBuBuBuBuBuBuB  vB  vBffvBffvBffvBffvBffvB33wB  xBffxBxBxByByByByByB  zBffzBffzBffzBffzBffzBffzBffzB33{Bff|B|B|B|B|B33}B}B  ~B  ~B  ~Bff~Bff~Bff~Bff~Bff~B33BB  B  B33B33BffBBBB̀B  B  B33B33B33BBBB  B  B  BffBffBffBffBffBffB̂B  B  B  B33B33B33B̃B  B  B33B33B33B33B33B33BffBBB  B  B  B  B  B33B̅B  B  B  B  B  B33B33BffBB̆B̆B̆B̆B̆B̆B33B33B33B33B33BffBB  B33BffBffBB̈B̈B̈B̈B  B  B  B33B33BffBffBffBffB̉B  B33BBBB̊B  B  B  B33B33B33B33B33B33B33BBB  B  B33B33B33B̌B̌B̌B̌B  B  B  B  B  B  B33BB̍B̍B̍B  B33BffBBBBBB  B  B  B33BffBffBffBffB̏B̏B̏B  B33BffBBB̐B̐B̐B̐B̐B̐B  B33B33BffBBB33B33B33B33BBB̒B̒B̒B̒B̒B̒B  B  B  B  B33BB̓B̓B̓B  BB̔B̔B̔B̔B̔B  B  B  B  B  B33BffB̕B̕B  B33BffBBBBB̖B̖B̖B̖B̖B̖B33BBB̗B  B  B33BffBffBBBBB̘B̘B̘B  B33B33BB̙B̙B33B33B33B33B33BffBffBBBBB̚B  BBBB̛B  B33B33B33B33BffBffBBBB̜B  B33B33BffBffBBBB̝B  B33BffBffBffBffBffBB̞B33BffBffBBBB̟B  B  B33BffBffBffBffBffBffB  B  B  B  B  BffBffBB̡B̡B  B33BffBffBffBffB̢B̢B  B  B  B33B33B33BBBḄḄB  B33BffBffBB  B  B  B33B33B33BffBffBBBBB  BffBffBB̦B̦B  B33B33B33B33B33BBBBB̧B  B33B33B33B33B33BffB̨B  B33B33BffBffBffBBBB̩B̩B̩B33B33B33B33BffB̪B  B  B  BffBBBBB̫B̫B  B  B33B33BffBBB̬B  B33B33BffBBB̭B̭B̭B̭B̭B  B  BffBffBBB̮B  BffBBBBB̯B̯B̯B  B  B33B33B33B33BffBffB33BBBBḆḆḆB  B  B  B  B  B33B33B33B̲B33B33BffBffBffBffB̳B  B  B  B  B  B  B  B33BffBB33BffBffBffBffBB̵B̵B̵B  B  B  B  B33B33BffBffBffB  B33BffBBBBB̷B̷B̷B̷B̷B  B33B33B33BffB̸B  B33BffBffBBBB̹B̹B̹B̹B  B33B33BffBBBB  BffBffBffBffBB̻B̻B̻B̻B̻B  B  B33BffBffBB̼B  B33BffBBBBBB̽B̽B̽B  BffBffBffB̾B  B33BffBBBBBB̿B̿B̿B̿B̿B33BffBB  B33B33B33B33BBBBBBBBBBB  B33BffBBBB  B33B33BBBBBBBB  B  B33BffBffBffBB  B33B33BffBBBBBB  B  B  B33B33B33B33BffB  B  B  B  B  B33BffBBBBBB  B  B  B  BBBBB  B  B33BffBffBffBBBBBBB33B33B33B33BBB  B33B33B33BffBBBBBB33B33B33B33BBBBBB  B33BBBBBBBB  B  B  B33BBBB  B  B  B  B33B33B33B33BffBffBB  B33BffBBBBBBBB  B  B33BffBffBffBB  B  B33B33BffBBBBBBB  B33BffBffBffBffBB  B33B33BBBBBBBB  B  B  BffBffBffBBBB  BffBffBffBffBffBffBBB  B  B  B33BBBBBBBB  B33BffBBBBBBB  BffBffBffBffBffBBBB  BffBffBffBBBB  B  B33B33BffBffBBBB  B33B33BffBffBBBBBBB33BffBffBffBffBBBB  BffBBBBBBBBB33BffBffBBBBB  B33B33B33BffBffBBBBB33BffBBBBB  B  B33B33BffBffBBBBB33BffBBBBB  B  B  B33B33B33BffBffBffBBB  B33BBBBBBB  B  B33B33B33BffBffBffBffBffBB  BffBffBBBBBBBB  B33BffBffBffBBBBBBBffBBBBB  B  B  B33BffBBBBBBB  B  BffBffBffBBBBB  B  BffBffBffBffBffBBB33B33B33BffBBBBB  B33B33BffBffBffBBBB  B  B  BffBBBBBBB33B33B33B33BffBBB  B  B  B  BffBBBBB  B  B  B  B  B  B33BffB  B  B  B33B33BffBBB  B  B  B  B  B  B  B  B33B33BffBB  B33B33B33BffBffBBBBBBB33B33B33BffBB  B  B33BffBffBffBBBBBB33B33B33B33BffBBBB33BffBffBffBffBBBB  B  B33B33B33BBBBBBB  BffBBBB  B  B  B  B33B33BffBBBBBB  B33B33B33BBB  B  B  B  B  B33BffBBBBB  B  B33B33B33BffBBB   C   C   C C33 Cff Cff Cff Cff C  C  C  C  C3 C C C C Cf Cf CC33C33C33C33CLCLCffCffCCCCCCCC  CC33C33C33CLCLCffCffC C3CCCCCCfC  C  CCCCCffCffCffCffCCCCCCCCCfC  C  C  CffCffCffCffCffCffCCCCC3C3C3CCfCfC  C  CLCLCLCLC C C C C C C C3C3CCCfC  C33CLCLCffCffCffC C C C CCCCCfCfC  C33C33CLCLCLCLC C C CCC3C3C3C3CCC33CLCLCLCLCLCffC C C C CC3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3CfC33	CL	C 	C 	C3	C3	C3	C3	C3	C3	C3	C3	C3	C3	C3	C	Cf	C  
CL
C 
C
C
C
C3
C3
C3
C3
C3
C3
C3
C3
C3
C3
C3
Cf
C33CLCLCffCC3C3C3C3C3C3C3C3C3C3CCfC  CC33C C C3C3C3C3C3C3C3C3C3CCfCfC  C  C  CC33CffC CCCCC3C3C3C3CfC  C  C  C  C  CC33CLC C C C C C3C3C3CCfCfCfC  C  CCCLCLC C C CCCCCC3CCCfCfC  C33C33CffCffC C C C C C C CC3C3CCC  C33CLCLCffCffC C C C C C C C C CCCfCfCCCLCLCLCffCffCffC C C C C C3C3CC  C  CCCCLCffCffCffC C C C CCCCfCfCfC  C  CC33CLCLCffC C C C C C C3C3CCCfCCCCCC33CLC C C C C CC3C3CC  C  C  C  C  CCCLCffCffCffCffCffC C CCC  C  C  C  C  C  CCC33CLCffCffC C C C CC3CfC  C  C  C  C  C  C  CLCffCffCffCffCffC CCCCCfCfC  C  C  C  C  CC33CLCffCffCffCC3C3CCfCfC  C  C  C  CC33C33C33CLCLCCCC3CfCfCfCfCfCfCfCfCCCCC33C C C3C3CCfCfCfCfCfCfCfCfC  C  CCffCffCC3C3C3CCfCfCfCfCfCfC  C  CCCCCLC CCCC3C3CCfCfC  C  C  C  C  C  C33CLCffC C CCC3C3CC  C  C  C  C  C  C  C  C33CffC C C C3C3C3CCCfCfCfCfCfC   C33 C33 CL CL C  C  C3 C3 C3 C3 C3 Cf Cf Cf Cf C  !C!C!CL!CL!CL!Cff!C!C!C3!C3!C3!Cf!Cf!Cf!Cf!C  "C"C"C33"C33"C33"C33"Cff"Cff"C "C"C"C3"C3"C"Cf"C  #C#C#C33#C33#C33#C33#CL#CL#C #C #C #C #C#C#C3#C#Cf#Cf#Cf#Cf#C  $C  $C$C33$C33$CL$Cff$Cff$C $C $C$C3$C$C$C$C$C$C$Cf$Cf$Cf$CL%CL%Cff%Cff%C %C %C %C%C%C%C3%C%C%Cf%Cf%Cf%C33&CL&CL&CL&Cff&C &C &C &C &C &C&C3&C3&C3&C3&C3&Cf&C  'C33'C33'CL'Cff'Cff'Cff'Cff'C 'C 'C 'C'C'C'C3'C'C'C  (C  (C33(C33(CL(CL(Cff(Cff(Cff(C (C (C (C (C (C (C(C3(C(Cf(Cf(C  )C  )C33)CL)CL)CL)CL)C )C )C )C )C)C)C3)C3)C)C)Cf)C*C*C33*CL*CL*CL*CL*CL*CL*Cff*Cff*C *C *C3*C*Cf*Cf*C  +C33+C33+C33+CL+CL+CL+CL+CL+CL+CL+Cff+C +C +C+C+Cf+Cf+C  ,C33,CL,CL,CL,CL,CL,CL,CL,Cff,Cff,C ,C ,C ,C ,C3,Cf,Cf,Cf,C  -C-CL-CL-CL-CL-Cff-Cff-C -C -C -C -C3-C-Cf-Cf-Cf-Cf-C  .C.C.C33.CL.Cff.C .C .C .C .C.C.C.C.C.C.C  /C  /C  /C  /C33/C33/C33/CL/Cff/Cff/Cff/Cff/C3/C3/C3/C/Cf/C  0C  0C  0C  0C0C0C0C330CL0CL0CL0C 0C0C30C30Cf0Cf0Cf0Cf0Cf0C  1C  1C1C1C1C331CL1Cff1C 1C 1C31C31C1Cf1Cf1Cf1C  2C  2C  2C  2C2C2C2C2C2CL2Cff2C 2C 2C32C32C2C2Cf2C  3C  3C3C3C3C3C3C3C3C333Cff3C3C3C33C3C3C3C3Cf3C4C4C4C4C4C4C334C334CL4CL4C 4C4C34C4C4C4C4C  5C  5C5C5C5C335C335C335C335C335Cff5C 5C 5C5C35C35C5Cf5Cf5Cf5C  6C  6C  6C6C6C6C336CL6CL6CL6C 6C6C6C6C6C6C6C6Cf6C  7C  7C  7C337CL7CL7CL7CL7Cff7Cff7C 7C7C37C37C37C37C7C7Cf7Cf7C  8C8C8CL8Cff8Cff8C 8C 8C 8C 8C8C38C8C8C8C8Cf8C  9C9CL9Cff9Cff9Cff9C 9C 9C 9C 9C 9C9C9C9C9C9Cf9Cf9C  :C33:CL:CL:Cff:Cff:Cff:Cff:C :C:C:C:C:C:C:C:Cf:C  ;C;C;C33;C33;C33;Cff;C ;C;C;C3;C3;C;C;C;C;Cf;C  <C  <C33<C33<C33<CL<Cff<Cff<C <C <C<C3<C3<C3<C<C<Cf<Cf<C  =C=C=C=C33=C33=C33=C33=Cff=C =C=C=C=C=C=C=C=C=C=Cf=C>C33>C33>C33>CL>Cff>Cff>Cff>C>C>C>C>C3>C3>C3>C3>C>C>Cf>C?C?C?C33?CL?C ?C ?C?C?C?C?C3?C3?C3?C3?C3?C3?C?Cf?Cf?C@C33@C @C@C@C@C@C3@C3@C3@C3@C3@C3@C3@C3@C3@Cf@C  ACAC AC AC AC AC AC3AC3AC3AC3AC3AC3AC3AC3AC3AC  BCBCLBCLBCLBCffBCffBCffBC BCBC3BC3BC3BC3BC3BC3BC3BC  CCCCCC33CCLCCffCCffCCffCC CC CC CC CC3CC3CC3CC3CCfCCfCCfCC  DCDC33DC33DCLDCLDCffDC DC DCDC3DC3DC3DCDCDCDCfDC  EC  ECEC33ECLECLECLECffECEC3EC3EC3EC3EC3ECECECECECFC33FC33FCLFCLFCffFC FCFCFC3FC3FC3FC3FC3FC3FCFC  GCGC33GCLGCLGCffGCffGC GCGCGC3GC3GC3GC3GC3GC3GC3GCGC  HCHC33HC33HCLHCLHCLHC HCHCHC3HC3HC3HC3HC3HCHCfHCfHC  IC  ICIC33IC33IC IC IC IC IC IC ICICIC3ICICfICfIC  JCJC33JC33JCLJCLJCffJCffJCffJCffJCffJC JC3JC3JC3JCJCfJC  KCKCKCKCLKCffKCffKCffKCffKCffKCffKC KC3KC3KC3KCKCfKCfKCfKC  LCLC33LCLLCffLCffLCffLCffLCffLCffLCLC3LCLCfLCfLCfLCfLCfLCMC33MCLMCLMCffMCffMCffMCffMCMCMC3MCMCMCfMCfMCfMC  NCNC33NC33NCffNCffNCffNCffNC NC NC NC NC3NC3NC3NCfNCfNCfNCfNCfNCOC33OC33OC33OC33OCLOCffOCffOCffOC OCOC3OC3OCOCOCOCfOC  PC  PC  PC  PC33PC33PCffPCffPCffPCffPCPC3PC3PC3PCPCfPC  QC  QC  QC  QC  QC  QC  QCQCQC33QC33QC33QCffQC QCQC3QC3QCQCfQC  RC  RC  RC  RC  RC  RC  RC  RCRCLRCffRCffRCRCRCRCRC3RCRCfRCfRC  SC  SC  SC  SC  SC  SC  SCSCLSCLSC SCSC3SC3SCfSCfSCfSC  TC  TC  TC  TC  TC  TCTCLTCLTCffTC TC TC TCTCTCTCfTCfTCfTC  UC  UC  UCUCUCUCLUCLUCLUCffUC UCUC3UCUCUCUCfUCfUCfUC  VC  VCVCVCVCLVCLVCLVCffVCffVCVCVCVCVC3VC3VCVC  WC  WCWCWCWCWC33WCLWCffWC WC WCWCWCWCWCWC3WCWCXCXCXCXCXC33XC33XCffXCffXC XCXCXCXCXCXCXCXCXCfXCfXC  YCYCYCYCYCffYC YC YC YCYCYCYCYCYC3YCYCYC  ZC  ZC  ZCZC33ZCLZCffZCffZC ZCZCZCZCZCZCZC3ZCZCfZCfZCfZC  [C[C33[C33[Cff[Cff[C [C [C [C [C [C[C[C3[C3[C[Cf[Cf[Cf[C\C33\C33\Cff\Cff\Cff\C \C \C\C\C\C3\C3\C\C\C\C  ]C  ]C]CL]CL]Cff]Cff]C ]C ]C ]C ]C3]C3]C3]C3]C3]C3]Cf]C  ^C^C33^C33^C33^C33^Cff^C ^C ^C ^C ^C ^C^C3^C3^C3^Cf^Cf^C  _C33_C33_C33_CL_Cff_Cff_Cff_C _C _C_C_C_C_C3_C_Cf_C  `C  `C33`C33`C33`CL`Cff`C `C `C `C `C`C`C`C`Cf`C  aC  aC  aC  aC  aC33aCLaCLaC aC aC aC aCaCaCaCaC3aCaCfaC  bC  bC  bCbC33bC bC bC bC bCbCbCbCbCbC3bC3bCbCbC  cC  cCcCLcCffcC cC cCcCcCcCcCcC3cC3cCcCcCcCcC  dC  dC  dC33dCffdC dCdCdCdCdC3dC3dCdCdCdCdCfdC  eC  eC  eC  eCeC33eCffeCffeC eCeC3eC3eC3eC3eCeCfeC  fC  fC  fC  fC  fC  fC33fCLfCfffCfffCfffC fCfC3fC3fC3fCffC  gC  gC  gC  gC  gCgC33gC33gCLgCLgCLgCffgC gC gCgC3gCfgC  hC  hC  hC  hChC33hC33hC33hC33hC33hC33hCffhCffhC hC hChC3hCfhCfhCfhCfhCfhC  iC33iC33iC33iC33iCLiCffiC iC iC iC iC iC iC3iCfiCfiC  jC  jC  jCjC33jC33jCffjC jC jC jC jC jC jC jC3jC3jCjCfjCfjC  kCkC33kCLkCffkCffkCffkCffkCffkCffkCffkCkC3kC3kC3kC3kC3kC3kCfkC33lCLlCLlCfflCfflCfflCfflCfflCfflCfflC lC lC lClC3lClC  mCmC33mCLmCLmCLmCLmCffmCffmCffmCffmCffmC mC mC mCmC3mC3mCmCfmCnC33nC33nC33nCLnCLnCLnCffnC nC nC nC nCnCnC3nC3nCnC  oCoCoC33oC33oC33oCLoCLoCffoCffoCffoCffoCffoCffoCffoC oC3oCoCoCpC33pC33pC33pCLpCLpCLpCffpCffpCffpCffpCffpCffpCpC3pC3pCpCpC  qCqCqC33qCLqCLqCLqCLqCLqCffqCffqC qCqCqCqC3qCfqCfqC  rC33rC33rC33rC33rC33rCLrCLrCLrCffrCffrCffrC rCrCrCrCrCrC  sCsCsC33sCLsCLsCLsCLsCLsCLsCLsCffsC sCsCsCsC3sCsCfsC  tC33tCLtCLtCLtCLtCLtCLtCLtCfftCfftC tCtCtCtCtC3tCftC  uC  uCuC33uC33uC33uC33uCLuCffuCffuCffuCffuC uCuCuC3uCuCfuCfuCfuCvCvCvCvCvC33vCLvCLvCLvCLvCLvCffvC vC vC vC3vC3vCvCvCvC  wCwCwCwCwC33wC33wC33wCffwC wC wCwC3wC3wC3wC3wC3wCfwC  xCxCxCxCxCxCLxCffxCffxCffxCffxC xCxCxCxC3xC3xCfxC  yC  yC  yC  yC  yC33yCLyCffyCffyC yC yC yC yC yC yCyC3yC3yC3yC  zC  zCzC33zCLzCLzCLzCLzCffzC zC zC zC zCzCzCzCzCzCfzCfzC  {C{C33{C33{CL{CL{CL{Cff{Cff{Cff{C {C {C {C {C{C3{C3{C{Cf{Cf{Cf{Cf{C|C33|C33|CL|Cff|Cff|C |C |C|C|C|C|Cf|Cf|Cf|Cf|Cf|C  }C  }C}CL}CL}Cff}Cff}C }C }C }C }C3}C3}C3}C3}C}C}Cf}Cf}Cf}C~CL~CL~Cff~Cff~Cff~Cff~Cff~Cff~Cff~Cff~C3~C3~C3~C~Cf~CC33C33C33CLCffCffCffCffCffCffCCCC3CCCCfCfC  CCf&C33C33C33C33C33C @C @CLCYCYCffC3sC3sC3sC3sC C CfC3C3C3C C C C C C C̀C̀C3C3C3C3CCCf&C33C @C @C @C @C @C @CLCLCffCffCffCffC3sC3sC3sC͌CCC3C3C3C3C C ĆĆĆĆCفCfC3C  CCCCf&Cf&C33C @C @C @C @C @C @C @CYCffCffCffC3sCCfCfCfC3C3C C C C C ĈĈĈĈC3C  CCCCCCf&Cf&Cf&C33C @C @CLCLCLCYCffC3sC͌C͌CCCfCfCfC3C C C C C̃C̃C̃C̃CكCfC3CCCCf&Cf&C @C @C @C @CLCLCLCLCLCLCLCYCYCffC3sC͌C3C3C C C C C C̄C̄C̄C̄C̄C̄CلCلC3C  CCC33C @C @C @C @C @C @C @C @C @CYCYC3sC3sC C CCfC3C C C C C C C C C C̅CمC3C3C  C  CCf&C33C33C33C @C @C @C @C @C @C @CLCYCffC3sC3sC CCfCfC3C C C C C C C̆C̆C̆CfCfC  CCCCCf&C33C33C @C @C @C @C @C @C @C @C @CffC3sC͌C͌C͌CfCfC3C3C3C3C3C3C3C3C3C C CهCfC  CCf&Cf&C33C33C33C33C33C33C33C33C33C33C @CLCLC CfCfCfCfC3C3C3C3C3C3C3C3C3C C̈CfC  C  CCCCf&Cf&Cf&Cf&C33C33C33C33C @CLCYCYC3sC3sC3sC C͌CCfCfCfCfC3C3C3C3C3C3CىCfC3C3CCCCCf&Cf&Cf&Cf&C33C33C33C33C33C33CLCffC3sC C͌C͌C͌CCCfC3C3C3C3C3C3C C̊C̊CfC  C  CCCCCf&C33C33C33C33C33C33C @CLCffCffCffC3sC3sCCCfCfCfCfC3C3C3C3C C̋C̋CًC3C3C3C  CCf&Cf&Cf&Cf&Cf&Cf&Cf&C33C33C33C33CffC3sC3sC3sC C C͌CCfCfCfCfCfCfCfC3ČČCٌCٌCٌCfCfC3CCCCCCf&Cf&C33C33C33C33C @CLCYCYCYC3sC C C͌C͌CfCfCfCfCfCfCfCfC C C̍CfCfC3C3CCCCf&Cf&Cf&Cf&Cf&Cf&Cf&C @C @C @C @CYC3sC3sC C C͌CCfCfCfCfCfC3C3C C C C C CfC3C  CCCCCCCCCf&Cf&C33C33C33C33C33CffC3sC3sC C͌C͌C͌CCCCCfCfCfCfCfC3C C CُCfC3CCCCCCCCf&Cf&Cf&C33C @C @CLCLC3sC3sC C͌C͌C͌C͌C͌CfCfCfCfC C C̐C̐C̐CِCfC3C  C  CCCf&Cf&Cf&Cf&C33C33C @CLCLCYCYCYCYCffCffCffC3sC3sC͌CCfC3C3C C C C̑CّCّCfCfCfCfCfC3CCC33C33C @C @C @C @CLCYCffCffCffCffCffCffCffC CCCfC C C C CْCfCfCfCfCfCfCfC3C3C  C  CCf&C33C33CLCLCYCYCYCffCffCffCffC3sC C C C CCC3C C̓C̓CٓCfCfCfCfCfCfC3C  C  C  C  C  CCCf&C33C @CLCYCYCffCffC3sC C C C C C C CCCC3C3C̔CٔCٔCfC3C3C3C  C  C  C  C  C  C  CCf&Cf&Cf&C @CLCLCffCffCffC3sC C C C C C C͌CCfCfC3C C̕C̕CٕCٕCfCfC  C  C  C  C  C  CCCCCf&C @C @CLCLCLCffCffCffCffCffC3sC C͌C͌C͌CCCfC3C3C C̖CٖCٖCٖCٖCfCfCfC  C  CCCf&Cf&Ctypescatterx]  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;E ;E ;E ;E ;E ;E ;E ;E  <E <E  <E 0<E @<E P<E `<E p<E <E <E <E <E <E <E <E <E  =E =E  =E 0=E @=E P=E `=E p=E =E =E =E =E =E =E =E =E  >E >E  >E 0>E @>E P>E `>E p>E >E >E >E >E >E >E >E >E  ?E ?E  ?E 0?E @?E P?E `?E p?E ?E ?E ?E ?E ?E ?E ?E ?E  @E @E  @E 0@E @@E P@E `@E p@E @E @E @E @E @E @E @E @E  AE AE  AE 0AE @AE PAE `AE pAE AE AE AE AE AE AE AE AE  BE BE  BE 0BE @BE PBE `BE pBE BE BE BE BE BE BE BE BE  CE CE  CE 0CE @CE PCE `CE pCE CE CE CE CE CE CE CE CE  DE DE  DE 0DE @DE PDE `DE pDE DE DE DE DE DE DE DE DE  EE EE  EE 0EE @EE PEE `EE pEE EE EE EE EE EE EE EE EE  FE FE  FE 0FE @FE PFE `FE pFE FE FE FE FE FE FE FE FE  GE GE  GE 0GE @GE PGE `GE pGE GE GE GE GE GE GE GE GE  HE HE  HE 0HE @HE PHE `HE pHE HE HE HE HE HE HE HE HE  IE IE  IE 0IE @IE PIE `IE pIE IE IE IE IE IE IE IE IE  JE JE  JE 0JE @JE PJE `JE pJE JE JE JE JE JE JE JE JE  KE KE  KE 0KE @KE PKE `KE pKE KE KE KE KE KE KE KE KE  LE LE  LE 0LE @LE PLE `LE pLE LE LE LE LE LE LE LE LE  ME ME  ME 0ME @ME PME `ME pME ME ME ME ME ME ME ME ME  NE NE  NE 0NE @NE PNE `NE pNE NE NE NE NE NE NE NE NE  OE OE  OE 0OE @OE POE `OE pOE OE OE OE OE OE OE OE OE  PE PE  PE 0PE @PE PPE `PE pPE PE PE PE PE PE PE PE PE  QE QE  QE 0QE @QE PQE `QE pQE QE QE QE QE QE QE QE QE  RE RE  RE 0RE @RE PRE `RE pRE RE RE RE RE RE RE RE RE  SE SE  SE 0SE @SE PSE `SE pSE SE SE SE SE SE SE SE SE  TE TE  TE 0TE @TE PTE `TE pTE TE TE TE TE TE TE TE TE  UE UE  UE 0UE @UE PUE `UE pUE UE UE UE UE UE UE UE UE  VE VE  VE 0VE @VE PVE `VE pVE VE VE VE VE VE VE VE VE  WE WE  WE 0WE @WE PWE `WE pWE WE WE WE WE WE WE WE WE  XE XE  XE 0XE @XE PXE `XE pXE XE XE XE XE XE XE XE XE  YE YE  YE 0YE @YE PYE `YE pYE YE YE YE YE YE YE YE YE  ZE ZE  ZE 0ZE @ZE PZE `ZE pZE ZE ZE ZE ZE ZE ZE ZE ZE  [E [E  [E 0[E @[E P[E `[E p[E [E [E [E [E [E [E [E [E  \E \E  \E 0\E @\E P\E `\E p\E \E \E \E \E \E \E \E \E  ]E ]E  ]E 0]E @]E P]E `]E p]E ]E ]E ]E ]E ]E ]E ]E ]E  ^E ^E  ^E 0^E @^E P^E `^E p^E ^E ^E ^E ^E ^E ^E ^E ^E  _E _E  _E 0_E @_E P_E `_E p_E _E _E _E _E _E _E _E _E  `E `E  `E 0`E @`E P`E ``E p`E `E `E `E `E `E `E `E `E  aE aE  aE 0aE @aE PaE `aE paE aE aE aE aE aE aE aE aE  bE bE  bE 0bE @bE PbE `bE pbE bE bE bE bE bE bE bE bE  cE cE  cE 0cE @cE PcE `cE pcE cE cE cE cE cE cE cE cE  dE dE  dE 0dE @dE PdE `dE pdE dE dE dE dE dE dE dE dE  eE eE  eE 0eE @eE PeE `eE peE eE eE eE eE eE eE eE eE  fE fE  fE 0fE @fE PfE `fE pfE fE fE fE fE fE fE fE fE  gE gE  gE 0gE @gE PgE `gE pgE gE gE gE gE gE gE gE gE  hE hE  hE 0hE @hE PhE `hE phE hE hE hE hE hE hE hE hE  iE iE  iE 0iE @iE PiE `iE piE iE iE iE iE iE iE iE iE  jE jE  jE 0jE @jE PjE `jE pjE jE jE jE jE jE jE jE jE  kE kE  kE 0kE @kE PkE `kE pkE kE kE kE kE kE kE kE kE  lE lE  lE 0lE @lE PlE `lE plE lE lE lE lE lE lE lE lE  mE mE  mE 0mE @mE PmE `mE pmE mE mE mE mE mE mE mE mE  nE nE  nE 0nE @nE PnE `nE pnE nE nE nE nE nE nE nE nE  oE oE  oE 0oE @oE PoE `oE poE oE oE oE oE oE oE oE oE  pE pE  pE 0pE @pE PpE `pE ppE pE pE pE pE pE pE pE pE  qE qE  qE 0qE @qE PqE `qE pqE qE qE qE qE qE qE qE qE  rE rE  rE 0rE @rE PrE `rE prE rE rE rE rE rE rE rE rE  sE sE  sE 0sE @sE PsE `sE psE sE sE sE sE sE sE sE sE  tE tE  tE 0tE @tE PtE `tE ptE tE tE tE tE tE tE tE tE  uE uE  uE 0uE @uE PuE `uE puE uE uE uE uE uE uE uE uE  vE vE  vE 0vE @vE PvE `vE pvE vE vE vE vE vE vE vE vE  wE wE  wE 0wE @wE PwE `wE pwE wE wE wE wE wE wE wE wE  xE xE  xE 0xE @xE PxE `xE pxE xE xE xE xE xE xE xE xE  yE yE  yE 0yE @yE PyE `yE pyE yE yE yE yE yE yE yE yE  zE zE  zE 0zE @zE PzE `zE pzE zE zE zE zE zE zE zE zE  {E {E  {E 0{E @{E P{E `{E p{E {E {E {E {E {E {E {E {E  |E |E  |E 0|E @|E P|E `|E p|E |E |E |E |E |E |E |E |E  }E }E  }E 0}E @}E P}E `}E p}E }E }E }E }E }E }E }E }E  ~E ~E  ~E 0~E @~E P~E `~E p~E ~E ~E ~E ~E ~E ~E ~E ~E  E E  E 0E @E PE `E pE E E E E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȀE ЀE ؀E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȁE ЁE ؁E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȂE ЂE ؂E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȃE ЃE ؃E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȄE ЄE ؄E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȅE ЅE ؅E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȆE ІE ؆E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȇE ЇE ؇E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȈE ЈE ؈E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȉE ЉE ؉E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȊE ЊE ؊E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȋE ЋE ؋E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȌE ЌE ،E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȍE ЍE ؍E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȎE ЎE ؎E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȏE ЏE ؏E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȐE АE ؐE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȑE БE ؑE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȒE ВE ؒE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȓE ГE ؓE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȔE ДE ؔE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȕE ЕE ؕE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȖE ЖE ؖE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȗE ЗE ؗE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȘE ИE ؘE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E șE ЙE ؙE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȚE КE ؚE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E țE ЛE ؛E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȜE МE ؜E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȝE НE ؝E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȞE ОE ؞E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȟE ПE ؟E E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȠE РE ؠE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȡE СE ءE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȢE ТE آE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȣE УE أE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȤE ФE ؤE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȥE ХE إE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȦE ЦE ئE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȧE ЧE اE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȨE ШE بE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȩE ЩE ةE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȪE ЪE تE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȫE ЫE ثE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȬE ЬE جE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȭE ЭE حE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȮE ЮE خE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȯE ЯE دE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȰE аE ذE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȱE бE رE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȲE вE زE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȳE гE سE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȴE дE شE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȵE еE صE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȶE жE ضE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȷE зE طE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȸE иE ظE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȹE йE عE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E E E E E E E E E ȺE кE غE E E E E  E E E E  E (E 0E 8E @E HE PE XE `E hE pE xE E53ee53c46-38f7-11f0-16c9-2b093684d981/a7554ac9055de0b8layouttemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  configshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay.                                                                            ==================================================L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>L>>>>>>>>>>>>>>>>   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?????????333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?333?L?L?L?L?L?L?L?L?L?L?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?fff?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?̌?̌?̌?̌?̌?̌?̌?̌?̌?̌???????????ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?33?33?33?33?33?33?33?33?  ?  ????????????ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?ff?33?33?33?   @   @   @   @   @   @   @ff@ff@ff@@@@@@@@33@33@33@33@@@@@@@@   @   @ff&@,@,@,@,@,@,@,@,@,@,@,@,@333@333@333@333@333@333@333@333@333@333@9@9@9@9@  @@  @@  @@  @@  @@  @@  @@  @@ffF@ffF@L@L@L@L@L@L@L@L@33S@33S@33S@33S@Y@  `@  `@  `@  `@  `@fff@fff@fff@fff@l@l@l@l@l@l@l@l@l@l@y@y@y@y@y@y@y@y@y@y@y@y@33@33@33@33@33@33@33@33@33@ff@ff@ff@ff@@@@̌@  @  @  @  @  @  @  @  @  @33@33@ff@ff@ff@ff@ff@ff@ff@ff@ff@@@̜@̜@̜@̜@̜@̜@̜@̜@̜@̜@  @  @  @  @  @  @  @  @33@33@33@33@ff@ff@ff@ff@ff@ff@ff@ff@ff@ff@ff@ff@̬@̬@̬@̬@̬@̬@̬@̬@̬@̬@  @  @  @  @ff@ff@ff@ff@ff@ff@@@@@̼@̼@33@33@33@33@ff@ff@ff@ff@ff@ff@@  @  @33@ff@@@@@@@  @  @33@33@ff@@@@@@@  @  @  @  @  @@   A   AAA33A33A33A33A33A33A33AffA  A	A33AAAAAAAAAffAffAA33AAffAffAffAffAffAffA  AAAAAAAffAffA   A   A!A!A!A33#A$A$A$A$Aff&Aff&A)A)A)A33+A,A,A,A,A,Aff.Aff.Aff.A1A1A4A4Aff6Aff6Aff6A  8A  8A  8A  8A  8A33;A33;A<A<A<Aff>A33CA33CA33CA33CADAffFAffFAffFA  HA  HA  HAIAIA33KA33KAffNAffNAffNA  PA  PA  PA  PA33SA33SA33SAffVAffVAffVA  XAYAYAYA33[A33[A33[A\Aff^A  `A  `A  `AaA33cAdAdAdAfffAfffA  hAiAiA33kA33kAlAlAlAlAffnA  pAqAqA33sA33sA33sA33sAffvAffvAffvAffvAyAyAyAyAyA33{Aff~Aff~A  A  AAAAAAAffAffA33A  AAffAffAffA33A33A  A  ÄÄAAffA33A33A  ǍAAffAffAffA33A  A̐A̐AAAAffAffA  A  AAffAffAffAffAffA33A33A33A33AA33A  A  A  A  A  A̜A̜A̜AAffA  A̠AAAAffAffAffA33A  A  A̤AAAAA33A  ĄAAAffA33A33A33A33A33A33A̬AffAffA  A  A  A  A  A̰A̰A̰A̰AAAffA  A  A̴AffAffAffAffAffAffAffA̸AAAAA33A33A33A33A̼AAAffAffAffA  A  A  AAAAffAffA33A33AAAAAA33A33A33A33A33AAAffA33A33A33A33A  A  AAffAffA  AAAAAAAAffAffA  A  AAAffAffAffAffAffA33A33A  AAA33A  A  A  A  AAAffA33A33A33A  A  AAAAA33A33AAAffAffAffAffAffAffAffAffAAffA33A  AAAAAAAA33A33AAffA33A33A33A33A33A33A33AAffA33A33A  AAAAAAAA33A  A  AAAAAAffAffAff B B33B  B  B  B  B  BffBffBffBffB33BBB33B33B33B33B33B33B33BB  B33BBB  B  B  B  B  BffB33	Bff
B
B
B
B
B
B
B
B
B33BBffBBBBB  B  B  B  BffBB  B  BffBffBB33B33B33BBB  BB33B33BBBBBBBffBB  B  B  B  BffBffBffBffBB33B  BffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB33B33B33BBBBBBBBBBBBBBBBBBBB  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  BffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBffBBBBBBBBBBBBBBBBBBB33B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33BBBBBBBBBBBBBBBBB  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  BffBffBffBffBffBBBBBBBBBBBBBBBB33B33B33B33B33BBBBBBBBBBBBBBBB  B  B  BffBffBffBffBffBffBffBffBffBffBffBffBffBBBB33B33B33B33B33B33B33B33B33B33B33B33B33B33B33BBBBBBB   B   B   B   B   B   B   B   B   B   B   B   B   Bff Bff Bff Bff B B B B B B B B B B B B B33!B33!B33!B33!B33!B33!B33!B33!B!B!B!B!B!B!B!B!B!B  "B  "B  "B  "B  "B  "B  "B  "B  "Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"Bff"B"B"B"B"B"B"B"B33#B33#B33#B33#B33#B#B#B#B#B#B#B  $B  $B  $B  $B  $B  $B  $B  $Bff$Bff$Bff$Bff$B$B$B$B$B33%B33%B33%B33%B33%B33%B33%B33%B%B%B%B%B  &B  &B  &B  &B  &Bff&Bff&Bff&Bff&Bff&Bff&Bff&B&B&B&B&B&B&B&B&B&B33'B'B'B'B'B'B'B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (Bff(Bff(Bff(Bff(Bff(B33)B33)B33)B33)B33)B)B)B)B)B)B)B)B)B)B)B)B  *B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B*B33+B33+B33+B+B+B+B+B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,B  ,Bff,Bff,Bff,Bff,Bff,B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B33-B-B-B-B-B-B  .B  .Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.Bff.B.B.B.B33/B33/B33/B/B/B/B/B/B/B/B/B/B/B/B/B/B  0Bff0Bff0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B331B1B  2B  2B  2B  2B  2B  2B  2B  2B  2B  2B  2B  2B  2B  2B  2B  2B2B2B333B333B333B333B333B333B333B333B333B333B333B333B333B333B3B3B  4B  4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4Bff4B335B335B5B5B  6B  6B  6B  6B  6B  6B  6B  6B  6B  6B  6B  6Bff6Bff6Bff6Bff6B6B337B337B7B7B7B7B7B7B7B7B7B  8B  8B  8B  8B  8B  8B  8Bff8B8B8B8B8B339B339B339B339B339B339B9B9B9B9B9B  :B  :B  :B  :Bff:Bff:Bff:Bff:Bff:Bff:Bff:B33;B33;B33;B33;B33;B33;B33;B;B;B;B;B;B;B;B;B;Bff<Bff<Bff<Bff<B<B<B<B<B33=B33=B33=B33=B33=B33=B33=B33=B33=B=B=B=B=B=B  >B  >Bff>Bff>Bff>Bff>Bff>Bff>Bff>Bff>B>B>B33?B33?B33?B33?B?B?B?B?B?B?B  @B  @B  @B  @B  @B  @B  @Bff@Bff@Bff@Bff@B@B@B@B33AB33AB33AB33ABABABABABABABABABAB  BB  BBffBBffBBffBBBBBBBBBBBBBBBB33CB33CB33CB33CB33CB33CB33CBCBCBCBCB  DBffDBffDBffDBffDBffDBffDBffDBDBDBDBDBDBDB33EB33EB33EB33EB33EBEBEBEBEBEBEB  FBffFBffFBffFBffFBffFBffFBffFBffFBffFBffFBffFBFB33GB33GB33GBGBGBGBGBGB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HB  HBffHBffHBffHBffHBHB33IB33IB33IB33IB33IBIBIBIBIBIBIBIBIBIBIBIBIBIB  JBffJBffJBJB33KB33KB33KB33KB33KB33KB33KB33KB33KB33KB33KB33KB33KB33KBKB  LB  LBLBLBLBLBLBLBLBLBLBLBLBLBLB33MB33MB33MB33MB  NB  NB  NBffNBffNBffNBffNBffNBffNBffNBffNBffNBffNBffNBffNBNB33OB33OBOBOBOBOBOB  PB  PB  PB  PB  PB  PB  PB  PB  PB  PBffPBPBPB33QB33QB33QB33QB33QB33QB33QB33QBQBQBQBQBQBQB  RB  RBRBRBRBRBRBRBRBRBRBRB33SB33SB33SB33SB33SB33SBSB  TB  TB  TB  TB  TBffTBffTBffTBffTBffTBffTBTBTBTBTBTBTBTB33UB33UBUB  VB  VB  VB  VB  VB  VB  VB  VB  VB  VB  VB  VB  VBffVBffVBffVB33WB33WB33WBWBWBWBWBWBWBWBWBWBWBWBWBWB  XB  XBffXBffXBffXBXBXBXBXBXBXBXB33YB33YB33YB33YB33YB33YB33YB33YBYBffZBffZBffZBffZBffZBffZBffZBffZBffZBZBZBZBZBZBZBZB33[B  \B  \B  \B  \B  \B  \B  \B  \B  \B  \B  \B  \B  \Bff\Bff\Bff\B\B\B\B\B\B33]B33]B33]B]B]B]B]B]B]B]B]B]B  ^B  ^B  ^B  ^B  ^B  ^Bff^Bff^Bff^Bff^B33_B33_B33_B33_B33_B33_B33_B33_B33_B33_B33_B33_B33_B33_B33_B_B_B  `Bff`Bff`Bff`Bff`Bff`Bff`B`B`B`B`B`B`B`B33aB33aB33aBaBaB  bB  bB  bB  bB  bB  bB  bB  bB  bB  bBffbBffbBffbBbBbBbB33cB33cBcBcBcBcBcBcBcBcBcBcBcBcB  dB  dBffdBdBdB33eB33eB33eB33eB33eB33eB33eB33eB33eB33eB33eB33eB33eBeB  fB  fBfffBfffBfffBfBfBfBfBfBfBfBfBfBfB33gB33gB33gBgBgB  hB  hB  hB  hB  hB  hB  hBffhBffhBffhBffhBhBhBhB33iB33iBiBiBiBiBiBiBiBiBiBiBiBiB  jB  jBffjBffjBffjBjBjB33kB33kB33kB33kB33kB33kB33kB33kB33kB33kB33kBkB  lB  lB  lB  lB  lBfflBlBlBlBlBlBlBlBlBlBlB33mB33mB33mBmBmB  nB  nB  nB  nB  nB  nB  nBffnBffnBffnBffnBffnBffnBffnB33oB33oB33oBoBoB  pB  pB  pB  pBffpBffpBffpBffpBffpBffpBffpBffpBpBpBpBpBpBpBpBpB33qB33qB33qB33qBqBqBqBqBqBqBqBqBqB  rBffrBffrBrBrBrBrBrBrBrBrB33sB33sB33sB33sB33sBsBsBsB  tB  tB  tB  tBfftBfftBfftBfftBtBtBtBtBtBtBtB33uB33uB33uB33uB33uB  vB  vB  vB  vBffvBffvBffvBffvBffvBffvBffvBffvBffvBvBvBvBvBvB33wB33wB33wBwBwBwB  xB  xB  xB  xB  xB  xB  xB  xBffxBffxBffxBffxBxBxBxBxB33yB33yByByByByByByByByB  zB  zB  zB  zBffzBffzBzBzB33{B33{B33{B33{B33{B33{B33{B33{B33{B{B{B{Bff|Bff|B|B|B|B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B33}B  ~B  ~B  ~Bff~Bff~B33B33B33B33B33B33B33B33B33B33B33B33B33B33B33BB  B33BffBffBffBffBBBBBBBBBBB̀B̀B̀B  B33B33B33BffBBBBBBBBBBBBBB  B33BffBBBBBBBBBBBBBBBB33B33BffBffBffBBBBBBBBBBBB  B  B  B  BffBffBffBBBBBBBBBBB̄B  B  B33B33B33B33BffBffBffBffBBBBBBBBBBBBB̅B  B33B33BffBffBffBffBBBBBBBBB̆B̆B  B33B33B33B33B33BffBffBffBffBffBBBḂḂḂḂḂB33B33B33B33BffBffBffBffBBBBBBBBBB̈B33B33B33BffBffBffBffBffBffBffBffBBBBB̉B33B33B33BffBffBffBffBffBffBffBffBffBffBffBBBB̊B̊B  B  B  B33B33B33BffBffBffBffBffBffBffBffBffBffBBBBB̋B̋B  B33BffBffBffBffBffBffBffBtypescatterx.  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A   B  B  B  B  B  B  B  B   B  $B  (B  ,B  0B  4B  8B  <B  @B  DB  HB  LB  PB  TB  XB  \B  `B  dB  hB  lB  pB  tB  xB  |B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B  B   C  C  C  C  C  C  C  C  C  	C  
C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C  C   C  !C  "C  #C  $C  %C  &C  'C  (C  )C  *C  +C  ,C  -C  .C  /C  0C  1C  2C  3C  4C  5C  6C  7C  8C  9C  :C  ;C  <C  =C  >C  ?C  @C  AC  BC  CC  DC  EC  FC  GC  HC  IC  JC  KC  LC  MC  NC  OC  PC  QC  RC  SC  TC  UC  VC  WC  XC  YC  ZC  [C  \C  ]C  ^C  _C  `C  aC  bC  cC  dC  eC  fC  gC  hC  iC  jC  kC  lC  mC  nC  oC  pC  qC  rC  sC  tC  uC  vC  wC  xC  yC  zC  {C  |C  }C  ~C  C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C  C C   D @ D  D  D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  	D @	D 	D 	D  
D @
D 
D 
D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D  D @D D D   D @ D  D  D  !D @!D !D !D  "D @"D "D "D  #D @#D #D #D  $D @$D $D $D  %D @%D %D %D  &D @&D &D &D  'D @'D 'D 'D  (D @(D (D (D  )D @)D )D )D  *D @*D *D *D  +D @+D +D +D  ,D @,D ,D ,D  -D @-D -D -D  .D @.D .D .D  /D @/D /D /D  0D @0D 0D 0D  1D @1D 1D 1D  2D @2D 2D 2D  3D @3D 3D 3D  4D @4D 4D 4D  5D @5D 5D 5D  6D @6D 6D 6D  7D @7D 7D 7D  8D @8D 8D 8D  9D @9D 9D 9D  :D @:D :D :D  ;D @;D ;D ;D  <D @<D <D <D  =D @=D =D =D  >D @>D >D >D  ?D @?D ?D ?D  @D @@D @D @D  AD @AD AD AD  BD @BD BD BD  CD @CD CD CD  DD @DD DD DD  ED @ED ED ED  FD @FD FD FD  GD @GD GD GD  HD @HD HD HD  ID @ID ID ID  JD @JD JD JD  KD @KD KD KD  LD @LD LD LD  MD @MD MD MD  ND @ND ND ND  OD @OD OD OD  PD @PD PD PD  QD @QD QD QD  RD @RD RD RD  SD @SD SD SD  TD @TD TD TD  UD @UD UD UD  VD @VD VD VD  WD @WD WD WD  XD @XD XD XD  YD @YD YD YD  ZD @ZD ZD ZD  [D @[D [D [D  \D @\D \D \D  ]D @]D ]D ]D  ^D @^D ^D ^D  _D @_D _D _D  `D @`D `D `D  aD @aD aD aD  bD @bD bD bD  cD @cD cD cD  dD @dD dD dD  eD @eD eD eD  fD @fD fD fD  gD @gD gD gD  hD @hD hD hD  iD @iD iD iD  jD @jD jD jD  kD @kD kD kD  lD @lD lD lD  mD @mD mD mD  nD @nD nD nD  oD @oD oD oD  pD @pD pD pD  qD @qD qD qD  rD @rD rD rD  sD @sD sD sD  tD @tD tD tD  uD @uD uD uD  vD @vD vD vD  wD @wD wD wD  xD @xD xD xD  yD @yD yD yD  zD @zD zD zD  {D @{D {D {D  |D @|D |D |D  }D @}D }D }D  ~D @~D ~D ~D  D @D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D  D  D @D `D D D D D   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  	E 	E  	E 0	E @	E P	E `	E p	E 	E 	E 	E 	E 	E 	E 	E 	E  
E 
E  
E 0
E @
E P
E `
E p
E 
E 
E 
E 
E 
E 
E 
E 
E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E  E E  E 0E @E PE `E pE E E E E E E E E   E  E   E 0 E @ E P E ` E p E  E  E  E  E  E  E  E  E  !E !E  !E 0!E @!E P!E `!E p!E !E !E !E !E !E !E !E !E  "E "E  "E 0"E @"E P"E `"E p"E "E "E "E "E "E "E "E "E  #E #E  #E 0#E @#E P#E `#E p#E #E #E #E #E #E #E #E #E  $E $E  $E 0$E @$E P$E `$E p$E $E $E $E $E $E $E $E $E  %E %E  %E 0%E @%E P%E `%E p%E %E %E %E %E %E %E %E %E  &E &E  &E 0&E @&E P&E `&E p&E &E &E &E &E &E &E &E &E  'E 'E  'E 0'E @'E P'E `'E p'E 'E 'E 'E 'E 'E 'E 'E 'E  (E (E  (E 0(E @(E P(E `(E p(E (E (E (E (E (E (E (E (E  )E )E  )E 0)E @)E P)E `)E p)E )E )E )E )E )E )E )E )E  *E *E  *E 0*E @*E P*E `*E p*E *E *E *E *E *E *E *E *E  +E +E  +E 0+E @+E P+E `+E p+E +E +E +E +E +E +E +E +E  ,E ,E  ,E 0,E @,E P,E `,E p,E ,E ,E ,E ,E ,E ,E ,E ,E  -E -E  -E 0-E @-E P-E `-E p-E -E -E -E -E -E -E -E -E  .E .E  .E 0.E @.E P.E `.E p.E .E .E .E .E .E .E .E .E  /E /E  /E 0/E @/E P/E `/E p/E /E /E /E /E /E /E /E /E  0E 0E  0E 00E @0E P0E `0E p0E 0E 0E 0E 0E 0E 0E 0E 0E  1E 1E  1E 01E @1E P1E `1E p1E 1E 1E 1E 1E 1E 1E 1E 1E  2E 2E  2E 02E @2E P2E `2E p2E 2E 2E 2E 2E 2E 2E 2E 2E  3E 3E  3E 03E @3E P3E `3E p3E 3E 3E 3E 3E 3E 3E 3E 3E  4E 4E  4E 04E @4E P4E `4E p4E 4E 4E 4E 4E 4E 4E 4E 4E  5E 5E  5E 05E @5E P5E `5E p5E 5E 5E 5E 5E 5E 5E 5E 5E  6E 6E  6E 06E @6E P6E `6E p6E 6E 6E 6E 6E 6E 6E 6E 6E  7E 7E  7E 07E @7E P7E `7E p7E 7E 7E 7E 7E 7E 7E 7E 7E  8E 8E  8E 08E @8E P8E `8E p8E 8E 8E 8E 8E 8E 8E 8E 8E  9E 9E  9E 09E @9E P9E `9E p9E 9E 9E 9E 9E 9E 9E 9E 9E  :E :E  :E 0:E @:E P:E `:E p:E :E :E :E :E :E :E :E :E  ;E ;E  ;E 0;E @;E P;E `;E p;E ;E53ee53c46-38f7-11f0-16c9-2b093684d981/d66ad0b4e19c289flayoutxaxistitletext%Computation time, in expected updatestemplatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    marginlBH  bBH  rBH  tBp  yaxistitletext(Value of start state under greedy policyconfigshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdatay,    Q>?)@k@oS@,U@@­@A@@typescatternameb = 1, uniformx,     @D @zE E @E hF ;F ZF @zF ČF hFy,    .>6C?Ԝ?[?a?W`@}@%#@+@I2@typescatternameb = 3, uniformx,     @D @zE E @E hF ;F ZF @zF ČF hFy,    <43>>(?}Z?U]?=?ܸ?M?ر??typescatternameb = 10, uniformx,     @D @zE E @E hF ;F ZF @zF ČF hFy,    >@!@@"@{@@I[@@C@typescatternameb = 1, on-policyx,      ?  D zE E E DF ;F ZF zF Fy,    Ɇ?>?u???x\@ @@R@@typescatternameb = 3, on-policyx,      ?  D zE E E DF ;F ZF zF Fy,    >:>J>9?6?:M?8wa?r?k(?^?,?typescatternameb = 10, on-policyx,      ?  D zE E E DF ;F ZF zF F53ee53c46-38f7-11f0-16c9-2b093684d981/758f20745cddbdf8layoutxaxis1showlineégridcolorblacktickvals$  ?   @  @@  @  @  @  @   A  Arange  ?   Adomain    ?>ticktextlinecolorblackshowgridègridwith?  zerolineæmirroræanchory1yaxis1showlineégridcolorblackgridwidth?  tickvals  ?   @  @@  @  @  @range  ?  @domain      ?ticktextlinecolorblackshowgridæmirroræanchorx1templatelayout coloraxiscolorbarticksoutlinewidth    xaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhitehovermodeclosestpaper_bgcolorwhitegeoshowlakesèshowlandélandcolor#E5ECF6bgcolorwhitesubunitcolorwhitelakecolorwhitecolorscalesequential    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921diverging    #8e0152=ͧ#c51b7d>Lͧ#de77ae>#f1b6da>ͧ#fde0ef?   #f7f7f7?#e6f5d0?333#b8e186?Lͧ#7fbc41?fff#4d9221?  #276419sequentialminus    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921yaxisgridcolorwhitezerolinewidth@   titlestandoffAp  tickszerolinecolorwhiteautomarginélinecolorwhiteshapedefaultslinecolor#2a3f5fhoverlabelalignleftmapboxstylelightpolarangularaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6radialaxisgridcolorwhitetickslinecolorwhiteautotypenumbersstrictfontcolor#2a3f5fternaryaaxisgridcolorwhitetickslinecolorwhitebgcolor#E5ECF6caxisgridcolorwhitetickslinecolorwhitebaxisgridcolorwhitetickslinecolorwhiteannotationdefaultsarrowhead    arrowwidth?  arrowcolor#2a3f5fplot_bgcolor#E5ECF6titlex=Lͥscenexaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitezaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhiteyaxisgridcolorwhitegridwidth@   backgroundcolor#E5ECF6ticksshowbackgroundízerolinecolorwhitelinecolorwhitecolorway#636efa#EF553B#00cc96#ab63fa#FFA15A#19d3f3#FF6692#B6E880#FF97FF#FECB52data scatterpolargltypescatterpolarglmarkercolorbarticksoutlinewidth    carpetbaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitetypecarpetaaxisgridcolorwhiteendlinecolor#2a3f5fminorgridcolorwhitestartlinecolor#2a3f5flinecolorwhitescatterpolartypescatterpolarmarkercolorbarticksoutlinewidth    parcoordslinecolorbarticksoutlinewidth    typeparcoordsscattertypescattermarkercolorbarticksoutlinewidth    histogram2dcontourcolorbarticksoutlinewidth    typehistogram2dcontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcolorbarticksoutlinewidth    typecontourcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattercarpettypescattercarpetmarkercolorbarticksoutlinewidth    mesh3dcolorbarticksoutlinewidth    typemesh3dsurfacecolorbarticksoutlinewidth    typesurfacecolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scattermapboxtypescattermapboxmarkercolorbarticksoutlinewidth    scattergeotypescattergeomarkercolorbarticksoutlinewidth    histogramtypehistogrammarkercolorbarticksoutlinewidth    pietypepieautomarginêchoroplethcolorbarticksoutlinewidth    typechoroplethheatmapglcolorbarticksoutlinewidth    typeheatmapglcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921bartypebarerror_ycolor#2a3f5ferror_xcolor#2a3f5fmarkerlinecolor#E5ECF6width?   heatmapcolorbarticksoutlinewidth    typeheatmapcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921contourcarpetcolorbarticksoutlinewidth    typecontourcarpettabletypetableheaderlinecolorwhitefillcolor#C8D4E3cellslinecolorwhitefillcolor#EBF0F8scatter3dlinecolorbarticksoutlinewidth    typescatter3dmarkercolorbarticksoutlinewidth    barpolartypebarpolarmarkerlinecolor#E5ECF6width?   scattergltypescatterglmarkercolorbarticksoutlinewidth    histogram2dcolorbarticksoutlinewidth    typehistogram2dcolorscale    #0d0887=9#46039f>c9#7201a8>#9c179e>9#bd3786?8#d8576b?*#ed7953?Gr#fb9f3a?c9#fdca26?  #f0f921scatterternarytypescatterternarymarkercolorbarticksoutlinewidth    xaxis2showlineégridcolorblacktickvalsH  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  Arange  ?  Adomaina>P$?ticktextlinecolorblackshowgridègridwith?  zerolineæmirroræanchory2marginlBH  bBH  rBH  tBp  yaxis2showlineégridcolorblackgridwidth?  tickvals0  ?   @  @@  @  @  @  @   A  A   A  0A  @Arange  ?  PAdomain      ?ticktextlinecolorblackshowgridæmirroræanchorx2xaxis3showlineégridcolorblacktickvalsl  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  A  A  A  A  A  A  A  A  A  Arange  ?  Adomaina6?  ?ticktextlinecolorblackshowgridègridwith?  zerolineæmirroræanchory3yaxis3showlineégridcolorblackgridwidth?  tickvalsH  ?   @  @@  @  @  @  @   A  A   A  0A  @A  PA  `A  pA  A  A  Arange  ?  Adomain      ?ticktext linecolorblackshowgridæmirroræanchorx3annotationsyanchorbottomxanchorcentery?  fontsizeA  showarrow¤yrefpapertextRandom policy <br> path examplexrefpaperx>?yanchorbottomxanchorcentery?  fontsizeA  showarrow¤yrefpapertextRandom policy <br> path examplexrefpaperx?   yanchorbottomxanchorcentery?  fontsizeA  showarrow¤yrefpapertextRandom policy <br> path examplexrefpaperx?[configshowLink¨editableªresponsiveêstaticPlotªscrollZoomæframesdataSshowlegend¤modetextxaxisx1textpositionlefty  @typescattertextSyaxisy1x  ?showlegend¤modetextxaxisx1textpositionlefty  @typescattertextGyaxisy1x  Ashowlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  `@typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  `@typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  `@  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  `@   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  `@   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@  `@typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  `@  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x   @  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  @  `@typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y  `@   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?  ?showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  ?   @showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x   @  `@showlegend¤modelineslinecolorbluexaxisx1y   @   @typescatternameOptimal Pathyaxisy1x  `@  `@showlegend¤modelineslinecolorbluexaxisx1y   @  @typescatternameOptimal Pathyaxisy1x  `@  ?showlegend¤modetextxaxisx1textpositionlefty  `@typescattertextWyaxisy1x33s@showlegend¤modetextxaxisx1textpositionlefty  @typescattertextWyaxisy1x33s@showlegend¤modetextxaxisx1textpositionlefty  @typescattertextWyaxisy1x33s@showlegend¤modetextxaxisx1textpositionlefty   @typescattertextWyaxisy1x@showlegend¤modetextxaxisx1textpositionlefty  @typescattertextWyaxisy1xAshowlegend¤modetextxaxisx1textpositionlefty  @typescattertextWyaxisy1xAshowlegend¤modetextxaxisx1textpositionlefty  @typescattertextWyaxisy1xAshowlegend¤modetextxaxisx2textpositionlefty  AtypescattertextSyaxisy2x  ?showlegend¤modetextxaxisx2textpositionlefty  HAtypescattertextGyaxisy2x  Ashowlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  A  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  A  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  A  @typescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  @  AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  A  (AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  (A  AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  A  (AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  (A  8AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  8A  HAtypescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  HA  8AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  8A  HAtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  HA  8AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  8A  (AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  (A  AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  A  (AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  (A  (AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  (A  (AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  (A  (AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  (A  AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  @  @showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  A  @typescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  @  AtypescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  A  AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  A  (AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  (A  8AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y  8A  HAtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  HA  8AtypescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x  `@  @showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x  @  `@showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y  8A  (AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  (A  (AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  (A  (AtypescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  (A  8AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  8A  HAtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  8AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  8A  (AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  (A  8AtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  8A  8AtypescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  8A  HAtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?  ?showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  ?   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x   @  `@showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  `@  `@showlegend¤modelineslinecolorbluexaxisx2y  HA  HAtypescatternameOptimal Pathyaxisy2x  `@   @showlegend¤modelineslinecolorbluexaxisx2y  HA  8AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  8A  (AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  (A  8AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  8A  (AtypescatternameOptimal Pathyaxisy2x   @   @showlegend¤modelineslinecolorbluexaxisx2y  (A  AtypescatternameOptimal Pathyaxisy2x   @  ?showlegend¤modetextxaxisx2textpositionlefty  @typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  @typescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  AtypescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  AtypescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  (AtypescattertextWyaxisy2x@showlegend¤modetextxaxisx2textpositionlefty  @typescattertextWyaxisy2xLAshowlegend¤modetextxaxisx2textpositionlefty  AtypescattertextWyaxisy2xffAshowlegend¤modetextxaxisx2textpositionlefty  AtypescattertextWyaxisy2xffAshowlegend¤modetextxaxisx2textpositionlefty  (AtypescattertextWyaxisy2xffAshowlegend¤modetextxaxisx2textpositionlefty  8AtypescattertextWyaxisy2xffAshowlegend¤modetextxaxisx2textpositionlefty  HAtypescattertextWyaxisy2xffAshowlegend¤modetextxaxisx3textpositionlefty  HAtypescattertextSyaxisy3x  ?showlegend¤modetextxaxisx3textpositionlefty  AtypescattertextGyaxisy3x  Ashowlegend¤modelineslinecolorbluexaxisx3y  HA  HAtypescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  HA  8AtypescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  8A  (AtypescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  (A  8AtypescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  8A  8AtypescatternameOptimal Pathyaxisy3x   @  ?showlegend¤modelineslinecolorbluexaxisx3y  8A  (AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  (A  AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  A  AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  A  (AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  (A  (AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  (A  8AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  8A  8AtypescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  8A  8AtypescatternameOptimal Pathyaxisy3x   @  ?showlegend¤modelineslinecolorbluexaxisx3y  8A  (AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  (A  (AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  (A  8AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  8A  HAtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  HA  XAtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  XA  HAtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  HA  HAtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  HA  HAtypescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  HA  8AtypescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  8A  8AtypescatternameOptimal Pathyaxisy3x   @  `@showlegend¤modelineslinecolorbluexaxisx3y  8A  (AtypescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y  (A  8AtypescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y  8A  (AtypescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y  (A  AtypescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y  A  AtypescatternameOptimal Pathyaxisy3x  `@   @showlegend¤modelineslinecolorbluexaxisx3y  A  AtypescatternameOptimal Pathyaxisy3x   @  ?showlegend¤modelineslinecolorbluexaxisx3y  A  AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  A  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  AtypescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  A  AtypescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  A  AtypescatternameOptimal Pathyaxisy3x   @  `@showlegend¤modelineslinecolorbluexaxisx3y  A  @typescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  `@   @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x   @  `@showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  `@  @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  @  @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  @  @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  @  @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  @  @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  @  `@showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  `@   @showlegend¤modelineslinecolorbluexaxisx3y  @  `@typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  `@   @typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y   @   @typescatternameOptimal Pathyaxisy3x   @  ?showlegend¤modelineslinecolorbluexaxisx3y   @  `@typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  `@  `@typescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  `@  @typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x   @  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  @  `@typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  `@  `@typescatternameOptimal Pathyaxisy3x   @  ?showlegend¤modelineslinecolorbluexaxisx3y  `@  `@typescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  `@   @typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y   @   @typescatternameOptimal Pathyaxisy3x   @  `@showlegend¤modelineslinecolorbluexaxisx3y   @  ?typescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y  ?   @typescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y   @   @typescatternameOptimal Pathyaxisy3x  `@   @showlegend¤modelineslinecolorbluexaxisx3y   @  ?typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x   @  ?showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x   @  `@showlegend¤modelineslinecolorbluexaxisx3y  ?   @typescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y   @  ?typescatternameOptimal Pathyaxisy3x  `@  `@showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x  `@   @showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x   @  `@showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x  `@   @showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x   @  ?showlegend¤modelineslinecolorbluexaxisx3y  ?  ?typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  ?   @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y   @  `@typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  `@  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x   @   @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x   @  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?  ?showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  ?   @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x   @  `@showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  `@  @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  @  @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  @  @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  @  @showlegend¤modelineslinecolorbluexaxisx3y  @  @typescatternameOptimal Pathyaxisy3x  @  @showlegend¤modelineslinecolorbluexaxisx3y  @  HAtypescatternameOptimal Pathyaxisy3x  @  ?showlegend¤modetextxaxisx3textpositionlefty  AtypescattertextWyaxisy3xAshowlegend¤modetextxaxisx3textpositionlefty  (AtypescattertextWyaxisy3xAshowlegend¤modetextxaxisx3textpositionlefty  8AtypescattertextWyaxisy3xAshowlegend¤modetextxaxisx3textpositionlefty  HAtypescattertextWyaxisy3xAshowlegend¤modetextxaxisx3textpositionlefty  XAtypescattertextWyaxisy3xAshowlegend¤modetextxaxisx3textpositionlefty  hAtypescattertextWyaxisy3xAshowlegend¤modetextxaxisx3textpositionlefty  xAtypescattertextWyaxisy3xAshowlegend¤modetextxaxisx3textpositionlefty  AtypescattertextWyaxisy3xffAshowlegend¤modetextxaxisx3textpositionlefty  HAtypescattertextWyaxisy3xffAshowlegend¤modetextxaxisx3textpositionlefty  XAtypescattertextWyaxisy3xffAshowlegend¤modetextxaxisx3textpositionlefty  hAtypescattertextWyaxisy3xffAshowlegend¤modetextxaxisx3textpositionlefty  xAtypescattertextWyaxisy3xffAshowlegend¤modetextxaxisx3textpositionlefty  AtypescattertextWyaxisy3xffAshowlegend¤modetextxaxisx3textpositionlefty  AtypescattertextWyaxisy3xffAshowlegend¤modetextxaxisx3textpositionlefty  AtypescattertextWyaxisy3xffAnbpkginstall_time_ns   Vinstantiatedòinstalled_versionsStatisticsstdlibTransducers0.4.84StatsBase0.34.5DataStructures0.18.22PlutoUI0.7.62RandomstdlibArrow2.7.4SerializationstdlibStaticArrays1.9.13HypertextLiteral0.9.5PlutoPlotly0.4.6terminal_outputsStatisticsA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mTransducersA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mPlutoUIA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mRandomA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mArrowA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mSerializationA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mStatsBaseA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mDataStructuresA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mStaticArraysA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mnbpkg_syncA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mHypertextLiteralA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39mPlutoPlotlyA
[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Fixing stdlib dependencies and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mStrategy failed to run.
[33m[1m│ [22m[39m  exception =
[33m[1m│ [22m[39m   The following package names could not be resolved:
[33m[1m│ [22m[39m    * Statistics (not found in project or manifest)
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:98[39m

[0m[1mResolving...[22m
[90m===[39m
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Updating registries and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Arrow"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StaticArrays"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "StatsBase"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "DataStructures"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "Transducers"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoUI"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "HypertextLiteral"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[36m[1m┌ [22m[39m[36m[1mInfo: [22m[39mChecking
[36m[1m│ [22m[39m  package_name = "PlutoPlotly"
[36m[1m└ [22m[39m  error_str = "Pkg.Resolve.ResolverError(\"Unsatisfiable requirements detected for package Statistics [10745b16]:\\n Statistics [10745b16] log:\\n ├─possible versions are: 1.11.0 - 1.11.1 or uninstalled\\n ├─restricted to versions * by project [34115c3b], leaving only ver"[93m[1m ⋯ 1595 bytes ⋯ [22m[39m" versions: 1.11.0 - 1.11.1\\n │ └─project [34115c3b] log:\\n │   ├─possible versions are: 0.0.0 or uninstalled\\n │   └─project [34115c3b] is fixed to version 0.0.0\\n └─restricted to versions 1.10.0 by an explicit requirement — no versions left\", nothing)"
[33m[1m┌ [22m[39m[33m[1mWarning: [22m[39mPkg operation failed. Removing Manifest.toml file and trying again...
[33m[1m└ [22m[39m[90m@ GracefulPkg ~/.julia/packages/GracefulPkg/iMkQe/src/apply strategies.jl:92[39m

[0m[1mResolving...[22m
[90m===[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Project.toml`
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[9a3f8284] [39m[93m~ Random ⇒ v1.11.0[39m
  [90m[9e88b42a] [39m[93m~ Serialization ⇒ v1.11.0[39m
[32m[1m    Updating[22m[39m `/tmp/jl_0VVRlI/Manifest.toml`
  [90m[6e696c72] [39m[92m+ AbstractPlutoDingetjes v1.3.2[39m
  [90m[7d9f7c33] [39m[92m+ Accessors v0.1.42[39m
  [90m[66dad0bd] [39m[92m+ AliasTables v1.1.3[39m
  [90m[dce04be8] [39m[92m+ ArgCheck v2.5.0[39m
[33m⌅[39m [90m[69666777] [39m[92m+ Arrow v2.7.4[39m
  [90m[31f734f8] [39m[92m+ ArrowTypes v2.3.0[39m
  [90m[198e06fe] [39m[92m+ BangBang v0.4.4[39m
  [90m[18cc8868] [39m[92m+ BaseDirs v1.3.0[39m
  [90m[9718e550] [39m[92m+ Baselet v0.1.1[39m
  [90m[c3b6d118] [39m[92m+ BitIntegers v0.3.5[39m
  [90m[5ba52731] [39m[92m+ CodecLz4 v0.4.6[39m
  [90m[6b39b394] [39m[92m+ CodecZstd v0.8.6[39m
  [90m[35d6a980] [39m[92m+ ColorSchemes v3.29.0[39m
[33m⌅[39m [90m[3da002f7] [39m[92m+ ColorTypes v0.11.5[39m
[32m⌃[39m [90m[c3611d14] [39m[92m+ ColorVectorSpace v0.10.0[39m
[33m⌅[39m [90m[5ae59095] [39m[92m+ Colors v0.12.11[39m
  [90m[34da2185] [39m[92m+ Compat v4.16.0[39m
  [90m[a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
  [90m[f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
  [90m[187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
  [90m[9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
  [90m[864edb3b] [39m[92m+ DataStructures v0.18.22[39m
  [90m[e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
  [90m[244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
  [90m[8bb1440f] [39m[92m+ DelimitedFiles v1.9.1[39m
  [90m[ffbed154] [39m[92m+ DocStringExtensions v0.9.4[39m
  [90m[4e289a0a] [39m[92m+ EnumX v1.0.5[39m
  [90m[e2ba6199] [39m[92m+ ExprTools v0.1.10[39m
  [90m[53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
  [90m[47d2ed2b] [39m[92m+ Hyperscript v0.0.5[39m
  [90m[ac1192a8] [39m[92m+ HypertextLiteral v0.9.5[39m
  [90m[b5f81e59] [39m[92m+ IOCapture v0.2.5[39m
  [90m[22cec73e] [39m[92m+ InitialValues v0.3.1[39m
  [90m[842dd82b] [39m[92m+ InlineStrings v1.4.3[39m
  [90m[3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
  [90m[92d709cd] [39m[92m+ IrrationalConstants v0.2.4[39m
  [90m[82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
  [90m[692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
  [90m[682c06a0] [39m[92m+ JSON v0.21.4[39m
  [90m[b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
  [90m[2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.29[39m
  [90m[6c6e2e6c] [39m[92m+ MIMEs v1.1.0[39m
  [90m[1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
  [90m[128add7d] [39m[92m+ MicroCollections v0.2.0[39m
  [90m[e1d29d7a] [39m[92m+ Missings v1.2.0[39m
  [90m[78c3b35d] [39m[92m+ Mocking v0.8.1[39m
  [90m[bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
  [90m[d96e819e] [39m[92m+ Parameters v0.12.3[39m
  [90m[69de0a69] [39m[92m+ Parsers v2.8.3[39m
  [90m[a03496cd] [39m[92m+ PlotlyBase v0.8.21[39m
[33m⌅[39m [90m[8e989ff0] [39m[92m+ PlutoPlotly v0.4.6[39m
  [90m[7f904dfe] [39m[92m+ PlutoUI v0.7.62[39m
  [90m[2dfb63ee] [39m[92m+ PooledArrays v1.4.3[39m
[33m⌅[39m [90m[aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
  [90m[21216c6a] [39m[92m+ Preferences v1.4.3[39m
  [90m[43287f4e] [39m[92m+ PtrArrays v1.3.0[39m
  [90m[189a3867] [39m[92m+ Reexport v1.2.2[39m
  [90m[ae029012] [39m[92m+ Requires v1.3.1[39m
  [90m[6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
  [90m[91c51154] [39m[92m+ SentinelArrays v1.4.8[39m
  [90m[efcf1570] [39m[92m+ Setfield v1.1.2[39m
  [90m[a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
  [90m[171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
  [90m[90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
  [90m[1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
  [90m[10745b16] [39m[92m+ Statistics v1.11.1[39m
  [90m[82ae8749] [39m[92m+ StatsAPI v1.7.0[39m
  [90m[2913bbd2] [39m[92m+ StatsBase v0.34.5[39m
  [90m[dc5dba14] [39m[92m+ TZJData v1.5.0+2025b[39m
  [90m[3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
  [90m[bd369af6] [39m[92m+ Tables v1.12.0[39m
  [90m[62fd8b95] [39m[92m+ TensorCore v0.1.1[39m
  [90m[f269a46b] [39m[92m+ TimeZones v1.21.3[39m
  [90m[3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
  [90m[28d57a85] [39m[92m+ Transducers v0.4.84[39m
  [90m[410a4b4d] [39m[92m+ Tricks v0.1.10[39m
  [90m[5c2747f8] [39m[92m+ URIs v1.5.2[39m
  [90m[3a884ed6] [39m[92m+ UnPack v1.0.2[39m
  [90m[5ced341a] [39m[92m+ Lz4_jll v1.10.1+0[39m
  [90m[3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
  [90m[0dad84c5] [39m[92m+ ArgTools v1.1.2[39m
  [90m[56f22d72] [39m[92m+ Artifacts v1.11.0[39m
  [90m[2a0f44e3] [39m[92m+ Base64 v1.11.0[39m
  [90m[ade2ca70] [39m[92m+ Dates v1.11.0[39m
  [90m[8ba89e20] [39m[92m+ Distributed v1.11.0[39m
  [90m[f43a241f] [39m[92m+ Downloads v1.6.0[39m
  [90m[7b1f6079] [39m[92m+ FileWatching v1.11.0[39m
  [90m[9fa8497b] [39m[92m+ Future v1.11.0[39m
  [90m[b77e0a4c] [39m[92m+ InteractiveUtils v1.11.0[39m
  [90m[b27032c2] [39m[92m+ LibCURL v0.6.4[39m
  [90m[76f85450] [39m[92m+ LibGit2 v1.11.0[39m
  [90m[8f399da3] [39m[92m+ Libdl v1.11.0[39m
  [90m[37e2e46d] [39m[92m+ LinearAlgebra v1.11.0[39m
  [90m[56ddb016] [39m[92m+ Logging v1.11.0[39m
  [90m[d6f4376e] [39m[92m+ Markdown v1.11.0[39m
  [90m[a63ad114] [39m[92m+ Mmap v1.11.0[39m
  [90m[ca575930] [39m[92m+ NetworkOptions v1.2.0[39m
  [90m[44cfe95a] [39m[92m+ Pkg v1.11.0[39m
  [90m[de0858da] [39m[92m+ Printf v1.11.0[39m
  [90m[3fa0cd96] [39m[92m+ REPL v1.11.0[39m
  [90m[9a3f8284] [39m[92m+ Random v1.11.0[39m
  [90m[ea8e919c] [39m[92m+ SHA v0.7.0[39m
  [90m[9e88b42a] [39m[92m+ Serialization v1.11.0[39m
  [90m[6462fe0b] [39m[92m+ Sockets v1.11.0[39m
  [90m[2f01184e] [39m[92m+ SparseArrays v1.11.0[39m
  [90m[f489334b] [39m[92m+ StyledStrings v1.11.0[39m
  [90m[fa267f1f] [39m[92m+ TOML v1.0.3[39m
  [90m[a4e569a6] [39m[92m+ Tar v1.10.0[39m
  [90m[8dfed614] [39m[92m+ Test v1.11.0[39m
  [90m[cf7118a7] [39m[92m+ UUIDs v1.11.0[39m
  [90m[4ec0a83e] [39m[92m+ Unicode v1.11.0[39m
  [90m[e66e0078] [39m[92m+ CompilerSupportLibraries_jll v1.1.1+0[39m
  [90m[deac9b47] [39m[92m+ LibCURL_jll v8.6.0+0[39m
  [90m[e37daf67] [39m[92m+ LibGit2_jll v1.7.2+0[39m
  [90m[29816b5a] [39m[92m+ LibSSH2_jll v1.11.0+1[39m
  [90m[c8ffd9c3] [39m[92m+ MbedTLS_jll v2.28.6+0[39m
  [90m[14a3606d] [39m[92m+ MozillaCACerts_jll v2023.12.12[39m
  [90m[4536629a] [39m[92m+ OpenBLAS_jll v0.3.27+1[39m
  [90m[bea87d4a] [39m[92m+ SuiteSparse_jll v7.7.0+0[39m
  [90m[83775a58] [39m[92m+ Zlib_jll v1.2.13+1[39m
  [90m[8e850b90] [39m[92m+ libblastrampoline_jll v5.11.0+0[39m
  [90m[8e850ede] [39m[92m+ nghttp2_jll v1.59.0+0[39m
  [90m[3f19e933] [39m[92m+ p7zip_jll v17.4.0+2[39m
[36m[1m        Info[22m[39m Packages marked with [32m⌃[39m and [33m⌅[39m have new versions available. Those with [32m⌃[39m may be upgradable, but those with [33m⌅[39m are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`

[0m[1mInstantiating...[22m
[90m===[39m

[0m[1mPrecompiling...[22m
[90m===[39m
[32m[1m  Activating[22m[39m project at `/tmp/jl_0VVRlI`
[92m[1mPrecompiling[22m[39m project...
  4 dependencies successfully precompiled in 9 seconds. 127 already precompiled.
  [33m1[39m dependency had output during precompilation:[33m
┌ [39mPlutoPlotly[33m
│  [39m┌ Warning: A base directory is being computed during precompilation.[33m
│  [39m│ This is dangerous, as results depend on the live system configuration.[33m
│  [39m│ [33m
│  [39m│ It is recommended that you invoke BaseDirs as required in[33m
│  [39m│ function bodies, rather than at the top level. Calls are very[33m
│  [39m│ cheap, and you can always pass the result of a live call around.[33m
│  [39m│ [33m
│  [39m│ If you have verified that this call was not assigned to a global constant,[33m
│  [39m│ you can silence this warning with `BaseDirs.@promise_no_assign`.[33m
│  [39m└ @ BaseDirs ~/.julia/packages/PlutoPlotly/PecJP/src/local_plotly_library.jl:1[33m
└  [39menabled÷restart_recommended_msgrestart_required_msgbusy_packageswaiting_for_permission,waiting_for_permission_but_probably_disabled«cell_inputs $2fa207dd-749f-4dc0-b4ab-159edf1d9bcecell_id$2fa207dd-749f-4dc0-b4ab-159edf1d9bcecodeپbegin_value_iteration_v(mdp::CompleteMDP{T,S,A}, γ::T; Vinit::T = zero(T), kwargs...) where {T<:Real,S,A} = begin_value_iteration_v(mdp, γ, Vinit .* ones(T, length(mdp.states)); kwargs...)metadatashow_logsèdisabled®skip_as_script«code_folded$e0cc1ca1-595d-44e2-8612-261df9e2d327cell_id$e0cc1ca1-595d-44e2-8612-261df9e2d327codemd"""
> ### *Exercise 8.1* 
> The nonplanning method looks particularly poor in Figure 8.3 because it is a one-step method; a method using multi-step bootstrapping would do better. Do you think one of the multi-step bootstrapping methods from Chapter 7 could do as well as the Dyna method? Explain why or why not.

For the n = 50 agent, it can learn a policy that covers nearly the entire maze during the second episode.  In the extreme case of a multistep method we would attempt to solve the maze using monte carlo sampling in which case after a single episode we would have action/value updates for every state visited along the random trajectory.  However, these action/value estimates would be high variance estimates of the randomly initialized policy.  In contrast, the Dyna method after one random episode has observed most or all of the transitions in the maze.  During the long planning phase its Q updates would actually be able to converge to the optimal policy given a large enough n using bootstrapping and the single reward from reaching the goal.  As long as something is sampled close to the goal that information will propagate through to the rest of the states and each update is simultaneously improving the ϵ-greedy policy.  With multi-step bootstrapping we can extend the updates back along the trajectory a certain distance, but in the extreme case we just sample values from the random policy without any bootstrapping or we bootstrap to a limited degree close to the goal and still have the lack of information further away from it.  Since this environment is deterministic, having the sample transitions is equivalent to having a full model of the environment.  This could be used explicitely with value iteration to obtain the Q function as well.  The planning step is effectively performing this computation but only using the known transitions and over time is focused only on the states visited by the optimal or nearly optimal policy.  No n-step method can take advantage of previously observed transitions this well, but it should be noted that Dyna-Q only works this well if the environment is deterministic and is taking advantage of the fact that we know our model is correct for the transitions already observed.  
"""metadatashow_logsèdisabled®skip_as_script«code_folded$304e6afd-11e0-4011-9929-85889b988400cell_id$304e6afd-11e0-4011-9929-85889b988400codeWstruct MDP_MC{S, A, F<:Function, G<:Function, H<:Function} <: MDP{S, A, F, G, H}
	init_states::Vector{S}
	actions::Vector{A}
	step::F #function that produces reward and updated state given a state action pair
	state_init::G #function that produces an initial state for an episode
	isterm::H #function that returns true if the state input is terminal
	function MDP_MC(init_states::Vector{S}, actions::Vector{A}, step::F, isterm::H) where {S, A, F<:Function, H<:Function}
		state_init() = rand(init_states)
		new{S, A, F, typeof(state_init), H}(init_states, actions, step, state_init, isterm)
	end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07cell_id$96bd8d33-d4e8-45bf-9b75-43e8bda6fa07codefunction make_ϵ_greedy_policy!(v::AbstractVector{T}, ϵ::T; valid_inds = eachindex(v)) where T <: Real
	vmax = maximum(view(v, valid_inds))
	v .= T.(isapprox.(v, vmax))
	s = sum(v)
	c = ϵ / length(valid_inds)
	d = c + (one(T) - ϵ)/s #value to add to actions that are maximizing
	v .= c .+ (v .* d)
	# for i in valid_inds
	# 	if v[i] == 1
	# 		v[i] = d + c
	# 	else
	# 		v[i] = c
	# 	end
	# end
	return v
endmetadatashow_logsèdisabled®skip_as_script«code_folded$3b4e27e7-8065-44b3-bc2a-e540913aa540cell_id$3b4e27e7-8065-44b3-bc2a-e540913aa540codefunction takestep(mdp::FiniteStochasticMDP{T, S, A}, π::Matrix{T}, s) where {T<:Real, S, A}
	i_s = mdp.state_index[s]
	i_a = sample_action(π, i_s)
	ptf = mdp.ptf[(i_a, i_s)]
	probabilities = [ptf[i_s′][1] for i_s′ in keys(ptf)]
	i_s′ = sample(collect(keys(ptf)), weights(probabilities))
	s′ = mdp.states[i_s′]
	r = ptf[i_s′][2]
	a = mdp.actions[i_a]
	return (i_s, i_s′, r, s′, a, i_a)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$6e273f2b-a1af-421f-aca7-772a836b89efcell_id$6e273f2b-a1af-421f-aca7-772a836b89efcodeofunction uniform_bellman_policy_value!(Q::Matrix{T}, π::Matrix{T}, mdp::FiniteStochasticMDP{T, S, A}, γ::T) where {T <: Real, S, A}
	delt = zero(T)
	num_updates = 0
	for i_s in eachindex(mdp.states)
		for i_a in eachindex(mdp.actions)
			delt = max(delt, bellman_policy_update!(Q, π, i_s, i_a, mdp, γ))
			num_updates += 1
		end
	end
	return delt, num_updates
endmetadatashow_logsèdisabled®skip_as_script«code_folded$726af565-8905-4409-864f-a5c1b5767e09cell_id$726af565-8905-4409-864f-a5c1b5767e09code`#forms a random policy for a generic finite state mdp.  The policy is a matrix where the rows represent actions and the columns represent states.  Each column is a probability distribution of actions over that state.
form_random_policy(mdp::CompleteMDP{T, S, A}) where {T, S, A} = ones(T, length(mdp.actions), length(mdp.states)) ./ length(mdp.actions)metadatashow_logsèdisabled®skip_as_script«code_folded$5d2abde0-7128-41c3-bd1f-b6940492d1aecell_id$5d2abde0-7128-41c3-bd1f-b6940492d1aecodefunction double_q_learning(mdp::MDP_TD{S, A, F, G, H}, α::T, γ::T; 
	num_episodes = 1000, 
	qinit = zero(T), 
	ϵinit = one(T)/10, 
	Qinit::Matrix{T} = initialize_state_action_value(mdp; qinit=qinit), 
	decay_ϵ = false, 
	target_policy_function! = (v, ϵ, s) -> make_greedy_policy!(v), 
	behavior_policy_function! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ), 
	πinit_target::Matrix{T} = create_greedy_policy(Qinit), 
	πinit_behavior::Matrix{T} = create_ϵ_greedy_policy(Qinit, ϵinit), 
	save_state::S = first(mdp.states), 
	save_history = false) where {S, A, F, G, H, T<:AbstractFloat} 
	
	double_expected_sarsa(mdp, α, γ; num_episodes = num_episodes, qinit = qinit, ϵinit = ϵinit, Qinit = Qinit, decay_ϵ = decay_ϵ, target_policy_function! = target_policy_function!, behavior_policy_function! = behavior_policy_function!, πinit_target = πinit_target, πinit_behavior = πinit_behavior, save_state = save_state, save_history = save_history)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$76489f21-677e-4c25-beaa-afaf2244cd94cell_id$76489f21-677e-4c25-beaa-afaf2244cd94codeImd"""
#### Figure 8.2

Learning curves for a Dyna-Q agent in the maze
"""metadatashow_logsèdisabled®skip_as_script«code_folded$1127c36f-9bc0-49b1-9481-8a5861bdf6cacell_id$1127c36f-9bc0-49b1-9481-8a5861bdf6cacode	7md"""
> ### *Exercise 8.5*
> How might the tabular Dyna-Q algorithm shown above be modified to handle stochastic environments?  How might this modification perform poorly on changing environments such as considered in this section?  How could the algorithm be modified to handle stochastic environments *and* changing environments?

Instead of storing the most recent transition for a state-action pair, we could store the fraction of the time different transition states and rewards are observed.  That way our model becomes a distribution model using the previously experienced samples as estimates of the true transition probabilities.  Then for the planning updates, we would sample the transition from the model stochastically and perform the same Q update.

If the environment is changing, then the model will take much longer to modify compared to the original version where as soon as a new transition is observed it replaces the previous value.  If we averaging the previously observed transitions and there are many actions, then a new experience would only slightly modify the model even if we use constant step size averaging.  We would therefore expect such a model to react much more slowly to a changing environment.

One solution to speed up model updates could be to use a modified reward such as what is used for Dyna-Q+ in which the time since a state-action pair was selected increases the planning reward update for that transition, but that method assumed that a single visit to the state is adequate to update the model.  In a stochastic environment if we are counting transition to have an estimate of the probabilities for each one, our method would need a way of forgetting transitions that no longer happen.  We could simply keep only data from the most recent n transitions or average with exponential decaying weights such that we give higher weight to more cently observed transitions in the probability distribution.  We may also have to keep track of the time since a specific transitions was seen rather than simply the time a state action pair was attempted, so we'd have $\tau(s, a, s′, r)$ and then the planning Q update could add up or take the maximum of all of the observed transitions from that state.  A state action pair would then be boosted if any one of the possible transitions has not been seen recently.  
"""metadatashow_logsèdisabled®skip_as_script«code_folded$69ff1b72-cb1b-4724-a445-38e4c9846964cell_id$69ff1b72-cb1b-4724-a445-38e4c9846964code>md"""
#### Figure 8.4:

Average performance of Dyna-Q agent on a blocking task.  After 1000 episodes of training the environment is switched to the second version.  The flat portion of the graph shows the agent getting stuck following the old optimal policy and needing many time steps to learn the new environment
"""metadatashow_logsèdisabled®skip_as_script«code_folded$3edc09ab-8fa1-440f-8a45-546898a2b2a3cell_id$3edc09ab-8fa1-440f-8a45-546898a2b2a3code#take a step in the environment from state s using policy π represented by a function that returns an action given a state
function takestep(mdp, π::Function, s)
	a = π(s)
	(r, s′) = mdp.step(s, a)
	return (0, 0, r, s′, a, 0)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$6c8cd429-2c2e-4515-98b2-d0394962e479cell_id$6c8cd429-2c2e-4515-98b2-d0394962e479codeIfunction takestep(mdp::FiniteDeterministicMDP{T, S, A}, π::Matrix{T}, s) where {T<:Real, S, A}
	i_s = mdp.state_index[s]
	i_a = sample_action(π, i_s)
	i_s′ = mdp.state_transition_map[i_a, i_s]
	r = mdp.reward_transition_map[i_a, i_s]
	s′ = mdp.states[i_s′]
	a = mdp.actions[i_a]
	return (i_s, i_s′, r, s′, a, i_a)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$6605b946-3010-47ed-8d88-3c4dca993cf8cell_id$6605b946-3010-47ed-8d88-3c4dca993cf8codebegin_value_iteration_q(mdp::CompleteMDP{T,S,A}, γ::T; Qinit::T = zero(T), kwargs...) where {T<:Real,S,A} = begin_value_iteration_q(mdp, γ, Qinit .* ones(T, length(mdp.actions), length(mdp.states)); kwargs...)metadatashow_logsèdisabled®skip_as_script«code_folded$00c8f62f-dee2-476c-b896-68d3ab57a168cell_id$00c8f62f-dee2-476c-b896-68d3ab57a168codefunction figure_8_8(num_states; expected_updates_max = 20_000, num_samples = 200, blist = [1, 3, 10])
	function get_uniform_value(num_states, b)
		Q = zeros(2, num_states + 1)
		Qref = copy(Q)
		π = copy(Q)
		mdp = make_random_mdp(num_states, b)
		total_updates = 0
		x = Vector{Int64}()
		y = Vector{Float64}()
		while total_updates <= expected_updates_max
			(delt, num_updates) = uniform_bellman_optimal_value!(Q, mdp, 1.0)
			# make_greedy_policy!(π, mdp, Q)
			# q_policy_evaluation!(Qref, π, mdp, 1.0)
			# qval = maximum(Qref[:, 1])
			qval = maximum(Q[:, 1])
			total_updates += num_updates
			push!(x, num_updates)
			push!(y, qval)
		end
		return x, y
	end

	function get_on_policy_value(num_states, b)
		Q = zeros(2, num_states + 1)
		π = copy(Q)
		mdp = make_random_mdp(num_states, b)
		total_updates = 0
		x = Vector{Int64}()
		y = Vector{Float64}()
		while total_updates <= expected_updates_max
			(delt, num_updates) = trajectory_bellman_optimal_value!(Q, π, mdp, 1.0, 0.1, 1, s -> s == 0)
			qval = maximum(Q[:, 1])
			total_updates += num_updates
			push!(x, total_updates)
			push!(y, qval)
		end
		updatecounts = collect(1:num_states*2:expected_updates_max)
		values = [y[min(searchsortedfirst(x, c), length(y))] for c in updatecounts]
		return updatecounts, values
	end
	
	uniform_traces = [begin
		out = 1:num_samples |> Map(_ -> get_uniform_value(num_states, b)) |> foldxt((x, y) -> ((x[1] .+ y[1]), (x[2] .+ y[2])))
		trace = scatter(x = [0; cumsum(out[1] ./ num_samples)], y = [0; out[2] ./ num_samples], name = "b = $b, uniform")
	end
	for b in blist]

	on_policy_traces = [begin
		out = 1:num_samples |> Map(_ -> get_on_policy_value(num_states, b)) |> foldxt((x, y) -> ((x[1] .+ y[1]), (x[2] .+ y[2])))
		trace = scatter(x = [0; out[1] ./ num_samples], y = [0; out[2] ./ num_samples], name = "b = $b, on-policy")
	end
	for b in blist]
	
	plot([uniform_traces; on_policy_traces], Layout(xaxis_title = "Computation time, in expected updates", yaxis_title = "Value of start state under greedy policy"))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$4d4baa61-b5bd-4bcf-a491-9a35a1695f0bcell_id$4d4baa61-b5bd-4bcf-a491-9a35a1695f0bcodefigure8_3(num_episodes_8_3)metadatashow_logsèdisabled®skip_as_script«code_folded$cd79ce14-14a1-43c6-93e0-b4a786f7f9fbcell_id$cd79ce14-14a1-43c6-93e0-b4a786f7f9fbcode$md"""
Because planning proceeds incrementally, it is trivial to intermix planning and acting.  So the learning from the model can inform the interaction with the environment in parallel and then any information from the environment can be used to update the model whenever it is received.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$516234a8-2748-11ed-35df-432eebaa5162cell_id$516234a8-2748-11ed-35df-432eebaa5162codesmd"""
# Chapter 8 - Planning and Learning with Tabular Methods

So far we have seen example problems where we have a full model of the environment in the form of the probability transition function as well as environments where we can only sample trajectories.  In this chapter we will integrate the techniques that are *model-based* and *model-free* and show how they can be intermixed.

## 8.1 Models and Planning

A *model* is anything that an agent can use to predict the environment.  If the model provides a full description of all possible transitions it is called a *distribution model* vs a *sample model* that can only generate one of those possibilities according to the correct probability distribution.  In dynamic programming, we used a distribution model while for certain example problems such as blackjack we only had a sample model.

A model can be used the create a *simulated experience* of the environment such as a trajectory.  The common thread across all the techniques is the computation of the value function to improve a policy and using some update process to compute the value function for example from the data collected in simulated experience.  For the learning methods considered so far, we have assumed that the data collected from trajectories is generated by the environment itself while in planning methods this experience would come instead from a model.  However the learning techniques largely still apply to planning techniques as well since the nature of the data is the same.  Consider a planning method analogous to Q-learning called *random-sample one-step tabular Q-planning*.  This technique applies the Q-learning update to a transition sapmled from a model.  Instead of interacting with the environment in an episode or continuing task, this technique simply selects a state action pair at random and observes the transition.  Just like with Q-learning, this method converges to the optimal policy under the assumption that all state-action pairs are visited an infinite number of times but the policy will only be optimal for the model of the environment.

Performing updates on single transitions highlights another theme of planning methods which don't necessarily involve exaustive solutions to the whole environment.  We can direct the method to specific states of interest which may be important for problems with very large state spaces.

## 8.2 Dyna: Integrated Planning, Acting, and Learning

A planning agent can use real experience in at least two ways: 1) it can be used to improve the model to make it a better match for the real environment (*model-learning*) and 2) it can be used directly to improve the value function using the previous learning methods (*direct reinforcement learning*).  If a better model is then used to improve the value function this is also called *indirect reinforcement learning*.  

Indirect methods can make better use of a limited amount of experience, but direct methods are much simpler and are not affected by the biases in the design of the model.  Dyna-Q includes all the processes of planning, acting, model-learning, and direct RL.  The planning method is the random-sample one-step tabular Q-planning described above.  The direct RL method is one-step tabular Q-learning.  The model-learning mdethod is also table-based and assumes the environment is deterministic.  After each transition $S_t,A_t \longrightarrow R_{t+1},S_{t+1}$, the model records in its table entry for $S_t,A_t$ the prediction that $R_{t+1},S_{t+1}$ will deterministically follow.  Thus if the model is queried with a state-action pair that has been experienced before, it simply returns the last-observed next state and next reward as its prediction.

During planning, the Q-planning algorithm randomly samples only from state-action pairs that have previously been experienced, so the model is never queried with a pair about which it has no information.  The learning and planning portions of the algorithm are connected in that they use the same type of update.  The only difference is the source of the experience used.

The collection of real experience and planning could occur simultaneously in these agents, but for a serial implementation it is assumed that the acting, model-learning, and direct RL processes are very fast while the planning process is the model computation-intensive.  Let us assume that after each step of acting, model-learning, and direct RL there is time for $n$ iterations of the Q-planning algorithm.  Without the model update and the $n$ loop planning step, this algorithm is identical to one-step tabular Q-learning.  An example implementation is below along with an example applying it to a maze environment.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$bf7950f2-05fa-4455-ad08-27735148d95ccell_id$bf7950f2-05fa-4455-ad08-27735148d95ccode	e#perform action selection within an mdp for a given state s, discount factor γ, and state value estimation function v_est.  v_est must be a function that takes the arguments (mdp, s, γ) and produces a reward of the same type as γ
function monte_carlo_tree_search(mdp::AfterstateMDP_MC{S, AS, A, F, G, H, I}, γ::T, v_est::Function, s::S; 
	depth = 10, 
	nsims = 100, 
	c = one(T), 
	tree_values = Dict{S, Tuple{T, Dict{Int64, Tuple{T, T}}}}(),
	update_tree_policy! = (v, s) -> make_greedy_policy!(v), 
	v_hold = zeros(T, length(mdp.actions)),
	update_tree! = function(tree_values, v::T, s::S, i_a::Integer)
		d = tree_values[s][2]
		new_value = if haskey(d, i_a)
			(d[i_a][1]+1, d[i_a][2]+v)
		else
			(1f0, v)
		end
		tree_values[s][2][i_a] = new_value
	end,
	apply_bonus! = apply_uct!,
	make_step_kwargs = k -> NamedTuple(), #option to create mdp afterstate step arguments that depend on the simulation number
	make_transition_kwargs = k -> NamedTuple(), #option to create mdp afterstate transition arguments that depend on the simulation number
	make_est_kwargs = k -> NamedTuple(), #option to create state estimation arguments that depend on the simulation number
	sim_message = false
	) where {S, AS, A, F, G, H, I, T<:Real}

	q_hold = zeros(T, length(mdp.actions))
	#I want to have a way of possible a kwargs such as the answer index to the simulator that can change with each simulation
	t = time()
	last_time = t
	for k in 1:nsims
		seed = rand(UInt64)
		if sim_message
			elapsed = time() - last_time
			if elapsed > 5
				last_time = time()
				pct_done = k/nsims
				total_time = time() - t
				ett = total_time / pct_done
				eta = ett - total_time
				@info """Completed simulation $k of $nsims after $(round(Int64, total_time/60)) minutes
				ETA: $(round(Int64, eta/60)) minutes"""
			end
		end
		simulate!(s, true, tree_values, mdp, γ, v_est, depth, c, v_hold, update_tree_policy!, update_tree!, q_hold, apply_bonus!, make_step_kwargs(seed), make_transition_kwargs(seed), make_est_kwargs(seed))
	end

	minv = minimum(t[2]/t[1] for t in values(tree_values[s][2]))
	for i in eachindex(v_hold)
		if haskey(tree_values[s][2], i)
			v_hold[i] = tree_values[s][2][i][2] / tree_values[s][2][i][1]
		else
			v_hold[i] = minv
		end
	end
	make_greedy_policy!(v_hold)
	if sim_message
		@info "Finished MCTS evaluation of state $s"
	end
	return mdp.actions[sample_action(v_hold)], tree_values
endmetadatashow_logsèdisabled®skip_as_script«code_folded$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27cell_id$4d1f0065-e5ab-46fa-8ab1-a0bbcf523c27codeDfigure_8_4(;ntrials = 10, ϵ = 0.1f0, α = 0.8f0, fig_8_4_params...)metadatashow_logsèdisabled®skip_as_script«code_folded$47ce2eda-b2c4-4f81-8d91-955bc35bab49cell_id$47ce2eda-b2c4-4f81-8d91-955bc35bab49codebegin
	struct AfterstateMDP_MC{S, AS, A, F<:Function, G<:Function, H<:Function, I<:Function}
		init_states::Vector{S}
		init_afterstates::Dict{Tuple{S, A}, AS}
		actions::Vector{A}
		afterstate_step::F #deterministic function that produces a reward and afterstate given a state action pair
		afterstate_transition::G #stochastic function that preduces a probability distribution of reward, state pairs given an afterstate
		state_init::H #function that produces an initial state for an episode
		isterm::I #function that returns true if the state input is terminal
		action_index::Dict{A, Int64}
		function AfterstateMDP_MC(init_states::Vector{S}, actions::Vector{A}, afterstate_step::F, afterstate_transition::G, isterm::I) where {S, A, F<:Function, G<:Function, I<:Function}
			state_init() = rand(init_states)
			init_afterstates = Dict((s, a) => afterstate_step(s, a)[2] for a in actions for s in init_states)
			action_index = makelookup(actions)
			new{S, typeof(init_afterstates[first(init_states), first(actions)]), A, F, G, typeof(state_init), I}(init_states, init_afterstates, actions, afterstate_step, afterstate_transition, state_init, isterm, action_index)
		end	
	end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$679b6096-b3ca-422d-9d9a-225832510ab1cell_id$679b6096-b3ca-422d-9d9a-225832510ab1code(make_ϵ_greedy_policy!(vholdtest, 0.1f0)metadatashow_logsèdisabled®skip_as_script«code_folded$d5ac7c6f-9636-46d9-806f-34d6c8e4d4d5cell_id$d5ac7c6f-9636-46d9-806f-34d6c8e4d4d5codemd"""
Consider the simple maze shown above where the agent can take four actions which take it deterministically into the neighboring square unless it is blocked by a wall represented by a W in the diagram.  In this case the agent remains in its original state.  Reward is zero on all transitions except those into the goal state, on which it is +1.  After reaching the goal the agent returns to the start to begin a new episode.  This is a discounted episodic task with $\gamma = 0.95$
"""metadatashow_logsèdisabled®skip_as_script«code_folded$aee1f6a8-de43-402e-b375-86c0f2f9e6b8cell_id$aee1f6a8-de43-402e-b375-86c0f2f9e6b8codewfunction figure_8_5′(; max_steps1 = 3000, max_steps2 = 3000, ntrials = 10, n = 50, α = 0.5f0, ϵ = 0.2f0, κ = 0.001f0)
	x = 1:(max_steps1 + max_steps2)
	function test_algo(f)
		y = zeros(max_steps1 + max_steps2)
		for _ in 1:ntrials
			(Q, steps, rewards, history, stm, rtm) = f(blocking_maze2, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps1, n = n)
			(Q2, steps2, rewards2, _, _) = f(blocking_maze3, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps2, n = n, Qinit = Q, history = history, state_transition_map = stm, reward_transition_map = rtm, init_step = max_steps1)

			y .+= cumsum([rewards; rewards2])
		end
		return x, y
	end

	(x1, y1) = test_algo(tabular_dynaQ)
	(x2, y2) = test_algo((args...; kwargs...) -> tabular_dynaQplus(args...; κ = κ, kwargs...))
	
	plot([scatter(x = x, y = y1 ./ ntrials, name = "Dyna-Q"), scatter(x = x, y = y2 ./ ntrials, name = "Dyna-Q+")])
endmetadatashow_logsèdisabled®skip_as_script«code_folded$a3243bc4-7ae7-418a-9881-a265ca95f5efcell_id$a3243bc4-7ae7-418a-9881-a265ca95f5efcode%md"""
## 8.4 Prioritized Sweeping
"""metadatashow_logsèdisabled®skip_as_script«code_folded$466268c4-664d-42dd-84c1-7b8ade49936fcell_id$466268c4-664d-42dd-84c1-7b8ade49936fcodemd"""
For each maze there is an optimal path that scales up with the size.  The plot below compares prioritized sweeping with Dyna-Q where each method can make at most 5 planning updates.  The number of updates until an optimal path is found is computed for different size mazes.  The number of updates required for prioritied sweeping is dramatically lower by tens or hundreds of times depending on the size of the maze.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96cell_id$f9cdd5a8-3a9b-4be4-9a33-bb0047ac4a96codeٱ#create a function that performs a rollout given an mdp, starting state, and discount rate
rollout(;max_steps = Inf) = (mdp, s, γ) -> rollout(mdp, s, γ; max_steps = max_steps)metadatashow_logsèdisabled®skip_as_script«code_folded$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8cell_id$6612f482-2f10-43fa-9b7b-2f0c6a94b8e8codeXrunepisode(mdp::MDP_TD; kwargs...) = runepisode(mdp, make_random_policy(mdp); kwargs...)metadatashow_logsèdisabled®skip_as_script«code_folded$f424edac-388d-4465-900f-9459d2a88f79cell_id$f424edac-388d-4465-900f-9459d2a88f79codeZ#take a step in the environment from state s using policy π and generate the subsequent action selection as well
function init_step(mdp::MDP_TD{S, A, F, G, H}, π::Matrix{T}, s::S) where {S, A, F<:Function, G<:Function, H<:Function, T<:Real}
	i_s = mdp.statelookup[s]
	i_a = sample_action(π, i_s)
	a = mdp.actions[i_a]
	return (i_s, i_a, a)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$08e81e30-119d-4f4e-a865-f1f85cbffd31cell_id$08e81e30-119d-4f4e-a865-f1f85cbffd31codemd"""
For many tasks the state space is too large to be solved effectively without prioritization.  That being said, there are multiple methods of prioritizing states such as looking forward from states that are being visited frequently by the policy.  

Prioritized sweeping also makes use of expected updates to update the priority queue (sweeping through model state action pairs) which could be very costly in environments with large numbers of actions.  Also in stochastic environments, our model may not even be accurate for some low probability transitions which would be a waste to consider.  An alternative is to use sample updates which are higher variance individually, but may win out in terms of rate of convergence per computation in environments with high stochasticity and large branching.  In the next sections, we more closely examine the value of expected and sample updates.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$898f1b06-a34f-496b-99db-9ca23498cbeecell_id$898f1b06-a34f-496b-99db-9ca23498cbeecodefunction prioritized_sweeping_deterministic(mdp::MDP_TD{S, A, F, G, H}, α::T, γ::T; 
	num_episodes = 1000, max_steps = 10000, n = 100, qinit = zero(T), ϵinit = one(T)/10, 
	Qinit = initialize_state_action_value(mdp; qinit=qinit), πinit = create_ϵ_greedy_policy(Qinit, ϵinit), 
	decay_ϵ = false, history_state::S = first(mdp.states), 
	save_history = false, update_policy! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ), 
	history = zeros(Int64, length(mdp.actions), length(mdp.states)),
	#each column contains the index of the state reached from the state represented by the column index while taking the action represented by the row index.  the values are initialized at 0 which represents a transition that has not occured
	state_transition_map = zeros(Int64, length(mdp.actions), length(mdp.states)),
	#each column contains the reward received from the state represented by the column index while taking the action represented by the row index.  the state_transition_map can be used to determine if any of these values have been updated from the zero initialization
	reward_transition_map = zeros(T, length(mdp.actions), length(mdp.states)),
	θ = one(T)/100,
	init_step = 0,
	isoptimal = l -> false) where {S, A, F, G, H, T<:AbstractFloat}

	π = copy(πinit)
	Q = copy(Qinit)
	ϵ = ϵinit
	terminds = findall(mdp.isterm(s) for s in mdp.states)
	Q[:, terminds] .= zero(T)
	num_updates = 0
	
	vhold = zeros(T, length(mdp.actions))
	#keep track of rewards per step and steps per episode
	rewards = zeros(T, max_steps)
	steps = zeros(Int64, num_episodes)

	#maintains a queue of state action pairs ranked by their priority with the largest value first
	priority_queue = PriorityQueue{Tuple{Int64, Int64}, T}(Base.Order.Reverse)

	function updateQ!(Q, i_s, i_a, i_s′, r)
		qmax = calculate_qmax(Q, i_s′)
		Q[i_a, i_s] += α*(r + γ*qmax - Q[i_a, i_s])
		num_updates += 1
	end

	calculate_priority(r, qmax, i_s, i_a) = abs(r + γ*qmax - Q[i_a, i_s])
	calculate_qmax(Q, i_s) = maximum(Q[i, i_s] for i in eachindex(mdp.actions))

	function q_planning!(Q, queue)
		step = 1
		while (step <= n) && !isempty(queue)
			(i_a, i_s) = first(keys(queue))
			delete!(queue, (i_a, i_s))
			i_s′ = state_transition_map[i_a, i_s]
			r = reward_transition_map[i_a, i_s]
			updateQ!(Q, i_s, i_a, i_s′, r)
			#loop for all state action pairs that the model predicts will lead to s
			qmax = calculate_qmax(Q, i_s)
			for i_s̄ in eachindex(mdp.states)
				for i_ā in eachindex(mdp.actions)
					if state_transition_map[i_ā, i_s̄] == i_s
						r̄ = reward_transition_map[i_ā, i_s̄]
						p = calculate_priority(r̄, qmax, i_s̄, i_ā)
						if p > θ
							priority_queue[(i_ā, i_s̄)] = p
						end
					end
				end
			end
			step += 1
		end
	end

	step = 1
	ep = 1
	optimal_path = false
	while (ep <= num_episodes) && (step <= max_steps) && !optimal_path
		s = mdp.state_init()
		l = 0
		
		while !mdp.isterm(s) && step <= max_steps
			#take policy action based on Q
			(i_s, i_s′, r, s′, a, i_a) = takestep(mdp, π, s)

			#replace model value with observed transition
			state_transition_map[i_a, i_s] = i_s′
			reward_transition_map[i_a, i_s] = r

			#calculate expected update from previous Q value
			p = calculate_priority(r, calculate_qmax(Q, i_s′), i_s, i_a)
			if p > θ
				priority_queue[(i_a, i_s)] = p
			end
			
			rewards[step] = r
			q_planning!(Q, priority_queue)
			step += 1
			s = s′
			
			#update policy for next state action selection
			vhold .= Q[:, i_s′]
			update_policy!(vhold, ϵ, s′)
			π[:, i_s′] .= vhold
			l += 1
		end
		steps[ep] = l
		optimal_path = isoptimal(l)
		
		ep += 1
	end
	return Q, steps, rewards, state_transition_map, reward_transition_map, num_updates
endmetadatashow_logsèdisabled®skip_as_script«code_folded$08ff749b-f4ff-4639-99f5-48262aa4643ecell_id$08ff749b-f4ff-4639-99f5-48262aa4643ecode)md"""
In the Dyna agents simulated transitions are started in the state-actino pairs selected uniformly at random from all previously experienced pairs, but a uniform selection is usually not the best.  Planning can be much more efficient if updates are focused on particular state-action pairs.  In particular if an environment has goal states such as the maze, then one-step TD updates will only be relevant along the trajectory leading to that goal.  Not all environments have goal states, but the idea still applies to cases where only certain states are expected to be updated given a certain amount of data from environment interactions.  We can therefore work *backward* from states we know will be updated to consider all of the relevant predecessor states.  Using *prioritized sweeping*, we maintain a queue of every state-action pair whose estimated value would change nontrivially if updated, prioritized by the size of the change.  When the top pair in the queue is updated, the effect on each of its predecessor pairs is computed.  If the effect is greater than some small threshold, then the pair is inserted int the queue with a new priority.  In this way the effects of changes are efficiently backpropagated backward until quienscence.  A full implementation of priorized sweeping can be found below.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$245d9616-e0d2-497e-bfdd-4729a7215bfdcell_id$245d9616-e0d2-497e-bfdd-4729a7215bfdcodemd"""
The maze task is a horrible candidate for MCTS because it is solved so effectively with the other techniques that build accurate action value estimates for the entire maze.  It is very likely that states will be revisited in this task as well and that information is useful to solve the problem.  MCTS would be most useful for problems where we cannot even know the full state space and states are never seen again in the course of a single episode as well as for tasks whose episodes don't last very long.  Blackjack might be a good example of this since the number of steps is usually one or two.  Another example could be tic-tac-toe.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$e8a6e672-b860-404f-83c1-62a080f23112cell_id$e8a6e672-b860-404f-83c1-62a080f23112codemd"""
### Figure 8.8
"""metadatashow_logsèdisabled®skip_as_script«code_folded$39ae7727-ea72-48f3-8d63-e03a9f607f87cell_id$39ae7727-ea72-48f3-8d63-e03a9f607f87codefunction make_dyna_maze(scale)
	scale_value(v) = ceil(Int64, v*scale)
	xmax = scale_value(9)
	ymax = scale_value(6)
	sterm = GridworldState(xmax, ymax)
	wall1 = Set(GridworldState(scale_value(3), y) for y in scale_value(3):scale_value(5))
	wall2 = Set([GridworldState(scale_value(6), scale_value(3) - 1)])
	wall3 = Set(GridworldState(xmax - 1, y) for y in scale_value(4):ymax)
	walls = union(wall1, wall2, wall3)
	iswall(s) = in(s, walls)
	start = GridworldState(1, scale_value(4))
	optimal_length = xmax - 1 + (ymax - scale_value(3) + 1) + start.y - scale_value(3) + 1
	(maze = make_gridworld(;start = start, xmax=xmax, ymax=ymax, sterm = sterm, iswall = iswall), iswall = iswall, optimal_length = optimal_length)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056cell_id$fad6e3b9-6d6e-4ea0-ac3d-5e57374c7056code#if no policy is provided then the rollout will use a uniformly random policy
rollout(mdp::MDP{S, A, F, G, H}, s::S, γ::T; max_steps = Inf) where {S, A, F, G, H, T<:Real} = rollout(mdp, s, s -> rand(mdp.actions), γ; max_steps = max_steps)metadatashow_logsèdisabled®skip_as_script«code_folded$d0b18699-7d3a-418d-9d15-be41f1643f09cell_id$d0b18699-7d3a-418d-9d15-be41f1643f09codefunction trajectory_bellman_optimal_value!(Q::Matrix{T}, π::Matrix{T}, mdp::FiniteStochasticMDP{T, S, A}, γ::T, ϵ::T, s0::S, isterm::Function) where {T <: Real, S, A}
	delt = zero(T)
	num_updates = 0
	s = s0
	i_s = mdp.state_index[s]
	make_ϵ_greedy_policy!(π, mdp, Q, ϵ, i_s)
	while !isterm(s)
		(i_s, i_s′, r, s′, a, i_a) = takestep(mdp, π, s)
		delt = max(delt, bellman_optimal_update!(Q, i_s, i_a, mdp, γ))
		make_ϵ_greedy_policy!(π, mdp, Q, ϵ, i_s′)
		num_updates += 1
		s = s′
	end
	return delt, num_updates
endmetadatashow_logsèdisabled®skip_as_script«code_folded$cd1980ff-2f35-4599-b08c-2037ddf5e995cell_id$cd1980ff-2f35-4599-b08c-2037ddf5e995codefunction figure_8_4′′(; max_steps1 = 1000, max_steps2 = 2000, ntrials = 10, n = 10, α = 0.1f0, ϵ = 0.1f0, κ = 0.01f0)
	x = 1:(max_steps1 + max_steps2)
	function test_algo(f)
		y = zeros(max_steps1 + max_steps2)
		for _ in 1:ntrials
			(Q, steps, rewards, history, stm, rtm) = f(blocking_maze1, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps1, n = n)
			(Q2, steps2, rewards2, _, _) = f(blocking_maze2, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps2, n = n, Qinit = Q, history = history, state_transition_map = stm, reward_transition_map = rtm, init_step = max_steps1)

			y .+= cumsum([rewards; rewards2])
		end
		return x, y
	end

	(x1, y1) = test_algo((args...; kwargs...) -> tabular_dynaQplus(args...; κ = κ, kwargs...))
	(x2, y2) = test_algo((args...; kwargs...) -> tabular_dynaQplus′(args...; κ = κ, kwargs...))
	
	plot([scatter(x = x, y = y1 ./ ntrials, name = "Dyna-Q+"), scatter(x = x, y = y2 ./ ntrials, name = "Dyna-Q+′")])
endmetadatashow_logsèdisabled®skip_as_script«code_folded$c32d0943-ba8f-438f-83b6-5ed42221f630cell_id$c32d0943-ba8f-438f-83b6-5ed42221f630codefunction figure_8_5′′(; max_steps1 = 3000, max_steps2 = 3000, ntrials = 10, n = 50, α = 0.5f0, ϵ = 0.2f0, κ = 0.001f0)
	x = 1:(max_steps1 + max_steps2)
	function test_algo(f)
		y = zeros(max_steps1 + max_steps2)
		for _ in 1:ntrials
			(Q, steps, rewards, history, stm, rtm) = f(blocking_maze2, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps1, n = n)
			(Q2, steps2, rewards2, _, _) = f(blocking_maze3, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps2, n = n, Qinit = Q, history = history, state_transition_map = stm, reward_transition_map = rtm, init_step = max_steps1)

			y .+= cumsum([rewards; rewards2])
		end
		return x, y
	end

	(x1, y1) = test_algo((args...; kwargs...) -> tabular_dynaQplus(args...; κ = κ, kwargs...))
	(x2, y2) = test_algo((args...; kwargs...) -> tabular_dynaQplus′(args...; κ = κ, kwargs...))
	
	plot([scatter(x = x, y = y1 ./ ntrials, name = "Dyna-Q+"), scatter(x = x, y = y2 ./ ntrials, name = "Dyna-Q+′")])
endmetadatashow_logsèdisabled®skip_as_script«code_folded$fc137613-7b4b-414c-93af-eeb2ace5d67fcell_id$fc137613-7b4b-414c-93af-eeb2ace5d67fcodefunction make_ϵ_greedy_policy!(π::Matrix{T}, mdp::FiniteStochasticMDP{T, S, A}, Q::Matrix{T}, ϵ::T, i_s::Int64) where {T<:Real,S,A}
	n = length(mdp.actions)
	maxq = -Inf
	for i_a in eachindex(mdp.actions)
		π[i_a, i_s] = Q[i_a, i_s]
		maxq = max(maxq, Q[i_a, i_s])
	end
	π[:, i_s] .= (π[:, i_s] .≈ maxq)
	π[:, i_s] ./= (sum(π[:, i_s]) / (one(T) - ϵ))
	π[:, i_s] .+= ϵ / n
	if isnan(π[1, i_s])
		@info "Q = $(Q[:, i_s]), maxq = $maxq"
	end
	return π
endmetadatashow_logsèdisabled®skip_as_script«code_folded$cffc9f11-77d7-4076-aa3b-821f1c741f58cell_id$cffc9f11-77d7-4076-aa3b-821f1c741f58codeٗuct(tree_values::Dict{S, Tuple{T, Dict{Int64, Tuple{T, T}}}}, s::S, i_a::Int64, ntot::T) where {S, T<:Real} = sqrt(log(ntot)/tree_values[s][2][i_a][1])metadatashow_logsèdisabled®skip_as_script«code_folded$4b424a47-dfeb-4380-8ab8-8bd24a080c2ecell_id$4b424a47-dfeb-4380-8ab8-8bd24a080c2ecodebegin
	newmaze = make_dyna_maze(2)
	newmaze2 = make_dyna_maze(3)
	[plot_path(dyna_maze; iswall = s -> in(s, maze_walls)) plot_path(newmaze.maze; iswall = newmaze.iswall) plot_path(newmaze2.maze; iswall = newmaze2.iswall)]
endmetadatashow_logsèdisabled®skip_as_script«code_folded$0f37ec0a-b737-478b-bf6a-027899250c4ecell_id$0f37ec0a-b737-478b-bf6a-027899250c4ecode#take a step in the environment from state s using policy π and generate the subsequent action selection as well
function sarsa_step(mdp::MDP_TD{S, A, F, G, H}, π::Matrix{T}, s::S, a::A) where {S, A, F<:Function, G<:Function, H<:Function, T<:Real}
	(r, s′) = mdp.step(s, a)
	i_s′ = mdp.statelookup[s′]
	i_a′ = sample_action(π, i_s′)
	a′ = mdp.actions[i_a′]
	return (s′, i_s′, r, a′, i_a′)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8dbc76fd-ac73-47ca-983e-0e90023390e3cell_id$8dbc76fd-ac73-47ca-983e-0e90023390e3codefigure8_2()metadatashow_logsèdisabled®skip_as_script«code_folded$e4f73889-af82-4304-89d5-ee50172eb3dacell_id$e4f73889-af82-4304-89d5-ee50172eb3dacodeFfunction make_greedy_policy!(π::Matrix{T}, mdp::FiniteStochasticMDP{T, S, A}, Q::Matrix{T}) where {T<:Real,S,A}
	for i_s in eachindex(mdp.states)
		maxq = -Inf
		for i_a in eachindex(mdp.actions)
			maxq = max(maxq, Q[i_a, i_s])
		end
		π[:, i_s] .= (Q[:, i_s] .≈ maxq)
		π[:, i_s] ./= sum(π[:, i_s])
	end
	return π
endmetadatashow_logsèdisabled®skip_as_script«code_folded$636d768c-670d-4485-a1dd-2bab6cf086d0cell_id$636d768c-670d-4485-a1dd-2bab6cf086d0codefunction make_random_mdp(num_states, b)
 	states = collect(1:num_states)
	actions = [1, 2]
	next_states = [rand(states, b) for _ in 1:num_states*2]

	rterm = randn()
	ptf = Dict((i_a, i_s) => Dict(zip([num_states+1; next_states[i_s*i_a]], zip([0.1; fill((1-0.1)/b, b)], [rterm; randn(b)]))) for i_s in eachindex(states) for i_a in eachindex(actions))

	#all transitions from terminal state lead to terminal state
	ptf[(1, num_states + 1)] = Dict([num_states+1 => (1., 0.0)])
	ptf[(2, num_states + 1)] = Dict([num_states+1 => (1., 0.0)])
	
	# function step(s, a)
	# 	r = randn()
	# 	rand() <= 0.1 && return (r, 0)
		
	# 	#each action result in one of b next states all equally likely with a different random selection of b states for each state-action pair
	# 	s′ = rand(next_states[s*a])
	# 	return (r, s′)
	# end
 
	# MDP_TD([states; 0], actions, () -> 1, step, s -> s == 0)
	FiniteStochasticMDP([states; 0], actions, ptf)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$cd139745-1877-43a2-97a0-3333e544cbd8cell_id$cd139745-1877-43a2-97a0-3333e544cbd8codefunction figure8_2(;num_episodes = 50, α = 0.1f0, nlist = [0, 5, 50], γ = 0.95f0, samples = 5)
	traces = [begin
		step_avg = zeros(Int64, num_episodes)
		for s in 1:samples
			Random.seed!(s)
			(Q, steps, rewards, _, _) = tabular_dynaQ(dyna_maze, α, γ; num_episodes = num_episodes, n = n)
			step_avg .+= steps
		end
		scatter(x = 2:num_episodes, y = step_avg[2:end] ./ samples, name = "$n planning steps")
	end
	for n in nlist]
	plot(traces, Layout(xaxis_title = "Episodes", yaxis_title = "Steps per episode"))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6cell_id$ffdd925e-b2b4-4cb1-9d6f-b8c9397729f6codefunction q_policy_evaluation!(Q::Matrix{T}, π::Matrix{T}, mdp::FiniteStochasticMDP{T, S, A}, γ::T; max_updates = typemax(Int64), θ = eps(zero(T))) where {T <: Real, S, A}
	delt, num_updates = uniform_bellman_policy_value!(Q, π, mdp, γ)
	total_updates = num_updates
	while (delt > θ) && (total_updates <= max_updates)
		delt, num_updates = uniform_bellman_policy_value!(Q, π, mdp, γ)
		total_updates += num_updates
	end
	return Q
endmetadatashow_logsèdisabled®skip_as_script«code_folded$f369a092-420d-4660-b802-93f05d5e7972cell_id$f369a092-420d-4660-b802-93f05d5e7972code
function apply_uct!(v_hold::Vector{T}, tree_values::Dict{S, Tuple{T, Dict{Int64, Tuple{T, T}}}}, s::S, c::T) where {S, T<:Real}
	#for normal UCB selection, unvisited states have an infinite bonus
	v_hold .= T(Inf)

	d = tree_values[s][2]
	isempty(d) && return v_hold
	ntot = sum(t[1] for t in values(d))
	@inbounds @fastmath for i in keys(d)
		#note that the only bonus values computed here are for actions that have been visited
		v_hold[i] = (d[i][2] / d[i][1]) + c * uct(tree_values, s, i, ntot)
	end
	return v_hold
endmetadatashow_logsèdisabled®skip_as_script«code_folded$1d97325a-8b9a-438d-a5f9-e17638e64627cell_id$1d97325a-8b9a-438d-a5f9-e17638e64627codesinitialize_state_value(mdp::MDP_TD; vinit::T = 0.0f0) where T<:AbstractFloat = ones(T, length(mdp.states)) .* vinitmetadatashow_logsèdisabled®skip_as_script«code_folded$113d2bc2-1f77-479f-86e5-a65b20672d7acell_id$113d2bc2-1f77-479f-86e5-a65b20672d7acode
 function double_expected_sarsa(mdp::MDP_TD{S, A, F, G, H}, α::T, γ::T; num_episodes = 1000, qinit = zero(T), ϵinit = one(T)/10, Qinit::Matrix{T} = initialize_state_action_value(mdp; qinit=qinit), decay_ϵ = false, target_policy_function! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ), behavior_policy_function! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ), πinit_target::Matrix{T} = create_ϵ_greedy_policy(Qinit, ϵinit), πinit_behavior::Matrix{T} = create_ϵ_greedy_policy(Qinit, ϵinit), save_state::S = first(mdp.states), save_history = false) where {S, A, F, G, H, T<:AbstractFloat}
	terminds = findall(mdp.isterm(s) for s in mdp.states)
	
	Q1 = copy(Qinit)
	Q2 = copy(Qinit) 
	Q1[:, terminds] .= zero(T)
	Q2[:, terminds] .= zero(T)
	π_target1 = copy(πinit_target)
	π_target2 = copy(πinit_target)
	π_behavior = copy(πinit_behavior)
	vhold1 = zeros(T, length(mdp.actions))
	vhold2 = zeros(T, length(mdp.actions))
	vhold3 = zeros(T, length(mdp.actions))
	#keep track of rewards and steps per episode as a proxy for training speed
	rewards = zeros(T, num_episodes)
	steps = zeros(Int64, num_episodes)

	if save_history
		action_history = Vector{A}(undef, num_episodes)
	end
	
	for ep in 1:num_episodes
		ϵ = decay_ϵ ? ϵinit/ep : ϵinit
		s = mdp.state_init()
		rtot = zero(T)
		l = 0
		while !mdp.isterm(s)
			
			(i_s, i_s′, r, s′, a, i_a) = takestep(mdp, π_behavior, s)
			if save_history && (s == save_state)
				action_history[ep] = a
			end
			
			# q_expected = sum(π_target[i, i_s′]*(Q1[i, i_s′]*toggle + Q2[i, i_s′]*(1-toggle)) for i in eachindex(mdp.actions))
			toggle = rand() < 0.5
			q_expected = if toggle 
				sum(π_target2[i, i_s′]*Q1[i, i_s′] for i in eachindex(mdp.actions))
			else
				sum(π_target1[i, i_s′]*Q2[i, i_s′] for i in eachindex(mdp.actions))
			end

			if toggle
				Q2[i_a, i_s] += α*(r + γ*q_expected - Q2[i_a, i_s])
			else
				Q1[i_a, i_s] += α*(r + γ*q_expected - Q1[i_a, i_s])
			end
			
			#update terms for next step
			if toggle
				vhold2 .= Q2[:, i_s]
				target_policy_function!(vhold2, ϵ, s)
				π_target2[:, i_s] .= vhold2
			else
				vhold1 .= Q1[:, i_s]
				target_policy_function!(vhold1, ϵ, s)
				π_target1[:, i_s] .= vhold1
			end
			
			vhold3 .= vhold1 .+ vhold2
			behavior_policy_function!(vhold3, ϵ, s)
			π_behavior[:, i_s] .= vhold3
			
			s = s′

			l+=1
			rtot += r
		end
		steps[ep] = l
		rewards[ep] = rtot
	end

	Q1 .+= Q2
	Q1 ./= 2
	plain_return = Q1, create_greedy_policy(Q1), steps, rewards

	save_history && return (plain_return..., action_history)
	return plain_return
endmetadatashow_logsèdisabled®skip_as_script«code_folded$27d12c1c-ddb0-4bc1-af51-3388ff806705cell_id$27d12c1c-ddb0-4bc1-af51-3388ff806705codemd"""
#### Figure 8.3:

Policies found by planning and nonplanning Dyna-Q agents after episode $(@bind num_episodes_8_3 NumberField(1:100, default = 2)). The arrows indicate the greedy action with respect to the learned state-action value function.  Without planning, the only states with a policy update are those within n episodes of the goal where n is the number of episodes experienced so far in training.  For the planning agent after 1 episode, at least one of the values will be updated so during future planning steps, that information can propagate through the other states through bootstrapping since we are free to sample transitions from states into the ones that already have a value update.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$f0e88db8-e3ee-4b74-923e-c34038024824cell_id$f0e88db8-e3ee-4b74-923e-c34038024824codefigure_8_5′()metadatashow_logsèdisabled®skip_as_script«code_folded$b0df4dad-74c7-4469-a13f-5ef6bb81199fcell_id$b0df4dad-74c7-4469-a13f-5ef6bb81199fcode٪md"""
#### Figure 8.5:

Average performance of Dyna-Q on shortcut task.  The constant slope after learning the optimal policy indicates the shortcut is not exploited.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$cfdaa9c2-265f-4540-9d04-d1b7a72aee3ecell_id$cfdaa9c2-265f-4540-9d04-d1b7a72aee3ecodefigure_8_7()metadatashow_logsèdisabled®skip_as_script«code_folded$250ea9da-dea3-4bf3-932d-cdda6756ae33cell_id$250ea9da-dea3-4bf3-932d-cdda6756ae33codefunction runepisode(mdp::CompleteMDP{T, S, A}, s0::S, isterm::Function, π::Matrix{T}; max_steps = Inf) where {T<:Real, S, A}
	s = s0
	states = Vector{S}()
	actions = Vector{A}()
	push!(states, s)
	(_, _, r, s′, a, _) = takestep(mdp, π, s)
	push!(actions, a)
	rewards = [r]
	step = 2
	sterm = s
	if isterm(s′)
		sterm = s′
	else
		sterm = s
	end
	s = s′

	#note that the terminal state will not be added to the state list
	while !isterm(s) && (step <= max_steps)
		push!(states, s)
		(_, _, r, s′, a, _) = takestep(mdp, π, s)
		push!(actions, a)
		push!(rewards, r)
		s = s′
		step += 1
		if isterm(s′)
			sterm = s′
		end
	end
	return states, actions, rewards, sterm
endmetadatashow_logsèdisabled®skip_as_script«code_folded$bc295bb5-addb-4bcf-a3e3-c839ccc346bdcell_id$bc295bb5-addb-4bcf-a3e3-c839ccc346bdcodemd"""
### Maze Example
"""metadatashow_logsèdisabled®skip_as_script«code_folded$729197ce-2c27-467d-ba5f-47a1ecd539f2cell_id$729197ce-2c27-467d-ba5f-47a1ecd539f2code`begin
	abstract type GridworldAction end
	struct Up <: GridworldAction end
	struct Down <: GridworldAction end
	struct Left <: GridworldAction end
	struct Right <: GridworldAction end
	struct UpRight <: GridworldAction end
	struct DownRight <: GridworldAction end
	struct UpLeft <: GridworldAction end
	struct DownLeft <: GridworldAction end
	struct Stay <: GridworldAction end
	
	struct GridworldState
		x::Int64
		y::Int64
	end

	rook_actions = [Up(), Down(), Left(), Right()]
	
	move(::Up, x, y) = (x, y+1)
	move(::Down, x, y) = (x, y-1)
	move(::Left, x, y) = (x-1, y)
	move(::Right, x, y) = (x+1, y)
	move(::UpRight, x, y) = (x+1, y+1)
	move(::UpLeft, x, y) = (x-1, y+1)
	move(::DownRight, x, y) = (x+1, y-1)
	move(::DownLeft, x, y) = (x-1, y-1)
	move(::Stay, x, y) = (x, y)
	apply_wind(w, x, y) = (x, y+w)
	const wind_vals = [0, 0, 0, 1, 1, 1, 2, 2, 1, 0]
endmetadatashow_logsèdisabled®skip_as_script«code_folded$1aa76f3d-6041-4886-a6cd-787bdf1ec63ccell_id$1aa76f3d-6041-4886-a6cd-787bdf1ec63ccodefigure_8_5′′(;ϵ = 0.01f0)metadatashow_logsèdisabled®skip_as_script«code_folded$3bf9e526-826d-42b8-84ee-75f1c7f79c69cell_id$3bf9e526-826d-42b8-84ee-75f1c7f79c69codeVfunction display_rook_policy(v::Vector{T}; scale = 1.0) where T<:AbstractFloat
	@htl("""
		<div style = "display: flex; align-items: center; justify-content: center; transform: scale($scale);">
		<div class = "downarrow" style = "position: absolute; transform: rotate(180deg); opacity: $(v[1]);"></div>	
		<div class = "downarrow" style = "position: absolute; opacity: $(v[2])"></div>
		<div class = "downarrow" style = "position: absolute; transform: rotate(90deg); opacity: $(v[3])"></div>
		<div class = "downarrow" style = "transform: rotate(-90deg); opacity: $(v[4])"></div>
		</div>
	""")
endmetadatashow_logsèdisabled®skip_as_script«code_folded$308fd488-a009-4de0-8b27-c1f6b0677fedcell_id$308fd488-a009-4de0-8b27-c1f6b0677fedcodesuct(counts::Dict{S, Dict{Int64, T}}, s::S, i_a::Int64, ntot::T) where {S, T<:Real} = sqrt(log(ntot)/counts[s][i_a])metadatashow_logsèdisabled®skip_as_script«code_folded$340ba72b-172a-4d92-99b2-17687ab511c7cell_id$340ba72b-172a-4d92-99b2-17687ab511c7codemd"""
> ### *Exercise 8.4 (programming)* 
> The exploration bonus described above actually changes the estimated values of states and actions. Is this necessary? Suppose the bonus $\kappa \sqrt{\tau}$ was used not in updates, but solely in action selection. That is, suppose the action selected was always that for which $Q(S_t,a) + \kappa \sqrt{\tau(S_t, a)}$ was maximal. Carry out a gridworld experiment that tests and illustrates the strengths and weaknesses of this alternate approach.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$44364e7f-1910-421a-b961-63fbbaac8230cell_id$44364e7f-1910-421a-b961-63fbbaac8230codefunction bellman_optimal_value!(V::Vector{T}, mdp::FiniteStochasticMDP{T, S, A}, γ::T) where {T <: Real, S, A}
	delt = zero(T)
	@inbounds @fastmath @simd for i_s in eachindex(mdp.states)
		maxvalue = typemin(T)
		@inbounds @fastmath @simd for i_a in eachindex(mdp.actions)
			r_avg = zero(T)
			v_avg = zero(T)
			ptf = mdp.ptf[(i_a, i_s)]
			for i_s′ in keys(ptf)
				p = ptf[i_s′][1]
				r = ptf[i_s′][2]
				v_avg += p*V[i_s′]
				r_avg += p*r
			end
			x = r_avg + γ*v_avg
			maxvalue = max(maxvalue, x)
		end
		delt = max(delt, abs(maxvalue - V[i_s]) / (eps(abs(V[i_s])) + abs(V[i_s])))
		V[i_s] = maxvalue
	end
	return delt
endmetadatashow_logsèdisabled®skip_as_script«code_folded$4f4551fe-54a9-4186-ab8f-3535dc2bf4c5cell_id$4f4551fe-54a9-4186-ab8f-3535dc2bf4c5codemd"""
## 8.3 When the Model Is Wrong

In the maze example the model started out empty and then was only filled in with correct information.  In general, we cannot expect to be so fortunate.  Models may be incorrect because the environment is stochastic and only a limited number of samples have been observed, or simply because the environment has changed.  When the model is incorrect, the planning process will likely compute a suboptimal policy.

In some cases, the suboptimal poicy computed by planning quickly leads to the discovery and correction of the modeling error.  This tends to happen when the model is optimistic in the sense of predicting greater reward or better state transitions than are actually possible.  The planned policy attempts to exploit these opportunities and in doing so it discovers that they do not exist.

### Example 8.2: Blocking Maze

Consider a maze with a barrier that separates the start from the goal except for an opening on one end.  After a set number of time steps this path is blocked and replaced with a longer path open at the other end.  Below is an example of the environment with a random trajectory before and after the blocking.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$f6486854-4892-4fb6-a805-de56b19b3571cell_id$f6486854-4892-4fb6-a805-de56b19b3571code~function make_uct_plus(update_prior!::Function) 
	function f(v_hold::Vector{T}, q_ests::Dict{S, Dict{Int64, T}}, counts::Dict{S, Dict{Int64, T}}, s::S, c::T) where {S, T<:Real}
		update_prior!(v_hold, s)
		if !isempty(q_ests[s])
			ntot = zero(T)
			qsum = zero(T)
			visited_weight = zero(T)
			@inbounds @fastmath for i in keys(q_ests[s])
				ntot += counts[s][i]
				qsum += counts[s][i] * q_ests[s][i]
				visited_weight += v_hold[i]
			end

			#sample from unvisited weights proportional to the probability that one of those is the best option given the prior
			unvisited_weight = one(T) - visited_weight

			#sample from the unvisited actions weighted by their prior probability
			if rand() < unvisited_weight
				v_hold ./= unvisited_weight
				@inbounds @fastmath for i in keys(q_ests[s])
					v_hold[i] = zero(T)
				end
			else #sample from visited actions weighted by UCT
				v_hold .= zero(T)
				@inbounds @fastmath for i in keys(q_ests[s])
					#note that the only bonus values computed here are for actions that have been visited
					v_hold[i] = q_ests[s][i] + c*uct(counts, s, i, ntot)
				end
			end
		end
		return v_hold
	end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$fb5601b0-06d4-43c4-81a6-23a4a8f29f00cell_id$fb5601b0-06d4-43c4-81a6-23a4a8f29f00codeٟfunction make_random_policy(mdp::MDP_TD; init::T = 1.0f0) where T <: AbstractFloat
	ones(T, length(mdp.actions), length(mdp.states)) ./ length(mdp.actions)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$82e5719c-bbdb-4a18-b2f0-ad746b6acd41cell_id$82e5719c-bbdb-4a18-b2f0-ad746b6acd41codefunction make_puct(update_prior!::Function) 
	function f(v_hold::Vector{T}, q_ests::Dict{S, Dict{Int64, T}}, counts::Dict{S, Dict{Int64, T}}, s::S, c::T) where {S, T<:Real}
		update_prior!(v_hold, s)
		if !isempty(q_ests[s])
			ntot = zero(T)
			qsum = zero(T)
			@inbounds @fastmath for i in keys(q_ests[s])
				ntot += counts[s][i]
				qsum += counts[s][i] * q_ests[s][i]
			end
			qavg = qsum / ntot
			v_hold .= qavg .+ ((c * sqrt(ntot)) .* v_hold)
			@inbounds @fastmath for i in keys(q_ests[s])
				#note that the only bonus values computed here are for actions that have been visited
				v_hold[i] = q_ests[s][i] + ((v_hold[i] - qavg) / (one(T) + counts[s][i]))
			end
		end
		return v_hold
	end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$c62cc32c-0d29-4ea2-8284-ac4c883df6dbcell_id$c62cc32c-0d29-4ea2-8284-ac4c883df6dbcodestruct MDP_TD{S, A, F<:Function, G<:Function, H<:Function} <: MDP{S, A, F, G, H}
	states::Vector{S}
	statelookup::Dict{S, Int64}
	actions::Vector{A}
	actionlookup::Dict{A, Int64}
	state_init::G #function that produces an initial state for an episode
	step::F #function that produces reward and updated state given a state action pair
	isterm::H #function that returns true if the state input is terminal
	function MDP_TD(states::Vector{S}, actions::Vector{A}, state_init::G, step::F, isterm::H) where {S, A, F<:Function, G<:Function, H<:Function}
		statelookup = makelookup(states)
		actionlookup = makelookup(actions)
		new{S, A, F, G, H}(states, statelookup, actions, actionlookup, state_init, step, isterm)
	end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8586d633-7c50-49ba-9b74-b5bdad27c317cell_id$8586d633-7c50-49ba-9b74-b5bdad27c317code#figure_8_8(1000; num_samples = 200)metadatashow_logsèdisabled®skip_as_script«code_folded$bb439641-30bd-495d-ba70-06b2e27efdbdcell_id$bb439641-30bd-495d-ba70-06b2e27efdbdcode\function make_gridworld(;actions = rook_actions, sterm = GridworldState(8, 4), start = GridworldState(1, 4), xmax = 10, ymax = 7, stepreward = 0.0f0, termreward = 1.0f0, iscliff = s -> false, iswall = s -> false, cliffreward = -100f0, goal2 = GridworldState(start.x, ymax), goal2reward = 0.0f0, usegoal2 = false)
	
	states = [GridworldState(x, y) for x in 1:xmax for y in 1:ymax]
	
	boundstate(x::Int64, y::Int64) = (clamp(x, 1, xmax), clamp(y, 1, ymax))
	
	function step(s::GridworldState, a::GridworldAction)
		(x, y) = move(a, s.x, s.y)
		s′ = GridworldState(boundstate(x, y)...)
		iswall(s′) && return s
		return s′
	end
		
	function isterm(s::GridworldState) 
		s == sterm && return true
		usegoal2 && (s == goal2) && return true
		return false
	end

	function tr(s::GridworldState, a::GridworldAction) 
		isterm(s) && return (0f0, s)
		s′ = step(s, a)
		iscliff(s′) && return (cliffreward, start)
		x = Float32(isterm(s′))
		usegoal2 && (s′ == goal2) && return (goal2reward, goal2)
		r = (1f0 - x)*stepreward + x*termreward
		(r, s′)
	end	
	MDP_TD(states, actions, () -> start, tr, isterm)
end	metadatashow_logsèdisabled®skip_as_script«code_folded$aab6ca56-57ca-421e-9b71-e3e96681c4c5cell_id$aab6ca56-57ca-421e-9b71-e3e96681c4c5code$md"""
## 8.6 Trajectory Sampling
"""metadatashow_logsèdisabled®skip_as_script«code_folded$41bb1f78-b83a-4a45-ba5c-faa94e112f45cell_id$41bb1f78-b83a-4a45-ba5c-faa94e112f45code<function get_mcts_statistics()
	# visit_counts = Dict{GridworldState, Vector{Int64}}()
	# Q = Dict{GridworldState, Vector{Float32}}()
	mean(runepisode(dyna_maze, s -> monte_carlo_tree_search(dyna_maze, 0.95f0, rollout(;max_steps = 10),  s; nsims = 100, depth = 100, c = 1f0)[1]) |> first |> length for _ in 1:10)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$0fff8e1b-d0c2-49b8-93b4-8d1615c26690cell_id$0fff8e1b-d0c2-49b8-93b4-8d1615c26690code٪begin
	using Statistics, PlutoPlotly, Random, StatsBase, PlutoUI, HypertextLiteral, DataStructures, StaticArrays, Transducers, Serialization, Arrow
	TableOfContents()
endmetadatashow_logsèdisabled®skip_as_script«code_folded$4e1c115a-4020-4a5a-a79a-56056892a953cell_id$4e1c115a-4020-4a5a-a79a-56056892a953code"md"""
## Gridworld Environment
"""metadatashow_logsèdisabled®skip_as_script«code_folded$324181f0-b890-4198-9b4b-c36547e6629acell_id$324181f0-b890-4198-9b4b-c36547e6629acode)function create_ϵ_greedy_policy(Q::Matrix{T}, ϵ::T; π = copy(Q), get_valid_inds = j -> 1:size(Q, 1)) where T<:Real
	vhold = zeros(T, size(Q, 1))
	for j in 1:size(Q, 2)
		vhold .= Q[:, j]
		make_ϵ_greedy_policy!(vhold, ϵ; valid_inds = get_valid_inds(j))
		π[:, j] .= vhold
	end
	return π
endmetadatashow_logsèdisabled®skip_as_script«code_folded$eded8b72-70f4-4579-ba69-2eca409fa684cell_id$eded8b72-70f4-4579-ba69-2eca409fa684codefunction plot_path(mdp, states::Vector, sterm; title = "Optimal policy <br> path example", iscliff = s -> false, iswall = s -> false)
	xmax = maximum([s.x for s in mdp.states])
	ymax = maximum([s.y for s in mdp.states])
	start = mdp.state_init()
	goal = mdp.states[findlast(mdp.isterm(s) for s in mdp.states)]
	start_trace = scatter(x = [start.x + 0.5], y = [start.y + 0.5], mode = "text", text = ["S"], textposition = "left", showlegend=false)
	finish_trace = scatter(x = [goal.x + .5], y = [goal.y + .5], mode = "text", text = ["G"], textposition = "left", showlegend=false)
	
	path_traces = [scatter(x = [states[i].x + 0.5, states[i+1].x + 0.5], y = [states[i].y + 0.5, states[i+1].y + 0.5], line_color = "blue", mode = "lines", showlegend=false, name = "Optimal Path") for i in 1:length(states)-1]
	finalpath = scatter(x = [states[end].x + 0.5, sterm.x + .5], y = [states[end].y + 0.5, sterm.y + 0.5], line_color = "blue", mode = "lines", showlegend=false, name = "Optimal Path")

	h1 = 30*ymax
	traces = [start_trace; finish_trace; path_traces; finalpath]

	cliff_squares = filter(iscliff, mdp.states)
	for s in cliff_squares
		push!(traces, scatter(x = [s.x + 0.6], y = [s.y+0.5], mode = "text", text = ["C"], textposition = "left", showlegend = false))
	end


	wall_squares = filter(iswall, mdp.states)
	for s in wall_squares
		push!(traces, scatter(x = [s.x + 0.8], y = [s.y+0.5], mode = "text", text = ["W"], textposition = "left", showlegend = false))
	end

	plot(traces, Layout(xaxis = attr(showgrid = true, showline = true, gridwith = 1, gridcolor = "black", zeroline = true, linecolor = "black", mirror=true, tickvals = 1:xmax, ticktext = fill("", 10), range = [1, xmax+1]), yaxis = attr(linecolor="black", mirror = true, gridcolor = "black", showgrid = true, gridwidth = 1, showline = true, tickvals = 1:ymax, ticktext = fill("", ymax), range = [1, ymax+1]), width = max(30*xmax, 200), height = max(h1, 200), autosize = false, padding=0, paper_bgcolor = "rgba(0, 0, 0, 0)", title = attr(text = title, font_size = 14, x = 0.5)))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6cell_id$563b6dbd-ce51-4904-b1cc-d766bd1fd1d6code2@htl("""
<div style = "background-color: white; color: black; display: flex; align-items: center; justify-content: center;">
<div>$(plot_path(dyna_maze; title = "Random policy path example in Dyna Maze", max_steps = 10000, iswall = s -> in(s, maze_walls)))</div>
<div>$rook_action_display</div>
</div>
""")metadatashow_logsèdisabled®skip_as_script«code_folded$6a4116c9-87cf-4ee7-8030-aa1150853984cell_id$6a4116c9-87cf-4ee7-8030-aa1150853984codeshow_mcts_solution()metadatashow_logsèdisabled®skip_as_script«code_folded$ee0f55c6-e9c6-4199-9f27-5706f3c84863cell_id$ee0f55c6-e9c6-4199-9f27-5706f3c84863code!md"""
### MCTS Implementation
"""metadatashow_logsèdisabled®skip_as_script«code_folded$caca8d95-e40e-4592-b29e-a7e8b19faeb5cell_id$caca8d95-e40e-4592-b29e-a7e8b19faeb5code	md"""
Modifying Dyna-Q+ with this method of action selection no longer uses the ϵ-greedy policy for exploration as before and instead directly encourages exploration in the policy itself which no longer follows the value estimates directly.  Now, during the planning steps, we still update the value function using existing data.  The bonus reward for old experiences will only have an impact on the data collection by encouraging visits to states that have not been seen for a while.  The original method instead operates under the assumption that the value estimate updates during planning may be underestimating the value of states visited a long time ago and will boost their value increasing the chance of action selection indirectly.  

One problem with the method that modifies the action selection directly is that once the agent has found an optimal policy, along the trajectory of that path many state action pairs will be frequently visited, so an agent may deviate from that path for one action which has not been attempted in a while, but then by the same logic, the transition immediately back to the optimal state will be favored over all others since that transition hasn't been visited for a long time as well.  The agent may deviate slightly from the optimal path but never for long.  With DynaQ+, however, eventually, unvisited states no matter how far away they are from the optimal path will eventually be visited since during planning those value bonuses will propagate throughout the whole environment.  That may be one reason why in the shortcut maze task, the modified DynaQ+ agent shown above never finds the shortcut and falls into the same trap as unmodified DynaQ.  If the goal is to find cases where the model is wrong even if it is far away in state space from the previously optimal policy, then DynaQ+ is a much more effective method than the one acting directly on action selection.

Similar to the original DynaQ, if the model is correct, then this algorithm will follow the optimal policy more often than DynaQ+ because very few deviations from optimal are tollerated.  You can see in both figures, once the environment is stable, the modified algorithm starts accumulating reward faster.  For the bloacking maze task, this method might perform the best over a certain time horizon by finding the new path faster than DynaQ but also consistently sticking new to the optimum more than DyanQ+.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$24efe9b4-9308-4ad1-8ef0-69f6f93407c0cell_id$24efe9b4-9308-4ad1-8ef0-69f6f93407c0codemd"""
> ### *Exercise 8.2* 
> Why did the Dyna agent with exploration bonus, Dyna-Q+, perform better in the first phase as well as in the second phase of the blocking and shortcut experiments?

For the second phase, the maze changed in both cases so the exploration reward bonus in Dyna-Q+ encourages the policy to attempt different actions that have not been visited recently which would result in model updates that reflect the new environment.  For the first phase where the model is accurate, this task may benefit from larger initial exploration than the ϵ of 0.1 provides.  In that case the Dyna-Q+ reward simply acts like if we had a larger ϵ in the first place which may result in faster learning.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$ecd8742c-2e10-4814-b477-7024e85b7fa6cell_id$ecd8742c-2e10-4814-b477-7024e85b7fa6codefunction make_ϵ_greedy_policy!(π::Matrix{T}, mdp::FiniteStochasticMDP{T, S, A}, Q::Matrix{T}, ϵ::T) where {T<:Real,S,A}
	n = length(mdp.actions)
	for i_s in eachindex(mdp.states)
		maxq = -Inf
		for i_a in eachindex(mdp.actions)
			maxq = max(maxq, Q[i_a, i_s])
		end
		π[:, i_s] .= (Q[:, i_s] .≈ maxq)
		π[:, i_s] ./= (sum(π[:, i_s]) / (one(T) - ϵ))
		π[:, i_s] .+= ϵ / actions
	end
	return π
endmetadatashow_logsèdisabled®skip_as_script«code_folded$beae0491-ed11-4edf-a136-d384578b088bcell_id$beae0491-ed11-4edf-a136-d384578b088bcodeكmonte_carlo_tree_search(dyna_maze, 0.95f0, rollout(;max_steps = 10_000),  dyna_maze.state_init(); nsims = 100, depth = 10, c = 1f0)metadatashow_logsèdisabled®skip_as_script«code_folded$562e824c-34b5-415d-b186-d8e2cf1980e7cell_id$562e824c-34b5-415d-b186-d8e2cf1980e7code8function figure_8_5(; max_steps = 3000, ntrials = 10, n = 10, α = 0.1f0, ϵ = 0.1f0)
	x = 1:2*max_steps
	y = zeros(2*max_steps)
	for _ in 1:ntrials
		(Q, steps, rewards, history, stm, rtm) = tabular_dynaQ(blocking_maze2, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps, n = n)
		(Q2, steps2, rewards2, _, _) = tabular_dynaQ(blocking_maze3, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps, n = n, Qinit = Q, history = history, state_transition_map = stm, reward_transition_map = rtm)
	
		y .+= cumsum([rewards; rewards2])
	end
	plot(scatter(x = x, y = y ./ ntrials))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69cell_id$f5e52b2f-ea14-423d-8ca9-2ed68cd27c69codefunction show_grid_policy(mdp, π, name; display_function = display_rook_policy, action_display = rook_action_display, scale = 1.0)
	width = maximum(s.x for s in mdp.states)
	height = maximum(s.y for s in mdp.states)
	start = mdp.state_init()
	termind = findfirst(mdp.isterm, mdp.states)
	sterm = mdp.states[termind]
	ngrid = width*height
	@htl("""
		<div style = "display: flex; transform: scale($scale); background-color: white;">
			<div>
				<div class = "gridworld $name">
					$(HTML(mapreduce(i -> """<div class = "gridcell $name" x = "$(mdp.states[i].x)" y = "$(mdp.states[i].y)" style = "grid-row: $(height - mdp.states[i].y + 1); grid-column: $(mdp.states[i].x);">$(display_function(π[:, i], scale =0.8))</div>""", *, eachindex(mdp.states))))
				</div>
			</div>
			<div style = "display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-end; color: black; font-size: 18px; width: 5em; margin-left: 1em;">
				$(action_display)
			</div>
		</div>
	
		<style>
			.$name.gridworld {
				display: grid;
				grid-template-columns: repeat($width, 40px);
				grid-template-rows: repeat($height, 40px);
				background-color: white;

			.$name[x="$(start.x)"][y="$(start.y)"]::before {
				content: 'S';
				position: absolute;
				color: green;
				opacity: 1.0;
			}

			.$name[x="$(sterm.x)"][y="$(sterm.y)"]::before {
				content: 'G';
				position: absolute;
				color: red;
				opacity: 1.0;
			}

		</style>
	""")
endmetadatashow_logsèdisabled®skip_as_script«code_folded$eb9ba23d-bee5-4bb1-b3e1-fe40d9f681dccell_id$eb9ba23d-bee5-4bb1-b3e1-fe40d9f681dccodefunction check_policy(π::Matrix{T}, mdp::MDP_TD) where {T <: AbstractFloat}
#checks to make sure that a policy is defined over the same space as an MDP
	(n, m) = size(π)
	num_actions = length(mdp.actions)
	num_states = length(mdp.states)
	@assert n == num_actions "The policy distribution length $n does not match the number of actions in the mdp of $(num_actions)"
	@assert m == num_states "The policy is defined over $m states which does not match the mdp state count of $num_states"
	return nothing
endmetadatashow_logsèdisabled®skip_as_script«code_folded$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771bcell_id$1eb9a2ad-4584-4d32-8abb-e0e0bc0a771bcode#if no value estimation function is provided, use a random rollout
monte_carlo_tree_search(mdp::MDP{S, A, F, G, H}, γ::T, s::S; kwargs...) where {S, A, F, G, H, T<:Real} = monte_carlo_tree_search(mdp, γ, rollout, s; kwargs...)metadatashow_logsèdisabled®skip_as_script«code_folded$6cf35193-dba5-4f78-a4ac-245dda7a0846cell_id$6cf35193-dba5-4f78-a4ac-245dda7a0846codeٺbegin_value_iteration_v(mdp::FiniteMDP{T,S,A}, γ::T; Vinit::T = zero(T), kwargs...) where {T<:Real,S,A} = begin_value_iteration_v(mdp, γ, Vinit .* ones(T, size(mdp.ptf, 1)); kwargs...)metadatashow_logsèdisabled®skip_as_script«code_folded$39c96fc8-8259-46e3-88a0-a14eb6752b5ccell_id$39c96fc8-8259-46e3-88a0-a14eb6752b5ccodefunction show_grid_value(mdp, Q, name; scale = 1.0, title = "", sigdigits = 2)
	width = maximum(s.x for s in mdp.states)
	height = maximum(s.y for s in mdp.states)
	start = mdp.state_init()
	termind = findfirst(mdp.isterm, mdp.states)
	sterm = mdp.states[termind]
	ngrid = width*height

	displayvalue(Q::Matrix, i) = round(maximum(Q[:, i]), sigdigits = sigdigits)
	displayvalue(V::Vector, i) = round(V[i], sigdigits = sigdigits)
	@htl("""
		<div style = "display: flex; transform: scale($scale); background-color: white; color: black; font-size: 16px;">
			<div>
				$title
				<div class = "gridworld $name value">
					$(HTML(mapreduce(i -> """<div class = "gridcell $name value" x = "$(mdp.states[i].x)" y = "$(mdp.states[i].y)" style = "grid-row: $(height - mdp.states[i].y + 1); grid-column: $(mdp.states[i].x); font-size: 12px; color: black; $(displayvalue(Q, i) != 0 ? "background-color: lightblue;" : "")">$(displayvalue(Q, i))</div>""", *, eachindex(mdp.states))))
				</div>
			</div>
		</div>
	
		<style>
			.$name.value.gridworld {
				display: grid;
				grid-template-columns: repeat($width, 20px);
				grid-template-rows: repeat($height, 20px);
				background-color: white;
			}

			.$name.value[x="$(start.x)"][y="$(start.y)"] {
				content: '';
				background-color: rgba(0, 255, 0, 0.5);
				
			}

			.$name.value[x="$(sterm.x)"][y="$(sterm.y)"] {
				content: '';
				background-color: rgba(255, 0, 0, 0.5);
				
			}

		</style>
	""")
endmetadatashow_logsèdisabled®skip_as_script«code_folded$4494cb61-ee2c-467b-9bf6-0afb59023e91cell_id$4494cb61-ee2c-467b-9bf6-0afb59023e91codefunction sarsa(mdp::MDP_TD{S, A, F, G, H}, α::T, γ::T; num_episodes = 1000, qinit = zero(T), ϵinit = one(T)/10, Qinit = initialize_state_action_value(mdp; qinit=qinit), πinit = create_ϵ_greedy_policy(Qinit, ϵinit), history_state::S = first(mdp.states), update_policy! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ), save_history = false, decay_ϵ = false) where {S, A, F, G, H, T<:AbstractFloat}
	terminds = findall(mdp.isterm(s) for s in mdp.states)
	Q = copy(Qinit)
	Q[:, terminds] .= zero(T)
	π = copy(πinit)
	vhold = zeros(T, length(mdp.actions))
	#keep track of rewards and steps per episode as a proxy for training speed
	rewards = zeros(T, num_episodes)
	steps = zeros(Int64, num_episodes)

	if save_history
		action_history = Vector{A}(undef, num_episodes)
	end

	for ep in 1:num_episodes
		ϵ = decay_ϵ ? ϵinit/ep : ϵinit
		s = mdp.state_init()
		(i_s, i_a, a) = init_step(mdp, π, s)
		rtot = zero(T)
		l = 0
		while !mdp.isterm(s)
			(s′, i_s′, r, a′, i_a′) = sarsa_step(mdp, π, s, a)
			if save_history && (s == history_state)
				action_history[ep] = a
			end
			Q[i_a, i_s] += α * (r + γ*Q[i_a′, i_s′] - Q[i_a, i_s])
			
			#update terms for next step
			vhold .= Q[:, i_s]
			update_policy!(vhold, ϵ, s)
			π[:, i_s] .= vhold
			s = s′
			a = a′
			i_s = i_s′
			i_a = i_a′
			
			l+=1
			rtot += r
		end
		steps[ep] = l
		rewards[ep] = rtot
	end

	default_return =  Q, π, steps, rewards
	save_history && return (default_return..., action_history)
	return default_return
endmetadatashow_logsèdisabled®skip_as_script«code_folded$618b5f35-2df5-4ffb-a34f-add542691080cell_id$618b5f35-2df5-4ffb-a34f-add542691080code^#take a step in the environment from state s using policy π represented by a distribution over state-action pairs
function takestep(mdp, π::Matrix{T}, s) where T<:Real
	i_s = mdp.statelookup[s]
	i_a = sample_action(π, i_s)
	a = mdp.actions[i_a]
	(r, s′) = mdp.step(s, a)
	i_s′ = mdp.statelookup[s′]
	return (i_s, i_s′, r, s′, a, i_a)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$0f9080af-f166-4a78-a003-8df07f6c27d4cell_id$0f9080af-f166-4a78-a003-8df07f6c27d4codepHTML("""
<style>
	.downarrow {
		display: flex;
		justify-content: center;
		align-items: center;
		flex-direction: column;
	}

	.downarrow::before {
		content: '';
		width: 2px;
		height: 40px;
		background-color: black;
	}
	.downarrow::after {
		content: '';
		width: 0px;
		height: 0px;
		border-left: 5px solid transparent;
		border-right: 5px solid transparent;
		border-top: 10px solid black;
	}

	.gridcell {
			display: flex;
			justify-content: center;
			align-items: center;
			border: 1px solid black;
		}

	.windbox {
		height: 40px;
		width: 40px;
		display: flex;
		justify-content: center;
		align-items: center;
		transform: rotate(180deg);
		background-color: green;
	}

	.windbox * {
		background-color: green;
		color: green;
	}

	.windbox[w="0"] {
		opacity: 0.0; 
	}

	.windbox[w="1"] {
		opacity: 0.5;
	}

	.windbox[w="2"] {
		opacity: 1.0;
	}
</style>
""")metadatashow_logsèdisabled®skip_as_script«code_folded$f8bf29fe-568f-437f-ba82-6b861988a18ecell_id$f8bf29fe-568f-437f-ba82-6b861988a18ecodefunction make_greedy_policy!(π::Matrix{T}, mdp::FiniteDeterministicMDP{T, S, A}, V::Vector{T}, γ::T) where {T<:Real,S,A}
	for i_s in eachindex(mdp.states)
		maxv = -Inf
		for i_a in eachindex(mdp.actions)
			i_s′ = mdp.state_transition_map[i_a, i_s]
			r = mdp.reward_transition_map[i_a, i_s]
			x = r + γ*V[i_s′]
			maxv = max(maxv, x)
			π[i_a, i_s] = x
		end
		π[:, i_s] .= (π[:, i_s] .≈ maxv)
		π[:, i_s] ./= sum(π[:, i_s])
	end
	return π
endmetadatashow_logsèdisabled®skip_as_script«code_folded$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3cell_id$0d0bbf62-b1ac-45f6-8a92-1e77b0709cb3code,function figure8_3(num_episodes; α = 0.1f0, nlist = [0, 50], γ = 0.95f0,)
	(Q1, _) = tabular_dynaQ(dyna_maze, α, γ; num_episodes = num_episodes, n = first(nlist))
	d1 = show_grid_policy(dyna_maze, create_greedy_policy(Q1), "test")
	(Q2, _) = tabular_dynaQ(dyna_maze, α, γ; num_episodes = num_episodes, n = last(nlist))
	d2 = show_grid_policy(dyna_maze, create_greedy_policy(Q2), "test")
	@htl("""
	<div style = "display: flex;">
	<div>Without planning (n = $(first(nlist)))$d1</div>
	<div>With planning (n = $(last(nlist)))$d2</div>
	</div>
	""")
endmetadatashow_logsèdisabled®skip_as_script«code_folded$b15f1262-1acf-40e5-87a7-bc4b1b437a42cell_id$b15f1262-1acf-40e5-87a7-bc4b1b437a42codefunction runepisode(mdp::MDP{S, A, F, G, H}, π; max_steps = Inf) where {S, A, F, G, H}
	s = mdp.state_init()
	states = Vector{S}()
	actions = Vector{A}()
	push!(states, s)
	(_, _, r, s′, a, _) = takestep(mdp, π, s)
	push!(actions, a)
	rewards = [r]
	step = 2
	sterm = s
	if mdp.isterm(s′)
		sterm = s′
	else
		sterm = s
	end
	s = s′

	#note that the terminal state will not be added to the state list
	while !mdp.isterm(s) && (step <= max_steps)
		push!(states, s)
		(_, _, r, s′, a, _) = takestep(mdp, π, s)
		push!(actions, a)
		push!(rewards, r)
		s = s′
		step += 1
		if mdp.isterm(s′)
			sterm = s′
		end
	end
	return states, actions, rewards, sterm
endmetadatashow_logsèdisabled®skip_as_script«code_folded$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2cell_id$9be963b9-f3a1-4f92-8ff9-f5be75ed52f2codefunction expected_sarsa(mdp::MDP_TD{S, A, F, G, H}, α::T, γ::T; num_episodes = 1000, qinit = zero(T), ϵinit = one(T)/10, Qinit = initialize_state_action_value(mdp; qinit=qinit), πinit = create_ϵ_greedy_policy(Qinit, ϵinit), update_policy! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ), decay_ϵ = false, save_history = false, save_state = first(mdp.states)) where {S, A, F, G, H, T<:AbstractFloat}
	terminds = findall(mdp.isterm(s) for s in mdp.states)
	Q = copy(Qinit)
	Q[:, terminds] .= zero(T)
	π = copy(πinit)
	vhold = zeros(T, length(mdp.actions))
	#keep track of rewards and steps per episode as a proxy for training speed
	rewards = zeros(T, num_episodes)
	steps = zeros(Int64, num_episodes)
	if save_history
		action_history = Vector{A}(undef, num_episodes)
	end
	
	for ep in 1:num_episodes
		ϵ = decay_ϵ ? ϵinit/ep : ϵinit
		s = mdp.state_init()
		rtot = zero(T)
		l = 0
		while !mdp.isterm(s)
			(i_s, i_s′, r, s′, a, i_a) = takestep(mdp, π, s)
			if save_history && (s == save_state)
				action_history[ep] = a
			end
			q_expected = sum(π[i, i_s′]*Q[i, i_s′] for i in eachindex(mdp.actions))
			Q[i_a, i_s] += α*(r + γ*q_expected - Q[i_a, i_s])
			
			#update terms for next step
			vhold .= Q[:, i_s]
			update_policy!(vhold, ϵ, s)
			π[:, i_s] .= vhold
			s = s′
			
			l+=1
			rtot += r
		end
		steps[ep] = l
		rewards[ep] = rtot
	end

	base_return = (Q, π, steps, rewards)
	save_history && return (base_return..., action_history)
	return base_return
endmetadatashow_logsèdisabled®skip_as_script«code_folded$b3a5adcb-5343-44e9-9466-1c51c1143a0dcell_id$b3a5adcb-5343-44e9-9466-1c51c1143a0dcodeexample_8_4()metadatashow_logsèdisabled®skip_as_script«code_folded$80affd41-b5e6-4b9c-b827-4e3b39bd7767cell_id$80affd41-b5e6-4b9c-b827-4e3b39bd7767code|function value_iteration_v!(V, θ, mdp, γ, nmax, valuelist)
	nmax <= 0 && return valuelist
	
	#update value function
	delt = bellman_optimal_value!(V, mdp, γ)
	
	#add copy of value function to results list
	push!(valuelist, copy(V))

	#halt when value function is no longer changing
	delt <= θ && return valuelist
	
	value_iteration_v!(V, θ, mdp, γ, nmax - 1, valuelist)	
endmetadatashow_logsèdisabled®skip_as_script«code_folded$9a1b250f-b404-4db3-a4b7-4cd33b79d921cell_id$9a1b250f-b404-4db3-a4b7-4cd33b79d921codefunction create_greedy_policy(Q::Matrix{T}; c = 1000, π = copy(Q)) where T<:Real
	vhold = zeros(T, size(Q, 1))
	for j in 1:size(Q, 2)
		vhold .= Q[:, j]
		make_greedy_policy!(vhold; c = c)
		π[:, j] .= vhold
	end
	return π
endmetadatashow_logsèdisabled®skip_as_script«code_folded$db66615e-fbbc-4ea8-b529-bdc14e58a215cell_id$db66615e-fbbc-4ea8-b529-bdc14e58a215codebegin
	const block3 = Set(GridworldState(x, 3) for x in 2:8)
	const blocking_maze3 = make_gridworld(;iswall = s -> in(s, block3), block_maze_base_args...)
	[plot_path(blocking_maze2, iswall = s -> in(s, block2), max_steps = 2000, title = "Shortcut Maze Steps <= 3000") plot_path(blocking_maze3, iswall = s -> in(s, block3), max_steps = 2000, title = "Shortcut Maze Steps > 3000")]
endmetadatashow_logsèdisabled®skip_as_script«code_folded$72b40384-9ca1-4bc1-8e1a-8b639d39e215cell_id$72b40384-9ca1-4bc1-8e1a-8b639d39e215codemd"""
In this section we compare two ways of distributing updates.  The classical approach, from dynamic programming, is to perform sweeps through the entire state (or state-action) space, updating each state (or state-action pair) once per sweep.  This is problematic on large tasks because there may not be time to complete even one sweep.  In many tasks, the vast majority or the states are irrelevant because they are visited only under very poor policies or with very low probability.  Exhaustive sweeps implicitely devote equal time to all parts of the state space rather than focusing where it is needed.  As we discussed in Chapter 4, exhaustive sweeps and the equal treatment of all states that they imply are not necessary properties of dynamic programming.  In principle, updates can be distributed in any way one likes (to assure convergence, all states or state-action pairs must be visited in the limit an infinite number of times; although an exception to this is discussed in Section 8.7 below), but in practice exhaustive sweeps are often used.

The second approach is to sample from the state or state-action space according to some distribution.  One could sample uniformly, as in the Dyna-Q agent, but this would suffer from some of the same problems as exhaustive sweeps.  More appealing is to distribute updates according to the on-poliy distribution, that is according to the distribution observed when following the current policy.  One advantage of this distribution is that it is easily generated; one simply interacts with the model, following the current policy.  In an episodic task, one starts in a start state (or according to the starting-state distribution) and simulates until the terminal state.  In a continuing task, one starts anywhere and just keeps simulating.  In either case, sample state transitions and rewards are given by the model, and sample actions are given by the current policy.  In other words, one simulates explicit individual trajectories and performs updates at the state or state-action pairs encountered along the way.  We call this way of generating experience and updates *trajectory sampling*.

Is the on-policy distribution of updates a good one?  Intuitively it seems like a good choice, at least better than the uniform distribution.  For example, if you are learning to play chess, you study positions that might arise in real games, not random positions of chess pieces.  The latter may be valid states, but to be able to accurately value them is a different skill from evaluating positions in real games.  We will also see in Part II that the on policy distribution has significant advantages when function approximation is used.  Whether or not function approximation is used, one might expect on-policy focusing to significantly improve the speed of planning.

The following experiment attempts to assess empirically the value of sampling from the on policy distribution by comparing it directly to the alternative of *uniform* sampling.  In the *uniform* case, all state action pairs are updated once in place and in the *on-policy* case an episode is imulated starting from the same state and updating each state-action pair that occured under the current $\epsilon$-greedy policy $(\epsilon = 0.1)$.  The tasks were undiscounted episodic tasks, generated randomly as follows.  From each of the $\vert \mathcal{S} \vert$ states, two actions were possible, each of which results in one of $b$ next states, all equally likely, with a different random selection of $b$ states for each state-action pair.  The branching factor, $b$, was the same for all state-action pairs.  In addition, on all transitions there was a 0.1 probability of transition to the terminal state, ending the episode.  The expected reward on each transition was selected from a Gaussian distribution with mean 0 and variance 1.  At any point in the planning process one can stop and exhaustively compute $v_{\tilde \pi}(s_0)$, the true value of the start state under the greedy policy, $\tilde \pi$, given the current action-value function $Q$, as in indication of how well the agent would do on a new episode on which it acted greedily (all while assuming the model is correct).
"""metadatashow_logsèdisabled®skip_as_script«code_folded$63bf9d16-4516-4cec-895f-f010275bca16cell_id$63bf9d16-4516-4cec-895f-f010275bca16code+md"""
## 8.5 Expected vs Sample Updates
"""metadatashow_logsèdisabled®skip_as_script«code_folded$0adcbce8-2be5-48ef-af43-04815e10dc5ccell_id$0adcbce8-2be5-48ef-af43-04815e10dc5ccodehfunction make_greedy_policy!(v::AbstractVector{T}; c = 1000) where T<:Real
	(vmin, vmax) = extrema(v)
	isnan(vmin) && error("NaN values in vector")
	if isinf(vmax)
		v .= T.(isinf.(v))
		v ./= sum(v)
	elseif vmin == vmax
		v .= zero(T)
		v .= one(T) / length(v)
	else
		v .= (v .- vmax) ./ abs(vmin - vmax)
		v .= exp.(c .* v)
		v ./= sum(v)
	end
	return v
endmetadatashow_logsèdisabled®skip_as_script«code_folded$f9e4baec-c988-4abd-9bb0-c618c0ec07b9cell_id$f9e4baec-c988-4abd-9bb0-c618c0ec07b9code.#perform a rollout with an mdp from state s using a policy function π that produces an action selection given a state input. return value is an unbiased estimate of the value of this state under the policy
function rollout(mdp::MDP{S, A, F, G, H}, s::S, π::Function, γ::T; max_steps = Inf) where {S, A, F, G, H, T<:Real}
	step = 0
	#note that the terminal state will not be added to the state list
	r = zero(T)
	while !mdp.isterm(s) && (step <= max_steps)
		a = π(s)
		r, s′ = mdp.step(s, a)
		r += γ^step * r
		s = s′
		step += 1
	end
	return r
endmetadatashow_logsèdisabled®skip_as_script«code_folded$502a7125-4460-4d39-be14-4852fb6d9ad2cell_id$502a7125-4460-4d39-be14-4852fb6d9ad2codeوplot_path(mdp; title = "Random policy <br> path example", kwargs...) = plot_path(mdp, make_random_policy(mdp); title = title, kwargs...)metadatashow_logsèdisabled®skip_as_script«code_folded$31072f9b-de1b-42cf-a187-cbff99b49b50cell_id$31072f9b-de1b-42cf-a187-cbff99b49b50codemd"""
Throughout the book we have considered a variety of value-function updates for the state value $v(s)$ and the state-action value $q(s, a)$.  Broadly, they can be separated into expected updates and sample-updates.  The first expected update considered was for dynamic programming in which we make use of the full probability transition function $p(s^\prime, r \vert s, a)$.  When used with a policy $\pi$ that provides a probability distribution over actions for each state, this technique is called *policy evaluation* and when a maximization is used over actions to find optimal value function and policy policy, this corresponds to *value iteration*.  Both of these techniques could be used with either the state or state-action value function.

The expected update for a state-action pair, $s,a$, is:

$Q(s, a) \leftarrow \sum_{s^\prime,r}\hat p (s^\prime,r \vert s, a) \left [ \gamma \max_{a^\prime} Q(s^\prime, a^\prime) \right ] \tag{8.1}$

Considering just one-step sample updates, we use an environment to sample a transition: $(s, a) \rightarrow (s^\prime, r)$.  Since we do not use the full probability transition function, the updates make use of a learning rate and accumulate samples over time either with Sarsa or Q-learning.  

The corresponding sample update for $s,a$ given a sample next state and reward, $S^\prime$ and $R$ (from the model), is the Q-learning-like update:

$Q(s, a) \leftarrow Q(s, a) + \alpha \left [ R + \gamma \max_{a^\prime} Q(s^\prime, a^\prime) - Q(s, a) \right ] \tag{8.2}$

where $\alpha$ is the usual positive step-size parameter.

The difference between expected and sample updates is significant to the extent that the environment is stochastic, specifically, to the extent that, given a state and action, many possible next states may occur with various probabilities.  If only one next state is possible, then the expected and sample updates given above are identical (taking $\alpha=1$).  If there are many possible next states, then tehre may be significant differences.  In favor  of the expected update is that it is an exact computation, resulting in a new $Q(s, a)$ whose correctness is limited only by the correctness of the $Q(s^\prime, a^\prime)$ at successor states.  The sample update is in addition affected by sampling error.  On the other hand, the sample update is cheaper computationally because it considers only one next state, not all possible next states.  In practice, the computation required by update operations is usually dominated by the number of state-action pairs at which $Q$ is evaluated.  For a particular starting pair, $s, a$, let $b$ be the *branching factor* (i.e. the number or possible next states, $s^\prime$, for which $\hat p (s^\prime, s, a) \gt 0$).  Then an expected update of this pair requires roughly $b$ times as much computation as a sample update.

If there is enough time to complete an expected update, then the resulting estimate is generally better than that of $b$ sample updates because of the absense of sampling error.  But if there is insufficient time to complete an expected update, then sample updates are always preferable because they at least make some improvement int he value estimate with fewer than $b$ updates.  In a large problem with many state-action pairs, we are often in the latter situation.  With so many state-action pairs, expected updates of all of them would take a very long time.  Before that we may be much better off with a few sample updates at many state-action pairs than with expected updates at a few pairs.  Given a unit of computation effort, is it better devoted to a few expected updates or to $b$ times as many sample updates?

Figure 8.7 shows the results of any analysis that suggests and answer ot this question.  It shows the estimation error as a function of computation time for expected and sample updates for a variety of branching factors $b$.  The case considered is that in which all $b$ successor states are equally likely and in which the error in the initial estimate is 1.  The values at the next states are assumed correct, sot he expected update redues the error to zero upon its completion.  In this case, sample updates reduce the error according to $\sqrt{\frac{b-1}{bt}}$ where $t$ is the number of sample updates that have been performed (assuming same averages, i.e. $\alpha = 1/t$).  The key observation is that for moderately large $b$ the error falls dramatically with a tiny fraction of $b$ updates.  For these cases, many state-action pairs could have their values improved dramatically, to within a few percent of the effect of an expected update, in teh same time that a single state-action pair could undergo an expected update.

The advantage of sample updates shown in Figure 8.7 is probably an underestimate of the real effect.  In a real problem, the values of successor states would be estimates that are themselves updated.  By causing estimates to be more accurate sooner, sample updates will have a second advantage in that the values backed up from the successor states will be more accurate.  These results suggest that sample updates are likely to be superior to expected updates on problems with large stochastic branching factors and too many states to be solved exactly.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$77fde69f-2119-41eb-8993-a93b2c47ca7ecell_id$77fde69f-2119-41eb-8993-a93b2c47ca7ecode$md"""
## Gridworld Visualization
"""metadatashow_logsèdisabled®skip_as_script«code_folded$65818e67-c146-4686-a9aa-d0859ef662fbcell_id$65818e67-c146-4686-a9aa-d0859ef662fbcode$md"""
### Example 8.1: Dyna Maze
"""metadatashow_logsèdisabled®skip_as_script«code_folded$b03087e9-e15d-4563-bdae-4d9ba7d2cec6cell_id$b03087e9-e15d-4563-bdae-4d9ba7d2cec6code$md"""
## MDP Types and Functions
"""metadatashow_logsèdisabled®skip_as_script«code_folded$195d2a34-c44c-4088-8ec4-dece3107f16dcell_id$195d2a34-c44c-4088-8ec4-dece3107f16dcodeefunction bellman_optimal_value!(V::Vector{T}, mdp::FiniteMDP{T, S, A}, γ::T) where {T <: Real, S, A}
	delt = zero(T)
	@inbounds @fastmath @simd for i_s in eachindex(mdp.states)
		maxvalue = typemin(T)
		@inbounds @fastmath @simd for i_a in eachindex(mdp.actions)
			x = zero(T)
			for (i_r, r) in enumerate(mdp.rewards)
				@inbounds @fastmath @simd for i_s′ in eachindex(V)
					x += mdp.ptf[i_s′, i_r, i_a, i_s] * (r + γ * V[i_s′])
				end
			end
			maxvalue = max(maxvalue, x)
		end
		delt = max(delt, abs(maxvalue - V[i_s]) / (eps(abs(V[i_s])) + abs(V[i_s])))
		V[i_s] = maxvalue
	end
	return delt
endmetadatashow_logsèdisabled®skip_as_script«code_folded$6858ef8b-1ca7-4e96-b57e-26553423cc13cell_id$6858ef8b-1ca7-4e96-b57e-26553423cc13codeTsample_action(v::Vector{T}) where T<:AbstractFloat = sample(1:length(v), weights(v))metadatashow_logsèdisabled®skip_as_script«code_folded$e689df6b-d6f0-4928-9212-a940aa00b0efcell_id$e689df6b-d6f0-4928-9212-a940aa00b0efcodehtml"""
	<style>
		main {
			margin: 0 auto;
			max-width: min(1200px, 90%);
	    	padding-left: max(10px, 5%);
	    	padding-right: max(10px, 5%);
			font-size: max(10px, min(24px, 2vw));
		}
	</style>
	"""metadatashow_logsèdisabled®skip_as_script«code_folded$3b0d2c55-2123-4b51-b946-6bc352e3d00acell_id$3b0d2c55-2123-4b51-b946-6bc352e3d00acodemd"""
> ### *Exercise 8.6* 
> The analysis above assumed that all of the $b$ possible next states were equally likely to occur.  Suppose instead that the distribution was highly skewed, that some of the $b$ states were much more likely to occur than most.  Would this strengthen or weaken the case for sample updates over expected updates?  Support your answer.

For the expected updates, all transitions no matter how small the probability are given the same amount of computation time.  If certain transitions are much more likely than others, than the resulting state value computation is dominated by those transitions.  If we perform sample updates, those transitions will appear more frequently than the less likely ones and will contribute earlier to the error reduction.  In the extreme case if just one transition is close to probability 1, then that will be sampled almost every time and after just a single sample the error could be reduced close to 0.  An expected update, on the other hand, would have to consider every state action pair to just perform a single update.  Therefore the efficiency of sample updates would become exaggerated in all real world problems where the subsequent state transition probabilities deviate from a uniform distribution.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cfcell_id$c04c91be-de42-4dfc-bd0d-b9fbdde0c9cfcodekfunction simulate!(visit_counts, Q, mdp, γ::T, v_est, s, depth, c::T, v_hold, update_tree_policy!, updateQ!, updateV!, q_hold, apply_bonus!, step_kwargs, est_kwargs) where T<:Real
	#if the state is terminal, produce a value of 0
	mdp.isterm(s) && return zero(T)
	
	depth ≤ 0 && return v_est(mdp, s, γ; est_kwargs...)
	
	#for a state where no actions have been attempted, expand a new node
	if !haskey(visit_counts, s)
		# Q[s] = sparse(q_hold)
		# visit_counts[s] = sparse(q_hold)
		Q[s] = Dict{Int64, T}()
		visit_counts[s] = Dict{Int64, T}()
		return v_est(mdp, s, γ; est_kwargs...)
	end

	apply_bonus!(v_hold, Q, visit_counts, s, c)
	
	update_tree_policy!(v_hold, s)
	i_a = sample_action(v_hold)
	a = mdp.actions[i_a]
	r, s′ = mdp.step(s, a; step_kwargs...)
	q = r + γ*simulate!(visit_counts, Q, mdp, γ, v_est, s′, depth - 1, c, v_hold, update_tree_policy!, updateQ!, updateV!, q_hold, apply_bonus!, step_kwargs, est_kwargs)
	
	updateV!(visit_counts, one(T), s, i_a)

	# δq = (q - Q[s][i_a]) / visit_counts[s][i_a]
	δq = (q - get_dict_value(Q[s], i_a)) / visit_counts[s][i_a]
	updateQ!(Q, δq, s, i_a)
	return q
endmetadatashow_logsèdisabled®skip_as_script«code_folded$d4e1e807-7e87-4b43-9c36-f59999dfcd2dcell_id$d4e1e807-7e87-4b43-9c36-f59999dfcd2dcode#get the value of a dictionary d at key k, defaulting to some value when the key is absent
get_dict_value(d::Dict{K, V}, k::K; default = zero(V)) where {K, V<:Real} = haskey(d, k) ? d[k] : default metadatashow_logsèdisabled®skip_as_script«code_folded$e25ec0d5-f70f-4269-b2a1-efa194936f72cell_id$e25ec0d5-f70f-4269-b2a1-efa194936f72code$abstract type MDP{S, A, F, G, H} endmetadatashow_logsèdisabled®skip_as_script«code_folded$1f7d77a6-d774-436d-a745-5a160cc15f2bcell_id$1f7d77a6-d774-436d-a745-5a160cc15f2bcodeٵfunction plot_path(mdp, π; max_steps = 100, kwargs...)
	(states, actions, rewards, sterm) = runepisode(mdp, π; max_steps = max_steps)
	plot_path(mdp, states, sterm; kwargs...)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$5b688057-06c7-4ae4-95d6-0a2ff451f11ccell_id$5b688057-06c7-4ae4-95d6-0a2ff451f11ccodevfunction figure_8_4′(; max_steps1 = 1000, max_steps2 = 2000, ntrials = 10, n = 10, α = 0.1f0, ϵ = 0.1f0, κ = 0.01f0)
	x = 1:(max_steps1 + max_steps2)
	function test_algo(f)
		y = zeros(max_steps1 + max_steps2)
		for _ in 1:ntrials
			(Q, steps, rewards, history, stm, rtm) = f(blocking_maze1, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps1, n = n)
			(Q2, steps2, rewards2, _, _) = f(blocking_maze2, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps2, n = n, Qinit = Q, history = history, state_transition_map = stm, reward_transition_map = rtm, init_step = max_steps1)

			y .+= cumsum([rewards; rewards2])
		end
		return x, y
	end

	(x1, y1) = test_algo(tabular_dynaQ)
	(x2, y2) = test_algo((args...; kwargs...) -> tabular_dynaQplus(args...; κ = κ, kwargs...))
	
	plot([scatter(x = x, y = y1 ./ ntrials, name = "Dyna-Q"), scatter(x = x, y = y2 ./ ntrials, name = "Dyna-Q+")])
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8987052b-0828-43a5-982e-5f3d6209f2aacell_id$8987052b-0828-43a5-982e-5f3d6209f2aacodeى@bind fig_8_4_params PlutoUI.combine() do Child
	md"""
	Planning Steps: $(Child(:n, NumberField(1:100, default = 5)))
	"""
end |> confirmmetadatashow_logsèdisabled®skip_as_script«code_folded$4b2a4fb1-7395-4293-9ff9-e2f9da50f56bcell_id$4b2a4fb1-7395-4293-9ff9-e2f9da50f56bcodefunction value_iteration_q!(Q, θ, mdp, γ, nmax)
	nmax <= 0 && return Q
	
	#update value function
	delt = bellman_optimal_value!(Q, mdp, γ)

	#halt when value function is no longer changing
	delt <= θ && return Q
	
	value_iteration_q!(Q, θ, mdp, γ, nmax - 1)	
endmetadatashow_logsèdisabled®skip_as_script«code_folded$fcaddc19-c0c9-4e8e-8f84-adc7a02cc1f5cell_id$fcaddc19-c0c9-4e8e-8f84-adc7a02cc1f5codeTfigure_8_8(10_000; blist = [1, 3], num_samples = 10, expected_updates_max = 200_000)metadatashow_logsèdisabled®skip_as_script«code_folded$5afad18b-1d87-450e-a0ff-8c1249d663edcell_id$5afad18b-1d87-450e-a0ff-8c1249d663edcode
function tabular_dynaQ(mdp::MDP_TD{S, A, F, G, H}, α::T, γ::T; num_episodes = 1000,
	max_steps = 10000, n = 100, qinit = zero(T), ϵinit = one(T)/10, 
	Qinit = initialize_state_action_value(mdp; qinit=qinit), πinit = create_ϵ_greedy_policy(Qinit, ϵinit), 
	decay_ϵ = false, history_state::S = first(mdp.states), 
	save_history = false, update_policy! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ), 
	history = Dict{Int64, Set{Int64}}(),
	#each column contains the index of the state reached from the state represented by the column index while taking the action represented by the row index.  the values are initialized at 0 which represents a transition that has not occured
	state_transition_map = zeros(Int64, length(mdp.actions), length(mdp.states)),
	#each column contains the reward received from the state represented by the column index while taking the action represented by the row index.  the state_transition_map can be used to determine if any of these values have been updated from the zero initialization
	reward_transition_map = zeros(T, length(mdp.actions), length(mdp.states)),
	init_step = 0,
	isoptimal = l -> false) where {S, A, F, G, H, T<:AbstractFloat}

	π = copy(πinit)
	Q = copy(Qinit)
	ϵ = ϵinit
	terminds = findall(mdp.isterm(s) for s in mdp.states)
	Q[:, terminds] .= zero(T)
	num_updates = 0
	
	vhold = zeros(T, length(mdp.actions))
	#keep track of rewards per step and steps per episode
	rewards = zeros(T, max_steps)
	steps = zeros(Int64, num_episodes)

	function updateQ!(Q, i_s, i_a, i_s′, r)
		qmax = maximum(Q[i, i_s′] for i in eachindex(mdp.actions))
		Q[i_a, i_s] += α*(r + γ*qmax - Q[i_a, i_s])
		num_updates += 1
	end

	function q_planning!(Q, history)
		for _ in 1:n
			i_s = rand(keys(history))
			i_a = rand(history[i_s])
			i_s′ = state_transition_map[i_a, i_s]
			r = reward_transition_map[i_a, i_s]
			updateQ!(Q, i_s, i_a, i_s′, r)
		end
	end

	ep = 1
	step = 1
	optimal_path = false
	while (step <= max_steps) && (ep <= num_episodes) && !optimal_path
		s = mdp.state_init()
		l = 0
		while !mdp.isterm(s) && step <= max_steps
			(i_s, i_s′, r, s′, a, i_a) = takestep(mdp, π, s)
			updateQ!(Q, i_s, i_a, i_s′, r)
			state_transition_map[i_a, i_s] = i_s′
			reward_transition_map[i_a, i_s] = r
			#save state action pair visited
			if haskey(history, i_s)
				push!(history[i_s], i_a)
			else
				history[i_s] = Set([i_a])
			end
			q_planning!(Q, history)
			π = create_ϵ_greedy_policy(Q, ϵ; π = π)
			s = s′
			rewards[step] = r
			step += 1
			l += 1
		end
		steps[ep] = l
		optimal_path = isoptimal(l)
		ep += 1
	end
	return Q, steps[1:ep-1], rewards[1:step-1], history, state_transition_map, reward_transition_map, num_updates
endmetadatashow_logsèdisabled®skip_as_script«code_folded$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3cell_id$b9054ed4-7f16-4920-b13e-5f4c6f50dcf3code
function tabular_dynaQplus(mdp::MDP_TD{S, A, F, G, H}, α::T, γ::T; 
	num_episodes = 1000, max_steps = 10000, n = 100, qinit = zero(T), ϵinit = one(T)/10, 
	Qinit = initialize_state_action_value(mdp; qinit=qinit), πinit = create_ϵ_greedy_policy(Qinit, ϵinit), 
	decay_ϵ = false, history_state::S = first(mdp.states), 
	save_history = false, update_policy! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ), 
	history = zeros(Int64, length(mdp.actions), length(mdp.states)),
	#each column contains the index of the state reached from the state represented by the column index while taking the action represented by the row index.  the values are initialized to produce transitions to the original state
	state_transition_map = mapreduce(i_s -> i_s .* ones(Int64, length(mdp.actions)), hcat, eachindex(mdp.states)),
	#each column contains the reward received from the state represented by the column index while taking the action represented by the row index.  the state_transition_map can be used to determine if any of these values have been updated from the zero initialization
	reward_transition_map = zeros(T, length(mdp.actions), length(mdp.states)),
	κ = 0.1f0, 
	init_step = 0) where {S, A, F, G, H, T<:AbstractFloat}

	π = copy(πinit)
	Q = copy(Qinit)
	ϵ = ϵinit
	terminds = findall(mdp.isterm(s) for s in mdp.states)
	Q[:, terminds] .= zero(T)
	
	vhold = zeros(T, length(mdp.actions))
	#keep track of rewards per step and steps per episode
	rewards = zeros(T, max_steps)
	steps = zeros(Int64, num_episodes)

	function updateQ!(Q, i_s, i_a, i_s′, r)
		qmax = maximum(Q[i, i_s′] for i in eachindex(mdp.actions))
		Q[i_a, i_s] += α*(r + γ*qmax - Q[i_a, i_s])
	end

	function q_planning!(Q, history, step)
		for _ in 1:n
			i_s = ceil(Int64, rand()*length(mdp.states))
			i_a = ceil(Int64, rand()*length(mdp.actions))
			i_s′ = state_transition_map[i_a, i_s]
			τ = step - history[i_a, i_s]
			r = reward_transition_map[i_a, i_s] + κ*sqrt(τ)
			updateQ!(Q, i_s, i_a, i_s′, r)
		end
	end

	step = 1
	ep = 1
	while (ep <= num_episodes) && (step <= max_steps)
		s = mdp.state_init()
		l = 0
		
		while !mdp.isterm(s) && step <= max_steps
			(i_s, i_s′, r, s′, a, i_a) = takestep(mdp, π, s)
			updateQ!(Q, i_s, i_a, i_s′, r)
			state_transition_map[i_a, i_s] = i_s′
			reward_transition_map[i_a, i_s] = r
			
			#save the step for which that state action pair was visited
			history[i_a, i_s] = step + init_step
			rewards[step] = r
			q_planning!(Q, history, step + init_step)
			step += 1
			π = create_ϵ_greedy_policy(Q, ϵ; π = π)
			s = s′
			l += 1
			
		end
		steps[ep] = l
		
		ep += 1
	end
	return Q, steps, rewards, history, state_transition_map, reward_transition_map
endmetadatashow_logsèdisabled®skip_as_script«code_folded$5ae2d740-13c7-4568-8f04-25bc82fecbdbcell_id$5ae2d740-13c7-4568-8f04-25bc82fecbdbcodebegin
	const block1 = Set(GridworldState(x, 3) for x in 1:8)
	const block2 = Set(GridworldState(x, 3) for x in 2:9)
	const block_maze_base_args = (xmax = 9, ymax = 6, sterm = GridworldState(9, 6), start = GridworldState(4, 1))
	const blocking_maze1 = make_gridworld(;iswall = s -> in(s, block1), block_maze_base_args...)
	const blocking_maze2 = make_gridworld(;iswall = s -> in(s, block2), block_maze_base_args...)
	[plot_path(blocking_maze1, iswall = s -> in(s, block1), max_steps = 2000, title = "Blocking Maze Steps <= 1000") plot_path(blocking_maze2, iswall = s -> in(s, block2), max_steps = 1000, title = "Blocking Maze Steps > 1000")]
endmetadatashow_logsèdisabled®skip_as_script«code_folded$0dbd2b87-d000-408b-8d04-25fc0fa512d1cell_id$0dbd2b87-d000-408b-8d04-25fc0fa512d1codeKfigure_8_4′(;ntrials = 10, ϵ = 0.2f0, α = 1.0f0, κ = 0.0001f0, n = 50)metadatashow_logsèdisabled®skip_as_script«code_folded$33f66659-1a87-4890-9137-dbc7776a19d8cell_id$33f66659-1a87-4890-9137-dbc7776a19d8codefunction make_greedy_policy!(π::Matrix{T}, mdp::FiniteMDP{T, S, A}, V::Vector{T}, γ::T) where {T<:Real,S,A}
	for i_s in eachindex(mdp.states)
		maxv = -Inf
		for i_a in eachindex(mdp.actions)
			x = zero(T)
			for i_r in eachindex(mdp.rewards)
				for i_s′ in eachindex(V)
					x += mdp.ptf[i_s′, i_r, i_a, i_s] * (mdp.rewards[i_r] + γ * V[i_s′])
				end
			end
			maxv = max(maxv, x)
			π[i_a, i_s] = x
		end
		π[:, i_s] .= (π[:, i_s] .≈ maxv)
		π[:, i_s] ./= sum(π[:, i_s])
	end
	return π
endmetadatashow_logsèdisabled®skip_as_script«code_folded$269f4505-e807-446c-8fd8-3458482e00abcell_id$269f4505-e807-446c-8fd8-3458482e00abcode
function tabular_dynaQplus′(mdp::MDP_TD{S, A, F, G, H}, α::T, γ::T; 
	num_episodes = 1000, max_steps = 10000, n = 100, qinit = zero(T), ϵinit = one(T)/10, 
	Qinit = initialize_state_action_value(mdp; qinit=qinit), πinit = create_ϵ_greedy_policy(Qinit, ϵinit), 
	decay_ϵ = false, history_state::S = first(mdp.states), 
	save_history = false, update_policy! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ), 
	history = zeros(Int64, length(mdp.actions), length(mdp.states)),
	#each column contains the index of the state reached from the state represented by the column index while taking the action represented by the row index.  the values are initialized to produce transitions to the original state
	state_transition_map = mapreduce(i_s -> i_s .* ones(Int64, length(mdp.actions)), hcat, eachindex(mdp.states)),
	#each column contains the reward received from the state represented by the column index while taking the action represented by the row index.  the state_transition_map can be used to determine if any of these values have been updated from the zero initialization
	reward_transition_map = zeros(T, length(mdp.actions), length(mdp.states)),
	κ = 0.1f0, 
	init_step = 0) where {S, A, F, G, H, T<:AbstractFloat}

	π = copy(πinit)
	Q = copy(Qinit)
	ϵ = ϵinit
	terminds = findall(mdp.isterm(s) for s in mdp.states)
	Q[:, terminds] .= zero(T)
	
	vhold = zeros(T, length(mdp.actions))
	#keep track of rewards per step and steps per episode
	rewards = zeros(T, max_steps)
	steps = zeros(Int64, num_episodes)

	function updateQ!(Q, i_s, i_a, i_s′, r)
		qmax = maximum(Q[i, i_s′] for i in eachindex(mdp.actions))
		Q[i_a, i_s] += α*(r + γ*qmax - Q[i_a, i_s])
	end

	function q_planning!(Q, history)
		for _ in 1:n
			i_s = ceil(Int64, rand()*length(mdp.states))
			i_a = ceil(Int64, rand()*length(mdp.actions))
			i_s′ = state_transition_map[i_a, i_s]
			r = reward_transition_map[i_a, i_s]
			updateQ!(Q, i_s, i_a, i_s′, r)
		end
	end

	step = 1
	ep = 1
	while (ep <= num_episodes) && (step <= max_steps)
		s = mdp.state_init()
		l = 0
		
		while !mdp.isterm(s) && step <= max_steps
			(i_s, i_s′, r, s′, a, i_a) = takestep(mdp, π, s)
			updateQ!(Q, i_s, i_a, i_s′, r)
			state_transition_map[i_a, i_s] = i_s′
			reward_transition_map[i_a, i_s] = r
			
			#save the step for which that state action pair was visited
			history[i_a, i_s] = step + init_step
			rewards[step] = r
			q_planning!(Q, history)
			step += 1
			π .= Q .+ κ .* sqrt.(T.(step .+ init_step .- history))
			π = create_greedy_policy(π; π = π)
			s = s′
			l += 1
			
		end
		steps[ep] = l
		
		ep += 1
	end
	return Q, steps, rewards, history, state_transition_map, reward_transition_map
endmetadatashow_logsèdisabled®skip_as_script«code_folded$037f1804-b24e-46e7-b2a8-6747e669db66cell_id$037f1804-b24e-46e7-b2a8-6747e669db66code?makelookup(v::Vector) = Dict(x => i for (i, x) in enumerate(v))metadatashow_logsèdisabled®skip_as_script«code_folded$c1ff1bea-649c-4483-b4be-55134f0e8cb7cell_id$c1ff1bea-649c-4483-b4be-55134f0e8cb7codeكfunction sample_action(π::Matrix{T}, i_s::Integer) where T<:AbstractFloat
	(n, m) = size(π)
	sample(1:n, weights(π[:, i_s]))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$7ae23e8e-d554-4d26-a08a-83dab507af13cell_id$7ae23e8e-d554-4d26-a08a-83dab507af13codeُinitialize_state_action_value(mdp::MDP_TD; qinit::T = 0.0f0) where T<:AbstractFloat = ones(T, length(mdp.actions), length(mdp.states)) .* qinitmetadatashow_logsèdisabled®skip_as_script«code_folded$26fe0c28-8f0f-4cff-87fb-76f04fce1be1cell_id$26fe0c28-8f0f-4cff-87fb-76f04fce1be1code#md"""
> ### *Exercise 8.3* 
> Careful inspection of Figure 8.5 reveals that the difference between Dyna-Q+ and Dyna-Q narrowed slightly over the first part of the experiment. What is the reason for this?

As long as the environment isn't changing, no matter how small ϵ is both algorithms will converge to the optimal policy as long as $\alpha$, $\kappa$, and $\tau$ converge to 0.  For a given value of $\epsilon$, the Dyna-Q+ agent will take more exploratory actions due to the modified rewards updating the Q function.  If both agents have converged to close to the optimal policy at this point, then the agent which follows a more expoitative policy will produce higher rewards.  In this case, the extra exploration of Dyna-Q+ is not beneficial and its relative performance to Dyna-Q degrades.
	"""metadatashow_logsèdisabled®skip_as_script«code_folded$98547223-05a6-43da-80b2-63c67d2de283cell_id$98547223-05a6-43da-80b2-63c67d2de283code!figure_8_5(;ntrials = 10, n = 10)metadatashow_logsèdisabled®skip_as_script«code_folded$4b3604db-0c1b-4770-95b1-5f5bb34d071bcell_id$4b3604db-0c1b-4770-95b1-5f5bb34d071bcode:function addelements(e1, e2)
	@htl("""
	$e1
	$e2
	""")
endmetadatashow_logsèdisabled®skip_as_script«code_folded$143fff7d-0bb2-43b4-b810-53784fe848bdcell_id$143fff7d-0bb2-43b4-b810-53784fe848bdcodefunction q_learning(mdp::MDP_TD{S, A, F, G, H}, α::T, γ::T; num_episodes = 1000, qinit = zero(T), ϵinit = one(T)/10, Qinit = initialize_state_action_value(mdp; qinit=qinit), πinit = create_ϵ_greedy_policy(Qinit, ϵinit), decay_ϵ = false, history_state::S = first(mdp.states), save_history = false, update_policy! = (v, ϵ, s) -> make_ϵ_greedy_policy!(v, ϵ)) where {S, A, F, G, H, T<:AbstractFloat}
	terminds = findall(mdp.isterm(s) for s in mdp.states)
	Q = copy(Qinit)
	Q[:, terminds] .= zero(T)
	π = copy(πinit)
	vhold = zeros(T, length(mdp.actions))
	#keep track of rewards and steps per episode as a proxy for training speed
	rewards = zeros(T, num_episodes)
	steps = zeros(Int64, num_episodes)
	
	if save_history
		history_actions = Vector{A}(undef, num_episodes)
	end
	
	for ep in 1:num_episodes
		ϵ = decay_ϵ ? ϵinit/ep : ϵinit
		s = mdp.state_init()
		rtot = zero(T)
		l = 0
		while !mdp.isterm(s)
			(i_s, i_s′, r, s′, a, i_a) = takestep(mdp, π, s)
			if save_history && (s == history_state)
				history_actions[ep] = a
			end
			qmax = maximum(Q[i, i_s′] for i in eachindex(mdp.actions))
			Q[i_a, i_s] += α*(r + γ*qmax - Q[i_a, i_s])
			
			#update terms for next step
			vhold .= Q[:, i_s]
			update_policy!(vhold, ϵ, s)
			π[:, i_s] .= vhold
			s = s′
			
			l+=1
			rtot += r
		end
		steps[ep] = l
		rewards[ep] = rtot
	end

	save_history && return Q, π, steps, rewards, history_actions
	return Q, π, steps, rewards
endmetadatashow_logsèdisabled®skip_as_script«code_folded$6778296c-ab05-47e7-86d2-e98c075a8a0ccell_id$6778296c-ab05-47e7-86d2-e98c075a8a0ccodefunction begin_value_iteration_q(mdp::M, γ::T, Q::Matrix{T}; θ = eps(zero(T)), nmax=typemax(Int64)) where {T<:Real, M <: CompleteMDP{T, S, A} where {S, A}}
	value_iteration_q!(Q, θ, mdp, γ, nmax)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$c04c803c-cdca-4b8b-9c9d-e456ee677906cell_id$c04c803c-cdca-4b8b-9c9d-e456ee677906codebegin
	const maze_walls = Set(GridworldState(x, y) for (x, y) in [(3, 3), (3, 4), (3, 5), (6, 2), (8, 4), (8, 5), (8, 6)])
	const dyna_maze = make_gridworld(;xmax = 9, ymax = 6, sterm = GridworldState(9, 6), iswall = s -> in(s, maze_walls))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$9d69687a-8df6-4e74-aa99-fbfcc84bcccfcell_id$9d69687a-8df6-4e74-aa99-fbfcc84bcccfcodeqconst rook_action_display = @htl("""
<div style = "display: flex; flex-direction: column; align-items: center; justify-content: center; color: black; background-color: rgba(100, 100, 100, 0.1);">
	<div style = "display: flex; align-items: center; justify-content: center;">
	<div class = "downarrow" style = "transform: rotate(90deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(180deg);"></div>
	<div class = "downarrow" style = "position: absolute; transform: rotate(270deg);"></div>
	<div class = "downarrow" style = "position: absolute;"></div>
	</div>
	<div>Actions</div>
</div>
""")metadatashow_logsèdisabled®skip_as_script«code_folded$16c68a13-c295-4a64-bc2b-2ae8451f332fcell_id$16c68a13-c295-4a64-bc2b-2ae8451f332fcode#function bellman_optimal_value!(V::Vector{T}, mdp::FiniteDeterministicMDP{T, S, A}, γ::T) where {T <: Real, S, A}
	delt = zero(T)
	@inbounds @fastmath @simd for i_s in eachindex(mdp.states)
		maxvalue = typemin(T)
		@inbounds @fastmath @simd for i_a in eachindex(mdp.actions)
			i_s′ = mdp.state_transition_map[i_a, i_s]
			r = mdp.reward_transition_map[i_a, i_s]
			x = r + γ*V[i_s′]
			maxvalue = max(maxvalue, x)
		end
		delt = max(delt, abs(maxvalue - V[i_s]) / (eps(abs(V[i_s])) + abs(V[i_s])))
		V[i_s] = maxvalue
	end
	return delt
endmetadatashow_logsèdisabled®skip_as_script«code_folded$fb00aedd-e103-4463-b4f8-d0dce6275c64cell_id$fb00aedd-e103-4463-b4f8-d0dce6275c64codefunction example_8_4(;α = 1f0, n = 5, γ = 0.95f0, samples = 2, maze_scales = [1, 1.25, 1.5, 2])
	function get_optimal_steps(algo, mdp, optimal_steps)
		updates_until_optimal = 0
		for s in 1:samples
			Random.seed!(s)
			out = algo(mdp, α, γ; n = n, ϵinit = 0.1f0, isoptimal = l -> l == optimal_steps)
			updates_until_optimal += last(out)
		end
		return updates_until_optimal / samples
	end

	mazes = [make_dyna_maze(s) for s in maze_scales]

	function make_trace(algo, name)
		y = mazes |> Map(maze -> get_optimal_steps(algo, maze.maze, maze.optimal_length)) |> tcollect
		x = [length(maze.maze.states) for maze in mazes]
		scatter(x = x, y = y, name = name)
	end
	
	traces = [make_trace(prioritized_sweeping_deterministic, "prioritized sweeping"), make_trace(tabular_dynaQ, "Dyna-Q")]
	plot(traces, Layout(yaxis_type = "log", xaxis_type = "log", xaxis_title = "Maze States", yaxis_title = "Updates until optimal solution"))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$e43513e8-2517-43b7-9a16-e57d4125edc4cell_id$e43513e8-2517-43b7-9a16-e57d4125edc4codeWrunepisode(mdp::MDP_MC; kwargs...) = runepisode(mdp, s -> rand(mdp.actions); kwargs...)metadatashow_logsèdisabled®skip_as_script«code_folded$df62fd47-6627-4931-b429-964c65960446cell_id$df62fd47-6627-4931-b429-964c65960446codetfunction figure_8_7(;bvec = [2, 10, 100, 1000, 10_000])
	traces = [begin
		t = 1:2*b
		error_reduction = sqrt.((b-1) ./ (b.*t))
		scatter(x = [0; t ./ b], y = [1; error_reduction], name = "b = $b")
	end
	for b in bvec]
	ex_update_trace = scatter(x = [0, 1, 1, 2], y = [1, 1, 0, 0], name = "expected updates", mode = "lines", line_color = "gray")
	md"""
	### Figure 8.7: 
	Comparison of efficiency of expected and sample updates
	$(plot([traces; ex_update_trace], Layout(yaxis_title = "RMS error in value estimates", xaxis=attr(title = "Number of max Q computations", tickvals = [0, 1, 2], ticktext = [0, "1b", "2b"]))))
	"""
endmetadatashow_logsèdisabled®skip_as_script«code_folded$321bdf5a-bff7-4181-986f-d3884ea96d27cell_id$321bdf5a-bff7-4181-986f-d3884ea96d27codemd"""
# Dependencies
"""metadatashow_logsèdisabled®skip_as_script«code_folded$82e1ceb8-b1bb-4dea-b041-bf462041793fcell_id$82e1ceb8-b1bb-4dea-b041-bf462041793fcode#function make_greedy_policy!(π::Matrix{T}, mdp::FiniteStochasticMDP{T, S, A}, V::Vector{T}, γ::T) where {T<:Real,S,A}
	for i_s in eachindex(mdp.states)
		maxv = -Inf
		for i_a in eachindex(mdp.actions)
			r_avg = zero(T)
			v_avg = zero(T)
			ptf = mdp.ptf[(i_a, i_s)]
			for i_s′ in keys(ptf)
				p = ptf[i_s′][1]
				v_avg += p*V[i_s′]
				r_avg += p*ptf[i_s′][2]
			end
			x = r_avg + γ*v_avg
			maxv = max(maxv, x)
			π[i_a, i_s] = x
		end
		π[:, i_s] .= (π[:, i_s] .≈ maxv)
		π[:, i_s] ./= sum(π[:, i_s])
	end
	return π
endmetadatashow_logsèdisabled®skip_as_script«code_folded$5e49504e-9623-48f9-aeb5-360906b92a09cell_id$5e49504e-9623-48f9-aeb5-360906b92a09codeGvholdtest = [[1f0, 1f0, 1f0]; fill(Inf32, length(nyt_valid_words) - 3)]metadatashow_logsèdisabled®skip_as_script«code_folded$2ff6d187-e06f-47b5-9834-d06bfc820c26cell_id$2ff6d187-e06f-47b5-9834-d06bfc820c26codeffunction figure_8_4(; max_steps1 = 1000, max_steps2 = 2000, ntrials = 10, n = 10, α = 0.1f0, ϵ = 0.1f0)
	y = zeros(max_steps1 + max_steps2)
	x = 1:(max_steps1 + max_steps2)
	for _ in 1:ntrials
		(Q, steps, rewards, history, stm, rtm) = tabular_dynaQ(blocking_maze1, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps1, n = n)
		(Q2, steps2, rewards2, _, _) = tabular_dynaQ(blocking_maze2, α, 0.95f0; ϵinit = ϵ, max_steps = max_steps2, n = n, Qinit = Q, history = history, state_transition_map = stm, reward_transition_map = rtm)
		y .+= cumsum([rewards; rewards2])
	end
	plot(scatter(x = x, y = y ./ ntrials))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$c31f4646-aa8a-41e3-9c68-ae8a349d4ed1cell_id$c31f4646-aa8a-41e3-9c68-ae8a349d4ed1codetfigure_8_4′′(;ntrials = 10, ϵ = 0.1f0, α = 1.0f0, κ = 0.0001f0, n = 50, max_steps1 = 1000, max_steps2 = 2000)metadatashow_logsèdisabled®skip_as_script«code_folded$dab6eac0-7958-4d3a-a1af-781fb57e7adbcell_id$dab6eac0-7958-4d3a-a1af-781fb57e7adbcodemd"""
### Example 8.3: Shortcut Maze

The problem of an incorrect model can be even worse in the case of an improvement to the environment.  The following example illustrates the problem in which a maze is at first blocked forcing a longer path.  After a certain number of timesteps a shorter path is opened up without disturbing the original path.  The Dyna-Q agent however never learns to switch to the shortcut because the model never reveals it or provides incentive to explore paths that it already thinks are suboptimal.  Even with an ϵ-greedy policy, it is very unlikely that hte agent will take so many exploratory actions as to discover the shortcut.  
"""metadatashow_logsèdisabled®skip_as_script«code_folded$04ea981e-337e-4324-a5cc-178eb3c7605bcell_id$04ea981e-337e-4324-a5cc-178eb3c7605bcode)md"""
## 8.11 Monte Carlo Tree Search
"""metadatashow_logsèdisabled®skip_as_script«code_folded$976ff0c3-54aa-41f0-b963-baf77bea8cb8cell_id$976ff0c3-54aa-41f0-b963-baf77bea8cb8code7md"""
The general problem here is the conflict between exploration and exploitation.  In a planning context, exploration means trying actions that improve the model, whereas exploitation means behaving in the optimal way given the current model.  We want the agent to explore to find changes in the environment, but not so much that performance is greatly degraded.  As in the earlier exploration/exploitation conflict, there probably is no solution that is both perfect and practical, but simple heuristics are often effective.

An example of such a heuristic is that used by the Dyna-Q+ agent which keeps track of how many time steps have elapsed since the state-action pair was last tried in a real interaction with the environment.  The more time that has elapsed, the greater (we might presume) the chance that the dynamics of this pair has changed and that the model is incorrect.  To encourage behavior that tests long-untried actions, a special "bonus reward" is given on simulated experiences involving these actions.  In particular, if the modeled reward for a transition is $r$, and the transition has not been tried in $\tau$ time steps, then planning updates are done as if that transition produced a reward of $r + \kappa \sqrt{\rho}$, for some small $\kappa$.  This encourages the agent to keep testing all accessible state transitions and even to find long sequences of actions in order to carry out such tests.  Of course all this testing has its cost, but in many cases, as in the shortcut maze, this kind of computational curiosity is well worth the extra exploration.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$094321bc-2d44-4e67-9ac6-5216a42e0cd3cell_id$094321bc-2d44-4e67-9ac6-5216a42e0cd3codefunction bellman_policy_update!(Q::Matrix{T}, π::Matrix{T}, i_s::Int64, i_a::Int64, mdp::FiniteStochasticMDP{T, S, A}, γ::T) where {T <: Real, S, A}
	#perform a bellman optimal update for a given state action pair index and return the percentage change in value
	q_avg = zero(T)
	r_avg = zero(T)
	ptf = mdp.ptf[(i_a, i_s)]
	x = zero(T)
	for i_s′ in keys(ptf)
		(p, r) = ptf[i_s′]
		v = zero(T)
		@inbounds @fastmath @simd for i_a′ in eachindex(mdp.actions)
			v += π[i_a′, i_s′] * Q[i_a′, i_s′]
		end
		x += p*(r + γ * v)
	end
	delt = abs(x - Q[i_a, i_s]) / (eps(abs(Q[i_a, i_s])) + abs(Q[i_a, i_s]))
	Q[i_a, i_s] = x
	return delt
endmetadatashow_logsèdisabled®skip_as_script«code_folded$13f08473-f0d8-47d1-aa48-de3e4a083dbfcell_id$13f08473-f0d8-47d1-aa48-de3e4a083dbfcodexfunction simulate!(w::AS, tree_values::Dict{S, Tuple{T, Dict{Int64, Tuple{T, T}}}}, mdp::AfterstateMDP_MC{S, AS, A, F, G, H, I}, γ::T, v_est::Function, depth::Integer, c::T, v_hold, update_tree_policy!, update_tree!, q_hold, apply_bonus!, step_kwargs, transition_kwargs, est_kwargs) where {T<:Real, S, AS, A, F<:Function, G<:Function, H<:Function, I<:Function}
	dist = mdp.afterstate_transition(w; transition_kwargs...) #get the distribution of states following the transition
	k_sample = sample(collect(keys(dist)), weights(collect(values(dist)))) #sample one of the transition states to visit in the tree
	sum(begin
		(r, s) = k
		p = dist[k]
		v′ = simulate!(s, k == k_sample, tree_values, mdp, γ, v_est, depth - 1, c, v_hold, update_tree_policy!, update_tree!, q_hold, apply_bonus!, step_kwargs, transition_kwargs, est_kwargs)
		p * (r + γ * v′) 
	end
	for k in keys(dist))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$f143446c-e44b-4d75-baa7-3b24eafad003cell_id$f143446c-e44b-4d75-baa7-3b24eafad003code
^#need to decide which tree statistics to collect like state values or afterstate values and what expansion means vs normal mcts.  I know that when I visit a new afterstate which is the same as a new action selection, I want to estimate it with a weighted sum of the value estimates of all the sucessor states but I don't necessarily want the tree search to continue down all those paths and split although it could so a single simulation would split into all the successor states avoiding the need to make a selection.  For doing sample updates though, I want to just pick one of those branches to go down by sampling from the distribution so then the simulation function itself should handle the case of an unvisited state which would look at the afterstate values that lead from that state if any exist and well this is the problem is which values should be saved and what does it mean to estimate the value of something for one of the unvisited states
function simulate!(s::S, visit::Bool, tree_values::Dict{S, Tuple{T, Dict{Int64, Tuple{T, T}}}}, mdp::AfterstateMDP_MC{S, AS, A, F, G, H, I}, γ::T, v_est::Function, depth::Integer, c::T, v_hold, update_tree_policy!, update_tree!, q_hold, apply_bonus!, step_kwargs, transition_kwargs, est_kwargs) where {T<:Real, S, AS, A, F<:Function, G<:Function, H<:Function, I<:Function}
	#if the state is terminal, produce a value of 0
	mdp.isterm(s) && return zero(T)

	depth ≤ 0 && return v_est(mdp, s, γ; est_kwargs...)
	
	#for a state where no actions have been attempted, expand a new node
	if !haskey(tree_values, s)
		v = v_est(mdp, s, γ; est_kwargs...)
		tree_values[s] = (v, Dict{Int64, Tuple{T, T}}()) 
		return v
	end

	!visit && return max(tree_values[s][1], maximum(t[2]/t[1] for t in values(tree_values[s][2]); init = zero(T))) #if not visiting this state then just return the best value estimate and do not update the tree values

	#compute value estimates and bonus applies to each potential action
	apply_bonus!(v_hold, tree_values, s, c)
	update_tree_policy!(v_hold, s)

	#select an action from the tree policy
	i_a = sample_action(v_hold)
	a = mdp.actions[i_a]
	r1, w = mdp.afterstate_step(s, a; step_kwargs...) #take a step with the action and get the afterstate
	v_w = simulate!(w, tree_values, mdp, γ, v_est, depth, c, v_hold, update_tree_policy!, update_tree!, q_hold, apply_bonus!, step_kwargs, transition_kwargs, est_kwargs)
	v_a = r1 + v_w #value for the visited action
	update_tree!(tree_values, v_a, s, i_a)
	return max(tree_values[s][1], maximum(t[2]/t[1] for t in values(tree_values[s][2]); init = zero(T))) #the value that was just updated will be included in this maximum
endmetadatashow_logsèdisabled®skip_as_script«code_folded$0899f37c-5def-4d15-8ca3-ebdec8e96b43cell_id$0899f37c-5def-4d15-8ca3-ebdec8e96b43codeIfunction begin_value_iteration_v(mdp::M, γ::T, V::Vector{T}; θ = eps(zero(T)), nmax=typemax(Int64)) where {T<:Real, M <: CompleteMDP{T, S, A} where {S, A}}
	valuelist = [copy(V)]
	value_iteration_v!(V, θ, mdp, γ, nmax, valuelist)

	π = form_random_policy(mdp)
	make_greedy_policy!(π, mdp, V, γ)
	return (valuelist, π)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$94b339bb-6e2d-422f-8043-615e8be9a217cell_id$94b339bb-6e2d-422f-8043-615e8be9a217code	begin
	abstract type CompleteMDP{T<:Real, S, A} end
	struct FiniteMDP{T<:Real, S, A} <: CompleteMDP{T, S, A} 
		states::Vector{S}
		actions::Vector{A}
		rewards::Vector{T}
		# ptf::Dict{Tuple{S, A}, Matrix{T}}
		ptf::Array{T, 4}
		action_scratch::Vector{T}
		state_scratch::Vector{T}
		reward_scratch::Vector{T}
		state_index::Dict{S, Int64}
		action_index::Dict{A, Int64}
		function FiniteMDP{T, S, A}(states::Vector{S}, actions::Vector{A}, rewards::Vector{T}, ptf::Array{T, 4}) where {T <: Real, S, A}
			new(states, actions, rewards, ptf, Vector{T}(undef, length(actions)), Vector{T}(undef, length(states)+1), Vector{T}(undef, length(rewards)), Dict(zip(states, eachindex(states))), Dict(zip(actions, eachindex(actions))))
		end	
	end
	FiniteMDP(states::Vector{S}, actions::Vector{A}, rewards::Vector{T}, ptf::Array{T, 4}) where {T <: Real, S, A} = FiniteMDP{T, S, A}(states, actions, rewards, ptf)
	
	struct FiniteDeterministicMDP{T<:Real, S, A} <: CompleteMDP{T, S, A}
		states::Vector{S}
		actions::Vector{A}
		state_index::Dict{S, Int64}
		action_index::Dict{A, Int64}
		state_transition_map::Matrix{Int64} #index of state reached from the state corresponding to the column when taking action corresponding to the row
		reward_transition_map::Matrix{T} #reward received for the transition from the state corresponding to the column when taking action corresponding to the row
	end
	FiniteDeterministicMDP(states::Vector{S}, actions::Vector{A}, state_transition_map::Matrix{Int64}, reward_transition_map::Matrix{T}) where {T<:Real, S, A} = FiniteDeterministicMDP{T, S, A}(states, actions, makelookup(states), makelookup(actions), state_transition_map, reward_transition_map)
	
	struct FiniteStochasticMDP{T<:Real, S, A} <: CompleteMDP{T, S, A}
		states::Vector{S}
		actions::Vector{A}
		state_index::Dict{S, Int64}
		action_index::Dict{A, Int64}
		ptf::Dict{Tuple{Int64, Int64}, Dict{Int64, Tuple{T, T}}} #for each state action pair index there is a corresponding dictionary mapping each transition state index to the probability of that transition and the average reward received
	end
	FiniteStochasticMDP(states::Vector{S}, actions::Vector{A}, ptf::Dict{Tuple{Int64, Int64}, Dict{Int64, Tuple{T, T}}}) where {T<:Real, S, A} = FiniteStochasticMDP{T, S, A}(states, actions, makelookup(states), makelookup(actions), ptf)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0acell_id$466b1cbf-586f-4b53-8b4b-2dc32e1c8b0acode#perform action selection within an mdp for a given state s, discount factor γ, and state value estimation function v_est.  v_est must be a function that takes the arguments (mdp, s, γ) and produces a reward of the same type as γ
function monte_carlo_tree_search(mdp::MDP{S, A, F, G, H}, γ::T, v_est::Function, s::S; 
	depth = 10, 
	nsims = 100, 
	c = one(T), 
	# visit_counts = Dict{S, SparseVector{T, Int64}}(), 
	visit_counts = Dict{S, Dict{Int64, T}}(),
	# Q = Dict{S, SparseVector{T, Int64}}(),
	Q = Dict{S, Dict{Int64, T}}(),
	update_tree_policy! = (v, s) -> make_greedy_policy!(v), 
	v_hold = zeros(T, length(mdp.actions)),
	updateQ! = function(Q, x, s, i_a)
		# Q[s][i_a] += x
		Q[s][i_a] = get_dict_value(Q[s], i_a) + x
	end,
	updateV! = function(V, x, s, i_a)
		# V[s][i_a] += x
		V[s][i_a] = get_dict_value(V[s], i_a) + x
	end,
	apply_bonus! = apply_uct!,
	make_step_kwargs = k -> NamedTuple(), #option to create mdp step arguments that depend on the simulation number, 
	make_est_kwargs = k -> NamedTuple(), #option to create state estimation arguments that depend on the simulation number
	sim_message = false
	) where {S, A, F, G, H, T<:Real}

	q_hold = zeros(T, length(mdp.actions))
	#I want to have a way of possible a kwargs such as the answer index to the simulator that can change with each simulation
	t = time()
	last_time = t
	for k in 1:nsims
		seed = rand(UInt64)
		if sim_message
			elapsed = time() - last_time
			if elapsed > 5
				last_time = time()
				pct_done = k/nsims
				total_time = time() - t
				ett = total_time / pct_done
				eta = ett - total_time
				@info """Completed simulation $k of $nsims after $(round(Int64, total_time/60)) minutes
				ETA: $(round(Int64, eta/60)) minutes"""
			end
		end
		simulate!(visit_counts, Q, mdp, γ, v_est, s, depth, c, v_hold, update_tree_policy!, updateQ!, updateV!, q_hold, apply_bonus!, make_step_kwargs(seed), make_est_kwargs(seed))
	end

	minv = minimum(Q[s][k] for k in keys(Q[s]))
	# v_hold .= Q[s]
	for i in eachindex(v_hold)
		v_hold[i] = get_dict_value(Q[s], i; default = minv)
	end
	make_greedy_policy!(v_hold)
	if sim_message
		@info "Finished MCTS evaluation of state $s"
	end
	return mdp.actions[sample_action(v_hold)], visit_counts, Q
endmetadatashow_logsèdisabled®skip_as_script«code_folded$dff6f326-ab7e-45e5-8c5e-28bfbb1d99bccell_id$dff6f326-ab7e-45e5-8c5e-28bfbb1d99bccodemd"""
### Example 8.4: Prioritized Sweeping on Mazes

Consider different mazes with the same wall structure as the Dyna Maze example but scaled up to different resolutions.  Some example mazes are shown below.
"""metadatashow_logsèdisabled®skip_as_script«code_folded$81f2f335-6606-4506-bfb3-d0d95e651f24cell_id$81f2f335-6606-4506-bfb3-d0d95e651f24codefunction bellman_optimal_update!(Q::Matrix{T}, i_s::Int64, i_a::Int64, mdp::FiniteStochasticMDP{T, S, A}, γ::T) where {T <: Real, S, A}
	#perform a bellman optimal update for a given state action pair index and return the percentage change in value
	q_avg = zero(T)
	r_avg = zero(T)
	ptf = mdp.ptf[(i_a, i_s)]
	x = zero(T)
	for i_s′ in keys(ptf)
		(p, r) = ptf[i_s′]
		maxvalue = typemin(T)
		@inbounds @fastmath @simd for i_a′ in eachindex(mdp.actions)
			maxvalue = max(maxvalue, Q[i_a′, i_s′])
		end
		x += p*(r + γ * maxvalue)
	end
	delt = abs(x - Q[i_a, i_s]) / (eps(abs(Q[i_a, i_s])) + abs(Q[i_a, i_s]))
	Q[i_a, i_s] = x
	return delt
endmetadatashow_logsèdisabled®skip_as_script«code_folded$aa898360-f802-438a-9081-a2e517230db2cell_id$aa898360-f802-438a-9081-a2e517230db2codefunction apply_uct!(v_hold::Vector{T}, q_ests::Dict{S, Dict{Int64, T}}, counts::Dict{S, Dict{Int64, T}}, s::S, c::T) where {S, T<:Real}
	ntot = sum(values(counts[s]))
	#for normal UCB selection, unvisited states have an infinite bonus
	v_hold .= T(Inf)
	@inbounds @fastmath for i in keys(q_ests[s])
		#note that the only bonus values computed here are for actions that have been visited
		v_hold[i] = q_ests[s][i] + c * uct(counts, s, i, ntot)
	end
	return v_hold
endmetadatashow_logsèdisabled®skip_as_script«code_folded$2c587d5b-7b62-4835-ad02-9575c13d5874cell_id$2c587d5b-7b62-4835-ad02-9575c13d5874codefunction show_mcts_solution()
	# visit_counts = Dict{GridworldState, SparseVector{Float32, Int64}}()
	visit_counts = Dict{GridworldState, Dict{Int64, Float32}}()
	# Q = Dict{GridworldState, SparseVector{Float32, Int64}}()
	Q = Dict{GridworldState, Dict{Int64, Float32}}()
	plot_path(dyna_maze, s -> monte_carlo_tree_search(dyna_maze, 0.95f0, rollout(;max_steps = 100),  s; nsims = 100, depth = 100, c = 1.0f0, visit_counts = visit_counts, Q = Q)[1]; max_steps = 1000, iswall = s -> in(s, maze_walls))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$a8ec05ad-8333-4423-ab42-883ab806ebd7cell_id$a8ec05ad-8333-4423-ab42-883ab806ebd7code^function uniform_bellman_optimal_value!(Q::Matrix{T}, mdp::FiniteStochasticMDP{T, S, A}, γ::T) where {T <: Real, S, A}
	delt = zero(T)
	num_updates = 0
	for i_s in eachindex(mdp.states)
		for i_a in eachindex(mdp.actions)
			delt = max(delt, bellman_optimal_update!(Q, i_s, i_a, mdp, γ))
			num_updates += 1
		end
	end
	return delt, num_updates
endmetadatashow_logsèdisabled®skip_as_script«code_folded«notebook_id$3ee53c46-38f7-11f0-16c9-2b093684d981in_temp_dir¨metadata