13376 lines
1.2 MiB
13376 lines
1.2 MiB
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Chapter 16 – Reinforcement Learning**"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This notebook contains all the sample code and solutions to the exersices in chapter 16."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Setup"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"First, let's make sure this notebook works well in both python 2 and 3, import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# To support both python 2 and python 3\n",
|
||
"from __future__ import division, print_function, unicode_literals\n",
|
||
"\n",
|
||
"# Common imports\n",
|
||
"import numpy as np\n",
|
||
"import os\n",
|
||
"import sys\n",
|
||
"\n",
|
||
"# to make this notebook's output stable across runs\n",
|
||
"def reset_graph(seed=42):\n",
|
||
" tf.reset_default_graph()\n",
|
||
" tf.set_random_seed(seed)\n",
|
||
" np.random.seed(seed)\n",
|
||
"\n",
|
||
"# To plot pretty figures and animations\n",
|
||
"%matplotlib nbagg\n",
|
||
"import matplotlib\n",
|
||
"import matplotlib.animation as animation\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"plt.rcParams['axes.labelsize'] = 14\n",
|
||
"plt.rcParams['xtick.labelsize'] = 12\n",
|
||
"plt.rcParams['ytick.labelsize'] = 12\n",
|
||
"\n",
|
||
"# Where to save the figures\n",
|
||
"PROJECT_ROOT_DIR = \".\"\n",
|
||
"CHAPTER_ID = \"rl\"\n",
|
||
"\n",
|
||
"def save_fig(fig_id, tight_layout=True):\n",
|
||
" path = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID, fig_id + \".png\")\n",
|
||
" print(\"Saving figure\", fig_id)\n",
|
||
" if tight_layout:\n",
|
||
" plt.tight_layout()\n",
|
||
" plt.savefig(path, format='png', dpi=300)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note: there may be minor differences between the output of this notebook and the examples shown in the book. You can safely ignore these differences. They are mainly due to the fact that most of the environments provided by OpenAI gym have some randomness."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Introduction to OpenAI gym"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In this notebook we will be using [OpenAI gym](https://gym.openai.com/), a great toolkit for developing and comparing Reinforcement Learning algorithms. It provides many environments for your learning *agents* to interact with. Let's start by importing `gym`:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import gym"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Next we will load the MsPacman environment, version 0."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"env = gym.make('MsPacman-v0')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's initialize the environment by calling is `reset()` method. This returns an observation:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"obs = env.reset()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Observations vary depending on the environment. In this case it is an RGB image represented as a 3D NumPy array of shape [width, height, channels] (with 3 channels: Red, Green and Blue). In other environments it may return different objects, as we will see later."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(210, 160, 3)"
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"obs.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"An environment can be visualized by calling its `render()` method, and you can pick the rendering mode (the rendering options depend on the environment). In this example we will set `mode=\"rgb_array\"` to get an image of the environment as a NumPy array:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"img = env.render(mode=\"rgb_array\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's plot this image:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAMgCAYAAACwGEg9AAAgAElEQVR4XuzdMa5kWZIe6MdlBBA6lQEFAgSoNEGFAAVqVChxC0WxltDixBYojZLaCANQIaaVAQZoYUCFegK9jBpEkpWIKvbLvGbux/x3ux8lovoeP8c+s+t5/vciMv/Jh/9HgAABAgQIECBAgAABAgQIvFzgn7z8BA5AgAABAgQIECBAgAABAgQIfAjohoAAAQIECBAgQIAAAQIECAQICOgBTXAEAgQIECBAgAABAgQIECAgoJsBAgQIECBAgAABAgQIECAQICCgBzTBEQgQIECAAAECBAgQIECAgIBuBggQIECAAAECBAgQIECAQICAgB7QBEcgQIAAAQIECBAgQIAAAQICuhkgQIAAAQIECBAgQIAAAQIBAgJ6QBMcgQABAgQIECBAgAABAgQICOhmgAABAgQIECBAgAABAgQIBAgI6AFNcAQCBAgQIECAAAECBAgQICCgmwECBAgQIECAAAECBAgQIBAgIKAHNMERCBAgQIAAAQIECBAgQICAgG4GCBAgQIAAAQIECBAgQIBAgICAHtAERyBAgAABAgQIECBAgAABAgK6GSBAgAABAgQIECBAgAABAgECAnpAExyBAAECBAgQIECAAAECBAgI6GaAAAECBAgQIECAAAECBAgECAjoAU1wBAIECBAgQIAAAQIECBAgIKCbAQIECBAgQIAAAQIECBAgECAgoAc0wREIECBAgAABAgQIECBAgICAbgYIECBAgAABAgQIECBAgECAgIAe0ARHIECAAAECBAgQIECAAAECAroZIECAAAECBAgQIECAAAECAQICekATHIEAAQIECBAgQIAAAQIECAjoZoAAAQIECBAgQIAAAQIECAQICOgBTXAEAgQIECBAgAABAgQIECAgoJsBAgQIECBAgAABAgQIECAQICCgBzTBEQgQIECAAAECBAgQIECAgIBuBggQIECAAAECBAgQIECAQICAgB7QBEcgQIAAAQIECBAgQIAAAQICuhkgQIAAAQIECBAgQIAAAQIBAgJ6QBMcgQABAgQIECBAgAABAgQICOhmgAABAgQIECBAgAABAgQIBAgI6AFNcAQCBAgQIECAAAECBAgQICCgmwECBAgQIECAAAECBAgQIBAgIKAHNMERCBAgQIAAAQIECBAgQICA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\" width=\"500\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Saving figure MsPacman\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.figure(figsize=(5,4))\n",
|
||
"plt.imshow(img)\n",
|
||
"plt.axis(\"off\")\n",
|
||
"save_fig(\"MsPacman\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Welcome back to the 1980s! :)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In this environment, the rendered image is simply equal to the observation (but in many environments this is not the case):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"True"
|
||
]
|
||
},
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"(img == obs).all()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's create a little helper function to plot an environment:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def plot_environment(env, figsize=(5,4)):\n",
|
||
" plt.close() # or else nbagg sometimes plots in the previous cell\n",
|
||
" plt.figure(figsize=figsize)\n",
|
||
" img = env.render(mode=\"rgb_array\")\n",
|
||
" plt.imshow(img)\n",
|
||
" plt.axis(\"off\")\n",
|
||
" plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's see how to interact with an environment. Your agent will need to select an action from an \"action space\" (the set of possible actions). Let's see what this environment's action space looks like:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Discrete(9)"
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"env.action_space"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"`Discrete(9)` means that the possible actions are integers 0 through 8, which represents the 9 possible positions of the joystick (0=center, 1=up, 2=right, 3=left, 4=down, 5=upper-right, 6=upper-left, 7=lower-right, 8=lower-left)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Next we need to tell the environment which action to play, and it will compute the next step of the game. Let's go left for 110 steps, then lower left for 40 steps:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"env.reset()\n",
|
||
"for step in range(110):\n",
|
||
" env.step(3) #left\n",
|
||
"for step in range(40):\n",
|
||
" env.step(8) #lower-left"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Where are we now?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAMgCAYAAACwGEg9AAAgAElEQVR4XuzdQaoteZIf6FfLCHhr0EDQE0FpIBBoXqBthIa5hBr220ZBzBsEGnRBTRpqoDUk5DKieRGKyJeR97x77Fwz95+5fz1qlH7MzT8zP/n/3Xvz1T988v8RIECAAAECBAgQIECAAAECpwv8w+kdaIAAAQIECBAgQIAAAQIECBD4JKBbAgIECBAgQIAAAQIECBAgECAgoAcMQQsECBAgQIAAAQIECBAgQEBAtwMECBAgQIAAAQIECBAgQCBAQEAPGIIWCBAgQIAAAQIECBAgQICAgG4HCBAgQIAAAQIECBAgQIBAgICAHjAELRAgQIAAAQIECBAgQIAAAQHdDhAgQIAAAQIECBAgQIAAgQABAT1gCFogQIAAAQIECBAgQIAAAQICuh0gQIAAAQIECBAgQIAAAQIBAgJ6wBC0QIAAAQIECBAgQIAAAQIEBHQ7QIAAAQIECBAgQIAAAQIEAgQE9IAhaIEAAQIECBAgQIAAAQIECAjodoAAAQIECBAgQIAAAQIECAQICOgBQ9ACAQIECBAgQIAAAQIECBAQ0O0AAQIECBAgQIAAAQIECBAIEBDQA4agBQIECBAgQIAAAQIECBAgIKDbAQIECBAgQIAAAQIECBAgECAgoAcMQQsECBAgQIAAAQIECBAgQEBAtwMECBAgQIAAAQIECBAgQCBAQEAPGIIWCBAgQIAAAQIECBAgQICAgG4HCBAgQIAAAQIECBAgQIBAgICAHjAELRAgQIAAAQIECBAgQIAAAQHdDhAgQIAAAQIECBAgQIAAgQABAT1gCFogQIAAAQIECBAgQIAAAQICuh0gQIAAAQIECBAgQIAAAQIBAgJ6wBC0QIAAAQIECBAgQIAAAQIEBHQ7QIAAAQIECBAgQIAAAQIEAgQE9IAhaIEAAQIECBAgQIAAAQIECAjodoAAAQIECBAgQIAAAQIECAQICOgBQ9ACAQIECBAgQIAAAQIECBAQ0O0AAQIECBAgQIAAAQIECBAIEBDQA4agBQIECBAgQIAAAQIECBAgIKDbAQIECBAgQIAAAQIECBAgECAgoAcMQQsECBAgQIAAAQIECBAgQEBAtwMECBAgQIAAAQIECBAgQCBAQEAPGIIWCBAgQIAAAQIECBAgQICAgG4HCBAgQIAAAQIECBAgQIBAgICAHjAELRAgQIAAAQIECBAgQIAAAQHdDhAgQIAAAQIECBAgQIAAgQABAT1gCFogQIAAAQIECBAgQIAAAQICuh0gQIAAAQIECBAgQIAAAQIBAgJ6wBC0QIAAAQIECBAgQIAAAQIEBHQ7QIAAAQIECBAgQIAAAQIEAgQE9IAhaIEAAQIECBAgQIAAAQIECAjodoAAAQIECBAgQIAAAQIECAQICOgBQ9ACAQIECBAgQIAAAQIECBAQ0O0AAQIECBAgQIAAAQIECBAIEBDQA4agBQIECBAgQIAAAQIECBAgIKDbAQIECBAgQIAAAQIECBAgECAgoAcMQQsECBAgQIAAAQIECBAgQEBAtwMECBAgQIAAAQIECBAgQCBAQEAPGIIWCBAgQIAAAQIECBAgQICAgG4HCBAgQIAAAQIECBAgQIBAgICAHjAELRAgQIAAAQIECBAgQIAAAQHdDhAgQIAAAQIECBAgQIAAgQABAT1gCFogQIAAAQIECBAgQIAAAQICuh0gQIAAAQIECBAgQIAAAQIBAgJ6wBC0QIAAAQIECBAgQIAAAQIEBHQ7QIAAAQIECBAgQIAAAQIEAgQE9IAhaIEAAQIECBAgQIAAAQIECAjodoAAAQIECBAgQIAAAQIECAQICOgBQ9ACAQIECBAgQIAAAQIECBAQ0O0AAQIECBAgQIAAAQIECBAIEBDQA4agBQIECBAgQIAAAQIECBAgIKDbAQIECBAgQIAAAQIECBAgECAgoAcMQQsECBAgQIAAAQIECBAgQEBAtwMECBAgQIAAAQIECBAgQCBAQEAPGIIWCBAgQIAAAQIECBAgQICAgG4HCBAgQIAAAQIECBAgQIBAgICAHjAELRAgQIAAAQIECBAgQIAAAQHdDhAgQIAAAQIECBAgQIAAgQABAT1gCFogQIAAAQIECBAgQIAAAQICuh0gQIAAAQIECBAgQIAAAQIBAgJ6wBC0QIAAAQIECBAgQIAAAQIEBHQ7QIAAAQIECBAgQIAAAQIEAgQE9IAhaIEAAQIECBAgQIAAAQIECAjodoAAAQIECBAgQIAAAQIECAQICOgBQ9ACAQIECBAgQIAAAQIECBAQ0O0AAQIECBAgQIAAAQIECBAIEBDQA4agBQIECBAgQIAAAQIECBAgIKDbAQIECBAgQIAAAQIECBAgECAgoAcMQQsE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\" width=\"500\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_environment(env)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The `step()` function actually returns several important objects:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"obs, reward, done, info = env.step(0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The observation tells the agent what the environment looks like, as discussed earlier. This is a 210x160 RGB image:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(210, 160, 3)"
|
||
]
|
||
},
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"obs.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The environment also tells the agent how much reward it got during the last step:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0.0"
|
||
]
|
||
},
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"reward"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"When the game is over, the environment returns `done=True`:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"False"
|
||
]
|
||
},
|
||
"execution_count": 16,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"done"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Finally, `info` is an environment-specific dictionary that can provide some extra information about the internal state of the environment. This is useful for debugging, but your agent should not use this information for learning (it would be cheating)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'ale.lives': 3}"
|
||
]
|
||
},
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"info"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's play one full game (with 3 lives), by moving in random directions for 10 steps at a time, recording each frame:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"frames = []\n",
|
||
"\n",
|
||
"n_max_steps = 1000\n",
|
||
"n_change_steps = 10\n",
|
||
"\n",
|
||
"obs = env.reset()\n",
|
||
"for step in range(n_max_steps):\n",
|
||
" img = env.render(mode=\"rgb_array\")\n",
|
||
" frames.append(img)\n",
|
||
" if step % n_change_steps == 0:\n",
|
||
" action = env.action_space.sample() # play randomly\n",
|
||
" obs, reward, done, info = env.step(action)\n",
|
||
" if done:\n",
|
||
" break"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now show the animation (it's a bit jittery within Jupyter):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def update_scene(num, frames, patch):\n",
|
||
" patch.set_data(frames[num])\n",
|
||
" return patch,\n",
|
||
"\n",
|
||
"def plot_animation(frames, repeat=False, interval=40):\n",
|
||
" plt.close() # or else nbagg sometimes plots in the previous cell\n",
|
||
" fig = plt.figure()\n",
|
||
" patch = plt.imshow(frames[0])\n",
|
||
" plt.axis('off')\n",
|
||
" return animation.FuncAnimation(fig, update_scene, fargs=(frames, patch), frames=len(frames), repeat=repeat, interval=interval)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4XuzdMa4n15In5mpbKyBQOxAwkN2ARhsYb5yxZgt03xKeW1sYSw49bUBqQLYgoHdAoFcgm8Itvse6LN5bNzMy8uSJiK/dzsxz4ovILJ7f+xf5L5/8HwECBAgQIECAAAECBAgQIECAAAECbQX+pW1lCiNAgAABAgQIECBAgAABAgQIECBA4JMA0BAQIECAAAECBAgQIECAAAECBAgQaCwgAGzcXKURIECAAAECBAgQIECAAAECBAgQEACaAQIECBAgQIAAAQIECBAgQIAAAQKNBQSAjZurNAIECBAgQIAAAQIECBAgQIAAAQICQDNAgAABAgQIECBAgAABAgQIECBAoLGAALBxc5VGgAABAgQIECBAgAABAgQIECBAQABoBggQIECAAAECBAgQIECAAAECBAg0FhAANm6u0ggQIECAAAECBAgQIECAAAECBAgIAM0AAQIECBAgQIAAAQIECBAgQIAAgcYCAsDGzVUaAQIECBAgQIAAAQIECBAgQIAAAQGgGSBAgAABAgQIECBAgAABAgQIECDQWEAA2Li5SiNAgAABAgQIECBAgAABAgQIECAgADQDBAgQIECAAAECBAgQIECAAAECBBoLCAAbN1dpBAgQIECAAAECBAgQIECAAAECBASAZoAAAQIECBAgQIAAAQIECBAgQIBAYwEBYOPmKo0AAQIECBAgQIAAAQIECBAgQICAANAMECBAgAABAgQIECBAgAABAgQIEGgsIABs3FylESBAgAABAgQIECBAgAABAgQIEBAAmgECBAgQIECAAAECBAgQIECAAAECjQUEgI2bqzQCBAgQIECAAAECBAgQIECAAAECAkAzQIAAAQIECBAgQIAAAQIECBAgQKCxgACwcXOVRoAAAQIECBAgQIAAAQIECBAgQEAAaAYIECBAgAABAgQIECBAgAABAgQINBYQADZurtIIECBAgAABAgQIECBAgAABAgQICADNAAECBAgQIECAAAECBAgQIECAAIHGAgLAxs1VGgECBAgQIECAAAECBAgQIECAAAEBoBkgQIAAAQIECBAgQIAAAQIECBAg0FhAANi4uUojQIAAAQIECBAgQIAAAQIECBAgIAA0AwQIECBAgAABAgQIECBAgAABAgQaCwgAGzdXaQQIECBAgAABAgQIECBAgAABAgQEgGaAAAECBAgQIECAAAECBAgQIECAQGMBAWDj5iqNAAECBAgQIECAAAECBAgQIECAgADQDBAgQIAAAQIECBAgQIAAAQIECBBoLCAAbNxcpREgQIAAAQIECBAgQIAAAQIECBAQAJoBAgQIECBAgAABAgQIECBAgAABAo0FBICNm6s0AgQIECBAgAABAgQIECBAgAABAgJAM0CAAAECBAgQIECAAAECBAgQIECgsYAAsHFzlUaAAAECBAgQIECAAAECBAgQIEBAAGgGCBAgQIAAAQIECBAgQIAAAQIECDQWEAA2bq7SCBAgQIAAAQIECBAgQIAAAQIECAgAzQABAgQIECBAgAABAgQIECBAgACBxgICwMbNVRoBAgQIECBAgAABAgQIECBAgAABAaAZIECAAAECBAgQIECAAAECBAgQINBYQADYuLlKI0CAAAECBAgQIECAAAECBAgQICAANAMECBAgQIAAAQIECBAgQIAAAQIEGgsIABs3V2kECBAgQIAAAQIECBAgQIAAAQIEBIBmgAABAgQIECBAgAABAgQIECBAgEBjAQFg4+YqjQABAgQIECBAgAABAgQIECBAgIAA0AwQIECAAAECBAgQIECAAAECBAgQaCwgAGzcXKURIECAAAECBAgQIECAAAECBAgQEACaAQIECBAgQIAAAQIECBAgQIAAAQKNBQSAjZurNAIECBAgQIAAAQIECBAgQIAAAQICQDNAgAABAgQIECBAgAABAgQIECBAoLGAALBxc5VGgAABAgQIECBAgAABAgQIECBAQABoBggQIECAAAECBAgQIECAAAECBAg0FhAANm6u0ggQIECAAAECBAgQIECAAAECBAgIAM0AAQIECBAgQIAAAQIECBAgQIAAgcYCAsDGzVUaAQIECBAgQIAAAQIECBAgQIAAAQGgGSBAgAABAgQIECBAgAABAgQIECDQWEAA2Li5SiNAgAABAgQIECBAgAABAgQIECAgADQDBAgQIECAAAECBAgQIECAAAECBBoLCAAbN1dpBAgQIECAAAECBAgQIECAAAECBASAZoAAAQIECBAgQIAAAQIECBAgQIBAYwEBYOPmKo0AAQIECBAgQIAAAQIECBAgQICAANAMECBAgAABAgQIECBAgAABAgQIEGgsIABs3FylESBAgAABAgQIECBAgAABAgQIEBAAmgECBAgQIECAAAECBAgQIECAAAECjQUEgI2bqzQCBAgQIECAAAECBAgQIECAAAECAkAzQIAAAQIECBAgQIAAAQIECBAgQKCxgACwcXOVRoAAAQIECBAgQIAAAQIECBAgQEAAaAYIECBAgAABAgQIECBAgAABAgQINBYQADZurtIIECBAgAABAgQIECBAgAABAgQICADNAAECBAgQIECAAAECBAgQIECAAIHGAgLAxs1VGgECBAgQIECAAAECBAgQIECAAAEBoBkgQIAAAQIECBAgQIAAAQIECBAg0FhAANi4uUojQIAAAQIECBAgQIAAAQIECBAgIAA0AwQIECBAgAABAgQIECBAgAABAgQaCwgAGzdXaQQIECBAgAABAgQIECBAgAABAgQEgGaAAAECBAgQIECAAAECBAgQIECAQGMBAWDj5iqNAAECBAgQIECAAAECBAgQIECAgADQDBAgQIAAAQIECBAgQIAAAQIECBBoLCAAbNxcpREgQIAAAQIECBAgQIAAAQIECBAQAJoBAgQIECBAgAABAgQIECBAgAABAo0FBICNm6s0AgQIECBAgAABAgQIECBAgAABAgJAM0CAAAECBAgQIECAAAECBAgQIECgsYAAsHFzlUaAAAECBAgQIECAAAECBAgQIEBAAGgGCBAgQIAAAQIECBAgQIAAAQIECDQWEAA2bq7SCBAgQIAAAQIECBAgQIAAAQIECAgAzQABAgQIECBAgAABAgQIECBAgACBxgICwMbNVRoBAgQIECBAgAABAgQIECBAgAABAaAZIECAAAECBAgQIECAAAECBAgQINBYQADYuLlKI0CAAAECBAgQIECAAAECBAgQICAANAMECBAgQIAAAQIECBAgQIAAAQIEGgsIABs3V2kECBAgQIAAAQIECBAgQIAAAQIEBIBmgAABAgQIECBAgAABAgQIECBAgEBjAQFg4+YqjQABAgQIECBAgAABAgQIECBAgIAA0AwQIECAAAECBAgQIECAAAECBAgQaCwgAGzcXKURIECAAAECBAgQIECAAAECBAgQEACaAQIECBAgQIAAAQIECBAgQIAAAQKNBQSAjZurNAIECBAgQIAAAQIECBAgQIAAAQICQDNAgAABAgQIECBAgAABAgQIECBAoLGAALBxc5VGgAABAgQIECBAgAABAgQIECBAQABoBggQIECAAAECBAgQIECAAAECBAg0FhAANm6u0ggQIECAAAECBAgQIECAAAECBAgIAM0AAQIECBAgQIAAAQIECBAgQIAAgcYCAsDGzVUaAQIECBAgQIAAAQIECBAgQIAAAQGgGSBAgAABAgQIECBAgAABAgQIECDQWEAA2Li5SiNAgAABAgQIECBAgAABAgQIECAgADQDBAgQIECAAAECBAgQIECAAAECBBoLCAAbN1dpBAgQIECAAAECBAgQIECAAAECBASAZoAAAQIECBAgQIAAAQIECBAgQIBAYwEBYOPmKo0AAQIECBAgQIAAAQIECBAgQICAANAMECBAgAABAgQIECBAgAABAgQIEGgsIABs3FylESAwVuC3sZUrnAABAgQIEOgi4KzapZPqIEBgCwEf1S3aYBMECBBIFRAApnJ6GAECBAgQIPCAgLPqA+iWJECgr4CPat/eqowAgbkCAsC5vVc5AQIECBDoIuCs2qWT6iBAYAsBH9Ut2mATBAgQyBP49eefBYB5nJ5EgAABAgQIPCDw+csXZ9UH3C1JgEBfAR/Vvr1VGQECQwUEgEMbr2wCBAgQINBIQADYqJlKIUBgCwEB4BZtsAkCBAjkCQgA8yw9iQABAgQIEHhGQAD4jLtVCRDoKyAA7NtblREgMFQgGgB+/uWnoWLK/vW//kcIwcyE2NxEoLSA70Xp9j2y+fDM+CvAj/TLogQI9BUQAPbtrcoIEBgqIAAc2vgLZYcPZ0LjC+puJVBTwPeiZt+e3HV4ZgSAT7bN2gQINBQQADZsqpIIEJgtIACc3f9I9eHDmQAwwu0eAqUFfC9Kt++RzYdnRgD4SL8sSoBAXwEBYN/eqowAgaECAsChjb9QdvhwJgC8oO5WAjUFfC9q9u3JXYdnRgD4ZNusTYBAQwEBYMOmKokAgdkCAsDZ/Y9UHz6cCQAj3O4hUFrA96J0+x7ZfHhmBICP9MuiBAj0FRAA9u2tyggQGCogABza+Atlhw9nAsAL6m4lUFPA96Jm357cdXhmBIBPts3aBAg0FBAANmyqkggQmC0gAJzd/0j14cOZADDC7R4CpQV8L0q375HNh2dGAPhIvyxKgEBfAQFg396qjACBoQICwKGNv1B2+HAmALyg7lYCNQV8L2r27cldh2dGAPhk26xNgEBDAQFgw6YqiQCB2QICwNn9j1QfPpwJACPc7iFQWsD3onT7Htl8eGYEgI/0y6IECPQVEAD27a3KCBAYKiAAHNr4C2WHD2cCwAvqbiVQU8D3ombfntx1eGYEgE+2zdoECDQUEAA2bKqSCBCYLSAAnN3/SPXhw5kAMMLtHgKlBXwvSrfvkc2HZ0YA+Ei/LEqAQF8BAWDf3qqMAIGhAgLAoY2/UHb4cCYAvKDuVgI1BXwvavbtyV2HZ0YA+GTbrE2AQEMBAWDDpiqJAIHZAgLA2f2PVB8+nAkAI9zuIVBawPeidPse2Xx4ZgSAj/TLogQI9BUQAPbtrcoIEBgqIAAc2vgLZYcPZwLAC+puJVBTwPeiZt+e3HV4ZgSAT7bN2gQINBQQADZsqpIIEJgtIACc3f9I9eHDmQAwwu0eAqUFfC9Kt++RzYdnRgD4SL8sSoBAXwEBYN/eqowAgaECAsChjb9QdvhwJgC8oO5WAjUFfC9q9u3JXYdnRgD4ZNusTYBAQwEBYMOmKokAgdkCAsDZ/Y9UHz6cCQAj3O4hUFrA96J0+x7ZfHhmBICP9MuiBAj0FRAA9u2tyggQGCogABza+Atlhw9nAsAL6m4lUFPA96Jm357cdXhmBIBPts3aBAg0FBAANmyqkggQmC2wOgAM/4N9MDxavd7LNK1e03pvv8Ofzcy7H7fVMxP9yq7eZ5X1XjyrzHcV0+6eI2ZGABj91LqPAAECbwoIAA0GAQIEmgkIAHPDIwHg+y9I9wN2tL4JMxP9bAqPvE9nZ8fMDJ4ZAeDZ18X1BAgQ+KGAANCAECBAoJmAAFAAeHakHbDNzNmZiV5v1gaHOUV+wVtlRl8mKfo/UlSp8bMAMPqpdR8BAgTeFBAAGgwCBAg0ExAACnPOjnSZw2CRAOHFv7vp2Rn75/XdXaL1jQhziry/0R6uDuNGzIwAMPqpdR8BAgQEgGaAAAECEwQEgALAs3Ne5cC7+oAdXU8A+P4EmrX3baLzxjT3m1/FUwB49k861xMgQICAXwCaAQIECDQTEADmHgYnhDlVDrxVApIJMxP9bJo1AeDZ2TEzg2fGLwDPvi6uJ0CAwA8FBIAGhAABAs0EBIACwLMj7YBtZs7OTPR6szY4zPFXgN9sfvSdeHlYlf9RJFqjfwdg9EvrPgIECLwtIAA0GQQIEGgmsDoAbMY3spzw4Sx4oB+JrGgCTQR8L5o0cmEZ4ZnxC8CFXbIUAQITBASAE7qsRgIERgkIAEe1O6XY8OFMAJji7yEEKgn4XlTq1h57Dc+MAHCPBtoFAQJtBASAbVqpEAIECPwuIAA0CWcFwoczAeBZatcTKC/ge1G+hcsLCM+MAHB5ryxIgEBvAQFg7/6qjgCBgQICwIFNv1hy+HAmALwo73YC9QR8L+r17Okdh2dGAPh066xPgEAzAQFgs4YqhwABAgJAM3BWIHw4EwCepXY9gfICvhflW7i8gPDMCACX98qCBAj0FhAA9u6v6ggQGCggABzY9Islhw9nAsCL8m4nUE/A96Jez57ecXhmBIBPt876BAg0ExAANmuocggQICAANANnBcKHMwHgWWrXEygv4HtRvoXLCwjPjABwea8sSIBAbwEBYO/+qo4AgYECAsCBTb9YcvhwJgC8KO92AvUEfC/q9ezpHYdnRgD4dOusT4BAMwEBYLOGKocAAQICQDNwViB8OBMAnqV2PYHyAr4X5Vu4vIDwzAgAl/fKggQI9BYQAPbur+oIEBgoIAAc2PSLJYcPZwLAi/JuJ1BPwPeiXs+e3nF4ZgSAT7fO+gQINBMQADZrqHIIECAgADQDZwXChzMB4Flq1xMoL+B7Ub6FywsIz4wAcHmvLEiAQG8BAWDv/qqOAIGBAgLAgU2/WHL4cCYAvCjvdgL1BHwv6vXs6R2HZ0YA+HTrrE+AQDMBAWCzhiqHAAECAkAzcFYgfDgTAJ6ldj2B8gK+F+VbuLyA8MwIAJf3yoIECPQWEAD27q/qCBAYKCAAHNj0iyWHD2cCwIvybidQT8D3ol7Pnt5xeGYEgE+3zvoECDQTEAA2a6hyCBAgIAA0A2cFwoczAeBZatcTKC/ge1G+hcsLCM+MAHB5ryxIgEBvAQFg7/6qjgCBgQICwIFNv1hy+HAmALwo73YC9QR8L+r17Okdh2dGAPh066xPgEAzAQFgs4YqhwABAgJAM3BWIHw4EwCepXY9gfICvhflW7i8gPDMCACX98qCBAj0FhAA9u6v6ggQGCjQPQCMHiSeGIXPRQKyqGn3+p6YGWvOFej+PnWv74nJjZqu/uaH1xMAPjFW1iRAoLGAALBxc5VGgMBMAQHgPn2PHs5WVxA+nDUPOFf3wXqzBXwv9uh/9Hv4xO6jMxOtcfl6AsAnxsqaBAg0FhAANm6u0ggQmCkgANyn79HD0uoKVh8Gq9S3ep/Wmy3ge7FH/6Pfwyd2H52ZaI3L1xMAPjFW1iRAoLGAALBxc5VGgMBMAQHgPn2PHpZWV7D6MFilvtX7tN5sAd+LPfof/R4+sfvozERrXL6eAPCJsbImAQKNBQSAjZurNAIEZgoIAPfpe/SwtLqC1YfBKvWt3qf1Zgv4XuzR/+j38IndR2cmWuPy9QSAT4yVNQkQaCwgAGzcXKURIDBTQAC4T9+jh6XVFaw+DFapb/U+rTdbwPdij/5Hv4dP7D46M9Eal68nAHxirKxJgEBjAQFg4+YqjQCBmQICwH36Hj0sra5g9WGwSn2r92m92QK+F3v0P/o9fGL30ZmJ1rh8PQHgE2NlTQIEGgsIABs3V2kECMwUEADu0/foYWl1BasPg1XqW71P680W8L3Yo//R7+ETu4/OTLTG5esJAJ8YK2sSINBYQADYuLlKI0BgpoAAcJ++Rw9LqytYfRisUt/qfVpvtoDvxR79j34Pn9h9dGaiNS5fTwD4xFhZkwCBxgICwMbNVRoBAjMFBID79D16WFpdwerDYJX6Vu/TerMFfC/26H/0e/jE7qMzE61x+XoCwCfGypoECDQWEAA2bq7SCBCYKSAA3Kfv0cPS6gpWHwar1Ld6n9abLeB7sUf/o9/DJ3YfnZlojcvXEwA+MVbWJECgsYAAsHFzlUaAwEwBAeA+fY8ellZXsPowWKW+1fu03mwB34s9+h/9Hj6x++jMRGtcvp4A8ImxsiYBAo0FBICNm6s0AgRmCggA9+l79LC0uoLVh8Eq9a3ep/VmC/he7NH/6Pfwid1HZyZa4/L1BIBPjJU1CRBoLCAAbNxcpREgMFNAALhP36OHpdUVrD4MVqlv9T6tN1vA92KP/ke/h0/sPjoz0RqXrycAfGKsrEmAQGMBAWDj5iqNAIGZAgLAffoePSytrmD1YbBKfav3ab3ZAr4Xe/Q/+j18YvfRmYnWuHw9AeATY2VNAgQaCwgAGzdXaQQIzBQQAO7T9+hhaXUFqw+DVepbvU/rzRbwvdij/9Hv4RO7j85MtMbl6wkAnxgraxIg0FhAANi4uUojQGCmgABwn75HD0urK1h9GKxS3+p9Wm+2gO/FHv2Pfg+f2H10ZqI1Ll9PAPjEWFmTAIHGAgLAxs1VGgECMwUEgPv0PXpYWl3B6sNglfpW79N6swV8L/bof/R7+MTuozMTrXH5egLAJ8bKmgQINBYQADZurtIIEJgpIADcp+/LD0u//BQqvsxhcHF9IUw3EQgK+F68DVfl+xRs+6Xb2s+MAPDSfLiZAAEC3wsIAM0EAQIEmgkIAPdpaPvD2eJAbrXnPpNkJxMEVs+39XIDxydmtH0PBYBPjJU1CRBoLCAAbNxcpREgMFNAALhP39sfzgSA+wybnZQX8L3IDeRWez4xgKtrXL6eAPCJsbImAQKNBQSAjZurNAIEZgoIAPfp+/LDUvNAbrXnPpNkJxMEVs+39XIDxydmtH0PBYBPjJU1CRBoLCAAbNxcpREgMFNAALhP39sfzpoHjvtMkp1MEPC9yA3kVns+MaOra1y+ngDwibGyJgECjQUEgI2bqzQCBGYKCAD36fvyw1LzQG615z6TZCcTBFbPt/VyA8cnZrR9DwWAT4yVNQkQaCwgAGzcXKURIDBTQAC4T9/bH86aB477TJKdTBDwvcgN5FZ7PjGjq2tcvp4A8ImxsiYBAo0FBICNm6s0AgRmCggA9+l79LC0uoJf/+t/hJbsXl8IxU0EggLd36fu9QXbfum27qafBYCX5sPNBAgQ+F5AAGgmCBAg0ExAALhPQ9sfzoK/AFzdoWjAuXqf1pst4HuxR/8rfS/az4wAcI+Xwi4IEGgjIABs00qFECBA4HcBAeA+k9D+cCYA3GfY7KS8gO/FHi0UAOb3IWrqF4D5vfBEAgRmCwgAZ/df9QQINBQQAO7TVAf6PXoRPXzusXu7mCLge7FHpyt9L9rPjF8A7vFS2AUBAm0EBIBtWqkQAgQI/C4gANxnEtofzvwCcJ9hs5PyAr4Xe7RQAJjfh6ipXwDm98ITCRCYLSAAnN1/1RMg0FBAALhPUx3o9+hF9PC5x+7tYoqA78Uena70vWg/M34BuMdLYRcECLQREAC2aaVCCBAg8LuAAHCfSWh/OPMLwH2GzU7KC/he7NFCAWB+H6KmfgGY3wtPJEBgtoAAcHb/VU+AQEMBAeA+TXWg36MX0cPnHru3iykCvhd7dLrS96L9zPgF4B4vhV0QINBGQADYppUKIUCAwO8CAsB9JqH94cwvAPcZNjspL+B7sUcLBYD5fYia+gVgfi88kQCB2QICwNn9Vz0BAg0FBID7NNWBfo9eRA+fe+zeLqYI+F7s0elK34v2M+MXgHu8FHZBgEAbAQFgm1YqhAABAr8LCAD3mYT2hzO/ANxn2OykvIDvxR4tFADm9yFq6heA+b3wRAIEZgsIAGf3X/UECDQUEADu01QH+j16ET187rF7u5gi4HuxR6crfS/az4xfAO7xUtgFAQJtBASAbVqpEAIECPwuIADcZxLaH878AnCfYbOT8gK+F3u0UACY34eoqV8A5vfCEwkQmC0gAJzdf9UTINBQQAC4T1Md6PfoRfTwucfu7WKKgO/FHp2u9L1oPzN+AbjHS2EXBAi0ERAAtmmlQggQIPC7gABwn0lofzjzC8B9hs1Oygv4XuzRQgFgfh+ipn4BmN8LTyRAYLaAAHB2/1VPgEBDAQHgPk11oN+jF9HD5x67t4spAr4Xe3S60vei/cz4BeAeL4VdECDQRkAA2KaVCiFAgMDvAgLAfSah/eHMLwD3GTY7KS/ge7FHCwWA+X2ImvoFYH4vPJEAgdkCAsDZ/Vc9AQINBQSA+zTVgX6PXkQPn3vs3i6mCPhe7NHpSt+L9jPjF4B7vBR2QYBAGwEBYJtWKoQAAQK/C3QPAPWZAAECBAgQqCMQDVX9ArBOj+2UAIEaAgLAGn2ySwIECBwWEAAepnIhAQIECBAgcLOAAPBmYI8nQIDAQQEB4EEolxEgQKCKgACwSqfskwABAgQI9BcQAPbvsQoJEKghIACs0Se7JECAwGEBAeBhKhcSIECAAAECNwsIAG8G9ngCBAgcFBAAHoRyGQECBKoICACrdMo+CRAgQIBAfwEBYP8eq5AAgRoCAsAafbJLAgQIHBYQAB6mciEBAgQIECBws4AA8GZgjydAgMBBAQHgQSiXESBAoIqAALBKp+yTAAECBAj0FxAA9u+xCgkQqCEgAKzRJ7skQIDAYQEB4GEqFxIgQIAAAQI3CwgAbwb2eAIECBwUEAAehHIZAQIEqggIAKt0yj4JECBAgEB/AQFg/x6rkACBGgICwBp9sksCBAgcFhAAHqZyIQECBAgQIHCzgADwZmCPJ0CAwEEBAeBBKJcRIECgioAAsEqn7JMAAQIECPQXEAD277EKCRCoISAArNEnuyRAgMBhAQHgYSoXEiBAgAABAjcLCABvBvZ4AgQIHBQQAB6EchkBAgSqCAgAq3TKPgkQIECAQH8BAWD/HquQAIEaAgLAGn2ySwIECBwWEAAepnIhAQIECBAgcLOAAPBmYI8nQIDAQQEB4EEolxEgQKCKgACwSqfskwABAgQI9BcQAPbvsQoJEKghIACs0Se7JECAwGEBAeBhKhcSIECAAAECNwsIAG8G9ngCBAgcFBAAHoRyGQECBKoICACrdMo+CRAgQIBAfwEBYP8eq5AAgRoCAsAafbJLAgQIHBZYHQCG/8H+l58O1/T6wtXrvay9ek3rvT0an83Mu+/M6n4VqV0AACAASURBVJkJvbzepR+yVZnv1bNmvffHpv3MfPnirBr92LqPAAECbwj4qBoLAgQINBMQAOaGRwLAwYfPYOA4YWain01hjvfp7OyYmcEzIwA8+7q4ngABAj8UEAAaEAIECDQTEAAKAM+OtAO2mTk7M9HrzdrgMCcYqJuZwTMjAIx+at1HgACBNwUEgAaDAAECzQQEgMKcsyPtgG1mzs5M9HqzNjjMEQC+2fzoO/HyMH8FOPolch8BAgRmCggAZ/Zd1QQINBYQAApzzo539ADa/vAZDCxe/Lubnp2xf17f3SVa34gwJ/g+RU27f59GzIxfAEY/te4jQIDAmwICQINBgACBZgICQAHg2ZF2wDYzZ2cmer1Ze1+ue2Clvrd7H30nBIDRr5D7CBAgMFdAADi39yonQKCpgABQmHN2tKMHUAf696W7m56dsX9e390lWt+IMMcvAN98bczMD0JxvwCMfmrdR4AAgTcFBIAGgwABAs0EVgeAzfiUQ4AAAQIECCQKREPOzwLAxC54FAECBD59EgCaAgIECDQTEAA2a6hyCBAgQIBAYQEBYOHm2ToBAq0EBICt2qkYAgQIfPokADQFBAgQIECAwC4CAsBdOmEfBAhMFxAATp8A9RMg0E5AANiupQoiQIAAAQJlBQSAZVtn4wQINBMQADZrqHIIECAgADQDBAgQIECAwC4CAsBdOmEfBAhMFxAATp8A9RMg0E5AANiupQoiQIAAAQJlBQSAZVtn4wQINBMQADZrqHIIECAgADQDBAgQIECAwC4CAsBdOmEfBAhMFxAATp8A9RMg0E5AANiupQoiQIAAAQJlBQSAZVtn4wQINBMQADZrqHIIECAgADQDBAgQIECAwC4CAsBdOmEfBAhMFxAATp8A9RMg0E5AANiupQoiQIAAAQJlBQSAZVtn4wQINBMQADZrqHIIECAgADQDBAgQIECAwC4CAsBdOmEfBAhMFxAATp8A9RMg0E5AANiupQoiQIAAAQJlBQSAZVtn4wQINBMQADZrqHIIECAgADQDBAgQIECAwC4CAsBdOmEfBAhMFxAATp8A9RMg0E5AANiupQoiQIAAAQJlBQSAZVtn4wQINBMQADZrqHIIECAgADQDBAgQIECAwC4CAsBdOmEfBAhMFxAATp8A9RMg0E5AANiupQoiQIAAAQJlBQSAZVtn4wQINBMQADZrqHIIECAgADQDBAgQIECAwC4CAsBdOmEfBAhMFxAATp8A9RMg0E5AANiupQoiQIAAAQJlBQSAZVtn4wQINBMQADZrqHIIECAQDQBXy33+5afVS4bXCx9eitQYrS8MGrxxwswEadyWLGDWkkE/ffpUxTT6PaxS30tnozXmT8WPn/j5yxdn1dXo1iNAoLWAj2rr9iqOAIGJAgLA/K5HD0tVDoTR+vKlPzgMFglUKx2wV/ewynpV3t1Ks1bFNPo9rFJfqZkRAFb5ZNonAQJFBASARRplmwQIEDgqIAA8KnX8uu4Hwmh9xwVzrnTAznH0lI8FzNrHRmevqGIa/R5WqU8AeHZyXU+AAIE+AgLAPr1UCQECBL4KCADzB6H7gTBaX770j5/ogL1afO56Zi2/91VMo9/DKvUJAPNn2xMJECBQRUAAWKVT9kmAAIGDAgLAg1AnLut+IIzWd4Iw5VIH7BRGDzkgYNYOIJ28pIpp9HtYpT4B4MnBdTkBAgQaCQgAGzVTKQQIEPj6D/Y///xbBYkJh6UqNUYPvKvnrIpnpQP26h5WWc+s5Xeqimn0e1ilvkrfJ/8RkPz30BMJEJgtIACc3X/VEyDQUEAAmN/U7gfCaH350j9+ogP2avG565m1/N5XMY1+D6vUJwDMn21PJECAQBUBAWCVTtknAQIEDgoIAA9Cnbis+4EwWt8JwpRLHbBTGD3kgIBZO4B08pIqptHvYZX6BIAnB9flBAgQaCQgAGzUTKUQIEDg6z/Y+yvA6YPQ/UAYrS8d+oMHOmCvFp+7nlnL730V0+j3sEp9AsD82fZEAgQIVBEQAFbplH0SIEDgoIAA8CDUicu6Hwij9Z0gTLnUATuF0UMOCJi1A0gnL6liGv0eVqlPAHhycF1OgACBRgICwEbNVAoBAgS+/oO9XwCmD0L3A2G0vnToDx7ogL1afO56Zi2/91VMo9/DKvUJAPNn2xMJECBQRUAAWKVT9kmAAIGDAgLAg1AnLut+IIzWd4Iw5VIH7BRGDzkgYNYOIJ28pIpp9HtYpT4B4MnBdTkBAgQaCQgAGzVTKQQIEPj6D/Z+AZg+CN0PhNH60qE/eKAD9mrxueuZtfzeVzGNfg+r1CcAzJ9tTyRAgEAVAQFglU7ZJwECBA4KCAAPQp24rPuBMFrfCcKUSx2wUxg95ICAWTuAdPKSKqbR72GV+gSAJwfX5QQIEGgkIABs1EylECBA4Os/2PsFYPogdD8QRutLh/7ggQ7Yq8XnrmfW8ntfxTT6PaxSnwAwf7Y9kQABAlUEBIBVOmWfBAgQOCggADwIdeKy7gfCaH0nCFMudcBOYfSQAwJm7QDSyUuqmEa/h1XqEwCeHFyXEyBAoJGAALBRM5VCgACBr/9g7xeA6YPQ/UAYrS8d+oMHOmCvFp+7nlnL730V0+j3sEp9AsD82fZEAgQIVBEQAFbplH0SIEDgoIAA8CDUicu6Hwij9Z0gTLnUATuF0UMOCJi1A0gnL6liGv0eVqlPAHhycF1OgACBRgICwEbNVAoBAgS+/oN9818APnE4W71mlfVWv3HRA/Zqz0oH7NU9rLLe6ll7cXlizZX9WF1f9/VGzMyXL86qK19SaxEg0F7AR7V9ixVIgMA0AQHg2x2PHgavhDnRNVcHVtH1Vr9bVTyvzMxqU+vlfi+uvEur53t171fX1309AeDqCbYeAQIE6gsIAOv3UAUECBD4k4AAMPdAfyXMmXAAXfn6VfG8MjMrPa31vsDqWRsR5vzyU2jkoqHq6h6uXm/EzPgFYOidcRMBAgTeExAAmg0CBAg0ExAACgDPjnT0gH12navXrz5gR9cTAF7t9PP3R3t/5V16Ys2V0qvr676eAHDl9FqLAAECPQQEgD36qAoCBAj8ISAAFACefR2uhBZn17pyfZUDvQDwSpf3uHf1rI0Ic/wC8M3hvvL9fWJOV76hn/0CcCW3tQgQGCAgABzQZCUSIDBLQAAoADw78VcOoGfXunL96sNudD0B4JUu73FvtPdX3qUn1lypvbq+7uuNCI0FgCtfUWsRIDBAQAA4oMlKJEBgloAAUAB4duKvhBZn17pyfZUDvQDwSpf3uHf1rI0Ic/wC8M3hvvL9fWJOV76hfgG4UttaBAhMEBAATuiyGgkQGCXQPQB8opnRA1r0cLa6xmh9q/dZxVMAuHoy8tcza3NNo99DM3PDzPgFYD6qJxIgMFpAADi6/YonQKCjgAAwv6vdD4TR+vKlf/xEB+zV4nPXM2v5va9iGv0eVqmv0v9A4ReA+e+hJxIgMFtAADi7/6onQKChgAAwv6ndD4TR+vKlBYCrTa33toAwJ38yqphGv4dV6hMA5s+2JxIgQKCKgACwSqfskwABAgcFBIAHoU5c1v1AGK3vBGHKpQ7YKYweckDArB1AOnlJFdPo97BKfQLAk4PrcgIECDQSEAA2aqZSCBAg8PUf7H/++bcKEhMOS1VqjB54V89ZFc9KB+zVPayynlnL71QV0+j3sEp9lb5P/gpw/nvoiQQIzBYQAM7uv+oJEGgoIADMb2r3A2G0vnzpHz/RAXu1+Nz1zFp+76uYRr+HVeoTAObPticSIECgioAAsEqn7JMAAQIHBQSAB6FOXNb9QBit7wRhyqUO2CmMHnJAwKwdQDp5SRXT6PewSn0CwJOD63ICBAg0EhAANmqmUggQIPD1H+z9FeD0Qeh+IIzWlw79wQMdsFeLz13PrOX3vopp9HtYpT4BYP5seyIBAgSqCAgAq3TKPgkQIHBQQAB4EOrEZd0PhNH6ThCmXOqAncLoIQcEzNoBpJOXVDGNfg+r1CcAPDm4LidAgEAjAQFgo2YqhQABAl//wd4vANMHofuBMFpfOvQHD3TAXi0+dz2zlt/7KqbR72GV+gSA+bPtiQQIEKgiIACs0in7JECAwEEBAeBBqBOXdT8QRus7QZhyqQN2CqOHHBAwaweQTl5SxTT6PaxSnwDw5OC6nAABAo0EBICNmqkUAgQIfP0He78ATB+E7gfCaH3p0B880AF7tfjc9cxafu+rmEa/h1XqEwDmz7YnEiBAoIqAALBKp+yTAAECBwUEgAehTlzW/UAYre8EYcqlDtgpjB5yQMCsHUA6eUkV0+j3sEp9AsCTg+tyAgQINBIQADZqplIIECDw9R/s/QIwfRC6Hwij9aVDf/BAB+zV4nPXM2v5va9iGv0eVqlPAJg/255IgACBKgICwCqdsk8CBAgcFBAAHoQ6cVn3A2G0vhOEKZc6YKcwesgBAbN2AOnkJVVMo9/DKvUJAE8OrssJECDQSEAA2KiZSiFAgMDXf7D3C8D0Qeh+IIzWlw79wQMdsFeLz13PrOX3vopp9HtYpT4BYP5seyIBAgSqCAgAq3TKPgkQIHBQQAB4EOrEZd0PhNH6ThCmXOqAncLoIQcEzNoBpJOXVDGNfg+r1CcAPDm4LidAgEAjAQFgo2YqhQABAl8FPv/9NxK5AhMOhLlinkaAAIGaAr73G/Xt1785q27UDlshQKC+gI9q/R6qgAABAn8WEACmT4QDYTqpBxIgQGBLAd/7jdoiANyoGbZCgEAHAQFghy6qgQABAq8FBIDp8+BAmE7qgQQIENhSwPd+o7YIADdqhq0QINBBQADYoYtqIECAgADw1hlwILyV18MJECCwjYDv/Tat+PRJALhRM2yFAIEOAgLADl1UAwECBASAt86AA+GtvB5OgACBbQR877dphQBwo1bYCgECPQQEgD36qAoCBAh8E/BXgNOnwYEwndQDCRAgsKWA7/1GbfELwI2aYSsECHQQEAB26KIaCBAg8FpAAJg+Dw6E6aQeSIAAgS0FfO83aosAcKNm2AoBAh0EBIAduqgGAgQICABvnQEHwlt5PXxTgf/jv//voZ39l//x30L3uYnADgK+9zt04R97EABu1AxbIUCgg4AAsEMX1UCAAAEB4K0z4EB4K6+HbyogANy0MbZ1q4Dv/a285x4uADzn5WoCBAh8ICAANCIECBDoJuCvAKd31IEwndQDCwgIAAs0yRbTBXzv00njDxQAxu3cSYAAgTcEBIDGggABAt0EBIDpHXUgTCf1wAICAsACTbLFdAHf+3TS+AMFgHE7dxIgQEAAaAYIECAwQEAAmN5kB8J0Ug/cUCAa+H1Uin8n4EdC/v87Cfjeb9QNAeBGzbAVAgQ6CPgFYIcuqoEAAQKvBQSA6fPgQJhO6oEbCggAN2yKLS0X8L1fTv7+ggLAjZphKwQIdBAQAHboohoIECAgALx1BhwIb+X18E0EBICbNMI2HhXwvX+U/8+LCwA3aoatECDQQUAA2KGLaiBAgIAA8NYZcCC8ldfDHxT4Uej3o7+6+/19R6/114EfbLalDwn43h9iWnORAHCNs1UIEBgjIAAc02qFEiAwRsBfAU5vtQNhOqkHbiIgANykEbaxjYDv/Tat+PRJALhRM2yFAIEOAgLADl1UAwECBF4LCADT58GBMJ3UAzcREABu0gjb2EbA936bVggAN2qFrRAg0ENAANijj6ogQIDANwEBYPo0OBCmk3rgJgICwE0aYRvbCPjeb9MKAeBGrbAVAgR6CAgAe/RRFQQIEHgsAFx9WFq93gvs6jWt9/YL/fmXn0Jv+mrPSjPz//xP/+e7pq//fX0f/QdCjl77v/x//1uoh1V6H521F5TuNarv7dGfMDOhl/7rh/RvzqphPDcSIEDgrwI+qqaCAAEC3QQW/wIwenipchisFOZUMTUz7390VvdQALhH2CwAfP+d6P69iNZXaWbC/5glAAzTuZEAAQJvCQgAzQUBAgS6CQgA3+xoNFgRAO4TVkV7GD1gR9erNDMCQAHg2T8CV79P1qv/DT47Y39cLwAM07mRAAECAkAzQIAAgQkCAkAB4Mk5d8DODYE6BoDfC33/V4Jf/xXgH13rrwDXD3N8L3K/F1HPl11E/0eK6JrR9U7+kfTtcgFgmM6NBAgQEACaAQIECEwQEAAKAE/O+erDYPf1BIB/HsDXYaEAUAB48vPk38H6A7BoILf6G3y2539cLwAM07mRAAECAkAzQIAAgQkCAkAB4Mk5X30Y7L6eAFAAePIV/Hp5lTCn+/tbpb5KMxN5H77eIwAM07mRAAECAkAzQIAAgQkCAkAB4Mk5r3LgrRKQCAAFgCdfQQHgD8B8n97HqfRNjLwTAsCQmpsIECDwroD/CIjhIECAQDeBxQFgN7636ll9AJ1gqsY9BL7/d/ndvasf/bsC717b8wkcEfC9P6K06Bq/AFwEbRkCBKYICACndFqdBAjMERAApvfagTCd1AM3ERAAbtII29hGwPd+m1b4K8AbtcJWCBDoISAA7NFHVRAgQOCbgAAwfRocCNNJPXATAQHgJo2wjW0EfO+3aYUAcKNW2AoBAj0EBIA9+qgKAgQICABvnAEHwhtxPfpRAQHgo/wW31DA936jpvgrwBs1w1YIEOggIADs0EU1ECBA4LWAXwCmz4MDYTqpB24iIADcpBG2sY2A7/02rfALwI1aYSsECPQQEAD26KMqCBAg8E1AAJg+DQ6E6aQeuImAAHCTRtjGNgK+99u0QgC4UStshQCBHgICwB59VAUBAgQEgDfOgAPhjbge/aiAAPBRfotvKOB7v1FT/BXgjZphKwQIdBAQAHboohoIECDwWsAvANPnwYEwndQDNxEQAG7SCNvYRsD3fptW+AXgRq2wFQIEeggIAHv0URUECBD4JiAATJ8GB8J0Ug/cREAAuEkjbGMbAd/7bVohANyoFbZCgEAPAQFgjz6qggABAgLAG2fAgfBGXI9+VEAA+Ci/xTcU8L3fqCn+CvBGzbAVAgQ6CAgAO3RRDQQIEHgt4BeA6fPgQJhO6oGbCAgAN2mEbWwj4Hu/TSv8AnCjVtgKAQI9BASAPfqoCgIECHwTEACmT4MDYTqpB24iIADcpBG2sY2A7/02rRAAbtQKWyFAoIeAALBHH1VBgAABAeCNM+BAeCOuRz8qIAB8lN/iGwr43m/UFH8FeKNm2AoBAh0EBIAduqgGAgQIvBbwC8D0eXAgTCf1wE0EBICbNMI2thHwvd+mFX4BuFErbIUAgR4CAsAefVQFAQIEvgkIANOnwYEwndQDNxF4HQD+l//x3/60q6P/v5ebXt/7faj4/XM3Kd02CLwp4Hu/0WD4BeBGzbAVAgQ6CAgAO3RRDQQIEHgtIABMnwcHwnRSD9xE4GjI96NwUAC4STNtI0XA9z6FMechAsAcR08hQIDAPwQEgEaBAAEC3QQEgOkddSBMJ/XATQQEgJs0wja2EfC936YV/grwRq2wFQIEeggIAHv0URUECBD4Q+DXn3/+rQLH519+qrDNr3uMHgjLFFhko2amSKMabNOsNWji4hLMTD745y9fnFXzWT2RAIHBAj6qg5uvdAIEegoIAPP7KgDMN4080QE7ouaeiIBZi6jNvsfM5PdfAJhv6okECMwWEADO7r/qCRBoKCAAzG+qADDfNPJEB+yImnsiAmYtojb7HjOT338BYL6pJxIgMFtAADi7/6onQKChgAAwv6kCwHzTyBMdsCNq7okImLWI2ux7zEx+/wWA+aaeSIDAbAEB4Oz+q54AgYYCAsD8pgoA800jT3TAjqi5JyJg1iJqs+8xM/n9FwDmm3oiAQKzBQSAs/uvegIEGgoIAPObKgDMN4080QE7ouaeiIBZi6jNvsfM5PdfAJhv6okECMwWEADO7r/qCRBoKCAAzG+qADDfNPJEB+yImnsiAmYtojb7HjOT338BYL6pJxIgMFtAADi7/6onQKChgAAwv6kCwHzTyBMdsCNq7okImLWI2ux7zEx+/wWA+aaeSIDAbAEB4Oz+q54AgYYCAsD8pgoA800jT3TAjqi5JyJg1iJqs+8xM/n9FwDmm3oiAQKzBQSAs/uvegIEGgoIAPObKgDMN4080QE7ouaeiIBZi6jNvsfM5PdfAJhv6okECMwWEADO7r/qCRBoKCAAzG+qADDfNPJEB+yImnsiAmYtojb7HjOT338BYL6pJxIgMFtAADi7/6onQKChgAAwv6kCwHzTyBMdsCNq7okImLWI2ux7zEx+/wWA+aaeSIDAbAEB4Oz+q54AgYYCAsD8pgoA800jT3TAjqi5JyJg1iJqs+8xM/n9FwDmm3oiAQKzBQSAs/uvegIEGgoIAPObKgDMN4080QE7ouaeiIBZi6jNvsfM5PdfAJhv6okECMwWEADO7r/qCRBoKCAAzG+qADDfNPJEB+yImnsiAmYtojb7HjOT338BYL6pJxIgMFtAADi7/6onQKChgAAwv6kCwHzTyBMdsCNq7okImLWI2ux7zEx+/wWA+aaeSIDAbAEB4Oz+q54AgYYCAsD8pgoA800jT3TAjqi5JyJg1iJqs+8xM/n9FwDmm3oiAQKzBQSAs/uvegIEGgoIAPObKgDMN4080QE7ouaeiIBZi6jNvsfM5PdfAJhv6okECMwWEADO7r/qCRBoKNA9AIyGcVcOZ9E1G47XoyVFexjtX3S9F6Qn1ny0OZsuvroP0fVe+KLzdmXNTdtWcltP9O+JNVc2RwC4UttaBAhMEBAATuiyGgkQGCUgAHy73dGD0pUwZ9TgLSg22sNoQBJd78rMXFlzQQvKLbG699H1BIDlRusvG46+u2bm/d4LAOu/FyogQGAvAQHgXv2wGwIECFwWEAAKAC8P0aYPWH3Ajq4nANxngKLhSrT30fUEgPvMTHQnZiYqJwDMl/NEAgQIvC0gADQZBAgQaCYgABQANhvpP8pZfcCOricA3GcCo4FctPfR9QSA+8xMdCdmJionAMyX80QCBAgIAM0AAQIERggIAAWAXQd99QE7up4AcJ8JjAZy0d5H1xMA7jMz0Z2YmaicADBfzhMJECAgADQDBAgQGCEgABQAdh301Qfs6HoCwH0mMBrIRXsfXU8AuM/MRHdiZqJyAsB8OU8kQICAANAMECBAYISAAFAA2HXQVx+wo+sJAPeZwGggF+19dD0B4D4zE92JmYnKCQDz5TyRAAECAkAzQIAAgREC3QPAJ5p45VD/xH67rhk9YD/hEZ2ZSjU+4Xp2zQl9iNZ41tL1Pxao9O5WmRn/FWBvHQECBHIF/EdAcj09jQABAo8LCADzW1DlsJRf+V5PnHDArlTjXtPx9m6i726lPkRrrNC/Sns0M/ndEgDmm3oiAQKzBQSAs/uvegIEGgoIAPOb6oCdbxp54oQDdqUaIz1cfU/03a3Uh2iNq3vRfT0zk99hAWC+qScSIDBbQAA4u/+qJ0CgoYAAML+pDtj5ppEnTjhgV6ox0sPV90Tf3Up9iNa4uhfd1zMz+R0WAOabeiIBArMFBICz+696AgQaCggA85vqgJ1vGnnihAN2pRojPVx9T/TdrdSHaI2re9F9PTOT32EBYL6pJxIgMFtAADi7/6onQKChgAAwv6kO2PmmkSdOOGBXqjHSw9X3RN/dSn2I1ri6F93XMzP5HRYA5pt6IgECswUEgLP7r3oCBBoKCADzm+qAnW8aeeKEA3alGiM9XH1P9N2t1Idojat70X09M5PfYQFgvqknEiAwW0AAOLv/qidAoKGAADC/qQ7Y+aaRJ044YFeqMdLD1fdE391KfYjWuLoX3dczM/kdFgDmm3oiAQKzBQSAs/uvegIEGgoIAPOb6oCdbxp54oQDdqUaIz1cfU/03a3Uh2iNq3vRfT0zk99hAWC+qScSIDBbQAA4u/+qJ0CgoYAAML+pDtj5ppEnTjhgV6ox0sPV90Tf3Up9iNa4uhfd1zMz+R0WAOabeiIBArMFBICz+696AgQaCggA85vqgJ1vGnnihAN2pRojPVx9T/TdrdSHaI2re9F9PTOT32EBYL6pJxIgMFtAADi7/6onQKChgAAwv6kO2PmmkSdOOGBXqjHSw9X3RN/dSn2I1ri6F93XMzP5HRYA5pt6IgECswUEgLP7r3oCBBoKCADzm+qAnW8aeeKEA3alGiM9XH1P9N2t1Idojat70X09M5PfYQFgvqknEiAwW0AAOLv/qidAoKGAADC/qQ7Y+aaRJ044YFeqMdLD1fdE391KfYjWuLoX3dczM/kdFgDmm3oiAQKzBQSAs/uvegIEGgoIAPOb6oCdbxp54oQDdqUaIz1cfU/03a3Uh2iNq3vRfT0zk99hAWC+qScSIDBbQAA4u/+qJ0CgoYAAML+pDtj5ppEnTjhgV6ox0sPV90Tf3Up9iNa4uhfd1zMz+R0WAOabeiIBArMFBICz+696AgQaCggA85vqgJ1vGnnihAN2pRojPVx9T/TdrdSHaI2re9F9PTOT32EBYL6pJxIgMFtAADi7/6onQKChgAAwv6kO2PmmkSdOOGBXqjHSw9X3RN/dSn2I1ri6F93XMzP5HRYA5pt6IgECswUEgLP7r3oCBDoKfP77byvLih4+Kx2WVnpaq4eA92KPPurDHn2wi70EyrwXv/7NWXWv0bEbAgSKC/ioFm+g7RMgQOAvAgJAQ0HgcYEyB+zHpe7dgD7c6+vpNQXKvBcCwJoDZtcECGwrIADctjU2RoAAgaCAADAI5zYCeQJlDth5JW/5JH3Ysi029bBAmfdCAPjwpFieAIFuAgLAbh1VDwECBASAZoDA4wKrD9j/9//6P4dq/td/+/fQfVVuWt2HKi72OVugzHshAJw9qKonQCBdQACYTuqBBAgQeFhAAPhwAyxP4NOn1QdsAeDbU7e6D2afQAWBMu+FALDCONkjAQKFBASAhZplqwQIEDgkpuDTUwAAIABJREFUIAA8xOQiAncKrD5gCwAFgHfOs2f3Elj9fQrrCQDDdG4kQIDAWwICQHNBgACBbgICwG4dVU9BgdUHbAGgALDga2LLDwms/j6FyxQAhuncSIAAAQGgGSBAgMAEAQHghC6rcXOBuw/Y0cDvR2wd/32Ad/dh8zG0PQJvCpR5LwSAJpgAAQKpAn4BmMrpYQQIENhAQAC4QRNsYbrA3QdsAeCxCbu7D8d24SoCewmUeS8EgHsNjt0QIFBeQABYvoUKIECAwHcCAkAjQeBxgbsP2ALAYy2+uw/HduEqAnsJlHkvBIB7DY7dECBQXkAAWL6FCiBAgIAA0AwQ2E3gjgP2j0K/H/313df3Hb3uxbPDXwm+ow+7zZr9EDgrUOa9EACeba3rCRAg8EMBAaABIUCAQDcBvwDs1lH1FBS444AtADw/CHf04fwu3EFgL4Ey74UAcK/BsRsCBMoLCADLt1ABBAgQ+E5AAGgkCDwucMcBWwB4vq139OH8LtxBYC+BMu+FAHCvwbEbAgTKCwgAy7dQAQQIEBAAmgECuwncccAWAJ7v8h19OL8LdxDYS6DMeyEA3Gtw7IYAgfICAsDyLVQAAQIEBIBmgMBuAnccsI8GgEevezE7c+1uxkf2c0cfjqzrGgI7C5R5LwSAO4+RvREgUFBAAFiwabZMgACBHwr4K8AGhMDjAnccsI+GdUevEwC+Pyaff/np8RmyAQJ3CdzxfbplrwLAW1g9lACBuQICwLm9VzkBAl0FBIBdO6uuQgJ3HLCPBntHrxMACgALvVK2mihwx/cpcXvfHiUAvIXVQwkQmCsgAJzbe5UTINBVoHkA+MTBZfWa1nv75Yz+Kmu158vu71jzTLD3WvD1ff/6b//+7pfv++f/6Noqn887+vCj2qPrvTyzynxHa1Tf25MT9aw0M+HvhQAwTOdGAgQIvCUgADQXBAgQ6CYgAHyzo9HD511hzh0hQrTG6AHUeu938Q5TAeD5j/Udfbjj3a0U5lQx7f59qjQz59/cf9whAAzTuZEAAQICQDNAgACBCQICQAHgyTl3oH8bLBog3BUaCwBPDvZNv8QUAP7H+Ub4heO7ZtHvrwAwNIZuIkCAwGgBvwAc3X7FEyDQUkAAKAA8OdjRA2g0IOu+ngDw5ADeeHmVWasU5lQx7f59qjQz4VfcLwDDdG4kQIDAWwICQHNBgACBbgICQAHgyZl2oH8bLBogPBEAnmz5ocv9OwAPMf3poui7VCnMidYYfZ+s9/4cVjE9/yb94w4BYJjOjQQIEBAAmgECBAhMEBAACgBPzrkDtgDwLQEB4MkX6cJfORYAvm/t+yQAPP8muoMAAQIEBIBmgAABAhMEBIACwJNz7oAtABQA/llg9S+rBIACwJOf7a+Xr57T6HqR2r7e4xeAYTo3EiBAQABoBggQIDBBoHkAOKGFaqwvcEeo+qP/CMgdYn4BeIeqZxJ4XuCO79MtVQkAb2H1UAIE5gr4dwDO7b3KCRDoKiAA7NpZdRUSuOOALQA8PwB39OH8LtxBYC+BMu+FAHCvwbEbAgTKCwgAy7dQAQQIEPhOQABoJAg8LnDHAVsAeL6td/Th/C7cQWAvgTLvhQBwr8GxGwIEygsIAMu3UAEECBAQAJoBArsJ3HHAFgCe7/IdfTi/C3cQ2EugzHshANxrcOyGAIHyAgLA8i1UAAECBASAZoDAbgJ3HLAFgOe7fEcfzu/CHQT2EijzXggA9xocuyFAoLyAALB8CxVAgAABAaAZILCbwB0HbAHg+S7f0Yfzu3AHgb0EyrwXAsC9BsduCBAoLyAALN9CBRAgQEAAaAYI7CZwxwFbAHi+y3f04fwu3EFgL4Ey74UAcK/BsRsCBMoLCADLt1ABBAgQEACaAQK7CdxxwBYAnu/yHX04vwt3ENhLoMx7IQDca3DshgCB8gICwPItVAABAgQEgGaAwG4CdxywBYDnu3xHH87vwh0E9hIo814IAPcaHLshQKC8gACwfAsVQIAAAQGgGSCwm8AdB2wB4Pku39GH87twB4G9BMq8FwLAvQbHbggQKC8gACzfQgUQIEBAAGgGCOwmcMcBWwB4vst39OH8LtxBYC+BMu+FAHCvwbEbAgTKCwgAy7dQAQQIEBAAmgECuwncccB+HQD+67/9+59KvuP/t5tpZD939CGyD/cQ2EmgzHshANxpbOyFAIEGAgLABk1UAgECBP4k8Pnvv60UKXOQWIlirfECd7wXd4R8P3pmhybe0YcOLmqYLVDmvRAAzh5U1RMgkC4gAEwn9UACBAg8LCAAfLgBlifw6dMdB2wB4PnJuqMP53fhDgJ7CZR5LwSAew2O3RAgUF5AAFi+hQogQIDAdwICQCNB4HGBOw7YAsDzbb2jD+d34Q4CewmUeS8EgHsNjt0QIFBeQABYvoUKIECAgADQDBDYTaDMAXs3uOT96EMyqMe1ECjzXggAW8ybIggQ2EdAALhPL+yEAAECOQJ+AZjj6CkELgiUOWBfqLHCrfpQoUv2uFqgzHshAFw9GtYjQKC5gACweYOVR4DAQAEB4MCmK3k3gTIH7N3gkvejD8mgHtdCoMx7IQBsMW+KIEBgHwEB4D69sBMCBAikCPz6889L/yvA0U1//uWn6K3L74selpZvtPmCE2amUo0Vxi367lbqQ7TGCv2rtEczk9+tz1++OKvms3oiAQKDBXxUBzdf6QQI9BQQAOb31QE73zTyxAkH7Eo1Rnq4+p7ou1upD9EaV/ei+3pmJr/DAsB8U08kQGC2gABwdv9VT4BAQwEBYH5THbDzTSNPnHDArlRjpIer74m+u5X6EK1xdS+6r2dm8jssAMw39UQCBGYLCABn91/1BAg0FBAA5jfVATvfNPLECQfsSjVGerj6nui7W6kP0RpX96L7emYmv8MCwHxTTyRAYLaAAHB2/1VPgEBDAQFgflMdsPNNI0+ccMCuVGOkh6vvib67lfoQrXF1L7qvZ2byOywAzDf1RAIEZgsIAGf3X/UECDQUEADmN9UBO9808sQJB+xKNUZ6uPqe6LtbqQ/RGlf3ovt6Zia/wwLAfFNPJEBgtoAAcHb/VU+AQEMBAWB+Ux2w800jT5xwwK5UY6SHq++JvruV+hCtcXUvuq9nZvI7LADMN/VEAgRmCwgAZ/df9QQINBQQAOY31QE73zTyxAkH7Eo1Rnq4+p7ou1upD9EaV/ei+3pmJr/DAsB8U08kQGC2gABwdv9VT4BAQwEBYH5THbDzTSNPnHDArlRjpIer74m+u5X6EK1xdS+6r2dm8jssAMw39UQCBGYLCABn91/1BAg0FBAA5jfVATvfNPLECQfsSjVGerj6nui7W6kP0RpX96L7emYmv8MCwHxTTyRAYLaAAHB2/1VPgEBDAQFgflMdsPNNI0+ccMCuVGOkh6vvib67lfoQrXF1L7qvZ2byOywAzDf1RAIEZgsIAGf3X/UECDQUEADmN9UBO9808sQJB+xKNUZ6uPqe6LtbqQ/RGlf3ovt6Zia/wwLAfFNPJEBgtoAAcHb/VU+AQEMBAWB+Ux2w800jT5xwwK5UY6SHq++JvruV+hCtcXUvuq9nZvI7LADMN/VEAgRmCwgAZ/df9QQINBQQAOY31QE73zTyxAkH7Eo1Rnq4+p7ou1upD9EaV/ei+3pmJr/DAsB8U08kQGC2gABwdv9VT4BAQwEBYH5THbDzTSNPnHDArlRjpIer74m+u5X6EK1xdS+6r2dm8jssAMw39UQCBGYLCABn91/1BAg0FBAA5jfVATvfNPLECQfsSjVGerj6nui7W6kP0RpX96L7emYmv8MCwHxTTyRAYLaAAHB2/1VPgEBDAQFgflMdsPNNI0+ccMCuVGOkh6vvib67lfoQrXF1L7qvZ2byOywAzDf1RAIEZgsIAGf3X/UECDQUEADmN9UBO9808sQJB+xKNUZ6uPqe6LtbqQ/RGlf3ovt6Zia/wwLAfFNPJEBgtoAAcHb/VU+AQEOB7gFg9LB75XAWXbPheD1aUrSH0f5F13tBemLNR5uz6eKr+xBd74UvOm9X1ty0bSW39UT/nlhzZXMEgCu1rUWAwAQBAeCELquRAIFRAgLAt9sdPShdCXNGDd6CYqM9jAYk0fWuzMyVNRe0oNwSq3sfXU8AWG60/rLh6LtrZt7vvQCw/nuhAgIE9hIQAO7VD7shQIDAZQEBoADw8hBt+oDVB+zoegLAfQYoGq5Eex9dTwC4z8xEd2JmonICwHw5TyRAgMDbAgJAk0GAAIFmAgJAAWCzkf6jnNUH7Oh6AsB9JjAayEV7H11PALjPzER3YmaicgLAfDlPJECAgADQDBAgQGCEgABQANh10FcfsKPrCQD3mcBoIBftfXQ9AeA+MxPdiZmJygkA8+U8kQABAgJAM0CAAIERAgJAAWDXQV99wI6uJwDcZwKjgVy099H1BID7zEx0J2YmKicAzJfzRAIECAgAzQABAgRGCAgABYBdB331ATu6ngBwnwmMBnLR3kfXEwDuMzPRnZiZqJwAMF/OEwkQICAANAMECBAYIdA9AHyiiVcO9U/st+ua0QP2Ex5m5gn1vDXNWp7llCeZmfxO+68A55t6IgECswX8R0Bm91/1BAg0FBAA5jdVmJNvGnmiA3ZEzT0RAbMWUZt9j5nJ778AMN/UEwkQmC0gAJzdf9UTINBQQACY31QBYL5p5IkO2BE190QEzFpEbfY9Zia//wLAfFNPJEBgtoAAcHb/VU+AQEMBAWB+UwWA+aaRJzpgR9TcExEwaxG12feYmfz+CwDzTT2RAIHZAgLA2f1XPQECDQUEgPlNFQDmm0ae6IAdUXNPRMCsRdRm32Nm8vsvAMw39UQCBGYLCABn91/1BAg0FBAA5jdVAJhvGnmiA3ZEzT0RAbMWUZt9j5nJ778AMN/UEwkQmC0gAJzdf9UTINBQQACY31QBYL5p5IkO2BE190QEzFpEbfY9Zia//wLAfFNPJEBgtoAAcHb/VU+AQEMBAWB+UwWA+aaRJzpgR9TcExEwaxG12feYmfz+CwDzTT2RAIHZAgLA2f1XPQECDQUEgPlNFQDmm0ae6IAdUXNPRMCsRdRm32Nm8vsvAMw39UQCBGYLCABn91/1BAg0FBAA5jdVAJhvGnmiA3ZEzT0RAbMWUZt9j5nJ778AMN/UEwkQmC0gAJzdf9UTINBQQACY31QBYL5p5IkO2BE190QEzFpEbfY9Zia//wLAfFNPJEBgtoAAcHb/VU+AQEMBAWB+UwWA+aaRJzpgR9TcExEwaxG12feYmfz+CwDzTT2RAIHZAgLA2f1XPQECDQUEgPlNFQDmm0ae6IAdUXNPRMCsRdRm32Nm8vsvAMw39UQCBGYLCABn91/1BAg0FBAA5jdVAJhvGnmiA3ZEzT0RAbMWUZt9j5nJ778AMN/UEwkQmC0gAJzdf9UTINBQQACY31QBYL5p5IkO2BE190QEzFpEbfY9Zia//wLAfFNPJEBgtoAAcHb/VU+AQEMBAWB+UwWA+aaRJzpgR9TcExEwaxG12feYmfz+CwDzTT2RAIHZAgLA2f1XPQECDQUEgPlNFQDmm0ae6IAdUXNPRMCsRdRm32Nm8vsvAMw39UQCBGYLCABn91/1BAh0FPj89986lvVkTdEAsNKB8ElfaxMgQGAXAd/7XTrx6dOnX//mrLpRO2yFAIH6Aj6q9XuoAgIECPxZQACYPhEOhOmkHkiAAIEtBXzvN2qLAHCjZtgKAQIdBASAHbqoBgIECLwWEACmz4MDYTqpBxIgQGBLAd/7jdoiANyoGbZCgEAHAQFghy6qgQABAgLAW2fAgfBWXg8nQIDANgK+99u0wl8B3qgVtkKAQA8BAWCPPqqCAAEC3wT8AjB9GhwI00k9kAABAlsK+N5v1Ba/ANyoGbZCgEAHAQFghy6qgQABAq8FBIDp8+BAmE7qgQQIENhSwPd+o7YIADdqhq0QINBBQADYoYtqIECAgADw1hlwILyV18MJECCwjYDv/Tat8FeAN2qFrRAg0ENAANijj6ogQIDANwG/AEyfBgfCdFIPJECAwJYCvvcbtcUvADdqhq0QINBBQADYoYtqIECAwGsBAWD6PDgQppN6IAECBLYU8L3fqC0CwI2aYSsECHQQEAB26KIaCBAgIAC8dQYcCG/l9XACBAhsI+B7v00r/BXgjVphKwQI9BAQAPbooyoIECDwTcAvANOnwYEwndQDCRAgsKWA7/1GbfELwI2aYSsECHQQEAB26KIaCBAg8FpAAJg+Dw6E6aQeSIAAgS0FfO83aosAcKNm2AoBAh0EBIAduqgGAgQICABvnQEHwlt5PZwAAQLbCPjeb9MKfwV4o1bYCgECPQQEgD36qAoCBAh8E/ALwPRpcCBMJ/VAAgQIbCnge79RW/wCcKNm2AoBAh0EBIAduqgGAgQIvBYQAKbPgwNhOqkHEiBAYEsB3/uN2iIA3KgZtkKAQAcBAWCHLqqBAAECAsBbZ8CB8FZeDydAgMA2Ar7327TCXwHeqBW2QoBADwEBYI8+qoIAAQLfBPwCMH0aHAjTST2QAAECWwr43m/UFr8A3KgZtkKAQAcBAWCHLqqBAAECrwUEgOnz4ECYTuqBBAgQ2FLA936jtggAN2qGrRAg0EFAANihi2ogQIDAgwHg6sPS6vVeaFevab23X+nPv/wUetdXe06YmVAjBtwUnbUXmirzHa1RfW+/AFHPSjMTfvUFgGE6NxIgQOAtAQGguSBAgEA3gcW/AIweXqocBieEOd17uLq+CTPT7bOZVU901iqFOdEaq3zzq9RXaWbC75cAMEznRgIECAgAzQABAgQmCAgA3+xy9PA5IcypcuCN9nB1fRNmZsKnNFJjdNYqhTnRGqu8v1XqqzQzkXfp6z0CwDCdGwkQICAANAMECBCYICAAFACenPMqB94qAYIA8OQANro8+i5VCnOiNVZ5f6vUV2lmwq+4ADBM50YCBAgIAM0AAQIEJggIAAWAJ+e8yoG3SoAgADw5gI0uj75LlcKcaI1V3t8q9VWamfArLgAM07mRAAECAkAzQIAAgQkCAkAB4Mk5r3LgrRIgCABPDmCjy6PvUqUwJ1pjlfe3Sn2VZib8igsAw3RuJECAgADQDBAgQGCCgABQAHhyzqsceKsECALAkwPY6PLou1QpzInWWOX9rVJfpZkJv+ICwDCdGwkQICAANAMECBCYILA4AJxAuvpAOMFUjQQIENhRwPd+o64IADdqhq0QINBB4F86FKEGAgQIEHglIABMHwcHwnRSDyRAgMCWAr73G7VFALhRM2yFAIEOAgLADl1UAwECBF4LCADT58GBMJ3UAwkQILClgO/9Rm0RAG7UDFshQKCDgACwQxfVQIAAAQHgrTPgQHgrr4cTIEBgGwHf+21a8emTAHCjZtgKAQIdBASAHbqoBgIECAgAb50BB8JbeT2cAAEC2wj43m/TCgHgRq2wFQIEeggIAHv0URUECBD4JuCvAKdPgwNhOqkHEiBAYEsB3/uN2uIXgBs1w1YIEOggIADs0EU1ECBA4LWAADB9HhwI00k9kAABAlsK+N5v1BYB4EbNsBUCBDoICAA7dFENBAgQEADeOgMOhLfyejgBAgS2EfC936YV/grwRq2wFQIEeggIAHv0URUECBD4JuAXgOnT4ECYTuqBBAgQ2FLA936jtvgF4EbNsBUCBDoICAA7dFENBAgQeC0gAEyfBwfCdFIPJECAwJYCvvcbtUUAuFEzbIUAgQ4CAsAOXVQDAQIEBIC3zoAD4a28Hk6AAIFtBHzvt2mFvwK8UStshQCBHgICwB59VAUBAgS+CfgFYPo0OBCmk3ogAQIEthTwvd+oLX4BuFEzbIUAgQ4CAsAOXVQDAQIEXgsIANPnwYEwndQDCRAgsKWA7/1GbREAbtQMWyFAoIOAALBDF9VAgAABAeCtM+BAeCuvhxMgQGAbAd/7bVrhrwBv1ApbIUCgh4AAsEcfVUGAAIFvAn4BmD4NDoTppB5IgACBLQV87zdqi18AbtQMWyFAoIOAALBDF9VAgACB1wICwPR5cCBMJ/VAAgQIbCnge79RWwSAGzXDVggQ6CAgAOzQRTUQIEBAAHjrDDgQ3srr4QQIENhGwPd+m1b4K8AbtcJWCBDoISAA7NFHVRAgQOCbgF8Apk+DA2E6qQcSIEBgSwHf+43a4heAGzXDVggQ6CAgAOzQRTUQIEDglcCvP//8WwWQz7/8VGGbX/fY/UCovrdHccKMVnkJq/Qi+i699KF7jerb5227Mqcrq/j85Yuz6kpwaxEg0F7AR7V9ixVIgMA0AQFgfsejhyUH3vxeRJ7YvX9XQuqI5xP3dH+XBIBPTNXba/pe7NMLAeA+vbATAgR6CAgAe/RRFQQIEPhDQACYPwzdD4Tqe3tmqoROAsD8dz76xOi7JACMiuffF+2h70V+LwSA+aaeSIDAbAEB4Oz+q54AgYYCAsD8pnY/EKpPAJj/1uQ+sUq4En2XBIC583LladEeVpnRSv+DgQDwyiS7lwABAn8VEACaCgIECDQTEADmN7T7gVB9AsD8tyb3iVXClei7JADMnZcrT4v2sMqMCgCvTId7CRAgUFtAAFi7f3ZPgACBvwgIAPOHovuBUH0CwPy3JveJVcKV6LskAMydlytPi/awyowKAK9Mh3sJECBQW0AAWLt/dk+AAAEB4IIZ6H4gVJ8AcMFrdGmJKuFK9F0SAF4aj9Sboz2sMqMCwNRx8TACBAiUEhAAlmqXzRIgQOBjAb8A/Njo7BXdD4TqEwCefSdWX18lXIm+SwLA1RP1/nrRHlaZUQHgPrNmJwQIEFgtIABcLW49AgQI3CwgAMwH7n4gVJ8AMP+tyX1ilXAl+i4JAHPn5crToj2sMqMCwCvT4V4CBAjUFhAA1u6f3RMgQOAvAgLA/KHofiBUnwAw/63JfWKVcCX6LgkAc+flytOiPawyowLAK9PhXgIECNQWEADW7p/dEyBAQAC4YAa6HwjVJwBc8BpdWqJKuBJ9lwSAl8Yj9eZoD6vMqAAwdVw8jAABAqUEBICl2mWzBAgQ+FjALwA/Njp7RfcDofoEgGffidXXVwlXou+SAHD1RL2/XrSHVWZUALjPrNkJAQIEVgsIAFeLW48AAQI3CwgA84G7HwjVJwDMf2tyn1glXIm+SwLA3Hm58rRoD6vMqADwynS4lwABArUFBIC1+2f3BAgQ+IuAADB/KLofCNUnAMx/a3KfWCVcib5LAsDcebnytGgPq8yoAPDKdLiXAAECtQUEgLX7Z/cECBAQAC6Yge4HQvUJABe8RpeWqBKuRN8lAeCl8Ui9OdrDKjMqAEwdFw8jQIBAKQEBYKl22SwBAgQ+FvALwI+Nzl7R/UCoPgHg2Xdi9fVVwpXouyQAXD1R768X7WGVGRUA7jNrdkKAAIHVAgLA1eLWI0CAwM0CAsB84O4HQvUJAPPfmtwnVglXou+SADB3Xq48LdrDKjMqALwyHe4lQIBAbQEBYO3+2T0BAgT+ItA9AHzicLZ6TevlBnKrPa8csKMhQrTGKp/QqMvq+q70IVpjdE3rvT0dVTyvhMbRGle/T5+/fHFWXY1uPQIEWgv4qLZur+IIEJgoIADMDY8qhTkO9Hsc6CvNTJVvZHS2V9d3JViJ1hhd03p7fC+i/RMArn67rUeAAIH6AgLA+j1UAQECBP4kIAAUAJ59JaIHUAHC+9JVTM/OylPXR2dt9X6jfX8izImaRmu0Xm7g+MTMrH6f/AJwtbj1CBDoLiAA7N5h9REgME5AACgAPDv0DvRzZ+bsrDx1fTQ8Wr3f6Lv0RJgTNY3WaD0B4Nn3UQB4Vsz1BAgQ+LGAANCEECBAoJmAAHBumOOAnXvAjnq+7KJKSFLl83elFytrjPZdAPh+l6Km0Zmpst4TM7PyXfpan38H4Gpy6xEg0FxAANi8wcojQGCegABQAHh26qsceKsc6AWAZyfw4+ujvf/4yblXRN+lJ8KcqGm0Ruvl/g8UT8xM7tvy8dMEgB8buYIAAQJnBASAZ7RcS4AAgQICAkAB4NkxdaCfOzNnZ+Wp66Ph0er9Rt+lJ8KcqGm0RusJAM++jwLAs2KuJ0CAwI8FBIAmhAABAs0EugeAT7Rr9YF3dY3qyw8Aq/Rw9T6j60XDo+h60fui79KVADC61+h90Rq797BKfS99j/YwOjPR+wSAUTn3ESBA4G0BAaDJIECAQDMBAWB+Q6OHpSoHQvUJAPPfmtwndn+XBIC583Llad2/hwLAK9PhXgIECNQWEADW7p/dEyBA4C8CAsD8oeh+IFSfADD/rcl9ogAw1/PK03wvfC+uzM+Ze/0C8IyWawkQIPCxgADwYyNXECBAoJSAADC/XQ68tQ+83fv30p1ojflvyz1PFADe4xp5anTWuvewSn2VvhcCwMgb6h4CBAi8LyAANB0ECBBoJiAAzG+oA68AMH+qcp8YndHcXdz3tCrhypU+dK9Rffe9H2effGVOz6515XoB4BU99xIgQOCvAgJAU0GAAIFmAgLA/IZGD0sOvPm9iDyxe/9eTKI1RjyfuKf7u/Ri2r1G9T3x5ry9ZpXvhQBwn5mxEwIEeggIAHv0URUECBD4Q0AAmD8M0cOSA29+LyJP7N4/AWBkKu65JzprAsB7+hF5arSHVb73lb4XAsDIBLuHAAEC7wsIAE0HAQIEmgkIAPMb2v1AqL63Z8aBPv9dij6xSi+i75IAMDoZ+fdFe1hlRgWA+TPjiQQIEKgiIACs0in7JECAwEEBAeBBqBOXdT8Qqk8AeOJ1eOTSKuFK9F0SAD4yVm8uGu1hlRkVAO4za3ZCgACB1QICwNXi1iNAgMDNAgLAfODuB0L1CQDz35rcJ1YJV6LvkgAwd16uPC3awyozKgC8Mh3uJUCAQG0BAWDt/tk9AQIE/iIgAMwfiu4HQvUJAPPfmtwnVglXou8EftX0AAAgAElEQVSSADB3Xq48LdrDKjMqALwyHe4lQIBAbQEBYO3+2T0BAgQEgAtmoPuBUH0CwAWv0aUlqoQr0XdJAHhpPFJvjvawyowKAFPHxcMIECBQSkAAWKpdNkuAAIGPBfwC8GOjs1d0PxCqTwB49p1YfX2VcCX6LgkAV0/U++tFe1hlRgWA+8yanRAgQGC1gABwtbj1CBAgcLOAADAfuPuBUH0CwPy3JveJVcKV6LskAMydlytPi/awyowKAK9Mh3sJECBQW0AAWLt/dk+AAIG/CAgA84ei+4FQfQLA/Lcm94lVwpXouyQAzJ2XK0+L9rDKjAoAr0yHewkQIFBbQABYu392T4AAAQHgghnofiBUnwBwwWt0aYkq4Ur0XRIAXhqP1JujPawyowLA1HHxMAIECJQSEACWapfNEiBA4GMBvwD82OjsFd0PhOoTAJ59J1ZfXyVcib5LAsDVE/X+etEeVplRAeA+s2YnBAgQWC0gAFwtbj0CBAjcLCAAzAfufiBUnwAw/63JfWKVcCX6LgkAc+flytOiPawyowLAK9PhXgIECNQWEADW7p/dEyBA4C8C0QCw0uFF23MFuh94u9eXOw2edkUgOmsCwCvq7t1dIPpefP7yxVl19+baHwECpQR8VEu1y2YJECDwsYAA8GMjV/xZIHw4++WnEpTd6yvRhCGbjM6aAHDIgAwtM/peCACHDoyyCRC4TUAAeButBxMgQOAZAQHgM+6VVw0fzgSAldtu7zcIRN8lAeANzfDIbQSi74UAcJsW2ggBAk0EBIBNGqkMAgQI/FNAAGgWzgqED2cCwLPU46//f//+fx02+E9/+89/XPv9fa//f4cfuODC6LskAFzQHEs8JhB9LwSAj7XMwgQINBUQADZtrLIIEJgrIACc2/to5eHDmQAwSj72PgHg+62v8u9h7f69GPty3lh4eGb8OwBv7IpHEyAwUUAAOLHraiZAoLWAALB1e28pLnw4EwDe0o/ODxUACgA7z7fa3hYI/xkjADRSBAgQSBUQAKZyehgBAgSeFxAAPt+DajsIH84EgNVa/fh+BYACwMeH0AaWC4T/jBEALu+VBQkQ6C0gAOzdX9URIDBQQAA4sOkXSw4fzgSAF+Vn3H4m9HtP5Pt/59/rZ+707wOMvksvdfsrwDPeh4lVRt8L/w7AidOiZgIE7hQQAN6p69kECBB4QEAA+AB68SXDhzMBYPHOr9m+APCYswDwmJOr6gmE/4zxC8B6zbZjAgS2FhAAbt0emyNAgMB5AQHgebPpd4QPZwLA6aNzqH4B4CEmvwA8xuSqggLhP2MEgAW7bcsECOwsIADcuTv2RoAAgYCAADCANvyW8OFMADh8co6VfzQA/NFf8/1+pZ3+2u/rvUXfpZdn+AXgsXlyVT2B6HvhrwDX67UdEyCwt4AAcO/+2B0BAgROCwgAT5ONvyF8OBMAjp+dIwACwCNKAsBjSq6qKBD+M8YvACu2254JENhYQAC4cXNsjQABAhEBAWBEbfY94cOZAHD24BysXgB4DMovAI85uaqeQPjPGAFgvWbbMQECWwsIALduj80RIEDgvIAA8LzZ9DvChzMB4PTROVS/APAQk78CfIzJVQUFwn/GCAALdtuWCRDYWUAAuHN37I0AAQIBAQFgAG34LeHDmQBw+ORcL/9oOPj9Sv4dgNfto0/o/r2IurjvfYHwzAgAjRUBAgRSBQSAqZweRoAAgecFBIDP96DaDsKHMwFgtVZvt18B4LeW+CvA242nDSUJhP+MEQAmdcBjCBAg8LuAANAkECBAoJmAALBZQxeUEz6cCQAXdKf3EgJAAWDvCVfdi0D4zxgBoAEiQIBAqoAAMJXTwwgQIPC8gADw+R5U20H4cCYArNbq7fYrABQAbjeUNpQuEP4zRgCY3gsPJEBgtoAAcHb/VU+AQEOB1QFg+B/sg+HR6vUu/XqhSI2rTbuvN2FmVnw6fxQO+ncAfutA9/dJfe+/bdG/Nl7GVAC44lNrDQIEBgkIAAc1W6kECMwQEAC+3efoQWlCmFPmMFgkUJ0wMyu+pgLAY8re39xvfhXPl6qjf65VqfGzAPDYR8BVBAgQOCggADwI5TICBAhUERAA5h4GJ4Q5ZQ6DAsB3P0Ore7jieygAPKa8uvfWy/0zJuopADz2friKAAECBL4JCABNAwECBJoJCABzD2cCwPdfkPa/PgkGjhNmZsVnUwB4TDkaIHl/3/at4ikAPPZ+uIoAAQIEBIBmgAABAm0FBIACwLPDXeXAWyWwEACencC3rxcAHnP0/uZ+86t4CgCPvR+uIkCAAAEBoBkgQIBAWwEBYO5hcEKYU+XAKwB8/7O1uocrPqACwGPKq3tvvdw/Y6KeAsBj74erCBAgQEAAaAYIECDQVkAAmHs4EwC+/6pUCeSiB+xofRNmZsUHVAB4THn1fFsv98+YqKcA8Nj74SoCBAgQEACaAQIECLQVWB0AtoUcVFj0AHolIFvJ272+lZbZa/0o5PvRWv/pb/85eyspz4vO2pUwJ2XjJx4SrbHK9+IEhUsPCoRnxn8F+KCwywgQIHBMwH8E5JiTqwgQIFBGQABYplXbbDR8OLvwH8lYWXz3+lZaZq8lAPwmWiUg8z5lvwX9nxeeGQFg/+FQIQECSwUEgEu5LUaAAIH7BQSA9xt3WyF8OBMAdhuF5fUIAAWAy4fOgssFwn/GCACX98qCBAj0FhAA9u6v6ggQGCggABzY9Islhw9nAsCL8jNuj4Z8P9LxV4Cfm53u34vnZPuuHJ4ZAWDfoVAZAQKPCAgAH2G3KAECBO4TEADeZ9v1yeHDmQCw60ik1iUAPMbprwAfc3JVPYHwnzECwHrNtmMCBLYWEABu3R6bI0CAwHkBAeB5s+l3hA9nAsDpo3OofgHgIaZPAsBjTq6qJxD+M0YAWK/ZdkyAwNYCAsCt22NzBAgQOC8gADxvNv2O8OFMADh9dA7VLwA8xCQAPMbkqoIC4T9jBIAFu23LBAjsLCAA3Lk79kaAAIGAgAAwgDb8lvDhTAA4fHKOlZ8RAO767/z7XiD6Lr08xy8Aj82Tq+oJRN+LzwLAes22YwIEthYQAG7dHpsjQIDAeQEB4Hmz6XeED2cCwOmjc6h+AeAhJgHgMSZXFRQI/xkjACzYbVsmQGBnAQHgzt2xNwIECAQEBIABtOG3hA9nAsDhk3OsfAHgMSe/ADzm5Kp6AuE/YwSA9ZptxwQIbC0gANy6PTZHgACB8wICwPNm0+8IH84EgNNH53T9Z8LAKn/t9zVC9F16eYYA8PQ4uaGIQPS98FeAizTYNgkQKCMgACzTKhslQIDAMQEB4DEnV30TCB/OBIDG6KSAAPB9MAHgyWFyeRmB8J8xfgFYpsc2SoBADQEBYI0+2SUBAgQOCwgAD1O58B8C4cOZANAMnRQQAAoAT46MyxsIhP+MEQA26L4SCBDYSUAAuFM37IUAAQIJAgLABMRhjwgfzgSAwyblerkCQAHg9SnyhGoC4T9jBIDVWm2/BAhsLiAA3LxBtkeAAIGzAgLAs2KuDx/OBICGh8CfBKLv0stD/BVgw9RVIPpe+HcAdp0IdREg8JSAAPApeesSIEDgJgEB4E2wjR8bPpwJABtPhdIiAtF3SQAY0XZPFYHoeyEArNJh+yRAoIqAALBKp+yTAAECBwUEgAehXPaHQPhwJgA0RQT+JBB9lwSABqmzQPS9EAB2ngq1ESDwhIAA8Al1axIgQOBGge4BYPQgcSP5u4/2V/qeUJ+5ZqX3ItKhKu9SpLZq90RnrUoPo/U90cfupgLAJ6bKmgQIdBYQAHburtoIEBgpIADcp+3tD2dFfgG4z0Tct5NKoUVEocq7FKmt2j3RWavSw2h9T/Sxu6kA8ImpsiYBAp0FBICdu6s2AgRGCggA92l7+8OZAHCbYasUWkTQqrxLkdqq3ROdtSo9jNb3RB+7mwoAn5gqaxIg0FlAANi5u2ojQGCkgABwn7a3P5wJALcZtkqhRQStyrsUqa3aPdFZq9LDaH1P9LG7qQDwiamyJgECnQUEgJ27qzYCBEYKCAD3aXv7w5kAcJthqxRaRNCqvEuR2qrdE521Kj2M1vdEH7ubCgCfmCprEiDQWUAA2Lm7aiNAYKSAAHCftrc/nAkAtxm2SqFFBK3KuxSprdo90Vmr0sNofU/0sbupAPCJqbImAQKdBQSAnburNgIERgoIAPdpe/vDmQBwm2GrFFpE0Kq8S5Haqt0TnbUqPYzW90Qfu5sKAJ+YKmsSINBZQADYubtqI0BgpIAAcJ+2tz+cCQC3GbZKoUUErcq7FKmt2j3RWavSw2h9T/Sxu6kA8ImpsiYBAp0FBICdu6s2AgRGCggA92l7+8OZAHCbYasUWkTQqrxLkdqq3ROdtSo9jNb3RB+7mwoAn5gqaxIg0FlAANi5u2ojQGCkgABwn7a3P5wJALcZtkqhRQStyrsUqa3aPdFZq9LDaH1P9LG7qQDwiamyJgECnQUEgJ27qzYCBEYKCAD3aXv7w5kAcJthqxRaRNCqvEuR2qrdE521Kj2M1vdEH7ubCgCfmCprEiDQWUAA2Lm7aiNAYKSAAHCftrc/nAkAtxm2SqFFBK3KuxSprdo90Vmr0sNofU/0sbupAPCJqbImAQKdBQSAnburNgIERgoIAPdpe/vDmQBwm2GrFFpE0Kq8S5Haqt0TnbUqPYzW90Qfu5sKAJ+YKmsSINBZQADYubtqI0BgpIAAcJ+2tz+cCQC3GbZKoUUErcq7FKmt2j3RWavSw2h9T/Sxu6kA8ImpsiYBAp0FBICdu6s2AgRGCggA92l7+8OZAHCbYasUWkTQqrxLkdqq3ROdtSo9jNb3RB+7mwoAn5gqaxIg0FlAANi5u2ojQGCkgABwn7a3P5wJALcZtkqhRQStyrsUqa3aPdFZq9LDaH1P9LG7qQDwiamyJgECnQUEgJ27qzYCBEYKCAD3aXv7w5kAcJthqxRaRNCqvEuR2qrdE521Kj2M1vdEH7ubCgCfmCprEiDQWUAA2Lm7aiNAYKSAAHCftrc/nAkAtxm2SqFFBK3KuxSprdo90Vmr0sNofU/0sbupAPCJqbImAQKdBQSAnburNgIERgqsDgCjh6XowSW63hPDsLpG673d5ejMRD1fdrF6zeh6T7wXkTWjvYi6rF7vxWT1mtbL/V5E5vrqPe17+OWLs+rVIXE/AQIEXgn4qBoHAgQINBMQAO7T0PaHs+AvAKuEMtH+CQDz38FoL6rMmgDw/Zmp1MP8yf/xE7u/F34BuHqirEeAQHcBAWD3DquPAIFxAgLAfVre/nAmAHx32IQWue9h93dJACgAjLwx3d8LAWBkKtxDgACB9wUEgKaDAAECzQQEgPs0tP3hTAAoAFz0unV/lwSAAsDIq9T9vRAARqbCPQQIEBAAmgECBAiMERAA7tPq9oczAaAAcNHr1v1dEgAKACOvUvf3QgAYmQr3ECBAQABoBggQIDBGQAC4T6vbH84EgALARa9b93dJACgAjLxK3d8LAWBkKtxDgAABAaAZIECAwBgBAeA+rW5/OBMACgAXvW7d3yUBoAAw8ip1fy8EgJGpcA8BAgQEgGaAAAECYwRWB4CrYaP/cYXV+7xyoF+916hp9PC5ur4J60V7WMXGrO3TqeisVelhtL4nOtTdVAD4xFRZkwCBzgL+IyCdu6s2AgRGCggA92l7+8NZ8BeA+3Soz04qhRYR9SrvUqS2avdEZ61KD6P1PdHH7qYCwCemypoECHQWEAB27q7aCBAYKSAA3Kft7Q9nAsBthq1SaBFBq/IuRWqrdk901qr0MFrfE33sbioAfGKqrEmAQGcBAWDn7qqNAIGRAgLAfdre/nAmANxm2CqFFhG0Ku9SpLZq90RnrUoPo/U90cfupgLAJ6bKmgQIdBYQAHburtoIEBgpIADcp+3tD2cCwG2GrVJoEUGr8i5Faqt2T3TWqvQwWt8TfexuKgB8YqqsSYBAZwEBYOfuqo0AgZECAsB92t7+cCYA3GbYKoUWEbQq71Kktmr3RGetSg+j9T3Rx+6mAsAnpsqaBAh0FhAAdu6u2ggQGCkgANyn7e0PZwLAbYatUmgRQavyLkVqq3ZPdNaq9DBa3xN97G4qAHxiqqxJgEBnAQFg5+6qjQCBkQICwH3a3v5wJgDcZtgqhRYRtCrvUqS2avdEZ61KD6P1PdHH7qYCwCemypoECHQWEAB27q7aCBAYKSAA3Kft7Q9nAsBthq1SaBFBq/IuRWqrdk901qr0MFrfE33sbioAfGKqrEmAQGcBAWDn7qqNAIGRAgLAfdre/nAmANxm2CqFFhG0Ku9SpLZq90RnrUoPo/U90cfupgLAJ6bKmgQIdBYQAHburtoIEBgpIADcp+3tD2cCwG2GrVJoEUGr8i5Faqt2T3TWqvQwWt8TfexuKgB8YqqsSYBAZwEBYOfuqo0AgZECAsB92t7+cCYA3GbYKoUWEbQq71Kktmr3RGetSg+j9T3Rx+6mAsAnpsqaBAh0FhAAdu6u2ggQGCkgANyn7e0PZwLAbYatUmgRQavyLkVqq3ZPdNaq9DBa3xN97G4qAHxiqqxJgEBnAQFg5+6qjQCBkQICwH3a3v5wJgDcZtgqhRYRtCrvUqS2avdEZ61KD6P1PdHH7qYCwCemypoECHQWEAB27q7aCBAYKSAA3Kft7Q9nAsBthq1SaBFBq/IuRWqrdk901qr0MFrfE33sbioAfGKqrEmAQGcBAWDn7qqNAIGRAgLAfdre/nAmANxm2CqFFhG0Ku9SpLZq90RnrUoPo/U90cfupgLAJ6bKmgQIdBYQAHburtoIEBgpIADcp+3tD2cCwG2GrVJoEUGr8i5Faqt2T3TWqvQwWt8TfexuKgB8YqqsSYBAZwEBYOfuqo0AgZECAsB92t79cLaP9D07qdK/l+orhRaRblXpRfc+RHr3z3v08Ire2/dGTaNzuny9L1+cVfPHxhMJEBgs4KM6uPlKJ0Cgp4AAcJ++Rg9LqyuIHgZX73P1elX6JwBcPRnvr+ddet+myvtUqYdR02iNy9cTAO7zcbMTAgRaCAgAW7RREQQIEPgmIADcZxqih6XVFUQPg6v3uXq9Kv0TAK6eDAFgRLzK+1Tpexg1jda4fD0BYORVcw8BAgTeFRAAGg4CBAg0ExAA7tPQ6GFpdQXRw+Dqfa5er0r/BICrJ0MAGBGv8j5V+h5GTaM1Ll9PABh51dxDgAABAaAZIECAwBQBAeA+nY4ellZXED0Mrt7n6vWq9E8AuHoyBIAR8SrvU6XvYdQ0WuPy9QSAkVfNPQQIEBAAmgECBAhMERAA7tPp6GFpdQXRw+Dqfa5er0r/BICrJ0MAGBGv8j5V+h5GTaM1Ll9PABh51dxDgAABAaAZIECAwBQBAeA+nY4ellZXED0Mrt7n6vWq9E8AuHoyBIAR8SrvU6XvYdQ0WuPy9QSAkVfNPQQIEBAAmgECBAhMERAA7tPp6GFpdQXRw+Dqfa5er0r/BICrJ0MAGBGv8j5V+h5GTaM1Ll9PABh51dxDgAABAaAZIECAwBQBAeA+nY4ellZXED0Mrt7n/9/e3eTYchRhAG2WgeRVIDH00JKXw1LwQpgjMfTQ0tsSqJEN7Xb37VtRGfkTccbcqsg4kZUiP733PLveKfMTAM7eGQLAiPgp39NJ52HUNNrj9HoCwMin5hkCBAgIAO0BAgQIdBEQAO4z6ehlaXYH0cvg7HXOrnfK/ASAs3eGADAifsr3dNJ5GDWN9ji9ngAw8ql5hgABAgJAe4AAAQJdBASA+0w6elma3UH0Mjh7nbPrnTI/AeDsnSEAjIif8j2ddB5GTaM9Tq8nAIx8ap4hQICAANAeIECAQBcBAeA+k45elmZ3EL0Mzl7n7HqnzE8AOHtnCAAj4qd8Tyedh1HTaI/T6wkAI5+aZwgQICAAtAcIECDQRUAAuM+ko5el2R1EL4Oz1zm73inzEwDO3hkCwIj4Kd/TSedh1DTa4/R6AsDIp+YZAgQICADtAQIECHQREADuM+noZWl2B9HL4Ox1zq53yvwEgLN3hgAwIn7K93TSeRg1jfY4vZ4AMPKpeYYAAQICQHuAAAECXQQEgPtMOnpZmt1B9DI4e52z650yPwHg7J0hAIyIn/I9nXQeRk2jPU6vJwCMfGqeIUCAgADQHiBAgEAXAQHgPpOOXpZmdxC9DM5e5+x6p8xPADh7ZwgAI+KnfE8nnYdR02iP0+sJACOfmmcIECAgALQHCBAg0EVAALjPpKOXpdkdRC+Ds9c5u94p8xMAzt4ZAsCI+Cnf00nnYdQ02uP0egLAyKfmGQIECAgA7QECBAh0ERAA7jPp6GVpdgfRy+Dsdc6ud8r8BICzd4YAMCJ+yvd00nkYNY32OL2eADDyqXmGAAECAkB7gAABAl0EBID7THr6Zekffw41H70Mhood9FB0fncCuWjN6jOc7TK73kGfRXips01n1wvD3Hhwdo/T6wkAb+wOjxIgQOCPAn+CQoAAAQK1BASA+8xz+mVJADh0+NH5CQCHjuG/L4vOIhqMzq43Xmy/N842nV1vhfjsHqfXEwCu2FZqEiBQWEAAWHi4WiNAoKeAAHCfuU+/LAkAhw4/Oj8B4NAxCADHcy55Y/R7EuJ+Pq7qpt8JAJd8q4oSIFBXQABYd7Y6I0CgqYAAcJ/BV7+c7SOds5Lo/ASA4+cRnYXwaPwsom80w6icAHC8nDcSIECgp4AAsOfcdU2AQGEBAeA+w3Xh3WcWkZVE5ycAjGg/fiY6CwHg+FlE32iGUTkB4Hg5byRAgEBPAQFgz7nrmgCBwgICwH2G68K7zywiK4nOTwAY0RYAjlfb643R70mIKwDcaydbDQECBM4VEACeOzsrJ0CAwIcCAsB9NoYL7z6ziKwkOj8BYERbADheba83Rr8nAaAAcK+dbDUECBA4V0AAeO7srJwAAQICwM33QPTCO7ut6AV79jpn1ztlfncCx9mm0XqnzMK3ND6siu6Z6HMnzbD6d+E/AhLdxZ4jQIDAxwICQDuDAAECxQT8CcB9Blr9craPdM5KTpmfADBn/pG3nhQeRfq788wp39NJM6xuKgC888V5lgABAn8UEADaFQQIECgmIADcZ6DVL2f7SOes5JT5CQBz5h9560nhUaS/O8+c8j2dNMPqpgLAO1+cZwkQICAAtAcIECBQXkAAuM+Iq1/O9pHOWckp8xMA5sw/8taTwqNIf3eeOeV7OmmG1U0FgHe+OM8SIEBAAGgPECBAoLyAAHCfEVe/nO0jnbOSU+YnAMyZf+StJ4VHkf7uPHPK93TSDKubCgDvfHGeJUCAgADQHiBAgEB5AQHgPiOufjnbRzpnJafMTwCYM//IW08KjyL93XnmlO/ppBlWNxUA3vniPEuAAAEBoD1AgACB8gICwH1GXP1yto90zkpOmZ8AMGf+kbeeFB5F+rvzzCnf00kzrG4qALzzxXmWAAECAkB7gAABAuUFBID7jLj65Wwf6ZyVnDI/AWDO/CNvPSk8ivR355lTvqeTZljdVAB454vzLAECBASA9gABAgTKCwgA9xlx9cvZPtI5KzllfgLAnPlH3npSeBTp784zp3xPJ82wuqkA8M4X51kCBAgIAO0BAgQIlBcQAO4z4uqXs32kc1ZyyvwEgDnzj7z1pPAo0t+dZ075nk6aYXVTAeCdL86zBAgQEADaAwQIECgvIADcZ8TVL2f7SOes5JT5CQBz5h9560nhUaS/O8+c8j2dNMPqpgLAO1+cZwkQICAAtAcIECBQXkAAuM+Iq1/O9pHOWckp8xMA5sw/8taTwqNIf3eeOeV7OmmG1U0FgHe+OM8SIEBAAGgPECBAoLyAAHCfEVe/nO0jnbOSU+YnAMyZf+StJ4VHkf7uPHPK93TSDKubCgDvfHGeJUCAgADQHiBAgEB5AQHgPiOufjnbRzpnJafMTwCYM//IW08KjyL93XnmlO/ppBlWNxUA3vniPEuAAAEBoD1AgACB8gICwH1GXP1yto90zkpOmZ8AMGf+kbeeFB5F+rvzzCnf00kzrG4qALzzxXmWAAECAkB7gAABAuUFBID7jLj65Wwf6ZyVnDI/AWDO/CNvPSk8ivR355lTvqeTZljdVAB454vzLAECBASA9gABAgTKCwgA9xlx9cvZPtI5KzllfgLAnPlH3npSeBTp784zp3xPJ82wuqkA8M4X51kCBAgIAO0BAgQIlBcQAO4z4uqXs32kc1ZyyvwEgDnzj7z1pPAo0t+dZ075nk6aYXVTAeCdL86zBAgQEADaAwQIECgvUD0ALD9ADRIgQIAAgUIC0VBVAFhoE2iFAIEtBP60xSosggABAgSGCQgAh1F6EQECBAgQIHBTQAB4E9DjBAgQGCQgABwE6TUECBDYRUAAuMskrIMAAQIECBAQANoDBAgQ2ENAALjHHKyCAAECwwQEgMMovYgAAQIECBC4KSAAvAnocQIECAwSEAAOgvQaAgQI7CIgANxlEtZBgAABAgQICADtAQIECOwhIADcYw5WQYAAgWECAsBhlF5EgAABAgQI3BQQAN4E9DgBAgQGCQgAB0F6DQECBHYREADuMgnrIECAAAECBASA9gABAgT2EBAA7jEHqyBAgMAwAQHgMEovIkCAAAECBG4KCABvAnqcAAECgwQEgIMgvYYAAQK7CAgAd5mEdRAgQIAAAQICQHuAAAECewgIAPeYg1UQIEBgmIAAcBilFxEgQIAAAQI3BQSANwE9ToAAgUECAsBBkF5DgACBXQQEgLtMwjoIECBAgAABAaA9QIAAgT0EBIB7zMEqCBAgMExAADiM0osIECBAgACBmwICwJuAHidAgMAgAQHgIEivIUCAwC4CAsBdJmEdBAgQIECAgADQHiBAgMAeAgLAPeZgFQQIEBgmIAAcRulFBAgQIECAwE0BAeBNQI8TIEBgkIAAcAC5LisAACAASURBVBCk1xAgQGAXAQHgLpOwDgIECBAgQEAAaA8QIEBgDwEB4B5zsAoCBAgMExAADqP0IgIECBAgQOCmgADwJqDHCRAgMEhAADgI0msIECCwi4AAcJdJWAcBAgQIECAgALQHCBAgsIeAAHCPOVgFAQIEhgnMDgDD/8f+H38O9Ty73usiZ9dU7+Ot8Z098+k3M3vPhD5e39JDtlP29+y9pt7n26b8nvnpJ3fV6GHrOQIECHwg4FC1LQgQIFBMQAA4NjwSADa+fAYDxw57JnpsCnN8T1f3jj3TeM8IAK9+Ln5PgACBhwICQBuEAAECxQQEgALAq1vaBdueubpnor+31xqHOcFA3Z5pvGcEgNGj1nMECBD4UEAAaGMQIECgmIAAUJhzdUu7YNszV/dM9Pf2WuMwRwD44fCj38Try/wV4OhJ5DkCBAj0FBAA9py7rgkQKCwgABTmXN3e0Qto+ctnMLB49a9uenWP/fb76i7R/lqEOcHvKWpa/XxqsWf8CcDoUes5AgQIfCggALQxCBAgUExAACgAvLqlXbDtmat7Jvp7e+1zueqBlf4+nn30mxAARk8hzxEgQKCvgACw7+x1ToBAUQEBoDDn6taOXkBd6D+Xrm56dY/99vvqLtH+WoQ5/gTgh5+NPfMgFPcnAKNHrecIECDwoYAA0MYgQIBAMYHZAWAxPu0QIECAAAECAwWiIed3AsCBU/AqAgQIvLwIAO0CAgQIFBMQABYbqHYIECBAgMDBAgLAg4dn6QQIlBIQAJYap2YIECDw8iIAtAsIECBAgACBXQQEgLtMwjoIEOguIADsvgP0T4BAOQEBYLmRaogAAQIECBwrIAA8dnQWToBAMQEBYLGBaocAAQICQHuAAAECBAgQ2EVAALjLJKyDAIHuAgLA7jtA/wQIlBMQAJYbqYYIECBAgMCxAgLAY0dn4QQIFBMQABYbqHYIECAgALQHCBAgQIAAgV0EBIC7TMI6CBDoLiAA7L4D9E+AQDkBAWC5kWqIAAECBAgcKyAAPHZ0Fk6AQDEBAWCxgWqHAAECAkB7gAABAgQIENhFQAC4yySsgwCB7gICwO47QP8ECJQTEACWG6mGCBAgQIDAsQICwGNHZ+EECBQTEAAWG6h2CBAgIAC0BwgQIECAAIFdBASAu0zCOggQ6C4gAOy+A/RPgEA5AQFguZFqiAABAgQIHCsgADx2dBZOgEAxAQFgsYFqhwABAgJAe4AAAQIECBDYRUAAuMskrIMAge4CAsDuO0D/BAiUExAAlhuphggQIECAwLECAsBjR2fhBAgUExAAFhuodggQICAAtAcIECBAgACBXQQEgLtMwjoIEOguIADsvgP0T4BAOQEBYLmRaogAAQIECBwrIAA8dnQWToBAMQEBYLGBaocAAQICQHuAAAECBAgQ2EVAALjLJKyDAIHuAgLA7jtA/wQIlBMQAJYbqYYIECBAgMCxAgLAY0dn4QQIFBMQABYbqHYIECAQDQDJESBAgAABAgR2Efjup5/cVXcZhnUQIFBCwKFaYoyaIECAwP8FBIB2AwECBAgQIHC6gADw9AlaPwECuwkIAHebiPUQIEDgpoAA8CagxwkQIECAAIHlAgLA5SOwAAIEigkIAIsNVDsECBAQANoDBAgQIECAwOkCAsDTJ2j9BAjsJiAA3G0i1kOAAIGbAgLAm4AeJ0CAAAECBJYLCACXj8ACCBAoJiAALDZQ7RAgQEAAaA8QIECAAAECpwsIAE+foPUTILCbgABwt4lYDwECBG4KCABvAnqcAAECBAgQWC4gAFw+AgsgQKCYgACw2EC1Q4AAgZeXl39TIECAAAECBAgcLuCuevgALZ8Agb0EHKp7zcNqCBAgMEJAADhC0TsIECBAgACBlQLuqiv11SZAoJyAQ7XcSDVEgAABfwLQHiBAgAABAgSOF3BXPX6EGiBAYCcBh+pO07AWAgQIjBHwJwDHOHoLAQIECBAgsE7AXXWdvcoECBQUcKgWHKqWCBBoL3BkAPivf/31f4P74YdffjfEt//bo+m+f26nnfC+h7drfba/13527nEnb2shQKCfwD//8pdPm/7x27d+IOd37K56/gx1QIDARgIO1Y2GYSkECBAYJCAAHAQ58jUCwJGa3kWAAIE/CggAy+0Kd9VyI9UQAQIrBRyqK/XVJkCAQI6AADDH9dZbBYC3+DxMgACBLwUEgF8SnfYDd9XTJma9BAhsLeBQ3Xo8FkeAAIGQwBEB4KhA7JHQ6r8uO+KvNe/cX2h3eogAAQKDBN4Hfo/+mq9wcBD63Ne4q871Vo0AgeICDtXiA9YeAQItBQSAv45dANhy/2uaAIEmAgLA8oN2Vy0/Yg0SIDBTwKE6U1stAgQIzBEQAAoA5+w0VQgQILBQQAC4EH9OaXfVOc6qECDQRMCh2mTQ2iRAoJWAAFAA2GrDa5YAgZ4CAsDyc3dXLT9iDRIgMFPAoTpTWy0CBAjMETgiAHxP8f7fBHz7v7/9q7yPfvf+nav/CvDb9Tzb3+szz/a4U39ztrYqBAgQiAm8DQvf/1uBj/63WDVPDRJwVx0E6TUECBB4FXCo2gcECBCoJyAA/HWmOwVkAsB6H5qOCBA4R0AAeM6s3qzUXfXIsVk0AQK7CjhUd52MdREgQCAuIAAUAMZ3jycJECBQUEAAeORQ3VWPHJtFEyCwq4BDddfJWBcBAgTiAuUCwEcUO/0pv0frfPav9b5/xyn9xberJwkQIJAv8Oxf873y7wrmr7p9BXfV9lsAAAECIwUcqiM1vYsAAQJ7CAgA95jD71YhANxwKJZEgEAbAQHgkaN2Vz1ybBZNgMCuAg7VXSdjXQQIEIgLCADjdmlPCgDTaL2YAAECXwoIAL8k2vEH7qo7TsWaCBA4VsCheuzoLJwAAQKfCggAN9wcAsANh2JJBAi0ERAAHjlqd9Ujx2bRBAjsKuBQ3XUy1kWAAIG4QLkAsMK/g3flvwIcH70nCRAgQOBV4Mq/5ff+t28Ff/z2Deg6AXfVdfYqEyBQUMChWnCoWiJAoL2AAHDDLSAA3HAolkSAQFkBAWCJ0bqrlhijJggQ2EXAobrLJKyDAAEC4wQEgOMsh71JADiM0osIECDwpYAA8EuiE37grnrClKyRAIFjBByqx4zKQgkQIPC0gADwaap5PxQAzrNWiQCBngLRf+fvWS1/HfhZqWG/c1cdRulFBAgQeHlxqNoFBAgQqCcgANxwpgLADYdiSQQIlBIQAJYa52sz7qrlRqohAgRWCjhUV+qrTYAAgRwBAWCO6623CgBv8XmYAAECXwoIAL8kOu0H7qqnTcx6CRDYWsChuvV4LI4AAQIhAQFgiC33IQFgrq+3EyBAQABYbg+4q5YbqYYIEFgp4FBdqa82AQIEcgTKBYCPmH744ZccxcFvfRQAVuhvMJfXESBA4LLA+//wx9sXvP33+x797lFR/wbg5ZHcfcBd9a6g5wkQIPBGwKFqOxAgQKCegABww5kKADcciiURIFBKQABYapyvzbirlhuphggQWCngUF2przYBAgRyBASAOa633ioAvMXnYQIECHwpIAD8kui0H7irnjYx6yVAYGsBh+rW47E4AgQIhARaBYCPhHb668HRAPCU/kI71UMECBC4ITDqr/I+GxzeWKpHYwLuqjE3TxEgQOBDAYeqjUGAAIF6AgLAX2cqAKy3uXVEgACB3wQEgOX3grtq+RFrkACBmQIO1ZnaahEgQGCOgABQADhnp6lCgACBhQICwIX4c0q7q85xVoUAgSYCDtUmg9YmAQKtBASAAsBWG16zBAj0FBAAlp+7u2r5EWuQAIGZAg7VmdpqESBAYI7AkQHgW5pR/17eTn8F+P3oR/S4c39ztroqBAh0FhgVAHY23Lx3d9XNB2R5BAicJeBQPWteVkuAAIFnBASAvyrtHJAJAJ/Zyn5DgACBzwUEgOV3h7tq+RFrkACBmQIO1ZnaahEgQGCOgABQADhnp6lCgACBhQICwIX4c0q7q85xVoUAgSYCDtUmg9YmAQKtBI4PAN9P69k/Lbfzn/h7tAOf7e/1Haf22OoL1CwBAksEHgWCP377tmRNit4ScFe9xedhAgQI/F7AoWpHECBAoJ6AAPCwmQoADxuY5RIgsKWAAHDLsdxZlLvqHT3PEiBA4J2AQ9WWIECAQD0BAeBhMxUAHjYwyyVAYEsBAeCWY7mzKHfVO3qeJUCAgADQHiBAgEB5AQHgYSMWAB42MMslQGBLAQHglmO5sygB4B09zxIgQEAAaA8QIECgvEC5ALD8xDRIgAABAgQIvBcQANoTBAgQGCjgUB2I6VUECBDYREAAuMkgLIMAAQIECBAIC7irhuk8SIAAgT8KOFTtCgIECNQTEADWm6mOCBAgQIBANwF31W4T1y8BAqkCDtVUXi8nQIDAEgEB4BJ2RQkQIECAAIGBAu6qAzG9igABAg5Ve4AAAQL1BASA9WaqIwIECBAg0E3AXbXbxPVLgECqgEM1ldfLCRAgsERAALiEXVECBAgQIEBgoIC76kBMryJAgIBD1R4gQIBAPQEBYL2Z6ogAAQIECHQTcFftNnH9EiCQKuBQTeX1cgIECCwREAAuYVeUAAECBAgQGCjgrjoQ06sIECDgULUHCBAgUE9AAFhvpjoiQIAAAQLdBNxVu01cvwQIpAo4VFN5vZwAAQJLBASAS9gVJUCAAAECBAYKuKsOxPQqAgQIOFTtAQIECNQTEADWm6mOCBAgQIBANwF31W4T1y8BAqkCDtVUXi8nQIDAEgEB4BJ2RQkQIECAAIGBAu6qAzG9igABAg5Ve4AAAQL1BASA9WaqIwIECBAg0E3AXbXbxPVLgECqgEM1ldfLCRAgsERAALiEXVECBAgQIEBgoIC76kBMryJAgIBD1R4gQIBAPQEBYL2Z6ohAO4Gf//798J6//9vPoXc+u5bo+0OL8hCB+gLuqvVnrEMCBCYKOFQnYitFgACBSQICwEnQyhAgkCfwbOh2ZQXRgO7ZtUTff6UHvyXQSMBdtdGwtUqAQL6AQzXfWAUCBAjMFhAAzhZXjwCB4QLPhm5XCkcDumfXEn3/lR78lkAjAXfVRsPWKgEC+QIO1XxjFQgQIDBbQAA4W1w9AgSGCzwK3bKDtiu1r/x2OJIXEqgt4K5ae766I0BgsoBDdTK4cgQIEJggIACcgKwEAQK5AiuDtSu1r/w2V8zbCZQTcFctN1INESCwUsChulJfbQIECOQICABzXL2VAIGJAiuDtSu1r/x2Ip9SBCoIuKtWmKIeCBDYRsChus0oLIQAAQLDBASAwyi9iACBVQIrg7Urta/8dpWlugQOFXBXPXRwlk2AwJ4CDtU952JVBAgQuCMgALyj51kCBLYQmB2sjaj31X8sJPvfLtxicBZBYJyAu+o4S28iQIDAi0PVJiBAgEA9AQFgvZnqiEA7gRGB3BW0EfUEgFfE/ZbAlwLuql8S+QEBAgSeF3CoPm/llwQIEDhFQAB4yqSskwCBTwVGBHJXeEfUEwBeEfdbAl8KuKt+SeQHBAgQeF7Aofq8lV8SIEDgFAEB4CmTsk4CBASA9gABAp8JuKvaGwQIEBgo4FAdiOlVBAgQ2ERAALjJICyDAIG4wFd/mi7y5kf/Bp8/ARgR9QyBVAF31VReLydAoJuAQ7XbxPVLgEAHAQFghynrkUBxAQFg8QFrj8DXAu6qXxv5BQECBJ4WcKg+TeWHBAgQOEZAAHjMqCyUAIHPBASA9gaB9gLuqu23AAACBEYKOFRHanoXAQIE9hAQAO4xB6sgQGCxwJW/1nvlt9HQ8tFfQV5MpTyBHQXcVXecijURIHCsgEP12NFZOAECBD4VEADaHAQIEHh5ebkS6l35rQDQ9iIwRcBddQqzIgQIdBFwqHaZtD4JEOgkIADsNG29EiDwqcCVUO/KbwWANh2BKQLuqlOYFSFAoIuAQ7XLpPVJgEAnAQFgp2nrlQABAaA9QKCmgLtqzbnqigCBRQIO1UXwyhIgQCBRQACYiOvVBAicIxD9U31Xnrvy23PkrJTAFgLuqluMwSIIEKgi4FCtMkl9ECBA4P8CAkC7gQABAhf/DcC3YFdCvSu/NRQCBC4JuKte4vJjAgQIPBZwqNohBAgQqCcgAKw3Ux0RIBAQiIZzV5678ttACx4h0FnAXbXz9PVOgMBwAYfqcFIvJECAwHIBAeDyEVgAAQJ3BR4Fa9F3f/+3n0OPPruW6PtDi/IQgfoC7qr1Z6xDAgQmCjhUJ2IrRYAAgUkCAsBJ0MoQIJAn8GzodmUF0YDu2bVE33+lB78l0EjAXbXRsLVKgEC+gEM131gFAgQIzBYQAM4WV48AgeECz4ZuVwpHA7pn1xJ9/5Ue/JZAIwF31UbD1ioBAvkCDtV8YxUIECAwW0AAOFtcPQIEhgs8G7pdKRwN6J5dS/T9V3rwWwKNBNxVGw1bqwQI5As4VPONVSBAgMBsAQHgbHH1CBAgQIAAgdEC7qqjRb2PAIHWAg7V1uPXPAECRQUEgEUHqy0CBAgQINBIwF210bC1SoBAvoBDNd9YBQIECMwWEADOFlePAAECBAgQGC3grjpa1PsIEGgt4FBtPX7NEyBQVEAAWHSw2iJAgAABAo0E3FUbDVurBAjkCzhU841VIECAwGwBAeBscfUIECBAgACB0QLuqqNFvY8AgdYCDtXW49c8AQJFBQSARQerLQIECBAg0EjAXbXRsLVKgEC+gEM131gFAgQIzBYQAM4WV48AAQIECBAYLeCuOlrU+wgQaC3gUG09fs0TIFBUQABYdLDaIkCAAAECjQTcVRsNW6sECOQLOFTzjVUgQIDAbAEB4Gxx9QgQIECAAIHRAu6qo0W9jwCB1gIO1dbj1zwBAkUFBIBFB6stAgQIECDQSMBdtdGwtUqAQL6AQzXfWAUCBAjMFhAAzhZXjwABAgQIEBgt4K46WtT7CBBoLeBQbT1+zRMgUFRAAFh0sNoiQIAAAQKNBNxVGw1bqwQI5As4VPONVSBAgMBsAQHgbHH1CBAgQIAAgdEC7qqjRb2PAIHWAg7V1uPXPAECRQUEgEUHqy0CBAgQINBIwF210bC1SoBAvoBDNd9YBQIECMwWEADOFlePAAECBAgQGC3grjpa1PsIEGgt4FBtPX7NEyBQVEAAWHSw2iJAgAABAo0E3FUbDVurBAjkCzhU841VIECAwGwBAeBscfUIECBAgACB0QLuqqNFvY8AgdYCDtXW49c8AQJFBQSARQerLQIECBAg0EjAXbXRsLVKgEC+gEM131gFAgQIzBYQAM4WV48AAQIECBAYLeCuOlrU+wgQaC3gUG09fs0TIFBUQABYdLDaIkCAAAECjQTcVRsNW6sECOQLOFTzjVUgQIDAbAEB4Gxx9QgQIECAAIHRAu6qo0W9jwCB1gIO1dbj1zwBAkUFBIBFB6stAgQIECDQSMBdtdGwtUqAQL6AQzXfWAUCBAjMFhAAzhZXjwABAgQIEBgt4K46WtT7CBBoLeBQbT1+zRMgUFRAAFh0sNoiQIAAAQKNBNxVGw1bqwQI5As4VPONVSBAgMBsAQHgbHH1CBAgQIAAgdEC7qqjRb2PAIHWAg7V1uPXPAECRQUEgEUHqy0CBAgQINBIwF210bC1SoBAvoBDNd9YBQIECMwWEADOFlePAAECBAgQGC3grjpa1PsIEGgt4FBtPX7NEyBQVEAAWHSw2iJAgAABAo0E3FUbDVurBAjkCzhU841VIECAwGwBAeBscfUIECBAgACB0QLuqqNFvY8AgdYCDtXW49c8AQJFBQSARQerLQIECBAg0EjAXbXRsLVKgEC+gEM131gFAgQIzBYQAM4WV48AAQIECBAYLeCuOlrU+wgQaC3gUG09fs0TIFBUQABYdLDaIkCAAAECjQTcVRsNW6sECOQLOFTzjVUgQIDAbAEB4Gxx9QgQIECAAIHRAu6qo0W9jwCB1gIO1dbj1zwBAkUFBIBFB6stAgQIECDQSMBdtdGwtUqAQL6AQzXfWAUCBAjMFhAAzhZXjwABAgQIEBgt4K46WtT7CBBoLeBQbT1+zRMgUFRAAFh0sNoiQIAAAQKNBNxVGw1bqwQI5As4VPONVSBAgMBsAQHgbHH1CBAgQIAAgdEC7qqjRb2PAIHWAg7V1uPXPAECRQUEgEUHqy0CBAgQINBIwF210bC1SoBAvoBDNd9YBQIECMwWEADOFlePAAECBAgQGC3grjpa1PsIEGgt4FBtPX7NEyBQVEAAWHSw2iJAgAABAo0E3FUbDVurBAjkCzhU841VIECAwGwBAeBscfUIECBAgACB0QLuqqNFvY8AgdYCDtXW49c8AQJFBQSARQerLQIECBAg0EjAXbXRsLVKgEC+gEM131gFAgQIzBYQAM4WV48AAQIECBAYLeCuOlrU+wgQaC3gUG09fs0TIFBUQABYdLDaIkCAAAECjQTcVRsNW6sECOQLOFTzjVUgQIDAbAEB4Gxx9QgQIECAAIHRAu6qo0W9jwCB1gIO1dbj1zwBAkUFBIBFB6stAgQIECDQSMBdtdGwtUqAQL6AQzXfWAUCBAjMFhAAzhZXjwABAgQIEBgt4K46WtT7CBBoLeBQbT1+zRMgUFRAAFh0sNoiQIAAAQKNBNxVGw1bqwQI5As4VPONVSBAgMBsAQHgbHH1CBAgQIAAgdEC7qqjRb2PAIHWAg7V1uPXPAECRQUEgEUHqy0CBAgQINBIwF210bC1SoBAvoBDNd9YBQIECMwWEADOFlePAAECBAgQGC3grjpa1PsIEGgt4FBtPX7NEyBQVEAAWHSw2iJAgAABAo0E3FUbDVurBAjkCzhU841VIECAwGwBAeBscfUIECBAgACB0QLuqqNFvY8AgdYCDtXW49c8AQJFBQSARQerLQIECBAg0EjAXbXRsLVKgEC+gEM131gFAgQIzBYQAM4WV48AAQIECBAYLeCuOlrU+wgQaC3gUG09fs0TIFBUQABYdLDaIkCAAAECjQTcVRsNW6sECOQLOFTzjVUgQIAAAQIECBAgQIAAAQIECBAgsExAALiMXmECBAgQIECAAAECBAgQIECAAAEC+QICwHxjFQgQIECAAAECBAgQIECAAAECBAgsExAALqNXmAABAgQIECBAgAABAgQIECBAgEC+gAAw31gFAgQIECBAgAABAgQIECBAgAABAssEBIDL6BUmQIAAAQIECBAgQIAAAQIECBAgkC8gAMw3VoEAAQIECBAgQIAAAQIECBAgQIDAMgEB4DJ6hQkQIECAAAECBAgQIECAAAECBAjkCwgA841VIECAAAECBAgQIECAAAECBAgQILBMQAC4jF5hAgQIECBAgAABAgQIECBAgAABAvkCAsB8YxUIECBAgAABAgQIECBAgAABAgQILBMQAC6jV5gAAQIECBAgQIAAAQIECBAgQIBAvoAAMN9YBQIECBAgQIAAAQIECBAgQIAAAQLLBASAy+gVJkCAAAECBAgQIECAAAECBAgQIJAvIADMN1aBAAECBAgQIECAAAECBAgQIECAwDIBAeAyeoUJECBAgAABAgQIECBAgAABAgQI5AsIAPONVSBAgAABAgQIECBAgAABAgQIECCwTEAAuIxeYQIECBAgQIAAAQIECBAgQIAAAQL5AgLAfGMVCBAgQIAAAQIECBAgQIAAAQIECCwTEAAuo1eYAAECBAgQIECAAAECBAgQIECAQL6AADDfWAUCBAgQIECAAAECBAgQIECAAAECywQEgMvoFSZAgAABAgQIECBAgAABAgQIECCQLyAAzDdWgQABAgQIECBAgAABAgQIECBAgMAyAQHgMnqFCRAgQIAAAQIECBAgQIAAAQIECOQLCADzjVUgQIAAAQIECBAgQIAAAQIECBAgsExAALiMXmECBAgQIECAAAECBAgQIECAAAEC+QICwHxjFQgQIECAAAECBAgQIECAAAECBAgsExAALqNXmAABAgQIECBAgAABAgQIECBAgEC+gAAw31gFAgQIECBAgAABAgQIECBAgAABAssEBIDL6BUmQIAAAQIECBAgQIAAAQIECBAgkC8gAMw3VoEAAQIECBAgQIAAAQIECBAgQIDAMgEB4DJ6hQkQIECAAAECBAgQIECAAAECBAjkCwgA841VIECAAAECBAgQIECAAAECBAgQILBMQAC4jF5hAgQIECBAgAABAgQIECBAgAABAvkCAsB8YxUIECBAgAABAgQIECBAgAABAgQILBMQAC6jV5gAAQIECBAgQIAAAQIECBAgQIBAvoAAMN9YBQIECBAgQIAAAQIECBAgQIAAAQLLBASAy+gVJkCAAAECBAgQIECAAAECBAgQIJAvIADMN1aBAAECBAgQIECAAAECBAgQIECAwDIBAeAyeoUJECBAgAABAgQIECBAgAABAgQI5AsIAPONVSBAgAABAgQIECBAgAABAgQIECCwTEAAuIxeYQIECBAgQIAAAQIECBAgQIAAAQL5AgLAfGMVCBAgQIAAAQIECBAgQIAAAQIECCwTEAAuo1eYAAECBAgQIECAAAECBAgQIECAQL6AADDfWAUCBAgQIECAAAECBAgQIECAAAECywQEgMvoFSZAgAABAgQIECBAgAABAgQIECCQLyAAzDdWgQABAgQIECBAgAABAgQIECBAgMAyAQHgMnqFCRAgQIAAAQIECBAgQIAAAQIECOQLCADzjVUgQIAAAQIECBAgQIAAAQIECBAgsExAALiMXmECBAgQIECAAAECBAgQIECAAAEC+QICwHxjFQgQIECAAAECBAgQIECAAAECBAgsExAALqNXmAABAgQIECBAgAABAgQIECBAgEC+gAAw31gFAgQIECBAgAABAgQIECBAgAABAssEBIDL6BUmQIAAAQIECBAgQIAAAQIECBAgkC8gAMw3VoEAAQIECBAgQIAAAQIECBAgQIDAyejv7QAABUlJREFUMgEB4DJ6hQkQIECAAAECBAgQIECAAAECBAjkCwgA841VIECAAAECBAgQIECAAAECBAgQILBMQAC4jF5hAgQIECBAgAABAgQIECBAgAABAvkCAsB8YxUIECBAgAABAgQIECBAgAABAgQILBMQAC6jV5gAAQIECBAgQIAAAQIECBAgQIBAvoAAMN9YBQIECBAgQIAAAQIECBAgQIAAAQLLBASAy+gVJkCAAAECBAgQIECAAAECBAgQIJAvIADMN1aBAAECBAgQIECAAAECBAgQIECAwDIBAeAyeoUJECBAgAABAgQIECBAgAABAgQI5AsIAPONVSBAgAABAgQIECBAgAABAgQIECCwTEAAuIxeYQIECBAgQIAAAQIECBAgQIAAAQL5AgLAfGMVCBAgQIAAAQIECBAgQIAAAQIECCwTEAAuo1eYAAECBAgQIECAAAECBAgQIECAQL6AADDfWAUCBAgQIECAAAECBAgQIECAAAECywQEgMvoFSZAgAABAgQIECBAgAABAgQIECCQLyAAzDdWgQABAgQIECBAgAABAgQIECBAgMAyAQHgMnqFCRAgQIAAAQIECBAgQIAAAQIECOQLCADzjVUgQIAAAQIECBAgQIAAAQIECBAgsExAALiMXmECBAgQIECAAAECBAgQIECAAAEC+QICwHxjFQgQIECAAAECBAgQIECAAAECBAgsExAALqNXmAABAgQIECBAgAABAgQIECBAgEC+gAAw31gFAgQIECBAgAABAgQIECBAgAABAssEBIDL6BUmQIAAAQIECBAgQIAAAQIECBAgkC8gAMw3VoEAAQIECBAgQIAAAQIECBAgQIDAMgEB4DJ6hQkQIECAAAECBAgQIECAAAECBAjkCwgA841VIECAAAECBAgQIECAAAECBAgQILBMQAC4jF5hAgQIECBAgAABAgQIECBAgAABAvkCAsB8YxUIECBAgAABAgQIECBAgAABAgQILBMQAC6jV5gAAQIECBAgQIAAAQIECBAgQIBAvoAAMN9YBQIECBAgQIAAAQIECBAgQIAAAQLLBASAy+gVJkCAAAECBAgQIECAAAECBAgQIJAvIADMN1aBAAECBAgQIECAAAECBAgQIECAwDIBAeAyeoUJECBAgAABAgQIECBAgAABAgQI5AsIAPONVSBAgAABAgQIECBAgAABAgQIECCwTEAAuIxeYQIECBAgQIAAAQIECBAgQIAAAQL5AgLAfGMVCBAgQIAAAQIECBAgQIAAAQIECCwTEAAuo1eYAAECBAgQIECAAAECBAgQIECAQL6AADDfWAUCBAgQIECAAAECBAgQIECAAAECywQEgMvoFSZAgAABAgQIECBAgAABAgQIECCQLyAAzDdWgQABAgQIECBAgAABAgQIECBAgMAyAQHgMnqFCRAgQIAAAQIECBAgQIAAAQIECOQLCADzjVUgQIAAAQIECBAgQIAAAQIECBAgsExAALiMXmECBAgQIECAAAECBAgQIECAAAEC+QICwHxjFQgQIECAAAECBAgQIECAAAECBAgsExAALqNXmAABAgQIECBAgAABAgQIECBAgEC+gAAw31gFAgQIECBAgAABAgQIECBAgAABAssEBIDL6BUmQIAAAQIECBAgQIAAAQIECBAgkC8gAMw3VoEAAQIECBAgQIAAAQIECBAgQIDAMgEB4DJ6hQkQIECAAAECBAgQIECAAAECBAjkCwgA841VIECAAAECBAgQIECAAAECBAgQILBMQAC4jF5hAgQIECBAgAABAgQIECBAgAABAvkC/wH5Ben6/HXERgAAAABJRU5ErkJggg==\" width=\"640\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"video = plot_animation(frames)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Once you have finished playing with an environment, you should close it to free up resources:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"env.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"To code our first learning agent, we will be using a simpler environment: the Cart-Pole. "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# A simple environment: the Cart-Pole"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The Cart-Pole is a very simple environment composed of a cart that can move left or right, and pole placed vertically on top of it. The agent must move the cart left or right to keep the pole upright."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"env = gym.make(\"CartPole-v0\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"obs = env.reset()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([ 0.0230852 , 0.03446783, -0.04351584, -0.04777627])"
|
||
]
|
||
},
|
||
"execution_count": 24,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"obs"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The observation is a 1D NumPy array composed of 4 floats: they represent the cart's horizontal position, its velocity, the angle of the pole (0 = vertical), and the angular velocity. Let's render the environment... unfortunately we need to fix an annoying rendering issue first."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Fixing the rendering issue"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Some environments (including the Cart-Pole) require access to your display, which opens up a separate window, even if you specify the `rgb_array` mode. In general you can safely ignore that window. However, if Jupyter is running on a headless server (ie. without a screen) it will raise an exception. One way to avoid this is to install a fake X server like Xvfb. You can start Jupyter using the `xvfb-run` command:\n",
|
||
"\n",
|
||
" $ xvfb-run -s \"-screen 0 1400x900x24\" jupyter notebook\n",
|
||
"\n",
|
||
"If Jupyter is running on a headless server but you don't want to worry about Xvfb, then you can just use the following rendering function for the Cart-Pole:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from PIL import Image, ImageDraw\n",
|
||
"\n",
|
||
"try:\n",
|
||
" from pyglet.gl import gl_info\n",
|
||
" openai_cart_pole_rendering = True # no problem, let's use OpenAI gym's rendering function\n",
|
||
"except Exception:\n",
|
||
" openai_cart_pole_rendering = False # probably no X server available, let's use our own rendering function\n",
|
||
"\n",
|
||
"def render_cart_pole(env, obs):\n",
|
||
" if openai_cart_pole_rendering:\n",
|
||
" # use OpenAI gym's rendering function\n",
|
||
" return env.render(mode=\"rgb_array\")\n",
|
||
" else:\n",
|
||
" # rendering for the cart pole environment (in case OpenAI gym can't do it)\n",
|
||
" img_w = 600\n",
|
||
" img_h = 400\n",
|
||
" cart_w = img_w // 12\n",
|
||
" cart_h = img_h // 15\n",
|
||
" pole_len = img_h // 3.5\n",
|
||
" pole_w = img_w // 80 + 1\n",
|
||
" x_width = 2\n",
|
||
" max_ang = 0.2\n",
|
||
" bg_col = (255, 255, 255)\n",
|
||
" cart_col = 0x000000 # Blue Green Red\n",
|
||
" pole_col = 0x669acc # Blue Green Red\n",
|
||
"\n",
|
||
" pos, vel, ang, ang_vel = obs\n",
|
||
" img = Image.new('RGB', (img_w, img_h), bg_col)\n",
|
||
" draw = ImageDraw.Draw(img)\n",
|
||
" cart_x = pos * img_w // x_width + img_w // x_width\n",
|
||
" cart_y = img_h * 95 // 100\n",
|
||
" top_pole_x = cart_x + pole_len * np.sin(ang)\n",
|
||
" top_pole_y = cart_y - cart_h // 2 - pole_len * np.cos(ang)\n",
|
||
" draw.line((0, cart_y, img_w, cart_y), fill=0)\n",
|
||
" draw.rectangle((cart_x - cart_w // 2, cart_y - cart_h // 2, cart_x + cart_w // 2, cart_y + cart_h // 2), fill=cart_col) # draw cart\n",
|
||
" draw.line((cart_x, cart_y - cart_h // 2, top_pole_x, top_pole_y), fill=pole_col, width=pole_w) # draw pole\n",
|
||
" return np.array(img)\n",
|
||
"\n",
|
||
"def plot_cart_pole(env, obs):\n",
|
||
" plt.close() # or else nbagg sometimes plots in the previous cell\n",
|
||
" img = render_cart_pole(env, obs)\n",
|
||
" plt.imshow(img)\n",
|
||
" plt.axis(\"off\")\n",
|
||
" plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4Xuzd0bEjR5IlUFKMkaNbjJGDrUarwZZjxJiVY8TgWJltc7eqHpLIgAMe4ffwl8hI93Pjg3Ytn/HXX/xDgAABAgQIECBAgAABAgQIECBAgMBYgV/HbmYxAgQIECBAgAABAgQIECBAgAABAgR+UQC6BAQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO9Aq8Mcff/zROoCXEyBAgAABAgQIECBAgACBAIFff/1VBxSQ86MVhR8c/g6rKwB3SMEMBAgQIECAAAECBAgQIDBdQAE4PeHr/RSA2fm3b68AbI/AAAQIECBAgAABAgQIECAQIKAADAj5YkUFYHb+7dsrANsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh7zz9grAndMxGwECBAgQIECAAAECBAhMEVAATklybQ9fAK65eapIQAFYBOkYAgQIECBAgAABAgQIECBwIaAAzL4eCsDs/Nu3VwC2R2AAAgQIECBAgAABAgQIEAgQUAAGhHxVAGevb/tuAQVgdwLeT4AAAQIECBAgQIAAAQIJAgrAhJQf7+gLwOz827dXALZHYAACBAgQIECAAAECBAgQCBBQAAaEfLGiAjA7//btFYDtERiAAAECBAgQIECAAAECBAIEFIABISsAs0PeeXsF4M7pmI0AAQIECBAgQIAAAQIEpggoAKckubaHLwDX3DxVJKAALIJ0DAECBAgQIECAAAECBAgQuBBQAGZfDwVgdv7t2ysA2yMwAAECBAgQIECAAAECBAgECCgAA0K+KoCz17d9t4ACsDsB7ydAgAABAgQIECBAgACBBAEFYELKj3f0BWB2/u3bKwDbIzAAAQIECBAgQIAAAQIECAQIKAADQr5YUQGYnX/79grA9ggMQIAAAQIECBAgQIAAAQIBAgrAgJAVgNkh77y9AnDndMxGgAABAgQIECBAgAABAlMEFIBTklzbwxeAa26eKhJQABZBOoYAAQIECBAgQIAAAQIECFwIKACzr4cCMDv/9u0VgO0RGIAAAQIECBAgQIAAAQIEAgQUgAEhXxXA2evbvltAAdidgPcTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//27RWA7REYgAABAgQIECBAgAABAgQCBBSAASFfrKgAzM6/fXsFYHsEBiBAgAABAgQIECBAgACBAAEFYEDICsDskHfeXgG4czpmI0CAAAECBAgQIECAAIEpAgrAKUmu7eELwDU3TxUJKACLIB1DgAABAgQIECBAgAABAgQuBBSA2ddDAZidf/v2CsD2CAxAgAABAgQIECBAgAABAgECCsCAkK8K4Oz1bd8toADsTsD7CRAgQIAAAQIECBAgQCBBQAGYkPLjHX0BmJ1/+/YKwPYIDECAAAECBAgQIECAAAECAQIKwICQL1ZUAGbn3769ArA9AgMQIECAAAECBAgQIECAQICAAjAgZAVgdsg7b68A3DkdsxEgQIAAAQIECBAgQIDAFAEF4JQk1/bwBeCam6eKBBSARZCOIUCAAAECBAgQIECAAAECFwIKwOzroQDMzr99ewVgewQGIECAAAECBAgQIECAAIEAAQVgQMhXBXD2+rbvFlAAdifg/QQIECBAgAABAgQIECCQIKAATEj58Y6+AMzOv317BWB7BAYgQIAAAQIECBAgQIAAgQABBWBAyBcrKgCz82/fXgHYHoEBCBAgQIAAAQIECBAgQCBAQAEYELICMDvknbdXAO6cjtkIECBAgAABAgQIECBAYIqAAnBKkmt7+AJwzc1TRQIKwCJIxxAgQIAAAQIECBAgQIAAgQsBBWD29VAAZuffvr0CsD0CAxAgQIAAAQIECBAgQIBAgIACMCDkqwI4e33bdwsoALsT8H4CBAgQIECAAAECBAgQSBBQACak/HhHXwBm59++vQKwPQIDECBAgAABAgQIECBAgECAgAIwIOSLFRWA2fm3b68AbI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgd8s7bKwB3TsdsBAgQIECAAAECBAgQIDBFQAE4Jcm1PXwBuObmqSIBBWARpGMIECBAgAABAgQIECBAgMCFgAIw+3ooALPzb99eAdgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7bsFFIDdCXg/AQIECBAgQIAAAQIECCQIKAATUn68oy8As/Nv314B2B6BAQgQIECAAAECBAgQIEAgQEABGBDyxYoKwOz827dXALZHYAACBAgQIECAAAECBAgQCBBQAAaErADMDnnn7RWAO6djNgIECBAgQIAAAQIECBCYIqAAnJLk2h6+AFxz81SRgAKwCNIxBAgQIECAAAECBAgQIEDgQkABmH09FIDZ+bdvrwBsj8AABAgQIECAAAECBAgQIBAgoAAMCPmqAM5e3/bdAgrA7gS8nwABAgQIECBAgAABAgQSBBSACSk/3tEXgNn5t2+vAGyPwAAECBAgQIAAAQIECBAgECCgAAwI+WJFBWB2/u3bKwDbIzAAAQIECBAgQIAAAQIECAQIKAADQlYAZoe88/YKwJ3TMRsBAgQIECBAgAABAgQITBFQAE5Jcm0PXwCuuXmqSEABWATpGAIECBAgQIAAAQIECBAgcCGgAMy+HgrA7Pzbt1cAtkdgAAIECBAgQIAAAQIECBAIEFAABoR8VQBnr2/7bgEFYHcC3k+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Nu3VwC2R2AAAgQIECBAgAABAgQIEAgQUAAGhHyxogIwO//27RWA7REYgAABAgQIECBAgAABAgQCBBSAASErALND3nl7BeDO6ZiNAAECBAgQIECAAAECBKYIKACnJLm2hy8A19w8VSSgACyCdAwBAgQIECBAgAABAgQIELgQUABmXw8FYHb+7dsrANsjMAABAgQIECBAgAABAgQIBAgoAANCviqAs9e3fbeAArA7Ae8nQIAAAQIECBAgQIAAgQQBBWBCyo939AVgdv7t2ysA2yMwAAECBAgQIECAAAECBAgECCgAA0K+WFEBmJ1/+/YKwPYIDECAAAECBAgQIECAAAECAQIKwICQFYDZIe+8vQJw53TMRoAAAQIECBAgQIAAAQJTBBSAU5Jc28MXgGtunioSUAAWQTqGAAECBAgQIECAAAECBAhcCCgAs6+HAjA7//btFYDtERiAAAECBAgQIECAAAECBAIEFIABIV8VwNnr275bQAHYnYD3EyBAgAABAgQIECBAgECCgAIwIeXHO/oCMDv/9u0VgO0RGIAAAQIECBAgQIAAAQIEAgQUgAEhX6yoAMzOv317BWB7BAYgQIAAAQIECBAgQIAAgQABBWBAyArA7JB33l4BuHM6ZiNAgAABAgQIECBAgACBKQIKwClJru3hC8A1N08VCSgAiyAdQ4AAAQIECBAgQIAAAQIELgQUgNnXQwGYnX/79grA9ggMQIAAAQIECBAgQIAAAQIBAgrAgJCvCuDs9W3fLaAA7E7A+wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/v2CsD2CAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm59++vQKwPQIDECBAgAABAgQIECBAgECAgAIwIGQFYHbIO2+vANw5HbMRIECAAAECBAgQIECAwBQBBeCUJNf28AXgmpunigQUgEWQjiFAgAABAgQIECBAgAABAhcCCsDs66EAzM6/fXsFYHsEBiBAgAABAgQIECBAgACBAAEFYEDIVwVw9vq27xZQAHYn4P0ECBAgQIAAAQIECBAgkCCgAExI+fGOvgDMzr99ewVgewQGIECAAAECBAgQIECAAIEAAQVgQMgXKyoAs/Nv314B2B6BAQgQIECAAAECBAgQIEAgQEABGBCyAjA75J23VwDunI7ZCBAgQIAAAQIECBAgQGCKgAJwSpJre/gCcM3NU0UCCsAiSMcQIECAAAECBAgQIECAAIELAQVg9vVQAGbn3769ArA9AgMQIECAAAECBAgQIECAQICAAjAg5KsCOHt923cLKAC7E/B+AgQIECBAgAABAgQIEEgQUAAmpPx4R18AZuffvr0CsD0CAxAgQIAAAQIECBAgQIBAgIACMCDkixUVgNn5t2+vAGyPwAAECBAgQIAAAQIECBAgECCgAAwIWQGYHfLO2ysAd07HbAQIECBAgAABAgQIECAwRUABOCXJtT18Abjm5qkiAQVgEaRjCBAgQIAAAQIECBAgQIDAhYACMPt6KACz82/fXgHYHoEBCBAgQIAAAQIECBAgQCBAQAEYEPJVAZy9vu27BRSA3Ql4PwECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzb99eAdgegQEIECBAgAABAgQIECBAIEBAARgQ8sWKCsDs/Nu3VwC2R2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA555+0VgDunYzYCBAgQIECAAAECBAgQmCKgAJyS5NoevgBcc/NUkYACsAjSMQQIECBAgAABAgQIECBA4EJAAZh9PRSA2fm3b68AbI/AAAQIECBAgAABAgQIECAQIKAADAj5qgDOXt/23QIKwO4EvJ8AAQIECBAgQIAAAQIEEgQUgAkpP97RF4DZ+bdvrwBsj8AABAgQIECAAAECBAgQIBAgoAAMCPliRQVgdv7t2ysA2yMwAAECBAgQIECAAAECBAgECCgAA0JWAGaHvPP2CsCd0zEbAQIECBAgQIAAAQIECEwRUABOSXJtD18Arrl5qkhAAVgE6RgCBAgQIECAAAECBAgQIHAhoADMvh4KwOz827dXALZHYAACBAgQIECAAAECBAgQCBBQAAaEfFUAZ69v+24BBWB3At5PgAABAgQIECBAgAABAgkCCsCElB/v6AvA7Pzbt1cAtkdgAAIECBAgQIAAAQIECBAIEFAABoR8saICMDv/9u0VgO0RGIAAAQIECBAgQIAAAQIEAgQUgAEhKwCzQ955ewXgzumYjQABAgQIECBAgAABAgSmCCgApyS5tocvANfcPFUkoAAsgnQMAQIECBAgQIAAAQIECBC4EFAAZl8PBWB2/u3bKwDbIzAAAQIECBAgQIAAAQIECAQIKAADQr4qgLPXt323gAKwOwHvJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+7dsrANsjMAABAgQIECBAgAABAgQIBAgoAANCvlhRAZidf/v2CsD2CAxAgAABAgQIECBAgAABAgECCsCAkBWA2SHvvL0CcOd0zEaAAAECBAgQIECAAAECUwQUgFOSXNvDF4Brbp4qElAAFkE6hgABAgQIECBAgAABAgQIXAgoALOvhwIwO//27RWA7REYgAABAgQIECBAgAABAgQCBBSAASFfFcDZ69u+W0AB2J2A9xMgQIAAAQIECBAgQIBAgoACMCHlxzv6AjA7//btFYDtERiAAAECBAgQIECAAAECBAIEFIABIV+sqADMzr99ewVgewQGIECAAAECBAgQIECAAIEAAQVgQMgKwOyQd95eAbhzOmYjQIAAAQIECBAgQIAAgSkCCsApSa7t4QvANTdPFQkoAIsgHUOAAAECBAgQIECAAAECBC4EFIDZ10MBmJ1/+/YKwPYIDECAAAECBAgQIECAAAECAQIKwICQrwrg7PVt3y2gAOxOwPsJECBAgAABAgQIECBAIEFAAZiQ8uMdfQGYnX/79grA9ggMQIAAAQIECBAgQIAAAQIBAgrAgJAvVlQAZuffvr0CsD0CAxAgQIAAAQIECBAgQIBAgIACMCBkBWB2yDtvrwDcOR2zESBAgAABAgQIECBAgMAUAQXglCTX9vAF4Jqbp4oEFIBFkI4hQIAAAQIECBAgQIAAAQIXAgrA7OuhAMzOv317BWB7BAYgQIAAAQIECBAgQIAAgQABBWBAyFcFcPb6tu8WUAB2J+D9BAgQIECAAAECBAgQIJAgoABMSOvAHbgAACAASURBVPnxjr4AzM6/fXsFYHsEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzb99eAdgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+Sdt1cA7pyO2QgQIECAAAECBAgQIEBgioACcEqSa3v4AnDNzVNFAgrAIkjHECBAgAABAgQIECBAgACBCwEFYPb1UABm59++vQKwPQIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdt3CygAuxPwfgIECBAgQIAAAQIECBBIEFAAJqT8eEdfAGbn3769ArA9AgMQIECAAAECBAgQIECAQICAAjAg5IsVFYDZ+bdvrwBsj8AABAgQIECAAAECBAgQIBAgoAAMCFkBmB3yztsrAHdOx2wECBAgQIAAAQIECBAgMEVAATglybU9fAG45uapIgEFYBGkYwgQIECAAAECBAgQIECAwIWAAjD7eigAs/Nv314B2B6BAQgQIECAAAECBAgQIEAgQEABGBDyVQGcvb7tuwUUgN0JeD8BAgQIECBAgAABAgQIJAgoABNSfryjLwCz82/fXgHYHoEBCBAgQIAAAQIECBAgQCBAQAEYEPLFigrA7Pzbt1cAtkdgAAIECBAgQIAAAQIECBAIEFAABoSsAMwOeeftFYA7p2M2AgQIECBAgAABAgQIEJgioACckuTaHr4AXHPzVJGAArAI0jEECBAgQIAAAQIECBAgQOBCQAGYfT0UgNn5t2+vAGyPwAAECBAgQIAAAQIECBAgECCgAAwI+aoAzl7f9t0CCsDuBLyfAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fm3b68AbI/AAAQIECBAgAABAgQIECAQIKAADAj5YkUFYHb+7dsrANsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh7zz9grAndMxGwECBAgQIECAAAECBAhMEVAATklybQ9fAK65eapIQAFYBOkYAgQIECBAgAABAgQIECBwIaAAzL4eCsDs/Nu3VwC2R2AAAgQIECBAgAABAgQIEAgQUAAGhHxVAGevb/tuAQVgdwLeT4AAAQIECBAgQIAAAQIJAgrAhJQf7+gLwOz827dXALZHYAACBAgQIECAAAECBAgQCBBQAAaEfLGiAjA7//btFYDtERiAAAECBAgQIECAAAECBAIEFIABISsAs0PeeXsF4M7pmI0AAQIECBAgQIAAAQIEpggoAKckubaHLwDX3DxVJKAALIJ0DAECBAgQIECAAAECBAgQuBBQAGZfDwVgdv7t2ysA2yMwAAECBAgQIECAAAECBAgECCgAA0K+KoCz17d9t4ACsDsB7ydAgAABAgQIECBAgACBBAEFYELKj3f0BWB2/u3bKwDbIzAAAQIECBAgQIAAAQIECAQIKAADQr5YUQGYnX/79grA9ggMQIAAAQIECBAgQIAAAQIBAgrAgJAVgNkh77y9AnDndMxGgAABAgQIECBAgAABAlMEFIBTklzbwxeAa26eKhJQABZBOoYAAQIECBAgQIAAAQIECFwIKACzr4cCMDv/9u0VgO0RGIAAAQIECBAgQIAAAQIEAgQUgAEhXxXA2evbvltAAdidgPcTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//27RWA7REYgAABAgQIECBAgAABAgQCBBSAASFfrKgAzM6/fXsFYHsEBiBAgAABAgQIECBAgACBAAEFYEDICsDskHfeXgG4czpmI0CAAAECBAgQIECAAIEpAgrAKUmu7eELwDU3TxUJKACLIB1DgAABAgQIECBAgAABAgQuBBSA2ddDAZidf/v2CsD2CAxAgAABAgQIECBAgAABAgECCsCAkK8K4Oz1bd8toADsTsD7CRAgQIAAAQIECBAgQCBBQAGYkPLjHX0BmJ1/+/YKwPYIDECAAAECBAgQIECAAAECAQIKwICQL1ZUAGbn3769ArA9AgMQIECAAAECBAgQIECAQICAAjAgZAVgdsg7b68A3DkdsxEgQIAAAQIECBAgQIDAFAEF4JQk1/bwBeCam6eKBBSARZCOIUCAAAECBAgQIECAAAECFwIKwOzroQDMzr99ewVgewQGIECAAAECBAgQIECAAIEAAQVgQMhXBXD2+rbvFlAAdifg/QQIECBAgAABAgQIECCQIKAATEj58Y6+AMzOv317BWB7BAYgQIAAAQIECBAgQIAAgQABBWBAyBcrKgCz82/fXgHYHoEBCBAgQIAAAQIECBAgQCBAQAEYELICMDvknbdXAO6cjtkIECBAgAABAgQIECBAYIqAAnBKkmt7+AJwzc1TRQIKwCJIxxAgQIAAAQIECBAgQIAAgQsBBWD29VAAZuffvr0CsD0CAxAgQIAAAQIECBAgQIBAgIACMCDkqwI4e33bdwsoALsT8H4CBAgQIECAAAECBAgQSBBQACak/HhHXwBm59++vQKwPQIDECBAgAABAgQIECBAgECAgAIwIOSLFRWA2fm3b68AbI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgd8s7bKwB3TsdsBAgQIECAAAECBAgQIDBFQAE4Jcm1PXwBuObmqSIBBWARpGMIECBAgAABAgQIECBAgMCFgAIw+3ooALPzb99eAdgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7bsFFIDdCXg/AQIECBAgQIAAAQIECCQIKAATUn68oy8As/Nv314B2B6BAQgQIECAAAECBAgQIEAgQEABGBDyxYoKwOz827dXALZHYAACBAgQIECAAAECBAgQCBBQAAaErADMDnnn7RWAO6djNgIECBAgQIAAAQIECBCYIqAAnJLk2h6+AFxz81SRgAKwCNIxBAgQIECAAAECBAgQIEDgQkABmH09FIDZ+bdvrwBsj8AABAgQIECAAAECBAgQIBAgoAAMCPmqAM5e3/bdAgrA7gS8nwABAgQIECBAgAABAgQSBBSACSk/3tEXgNn5t2+vAGyPwAAECBAgQIAAAQIECBAgECCgAAwI+WJFBWB2/u3bKwDbIzAAAQIECBAgQIAAAQIECAQIKAADQlYAZoe88/YKwJ3TMRsBAgQIECBAgAABAgQITBFQAE5Jcm0PXwCuuXmqSEABWATpGAIECBAgQIAAAQIECBAgcCGgAMy+HgrA7Pzbt1cAtkdgAAIECBAgQIAAAQIECBAIEFAABoR8VQBnr2/7bgEFYHcC3k+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Nu3VwC2R2AAAgQIECBAgAABAgQIEAgQUAAGhHyxogIwO//27RWA7REYgAABAgQIECBAgAABAgQCBBSAASErALND3nl7BeDO6ZiNAAECBAgQIECAAAECBKYIKACnJLm2hy8A19w8VSSgACyCdAwBAgQIECBAgAABAgQIELgQUABmXw8FYHb+7dsrANsjMAABAgQIECBAgAABAgQIBAgoAANCviqAs9e3fbeAArA7Ae8nQIAAAQIECBAgQIAAgQQBBWBCyo939AVgdv7t2ysA2yMwAAECBAgQIECAAAECBAgECCgAA0K+WFEBmJ1/+/YKwPYIDECAAAECBAgQIECAAAECAQIKwICQFYDZIe+8vQJw53TMRoAAAQIECBAgQIAAAQJTBBSAU5Jc28MXgGtunioSUAAWQTqGAAECBAgQIECAAAECBAhcCCgAs6+HAjA7//btFYDtERiAAAECBAgQIECAAAECBAIEFIABIV8VwNnr275bQAHYnYD3EyBAgAABAgQIECBAgECCgAIwIeXHO/oCMDv/9u0VgO0RGIAAAQIECBAgQIAAAQIEAgQUgAEhX6yoAMzOv317BWB7BAYgQIAAAQIECBAgQIAAgQABBWBAyArA7JB33l4BuHM6ZiNAgAABAgQIECBAgACBKQIKwClJru3hC8A1N08VCSgAiyAdQ4AAAQIECBAgQIAAAQIELgQUgNnXQwGYnX/79grA9ggMQIAAAQIECBAgQIAAAQIBAgrAgJCvCuDs9W3fLaAA7E7A+wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/v2CsD2CAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm59++vQKwPQIDECBAgAABAgQIECBAgECAgAIwIGQFYHbIO2+vANw5HbMRIECAAAECBAgQIECAwBQBBeCUJNf28AXgmpunigQUgEWQjiFAgAABAgQIECBAgAABAhcCCsDs66EAzM6/fXsFYHsEBiBAgAABAgQIECBAgACBAAEFYEDIVwVw9vq27xZQAHYn4P0ECBAgQIAAAQIECBAgkCCgAExI+fGOvgDMzr99ewVgewQGIECAAAECBAgQIECAAIEAAQVgQMgXKyoAs/Nv314B2B6BAQgQIECAAAECBAgQIEAgQEABGBCyAjA75J23VwDunI7ZCBAgQIAAAQIECBAgQGCKgAJwSpJre/gCcM3NU0UCCsAiSMcQIECAAAECBAgQIECAAIELAQVg9vVQAGbn3769ArA9AgMQIECAAAECBAgQIECAQICAAjAg5KsCOHt923cLKAC7E/B+AgQIECBAgAABAgQIEEgQUAAmpPx4R18AZuffvr0CsD0CAxAgQIAAAQIECBAgQIBAgIACMCDkixUVgNn5t2+vAGyPwAAECBAgQIAAAQIECBAgECCgAAwIWQGYHfLO2ysAd07HbAQIECBAgAABAgQIECAwRUABOCXJtT18Abjm5qkiAQVgEaRjCBAgQIAAAQIECBAgQIDAhYACMPt6KACz82/fXgHYHoEBCBAgQIAAAQIECBAgQCBAQAEYEPJVAZy9vu27BRSA3Ql4PwECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzb99eAdgegQEIECBAgAABAgQIECBAIEBAARgQ8sWKCsDs/Nu3VwC2R2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA555+0VgDunYzYCBAgQIECAAAECBAgQmCKgAJyS5NoevgBcc/NUkYACsAjSMQQIECBAgAABAgQIECBA4EJAAZh9PRSA2fm3b68AbI/AAAQIECBAgAABAgQIECAQIKAADAj5qgDOXt/23QIKwO4EvJ8AAQIECBAgQIAAAQIEEgQUgAkpP97RF4DZ+bdvrwBsj8AABAgQIECAAAECBAgQIBAgoAAMCPliRQVgdv7t2ysA2yMwAAECBAgQIECAAAECBAgECCgAA0JWAGaHvPP2CsCd0zEbAQIECBAgQIAAAQIECEwRUABOSXJtD18Arrl5qkhAAVgE6RgCBAgQIECAAAECBAgQIHAhoADMvh4KwOz827dXALZHYAACBAgQIECAAAECBAgQCBBQAAaEfFUAZ69v+24BBWB3At5PgAABAgQIECBAgAABAgkCCsCElB/v6AvA7Pzbt1cAtkdgAAIECBAgQIAAAQIECBAIEFAABoR8saICMDv/9u0VgO0RGIAAAQIECBAgQIAAAQIEAgQUgAEhKwCzQ955ewXgzumYjQABAgQIECBAgAABAgSmCCgApyS5tocvANfcPFUkoAAsgnQMAQIECBAgQIAAAQIECBC4EFAAZl8PBWB2/u3bKwDbIzAAAQIECBAgQIAAAQIECAQIKAADQr4qgLPXt323gAKwOwHvJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+7dsrANsjMAABAgQIECBAgAABAgQIBAgoAANCvlhRAZidf/v2CsD2CAxAgAABAgQIECBAgAABAgECCsCAkBWA2SHvvL0CcOd0zEaAAAECBAgQIECAAAECUwQUgFOSXNvDF4Brbp4qElAAFkE6hgABAgQIECBAgAABAgQIXAgoALOvhwIwO//27RWA7REYgAABAgQIECBAgAABAgQCBBSAASFfFcDZ69u+W0AB2J2A9xMgQIAAAQIECBAgQIBAgoACMCHlxzv6AjA7//btFYDtERiAAAECBAgQIECAAAECBAIEFIABIV+sqADMzr99ewVgewQGIECAAAECBAgQIECAAIEAAQVgQMgKwOyQd95eAbhzOmYjQIAAAQIECBAgQIAAgSkCCsApSa7t4QvANTdPFQkoAIsgHUOAAAECBAgQIECAAAECBC4EFIDZ10MBmJ1/+/YKwPYIDECAAAECBAgQIECAAAECAQIKwICQrwrg7PVt3y2gAOxOwPsJECBAgAABAgQIECBAIEFAAZiQ8uMdfQGYnX/79grA9ggMQIAAAQIECBAgQIAAAQIBAgrAgJAvVlQAZuffvr0CsD0CAxAgQIAAAQIECBAgQIBAgIACMCBkBWB2yDtvrwDcOR2zESBAgAABAgQIECBAgMAUAQXglCTX9vAF4Jqbp4oEFIBFkI4hQIAAAQIECBAgQIAAAQIXAgrA7OuhAMzOv317BWB7BAYgQIAAAQIECBAgQIAAgQABBWBAyFcFcPb6tu8WUAB2J+D9BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fXsFYHsEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzb99eAdgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+Sdt1cA7pyO2QgQIECAAAECBAgQIEBgioACcEqSa3v4AnDNzVNFAgrAIkjHECBAgAABAgQIECBAgACBCwEFYPb1UABm59++vQKwPQIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdt3CygAuxPwfgIECBAgQIAAAQIECBBIEFAAJqT8eEdfAGbn3769ArA9AgMQIECAAAECBAgQIECAQICAAjAg5IsVFYDZ+bdvrwBsj8AABAgQIECAAAECBAgQIBAgoAAMCFkBmB3yztsrAHdOx2wECBAgQIAAAQIECBAgMEVAATglybU9fAG45uapIgEFYBGkYwgQIECAAAECBAgQIECAwIWAAjD7eigAs/Nv314B2B6BAQgQIECAAAECBAgQIEAgQEABGBDyVQGcvb7tuwUUgN0JeD8BAgQIECBAgAABAgQIJAgoABNSfryjLwCz82/fXgHYHoEBCBAgQIDAbYH/869//PTM3377/fY5HiBAgAABAgQ+J6AA/Jz1jm9SAO6YStBMCsCgsK1KgAABAtsKfFXo3R1WAXhXzO8JECBAgMBnBRSAn/Xe7W0KwN0SCZtHARgWuHUJECBAYEsBBeCWsRiKAAECBAiUCigASzmPO0wBeFxkswZWAM7K0zYECBAgcKaAAvDM3ExNgAABAgTuCCgA72jN+60CcF6mR22kADwqLsMSIECAwFABBeDQYK1FgAABAgT+PwEFYPZ1UABm59++vQKwPQIDECBAgACBXxSALgEBAgQIEJgvoACcn/HVhgrA7Pzbt1cAtkdgAAIECBAgoAB0BwgQIECAQICAAjAg5IsVFYDZ+bdvrwBsj8AABAgQIEBAAegOECBAgACBAAEFYEDICsDskHfeXgG4czpmI0CAAIEUAX8CnJK0PQkQIEAgWUABmJz+L7/4AjA7//btFYDtERiAAAECBAj4AtAdIECAAAECAQIKwICQL1ZUAGbn3769ArA9AgMQIECAAAEFoDtAgAABAgQCBBSAASErALND3nl7BeDO6ZiNAAECBFIE/AlwStL2JECAAIFkAQVgcvr+BDg7/Q22VwBuEIIRCBAgQCBeQAEYfwUAECBAgECAgAIwIOSLFf0JcHb+7dsrANsjMAABAgQIEPAnwO4AAQIECBAIEFAABoSsAMwOeeftFYA7p2M2AgQIEEgR8AVgStL2JECAAIFkAQVgcvr+BDg7/Q22VwBuEIIRCBAgQCBeQAEYfwUAECBAgECAgAIwIOSLFf0JcHb+7dsrANsjMAABAgQIEPAnwO4AAQIECBAIEFAABoSsAMwOeeftFYA7p2M2AgQIEEgR8AVgStL2JECAAIFkAQVgcvr+BDg7/Q22VwBuEIIRCBAgQCBeQAEYfwUAECBAgECAgAIwIOSLFf0JcHb+7dsrANsjMAABAgQIEPAnwO4AAQIECBAIEFAABoSsAMwOeeftFYA7p2M2AgQIEEgR8AVgStL2JECAAIFkAQVgcvr+BDg7/Q22VwBuEIIRCBAgQCBeQAEYfwUAECBAgECAgAIwIOSLFf0JcHb+7dsrANsjMAABAgQIEPAnwO4AAQIECBAIEFAABoSsAMwOeeftFYA7p2M2AgQIEEgR8AVgStL2JECAAIFkAQVgcvr+BDg7/Q22VwBuEIIRCBAgQCBeQAEYfwUAECBAgECAgAIwIOSLFf0JcHb+7dsrANsjMAABAgQIEPAnwO4AAQIECBAIEFAABoSsAMwOeeftFYA7p2M2AgQIEEgR8AVgStL2JECAAIFkAQVgcvr+BDg7/Q22VwBuEIIRCBAgQCBeQAEYfwUAECBAgECAgAIwIOSLFf0JcHb+7dsrANsjMAABAgQIEPAnwO4AAQIECBAIEFAABoSsAMwOeeftFYA7p2M2AgQIEEgR8AVgStL2JECAAIFkAQVgcvr+BDg7/Q22VwBuEIIRCBAgQCBeQAEYfwUAECBAgECAgAIwIOSLFf0JcHb+7dsrANsjMAABAgQIEPAnwO4AAQIECBAIEFAABoSsAMwOeeftFYA7p2M2AgQIEEgR8AVgStL2JECAAIFkAQVgcvr+BDg7/Q22VwBuEIIRCBAgQIDA/xVQBLoKBAgQIEBgroACcG62z2zmT4CfUfKbtwkoAN9G62ACBAgQIHBbQAF4m8wDBAgQIEDgGAEF4DFRvWVQBeBbWB36rIAC8FkpvyNAgAABAu8XUAC+39gbCBAgQIBAl4ACsEt+j/cqAPfIIXYKBWBs9BYnQIAAgQ0FFIAbhmIkAgQIECBQJKAALII89BgF4KHBTRlbATglSXsQIECAwAQBBeCEFO1AgAABAgS+FlAAZt8MBWB2/u3bKwDbIzAAAQIECBD4U0AB6DIQIECAAIG5AgrAudk+s5kC8Bklv3mbgALwbbQOJkCAAAECtwUUgLfJPECAAAECBI4RUAAeE9VbBlUAvoXVoc8KKACflfI7AgQIECDwfgEF4PuNvYEAAQIECHQJKAC75Pd4rwJwjxxip1AAxkZvcQIECBDYUEABuGEoRiJAgAABAkUCCsAiyEOPUQAeGtyUsRWAU5K0BwECBAhMEFAATkjRDgQIECBA4GsBBWD2zVAAZuffvr0CsD0CAxAgQIAAgT8FFIAuAwECBAgQmCugAJyb7TObKQCfUfKbtwkoAN9G62ACBAgQIHBbQAF4m8wDBAgQIEDgGAEF4DFRvWVQBeBbWB36rIAC8FkpvyNAgAABAu8XUAC+39gbCBAgQIBAl4ACsEt+j/cqAPfIIXYKBWBs9BYnQIAAgQ0FFIAbhmIkAgQIECBQJKAALII89BgF4KHBTRlbATglSXsQIECAwAQBBeCEFO1AgAABAgS+FlAAZt8MBWB2/u3bKwDbIzAAAQIECBD4U0AB6DIQIECAAIG5AgrAudk+s5kC8Bklv3mbgALwbbQOJkCAAAECtwUUgLfJPECAAAECBI4RUAAeE9VbBlUAvoXVoc8KKACflfI7AgQIECDwfgEF4PuNvYEAAQIECHQJKAC75Pd4rwJwjxxip1AAxkZvcQIECBDYUEABuGEoRiJAgAABAkUCCsAiyEOPUQAeGtyUsRWAU5K0BwECBAhMEFAATkjRDgQIECBA4GsBBWD2zVAAZuffvr0CsD0CAxAgQIAAgT8FFIAuAwECBAgQmCugAJyb7TObKQCfUfKbtwkoAN9G62ACBAgQIHBbQAF4m8wDBAgQIEDgGAEF4DFRvWVQBeBbWB36rIAC8FkpvyNAgAABAu8XUAC+39gbCBAgQIBAl4ACsEt+j/cqAPfIIXYKBWBs9BYnQIAAgQ0FFIAbhmIkAgQIECBQJKAALII89BgF4KHBTRlbATglSXsQIECAwAQBBeCEFO1AgAABAgS+FlAAZt8MBWB2/u3bKwDbIzAAAQIECBD4U0AB6DIQIECAAIG5AgrAudk+s5kC8Bklv3mbgALwbbQOJkCAAAECtwUUgLfJPECAAAECBI4RUAAeE9VbBlUAvoXVoc8KKACflfI7AgQIECDwfgEF4PuNvYEAAQIECHQJKAC75Pd4rwJwjxxip1AAxkZvcQIECBDYUEABuGEoRiJAgAABAkUCCsAiyEOPUQAeGtyUsRWAU5K0BwECBAhMEFAATkjRDgQIECBA4GsBBWD2zVAAZuffvr0CsD0CAxAgQIAAgT8FFIAuAwECBAgQmCugAJyb7TObKQCfUfKbtwkoAN9G62ACBAgQIHBbQAF4m8wDBAgQIEDgGAEF4DFRvWVQBeBbWB36rIAC8FkpvyNAgAABAu8XUAC+39gbCBAgQIBAl4ACsEt+j/cqAPfIIXYKBWBs9BYnQIAAgQ0FFIAbhmIkAgQIECBQJKAALII89BgF4KHBTRlbATglSXsQIECAwAQBBeCEFO1AgAABAgS+FlAAZt8MBWB2/u3bKwDbIzAAAQIECBD4U0AB6DIQIECAAIG5AgrAudk+s5kC8Bklv3mbgALwbbQOJkCAAAECtwUUgLfJPECAAAECBI4RUAAeE9VbBlUAvoXVoc8KKACflfI7AgQIECDwfgEF4PuNvYEAAQIECHQJKAC75Pd4rwJwjxxip1AAxkZvcQIECBDYWODVIvBvv/2+8XZGI0CAAAECmQIKwMzc/721AjA7//btFYDtERiAAAECBAj8JKAAdCkIECBAgMA8AQXgvEzvbKQAvKPlt+UCCsByUgcSIECAAIGXBRSALxM6gAABAgQIbCegANwuko8OpAD8KLeX/SigAHQnCBAgQIDAfgIKwP0yMREBAgQIEHhVQAH4quDZzysAz87v+OkVgMdHaAECBAgQGCigABwYqpUIECBAIF5AAZh9BRSA2fm3b68AbI/AAAQIECBA4CcBBaBLQYAAAQIE5B8fAQAAIABJREFU5gkoAOdlemcjBeAdLb8tF1AAlpM6kAABAgQIvCygAHyZ0AEECBAgQGA7AQXgdpF8dCAF4Ee5vexHAQWgO0GAAAECBPYTUADul4mJCBAgQIDAqwIKwFcFz35eAXh2fsdPrwA8PkILECBAgMBAAQXgwFCtRIAAAQLxAgrA7CugAMzOv317BWB7BAYgQIAAAQI/CSgAXQoCBAgQIDBPQAE4L9M7GykA72j5bbmAArCc1IEECBAgQOBlAQXgy4QOIECAAAEC2wkoALeL5KMDKQA/yu1lPwooAN0JAgQIECCwn4ACcL9MTESAAAECBF4VUAC+Knj28wrAs/M7fnoF4PERWoAAAQIEBgooAAeGaiUCBAgQiBdQAGZfAQVgdv7t2ysA2yMwAAECBAgQ+ElAAehSECBAgACBeQIKwHmZ3tlIAXhHy2/LBRSA5aQOJECAAAECLwsoAF8mdAABAgQIENhOQAG4XSQfHUgB+FFuL/tRQAHoThAgQIAAgf0EFID7ZWIiAgQIECDwqoAC8FXBs59XAJ6d3/HTKwCPj9ACBAgQIDBQQAE4MFQrESBAgEC8gAIw+wooALPzb99eAdgegQEIECBAgMBPAgpAl4IAAQIECMwTUADOy/TORgrAO1p+Wy6gACwndSABAgQIEHhZQAH4MqEDCBAgQIDAdgIKwO0i+ehACsCPcnvZjwIKQHeCAAECBAjsJ6AA3C8TExEgQIAAgVcFFICvCp79vALw7PyOn14BeHyEFiBAgACBgQIKwIGhWokAAQIE4gUUgNlXQAGYnX/79grA9ggMQIAAAQIEfhJQALoUBAgQIEBgnoACcF6mdzZSAN7R8ttyAQVgOakDCRAgQIDAywIKwJcJHUCAAAECBLYTUABuF8lHB1IAfpTby34UUAC6EwQIECBAYD8BBeB+mZiIAAECBAi8KqAAfFXw7OcVgGfnd/z0CsDjI7QAAQIECAwUUAAODNVKBAgQIBAvoADMvgIKwOz827dXALZHYAACBAgQIPCTgALQpSBAgAABAvMEFIDzMr2zkQLwjpbflgsoAMtJHUiAAAECBF4WUAC+TOgAAgQIECCwnYACcLtIPjqQAvCj3F72o4AC0J0gQIAAAQL7CSgA98vERAQIECBA4FUBBeCrgmc/rwA8O7/jp1cAHh+hBQgQIEBgoIACcGCoViJAgACBeAEFYPYVUABm59++vQKwPQIDECBAgACBnwQUgC4FAQIECBCYJ6AAnJfpnY0UgHe0/LZcQAFYTupAAgQIECDwsoAC8GVCBxAgQIAAge0EFIDbRfLRgRSAH+X2sh8FFIDuBAECBAgQ2E9AAbhfJiYiQIAAAQKvCigAXxU8+3kF4Nn5HT+9AvD4CC1AgAABAgMFFIADQ7USAQIECMQLKACzr4ACMDv/9u0VgO0RGIAAAQIECPwkoAB0KQgQIECAwDwBBeC8TO9spAC8o+W35QIKwHJSBxIgQIAAgZcFFIAvEzqAAAECBAhsJ6AA3C6Sjw6kAPwot5f9KKAAdCcIECBAgMB+AgrA/TIxEQECBAgQeFVAAfiq4NnPKwDPzu/46RWAx0doAQIECBAYKKAAHBiqlQgQIEAgXkABmH0FFIDZ+bdvrwBsj8AABAgQIEDgJwEFoEtBgAABAgTmCSgA52V6ZyMF4B0tvy0XUACWkzqQAAECBAiUCLxaAn4b4m+//V4yi0MIECBAgACB1wUUgK8bnnyCAvDk9AbMrgAcEKIVCBAgQGCkgAJwZKyWIkCAAIFgAQVgcPi//PKLAjA7//btFYDtERiAAAECBAh8KaAAdDEIECBAgMAsAQXgrDzvbqMAvCvm96UCCsBSTocRIECAAIEyAQVgGaWDCBAgQIDAFgIKwC1iaBtCAdhG78XfBBSA7gEBAgQIENhTQAG4Zy6mIkCAAAECqwIKwFW5Gc8pAGfkeOwWCsBjozM4AQIECAwXUAAOD9h6BAgQIBAnoACMi/y7hRWA2fm3b68AbI/AAAQIECBA4EsBBaCLQYAAAQIEZgkoAGfleXcbBeBdMb8vFVAAlnI6jAABAgQIlAkoAMsoHUSAAAECBLYQUABuEUPbEArANnov/iagAHQPCBAgQIDAngIKwD1zMRUBAgQIEFgVUACuys14TgE4I8djt1AAHhudwQkQIEBguIACcHjA1iNAgACBOAEFYFzk3y2sAMzOv317BWB7BAYgQIAAAQJfCigAXQwCBAgQIDBLQAE4K8+72ygA74r5famAArCU02EECBAgQKBMQAFYRukgAgQIECCwhYACcIsY2oZQALbRe/E3AQWge0CAAAECBPYUUADumYupCBAgQIDAqoACcFVuxnMKwBk5HruFAvDY6AxOgAABAsMFFIDDA7YeAQIECMQJKADjIv9uYQVgdv7t2ysA2yMwAAECBAgQ+FJAAehiECBAgACBWQIKwFl53t1GAXhXzO9LBRSApZwOI0CAAAECZQIKwDJKBxEgQIAAgS0EFIBbxNA2hAKwjd6LvwkoAN0DAgQIECCwp4ACcM9cTEWAAAECBFYFFICrcjOeUwDOyPHYLRSAx0ZncAIECBAYLqAAHB6w9QgQIEAgTkABGBf5dwsrALPzb99eAdgegQEIECBAgMCXAgpAF4MAAQIECMwSUADOyvPuNgrAu2J+XyqgACzldBgBAgQIECgTUACWUTqIAAECBAhsIaAA3CKGtiEUgG30XvxNQAHoHhAgQIAAgT0FFIB75mIqAgQIECCwKqAAXJWb8ZwCcEaOx26hADw2OoMTIECAwHABBeDwgK1HgAABAnECCsC4yL9bWAGYnX/79grA9ggMQIAAAQIEvhRQALoYBAgQIEBgloACcFaed7dRAN4V8/tSAQVgKafDCBAgQIBAmYACsIzSQQQIECBAYAsBBeAWMbQNoQBso/fibwIKQPeAAAECBAjsKaAA3DMXUxEgQIAAgVUBBeCq3IznFIAzcjx2CwXgsdEZnAABAgSGCygAhwdsPQIECBCIE1AAxkX+3cIKwOz827dXALZHYAACBAgQIPClgALQxSBAgAABArMEFICz8ry7jQLwrpjflwooAEs5HUaAAAECBMoEFIBllA4iQIAAAQJbCCgAt4ihbQgFYBu9F38TUAC6BwQIECBAYE8BBeCeuZiKAAECBAisCigAV+VmPKcAnJHjsVsoAI+NzuAECBAgMFxAATg8YOsRIECAQJyAAjAu8u8WVgBm59++vQKwPQIDECBAgACBLwUUgC4GAQIECBCYJaAAnJXn3W0U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1q00ayABMGtfbkuAAAECBAgQIECAAAECmQICYOberm4tAF5J+s9KQABcsTlEgAABAgQIECBAgAABAgRGAgLgiKvuYwGwbqVZAwmAWftyWwIECBAgQIAAAQIECBDIFBAAM/d2dWsB8ErSf1YCAuCKzSECBAgQIECAAAECBAgQIDASEABHXHUfC4B1K80aSADM2pfbEiBAgAABAgQIECBAgECmgACYuberWwuAV5L+sxIQAFdsDhEgQIAAAQIECBAgQIAAgZGAADjiqvtYAKxbadZAAmDWvtyWAAECBAgQIECAAAECBDIFBMDMvV3dWgC8kvSflYAAuGJziAABAgQIECBAgAABAgQIjAQEwBFX3ccCYN1KswYSALP25bYECBAgQIAAAQIECBAgkCkgAGbu7erWAuCVpP+sBATAFZtDBAgQIECAAAECBAgQIEBgJCAAjrjqPhYA61aaNZAAmLUvtyVAgAABAgQIECBAgACBTAEBMHNvV7cWAK8k/WclIACu2BwiQIAAAQIECBAgQIAAAQIjAQFwxFX3sQBYt9KsgQTArH25LQECBAgQIECAAAECBAhkCgiAmXu7urUAeCXpPysBAXDF5hABAgQIECBAgAABAgQIEBgJCIAjrrqPBcC6lWYNJABm7cttCRAgQIAAAQIECBAgQCBTQADM3NvVrQXAK0n/WQkIgCs2hwgQIECAAAECBAgQIECAwEhAABxx1X0sANatNGsgATBrX25LgAABAgQIECBAgAABApkCAmDm3q5uLQBeSfrPSkAAXLE5RIAAAQIECBAgQIAAAQIERgIC4Iir7mMBsG6lWQMJgFn7clsCBAgQIECAAAECBAgQyBQQADP3dnVrAfBK0n9WAgLgis0hAgQIECBAgAABAgQIECAwEhAAR1x1HwuAdSvNGkgAzNqX2xIgQIAAAQIECBAgQIBApoAAmLm3q1sLgFeS/rMSEABXbA4RIECAAAECBAgQIECAAIGRgAA44qr7WACsW2nWQAJg1r7clgABAgQIECBAgAABAgQyBQTAzL1d3VoAvJL0n5WAALhic4gAAQIECBAgQIAAAQIECIwEBMARV93HAmDdSrMGEgCz9uW2BAgQIECAAAECBAgQIJApIABm7u3q1gLglaT/rAQEwBWbQwQIECBAgAABAgQIECBAYCQgAI646j4WAOtWmjWQAJi1L7clQIAAAQIECBAgQIAAgUwBATBzb1e3FgCvJP1nJSAArtgcIkCAAAECBAgQIECAAAECIwEBcMRV97EAWLfSrIEEwKx9uS0BAgQIECBAgAABAgQIZAoIgJl7u7q1AHgl6T8rAQFwxeYQAQIECBAgQIAAAQIECBAYCQiAI666jwXAupVmDSQAZu3LbQkQIECAAAECBAgQIEAgU0AAzNzb1a0FwCtJ/1kJCIArNocIECBAgAABAgQIECBAgMBIQAAccdV9LADWrTRrIAEwa19uS4AAAQIECBAgQIAAAQKZAgJg5t6ubi0AXkn6z0pAAFyxOUSAAAECBAgQIECAAAECBEYCAuCIq+5jAbBupVkDCYBZ+3JbAgQIECBAgAABAgQIEMgUEAAz93Z1awHwStJ/VgIC4IrNIQIECBAgQIAAAQIECBAgMBIQAEdcdR8LgHUrzRpIAMzal9sSIECAAAECBAgQIECAQKaAAJi5t6tbC4BXkv6zEhAAV2wOESBAgAABAgQIECBAgACBkYAAOOKq+1gArFtp1kACYNa+3JYAAQIECBAgQIAAAQIEMgUEwMy9Xd1aALyS9J+VgAC4YnOIAAECBAgQIECAAAECBAiMBATAEVfdxwJg3UqzBhIAs/bltgQIECBAgAABAgQIECCQKSAAZu7t6tYC4JWk/6wEBMAVm0MECBAgQIAAAQIECBAgQGAkIACOuOo+FgDrVpo1kACYtS+3JUCAAAECBAgQIECAAIFMAQEwc29XtxYAryT9ZyUgAK7YHCJAgAABAgQIECBAgAABAiMBAXDEVfexAFi30qyBBMCsfbktAQIECBAgQIAAAQIECGQKCICZe7u6tQB4Jek/KwEBcMXmEAECBAgQIECAAAECBAgQGAkIgCOuuo8FwLqVZg0kAGbty20JECBAgAABAgQIECBAIFNAAMzc29WtBcArSf9ZCQiAKzaHCBAgQIAAAQIECBAgQIDASEAAHHHVfSwA1q00ayABMGtfbkuAAAECBAgQIECAAAECmQICYOberm4tAF5J+s9KQABcsTlEgAABAgQIECBAgAABAgRGAgLgiKvuYwGwbqUGIkCAAAECBAgQIECAAAECBAgQIPAFBECvgQABAgQIECBAgAABAgQIECBAgECxgABYvFyjESBAgAABAgQIECBAgAABAgQIEBAAvQECBAgQIECAAAECBAgQIECAAAECxQICYPFyjUaAAAECBAgQIECAAAECBAgQIEBAAPQGCBAgQIAAAQIECBAgQIAAAQIECBQLCIDFyzUaAQIECBAgQIAAAQIECBAgQIAAAQHQGyBAgAABAgQIECBAgAABAgQIECBQLCAAFi/XaAQIECBAgAABAgQIECBAgAABAgQEQG+AAAECBAgQIECAAAECBAgQIECAQLGAAFi8XKMRIECAAAECBAgQIECAAAECBAgQEAC9AQIECBAgQIAAAQIECBAgQIAAAQLFAgJg8XKNRoAAAQIECBAgQIAAAQIECBAgQEAA9AYIECBAgAABAgQIECBAgAABAgQIFAsIgMXLNRoBAgQIECBAgAABAgQIECBAgAABAdAbIECAAAECBAgQIECAAAECBAgQIFAsIAAWL9doBAgQIECAAAECBAgQIECAAAECBARAb4AAAQIECBAgQIAAAQIECBAgQIBAsYAAWLxcoxEgQIAAAQIECBAgQIAAAQIECBAQAL0BAgQIECBAgAABAgQIECBAgAABAsUCAmDxco1GgAABAgQIECBAgAABAgQIECBAQAD0BggQIECAAAECBAgQIECAAAECBAgUCwiAxcs1GgECBAgQIECAAAECBAgQIECAAAEB0BsgQIAAAQIECBAgQIAAAQIECBAgUCwgABYv12gECBAgQIAAAQIECBAgQIAAAQIEBEBvgAABAgQIECBAgAABAgQIECBAgECxgABYvFyjESBAgAABAgQIECBAgAABAgQIEBAAvQECBAgQIECAAAECBAgQIECAAAECxQICYPFyjUaAAAECBAgQIECAAAECBAgQIEBAAPQGCBAgQIAAAQIECBAgQIAAAQIECBQLCIDFyzUaAQIECBAgQIAAAQIECBAgQIAAAQHQGyBAgAABAgQIECBAgAABAgQIECBQLCAAFi/XaAQIECBAgAABAgQIECBAgAABAgQEQG+AAAECBAgQIECAAAECBAgQIECAQLGAAFi8XKMRIECAAAECBAgQIECAAAECBAgQEAC9AQIECBAgQIAAAQIECBAgQIAAAQLFAgJg8XKNRoAAAQIECBAgQIAAAQIECBAgQEAA9AYIECBAgAABAgQIECBAgAABAgQIFAsIgMXLNRoBAgQIECBAgAABAgQIECBAgAABAdAbIECAAAECBAgQIECAAAECBAgQIFAsIAAWL9doBAgQIECAAAECBAgQIECAAAECBARAb4AAAQIECBAgQIAAAQIECBAgQIBAsYAAWLxcoxEgQIAAAQIECBAgQIAAAQIECBAQAL0BAgQIECBAgAABAgQIECBAgAABAsUCAmDxco1GgAABAgQIECBAgAABAgQIECBAQAD0BggQIECAAAECBAgQIECAAAECBAgUCwiAxcs1GgECBAgQIECAAAECBAgQIECAAAEB0BsgQIAAAQIECBAgQIAAAQIECBAgUCwgABYv12gECBAgQIAAAQIECBAgQIAAAQIEBEBvgAABAgQIECBAgAABAgQIECBAgECxgABYvFyjESBAgAABAgQIECBAgAABAgQIEBAAvQECBAgQIECAAAECBAgQIECAAAECxQICYPFyjUaAAAECBAgQIECAAAECBAgQIEBAAPQGCBAgQIAAAQIECBAgQIAAAQIECBQLCIDFyzUaAQIECBAgQIAAAQIECBAgQIAAAQHQGyBAgAABAgQIECBAgAABAgQIECBQLCAAFi/XaAQIECBAgAABAgQIECBAgAABAgQEQG+AAAECBAgQIECAAAECBAgQIECAQLGAAFi8XKMRIECAAAECBAgQIECAAAECBAgQEAC9AQIECBAgQIAAAQIECBAgQIAAAQLFAgJg8XKNRoAAAQIECBAgQIAAAQIECBAgQEAA9AYIECBAgAABAgQIECBAgAABAgQIFAsIgMXLNRoBAgQIECBAgAABAgQIECBAgAABAdAbIECAAAECBAgQIECAAAECBAgQIFAsIAAWL9doBAgQIECAAAECBAgQIECAAAECBARAb4AAAQIECBAgQIAAAQIECBAgQIBAsYAAWLxcoxEgQIAAAQIECBAgQIAAAQIECBAQAL0BAgQIECBAgAABAgQIECBAgAABAsUCAmDxco1GgAABAgQIECBAgAABAgQIECBAQAD0BggQIECAAAECBAgQIECAAAECBAgUCwiAxcs1GgECBAgQIECAAAECBAgQIECAAAEB0BsgQIAAAQIECBAgQIAAAQIECBAgUCwgABYv12gECBAgQIAAAQIECBAgQIAAAQIEBEBvgAABAgQIECBAgAABAgQIECBAgECxgABYvFyjESBAgAABAgQIECBAgAABAgQIEBAAvQECBAgQIECAAAECBAgQIECAAAECxQICYPFyjUaAAAECBAgQIECAAAECBAgQIEBAAPQGCBAgQIAAAQIECBAgQIAAAQIECBQLCIDFyzUaAQIECBAgQIAAAQIECBAgQIAAAQHQGyBAgAABAgQIECBAgAABAgQIECBQLCAAFi/XaAQIECBAgAABAgQIECBAgAABAgQEQG+AAAECBAgQIECAAAECBAgQIECAQLGAAFi8XKMRIECAAAECBAgQIECAAAECBAgQEAC9AQIECBAgQIAAAQIECBAgQIAAAQLFAgJg8XKNRoAAAQIECBAgQIAAAQIECBAgQEAA9AYIECBAgAABAgQIECBAgAABAgQIFAsIgMXLNRoBAgQIECBAgAABAgQIECBAgAABAdAbIECAAAECBAgQIECAAAECBAgQIFAsIAAWL9doBAgQIECAAAECBAgQIECAAAECBARAb4AAAQIECBAgQIAAAQIECBAgQIBAsYAAWLxcoxEgQIAAAQIECBAgQIAAAQIECBAQAL0BAgQIECBAgAABAgQIECBAgAABAsUCAmDxco1GgAABAgQIECBAgAABAgQIECBAQAD0BggQIECAAAECBAgQIECAAAECBAgUCwiAxcs1GgECBAgQIECAAAECBAgQIECAAAEB0BsgQIAAAQIECBAgQIAAAQIECBAgUCwgABYv12gECBAgQIAAAQIECBAgQIAAAQIEBEBvgAABAgQIECBAgAABAgQIECBAgECxgABYvFyjESBAgAABAgQIECBAgAABAgQIEBAAvQECBAgQIECAAAECBAgQIECAAAECxQICYPFyjUaAAAECBAgQIECAAAECBAgQIEBAAPQGCBAgQIAAAQIECBAgQIAAAQIECBQLCIDFyzUaAQIECBAgQIAAAQIECBAgQIAAAQHQGyBAgAABAgQIECBAgAABAgQIECBQLCAAFi/XaAQIECBAgAABAgQIECBAgAABAgQEQG+AAAECBAgQIECAAAECBAgQIECAQLGAAFi8XKMRIECAAAECBAgQIECAAAECBAgQEAC9AQIECBAgQIAAAQIECBAgQIAAAQLFAgJg8XKNRoAAAQIECBAgQIAAAQIECBAgQEAA9AYIECBAgAABAgQIECBAgAABAgQIFAsIgMXLNRoBAgQIECBAgAABAgQIECBAgAABAdAbIECAAAECBAgQIECAAAECBAgQIFAsIAAWL9doBAgQIECAAAECBAgQIECAAAECBARAb4AAAQIECBAgQIAAAQIECBAgQIBAsYAAWLxcoxEgQIAAAQIECBAgQIAAAQIECBAQAL0BAgQIECBAgAABAgQIECBAgAABAsUCAmDxco1GgAABAgQIECBAgAABAgQIECBAQAD0BggQIECAAAECBAgQIECAAAECBAgUCwiAxcs1GgECBAgQIECAAAECBAgQIECAAAEB0BsgQIAAAQIECBAgQIAAAQIECBAgUCwgABYv12gECBAgQIAAAQIECBAgQIAAAQIEBEBvgAABAgQIECBAgAABAgQIECBAgECxgABYvFyjESBAgAABAgQIECBAgAABAgQIEBAAvQECBAgQIECAAAECBAgQIECAAAECxQICYPFyjUaAAAECBAgQIECAAAECBAgQIEBAAPQGCBAgQIAAAQIECBAgQIAAAQIECBQLCIDFyzUaAQIECBAgQIAAAQIECBAgQIAAAQHQGyBAgAABAgQIECBAgAABAgQIECBQLCAAFi/XaAQIECBAgAABAgQIECBAgAABAgQEQG+AAAECBAgQIECAAAECBAgQIECAQLGAAFi8XKMRIECAAAECBAgQIECAAAECBAgQEAC9AQIECBAgQIAAAQIECBAgQIAAAQLFAgJg8XKNRoAAAQIECBAgQIAAAQIECBAgQEAA9AYIECBAgAABAgQIECBAgAABAgQIFAsIgMXLNRoBAgQIECBAgAABAgQIECBAgAABAdAbIECAAAECBAgQIECAAAECBAgQIFAsIAAWL9doBAgQIECAAAECBAgQIECAAAECBARAb4AAAQIECBAgQIAAAQIECBAgQIBAsYAAWLxcoxEgQIAAAQIECBAgQIAAAQIECBAQAL0BAgQIECBAgAABAgQIECBAgAABAsUCAmDxco1GgAABAgQIECBAgAABAgQIECBAQAD0BggQIECAAAECBAgQIECAAAECBAgUCwiAxcs1GgECBAgQIECAAAECBAgQIECAAAEB0BsgQIAAAQIECBAgQIAAAQIECBAgUCwgABYv12gECBAgQIAAAQIECBAgQIAAAQIEHlwtbYRiyeqHAAAAAElFTkSuQmCC\" width=\"640\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_cart_pole(env, obs)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now let's look at the action space:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 27,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Discrete(2)"
|
||
]
|
||
},
|
||
"execution_count": 27,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"env.action_space"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Yep, just two possible actions: accelerate towards the left or towards the right. Let's push the cart left until the pole falls:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 28,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"obs = env.reset()\n",
|
||
"while True:\n",
|
||
" obs, reward, done, info = env.step(0)\n",
|
||
" if done:\n",
|
||
" break"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 29,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4Xuzd3bkdyXGmUcAM2TE0Q3aQbtAN0g6ZwbFDZvQ8EOfwIVrYXbtyZ2Z9GbF4o4uun4wVdW5eHQDfv/kfAQIECBAgQIAAAQIECBAgQIAAAQJlBb6XncxgBAgQIECAAAECBAgQIECAAAECBAh8EwB9BAQIECBAgAABAgQIECBAgAABAgQKCwiAhZdrNAIECBAgQIAAAQIECBAgQIAAAQICoG+AAAECBAgQIECAAAECBAgQIECAQGEBAbDwco1GgAABAgQIECBAgAABAgQIECBAQAD0DRAgQIAAAQIECBAgQIAAAQIECBAoLCAAFl6u0QgQIECAAAECBAgQIECAAAECBAgIgL4BAgQIECBAgAABAgQIECBAgAABAoUFBMDCyzUaAQIECBAgQIAAAQIECBAgQIAAAQHQN0CAAAECBAgQIECAAAECBAgQIECgsIAAWHi5RiNAgAABAgQIECBAgAABAgQIECAgAPoGCBAgQIAAAQIECBAgQIAAAQIECBQWEAALL9doBAgQIECAAAECBAgQIECAAAECBARA3wABAgQIECBAgAABAgQIECBAgACBwgICYOHlGo0AAQIECBAgQIAAAQIECBAgQICAAOgbIECAAAECBAgQIECAAAECBAgQIFBYQAAsvFyjESBAgAABAgQIECBAgAABAgQIEBAAfQMECBAgQIAAAQIECBAgQIAAAQIECgsIgIWXazQCBAgQIECAAAECBAgQIECAAAECAqBvgAABAgQIECBAgAABAgQIECBAgEBhAQGw8HKNRoAAAQIECBAgQIAAAQIECBAgQEAA9A0QIECAAAECBAgQIECAAAECBAgQKCwgABZertEIECBAgAABAgQIECBAgAABAgQICIC+AQIECBAgQIAAAQIECBAgQIAAAQKFBQTAwss1GgECBAgQIECAAAECBAgQIECAAAEB0DdAgAABAgQIECBAgAABAgQIECBAoLCAAFh4uUYjQIAAAQIECBAgQIAAAQIECBAgIAD6BggQIECAAAECBAgQIECAAAECBAgUFhAACy/XaAQIECBAgAABAgQIECBAgAABAgQEQN8AAQIECBAgQIAAAQIECBAgQIAAgcICAmDh5RqNAAECBAgQIECAAAECBAgQIECAgADoGyBAgAABAgQIECBAgAABAgQIECBQWEAALLxcoxEgQIAAAQIECBAgQIAAAQIECBAQAH0DBAgQIECAAAECBAgQIECAAAECBAoLCICFl2s0AgQIECBAgAABAgQIECBAgAABAgKgb4AAAQIECBAgQIAAAQIECBAgQIBAYQEBsPByjUaAAAECBAgQIECAAAECBAgQIEBAAPQNECBAgAABAgQIECBAgAABAgQIECgsIAAWXq7RCBAgQIAAAQIECBAgQIAAAQIECAiAvgECBAgQIECAAAECBAgQIECAAAEChQUEwMLLNRoBAgQIECBAgAABAgQIECBAgAABAdA3QIAAAQIECBAgQIAAAQIECBAgQKCwgABYeLlGI0CAAAECBAgQIECAAAECBAgQICAA+gYIECBAgAABAgQIECBAgAABAgQIFBYQAAsv12gECBAgQIAAAQIECBAgQIAAAQIEBEDfAAECBAgQIECAAAECBAgQIECAAIHCAgJg4eUajQABAgQIECBAgAABAgQIECBAgIAA6BsgQIAAAQIECBAgQIAAAQIECBAgUFhAACy8XKMRIECAAAECBAgQIECAAAECBAgQEAB9AwQIECBAgAABAgQIECBAgAABAgQKCwiAhZdrNAIECBAgQIAAAQIECBAgQIAAAQICoG+AAAECBAgQIECAAAECBAgQIECAQGEBAbDwco1GgAABAgQIECBAgAABAgQIECBAQAD0DRAgQIAAAQIECBAgQIAAAQIECBAoLCAAFl6u0QgQIECAAAECBAgQIECAAAECBAgIgL4BAgQIECBAgAABAgQIECBAgAABAoUFBMDCyzUaAQIECBAgQIAAAQIECBAgQIAAAQHQN0CAAAECBAgQIECAAAECBAgQIECgsIAAWHi5RiNAgAABAgQIECBAgAABAgQIECAgAPoGCBAgQIAAAQIECBAgQIAAAQIECBQWEAALL9doBAgQIECAAAECBAgQIECAAAECBARA3wABAgQIECBAgAABAgQIECBAgACBwgICYOHlGo0AAQIECBAgQIAAAQIECBAgQICAAOgbIECAAAECBAgQIECAAAECBAgQIFBYQAAsvFyjESBAgAABAgQIECBAgAABAgQIEBAAfQMECBAgQIAAAQIECBAgQIAAAQIECgsIgIWXazQCBAgQIECAAAECBAgQIECAAAECAqBvgAABAgQIECBAgAABAgQIECBAgEBhAQGw8HKNRoAAAQIECBAgQIAAAQIECBAgQEAA9A0QIECAAAECBAgQIECAAAECBAgQKCwgABZertEIECBAgAABAgQIECBAgAABAgQICIC+AQIECBAgQIAAAQIECBAgQIAAAQKFBQTAwss1GgECBAgQIECAAAECBAgQIECAAAEB0DdAgAABAgQIECBAgAABAgQIECBAoLCAAFh4uUYjQIAAAQIECBAgQIAAAQIECBAgIAD6BggQIECAAAECBAgQIECAAAECBAgUFhAACy/XaAQIECBAgAABAgQIECBAgAABAgQEQN8AAQIECBAgQIAAAQIECBAgQIAAgcICAmDh5RqNAAECBAgQIECAAAECBAgQIECAgADoGyBAgAABAgQIECBAgAABAgQIECBQWEAALLxcoxEgQIAAAQIECBAgQIAAAQIECBAQAH0DBAgQIECAAAECBAgQIECAAAECBAoLCICFl2s0AgQIECBAgAABAgQIECBAgAABAgKgb4AAAQIECBAgQIAAAQIECBAgQIBAYQEBsPByjUaAAAECBAgQIECAAAECBAgQIEBAAPQNECBAgAABAgQIECBAgAABAgQIECgsIAAWXq7RCBAgQIAAAQIECBAgQIAAAQIECAiAvgECBAgQIECAAAECBAgQIECAAAEChQUEwMLLNRoBAgQIECBAgAABAgQIECBAgAABAdA3QIAAAQIECBAgQIAAAQIECBAgQKCwgABYeLlGI0CAAAECBAgQIECAAAECBAgQICAA+gYIECBAgAABAgQIECBAgAABAgQIFBYQAAsv12gECBAgQIAAAQIECBAgQIAAAQIEBEDfAAECBAgQIECAAAECBAgQIECAAIHCAgJg4eUajQABAgQIECBAgAABAgQIECBAgIAA6BsgQIAAAQIECBAgQIAAAQIECBAgUFhAACy8XKMRIECAAAECBAgQIECAAAECBAgQEAB9AwQIECBAgAABAgQIECBAgAABAgQKCwiAhZdrNAIECBAgQIAAAQIECBAgQIAAAQICoG+AAAECBAgQIECAAAECBAgQIECAQGEBAbDwco1GgAABAgQIECBAgAABAgQIECBAQAD0DRAgQIAAAQIECBAgQIAAAQIECBAoLCAAFljub7/99luBMYxAgAABAgQIECBAgAABAgQIEFgq8P3795YtrOXQS7+k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IAAKgEV+CgTAIos0BgECBAg8IiAA7mUXAPd6exsBAgQIECAgAAqARX4KBMAiizQGAQIECDwiIADuZRcA93p7GwECBAgQICAACoBFfgoEwCKLNAYBAgQIPCIgAO5lFwD3ensbAQIECBAgIAAKgEV+CgTAIos0BgECBAg8IiAA7mUXAPd6exsBAgQIECAgAAqARX4KBMAiizQGAQIECDwiIADuZRcA93p7GwECBAgQICAACoBFfgoEwCKLNAYBAgQIPCIgAO5lFwD3ensbAQIECBAgIAAKgEV+CgTAIos0BgECBAg8IiAA7mUXAPd6exsBAgQIECAgAAqARX4KBMAiizQGAQIECDwiIADuZRcA93p7GwECBAgQICAACoBFfgoEwCKLNAYBAgQIPCIgAO5lFwD3ensbAQIECBAgIAAKgEV+CgTAIos0BgECBAgQIECAAAECBAgQILBU4HvT/+/v96WqHr5FQADcwuwlBAgQIECAAAECBAgQIECAwOECAuDhC+x8fAGw8/bNToAAAQIECBAgQIAAAQIECLwrIAC+K+W6OAEBMG4lDkSAAAECBAgQIECAAAECBAgECgiAgUtxpPcEBMD3nFxFgAABAgQIECBAgAABAgQI9BYQAHvv/+jpBcCj1+fwBAgQIECAAAECBAgQIECAwCYBAXATtNfMFxAA55t6IgECBAgQIECAAAECBAgQIFBPQACst9M2EwmAbVZtUAIECBAgQIAAAQIECBAgQOADAQHwAzy3PisgAD7r7+0ECBAgQIAAAQIECBAgQIDAGQIC4Bl7cspfCAiAPgsCBAgQIECAAAECBAgQIECAwLWAAHht5IpQAQEwdDGORYAAAQIECBAgQIAAAQIECEQJCIBR63CYOwIC4B0t1xIgQIAAAQIECBAgQIAAAQJdBQTArpsvMLcAWGCJRiBAgAABAgQIECBAgAABAgSWCwiAy4m9YJWAALhK1nMJECBAgAABAgQIECBAgACBSgICYKVtNptFAGy2cOMSIECAAAECBAgQIECAAAECQwIC4BCbmxIEBMCELTgDAQIECBAgQIAAAQIECBAgkC4gAKZvyPleCgiAPg4CBAgQIECAAAECBAgQIECAwLWAAHht5IpQAQEwdDGORYAAAQIECBAgQIAAAQIECEQJCIBR63CYOwIC4B0t1xIgQIAAAQIECBAgQIAAAQJdBQTArpsvMLcAWGCJRiBAgAABAgQIECBAgAABAgSWCwiAy4m9YJWAALhK1nMJECBAgAABAgQIECBAgACBSgICYKVtNptFAGy2cOMSIECAAAECBAgQIECAAAECQwIC4BCbmxIEBMCELTgDAQIECBAgQIAAAQIECBAgkC4gAKZvyPleCgiAPg4CBAgQIECAAAECBAgQIECAwLWAAHht5IpQAQEwdDGORYAAAQIECBAgQIAAAQIECEQJCIBR63CYOwIC4B0t1xIgQIAAAQIECBAgQIAAAQJdBQTArpsvMLcAWGCJRiBAgAABAgQIECBAgAABAgSWCwiAy4m9YJWAALhK1nMJECBAgAABAgQIECBAgACBSgICYKVtNptFAGy2cOMSIECAAAECBAgQIECAAAECQwIC4BCbmxIEBMCELTgDAQIECBAgQIAAAQIECBAgkC4gAKZvyPleCgiAPg4CBAgQIECAAAECBAgQIECAwLWAAHht5IpQAQEwdDGORYAAAQIECBAgQIAAAQIECEQJCIBR63CYOwIC4B0t1xIgQIAAAQIECBAgQIAAAQJdBQTArpsvMLcAWGCJRiBAgAABAgQIECBAgAABAgSWCwiAy4m9YJWAALhK1nMJECBAgAABAgQIECBAgACBSgICYKVtNptFAGy2cOMSIECAAAECBAgQIECAAAECQwIC4BCbmxIEBMCELTgDAQIECBAgQIAAAQIECBAgkC4gAKZvyPleCgiAPg4CBAgQIECAAAECBAgQIECAwLWAAHht5IpQAQEwdDGORYAAAQIECBAgQIAAAQIECEQJCIBR63CYOwIC4B0t1xIgQIAAAQIECBAgQIAAAQJdBQTArpsvMLcAWGCJRiBAgAABAgQIECBAgAABAgSWCwiAy4m9YJWAALhK1nMJECBAgAABAgQIECBAgACBSgICYKVtNptFAGy2cOMSIECAAAECBAgQIECAAAECQwIC4BCbmxIEBMCELTgDAQIECBAgQIAAAQIECBAgkC4gAKZvyPleCgiAPg4CBAgQIECAAAECBAgQIECAwLWAAHht5IpQAQEwdDGORYAAAQIECBAgQIAAAQIECEQJCIBR63CYOwIC4B0t1xIgQIAAAQIECBAgQIAAAQJdBQTArpsvMLcAWGCJRiBAgAABAgQIECBAgAABAgSWCwiAy4m9YJWAALhK1nMJECBAgAABAgQIECBAgACBSgICYKVtNptFAGy2cOMSIECAAAECBAgQIECAAAECQwIC4BCbmxIEBMCELTgDAQIECBAgQIAAAQIECBAgkC4gAKZvyPleCgiAPg4CBAgQIECAAAECBAgQIECAwLWAAHht5IpQAQEwdDGORYAAAQIECBAgQIAAAQIECEQJCIBR63CYOwIC4B0t1xIgQIAAAQIECBAgQIAAAQJdBQTArpsvMLcAWGCJRiBAgAABAgQIECBAgAABAgSWCwiAy4m9YJWAALhK1nMJECBAgAABAgQIECBAgACBSgICYKVtNptFAGy2cOMSIECAAAECBAgQIECAAAECQwIC4BCbmxIEBMCELTgDAQIECBAgQIAAAQIECBAgkC4gAKZvyPleCgiAPg4CBAgQIECAAAECBAgQIECAwLWAAHht5IpQAQEwdDGORYAAAQIECBAgQIAAAQIECEQJCIBR63CYOwIC4B0t1xIgQIAAAQIECBAgQIAAAQJdBQTArpsvMLcAWGCJRiBAgAABAgQIECBAgAABAgSWCwiAy4m9YJWAALhK1nMJECBAgAABAgQIECBAgACBSgICYKVtNpvl/7VjBykOxTAQBZn7X3pOEEx/MKit2iuJXMrqCYDLDu65BAgQIECAAAECBAgQIECAwCcBAfATmw9NEBAAJ1zBDgQIECBAgAABAgQIECBAgMB0AQFw+oXs91NAAPTnIECAAAECBAgQIECAAAECBAicBQTAs5GJoQIC4NDDWIsAAQIECBAgQIAAAQIECBAYJSAAjjqHZRIBATDRMkuAAAECBAgQIECAAAECBAhsFRAAt17+gXcLgA8c0RMIECBAgAABAgQIECBAgACB6wIC4HViP3BLQAC8Jet7CRAgQIAAAQIECBAgQIAAgZcEBMCXrrnsLQLgsoN7LgECBAgQIECAAAECBAgQIPBJQAD8xOZDEwQEwAlXsAMBAgQIECBAgAABAgQIECAwXUAAnH4h+/0UEAD9OQgQIECAAAECBAgQIECAAAECZwEB8GxkYqiAADj0MNYiQIAAAQIECBAgQIAAAQIERgkIgKPOYZlEQABMtMwSIECAAAECBAgQIECAAAECWwUEwK2Xf+DdAuADR/QEAgQIECBAgAABAgQIECBA4LqAAHid2A/cEhAAb8n6XgIECBAgQIAAAQIECBAgQOAlAQHwpWsue4sAuOzgnkuAAAECBAgQIECAAAECBAh8EhAAP7H50AQBAXDCFexAgAABAgQIECBAgAABAgQITBcQAKdfyH4/BQRAfw4CBAgQIECAAAECBAgQIECAwFlAADwbmRgqIAAOPYy1CBAgQIAAAQIECBAgQIAAgVECAuCoc1gmERAAEy2zBAgQIECAAAECBAgQIECAwFYBAXDr5R94twD4wBE9gQABAgQIECBAgAABAgQIELguIABeJ/YDtwQEwFuyvpcAAQIECBAgQIAAAQIECBB4SUAAfOmay94iAC47uOcSIECAAAECBAgQIECAAAECnwQEwE9sPjRBQACccAU7ECBAgAABAgQIECBAgAABAtMFBMDpF7LfTwEB0J+DAAECBAgQIECAAAECBAgQIHAWEADPRiaGCgiAQw9jLQIECBAgQIAAAQIECBAgQGCUgAA46hyWSQQEwES7+WnSAAAUb0lEQVTLLAECBAgQIECAAAECBAgQILBVQADcevkH3i0APnBETyBAgAABAgQIECBAgAABAgSuCwiA14n9wC0BAfCWrO8lQIAAAQIECBAgQIAAAQIEXhIQAF+65rK3CIDLDu65BAgQIECAAAECBAgQIECAwCcBAfATmw9NEBAAJ1zBDgQIECBAgAABAgQIECBAgMB0AQFw+oXs91NAAPTnIECAAAECBAgQIECAAAECBAicBQTAs5GJoQIC4NDDWIsAAQIECBAgQIAAAQIECBAYJSAAjjqHZRIBATDRMkuAAAECBAgQIECAAAECBAhsFRAAt17+gXcLgA8c0RMIECBAgAABAgQIECBAgACB6wIC4HViP3BLQAC8Jet7CRAgQIAAAQIECBAgQIAAgZcEBMCXrrnsLQLgsoN7LgECBAgQIECAAAECBAgQIPBJQAD8xOZDEwQEwAlXsAMBAgQIECBAgAABAgQIECAwXUAAnH4h+/0UEAD9OQgQIECAAAECBAgQIECAAAECZwEB8GxkYqiAADj0MNYiQIAAAQIECBAgQIAAAQIERgkIgKPOYZlEQABMtMwSIECAAAECBAgQIECAAAECWwUEwK2Xf+DdAuADR/QEAgQIECBAgAABAgQIECBA4LqAAHid2A/cEhAAb8n6XgIECBAgQIAAAQIECBAgQOAlAQHwpWsue4sAuOzgnkuAAAECBAgQIECAAAECBAh8EhAAP7H50AQBAXDCFexAgAABAgQIECBAgAABAgQITBcQAKdfyH4/BQRAfw4CBAgQIECAAAECBAgQIECAwFlAADwbmRgqIAAOPYy1CBAgQIAAAQIECBAgQIAAgVECAuCoc1gmERAAEy2zBAgQIECAAAECBAgQIECAwFYBAXDr5R94twD4wBE9gQABAgQIECBAgAABAgQIELguIABeJ/YDtwQEwFuyvpcAAQIECBAgQIAAAQIECBB4SUAAfOmay94iAC47uOcSIECAAAECBAgQIECAAAECnwQEwE9sPjRBQACccAU7ECBAgAABAgQIECBAgAABAtMFBMDpF7LfTwEB0J+DAAECBAgQIECAAAECBAgQIHAWEADPRiaGCgiAQw9jLQIECBAgQIAAAQIECBAgQGCUgAA46hyWSQQEwETLLAECBAgQIECAAAECBAgQILBVQADcevkH3i0APnBETyBAgAABAgQIECBAgAABAgSuCwiA14n9wC0BAfCWrO8lQIAAAQIECBAgQIAAAQIEXhIQAF+65rK3CIDLDu65BAgQIECAAAECBAgQIECAwCcBAfATmw9NEBAAJ1zBDgQIECBAgAABAgQIECBAgMB0AQFw+oXs91NAAPTnIECAAAECBAgQIECAAAECBAicBQTAs5GJoQIC4NDDWIsAAQIECBAgQIAAAQIECBAYJSAAjjqHZRIBATDRMkuAAAECBAgQIECAAAECBAhsFRAAt17+gXcLgA8c0RMIECBAgAABAgQIECBAgACB6wIC4HViP3BLQAC8Jet7CRAgQIAAAQIECBAgQIAAgZcEBMCXrrnsLQLgsoN7LgECBAgQIECAAAECBAgQIPBJQAD8xOZDEwQEwAlXsAMBAgQIECBAgAABAgQIECAwXUAAnH4h+/0UEAD9OQgQIECAAAECBAgQIECAAAECZwEB8GxkYqiAADj0MNYiQIAAAQIECBAgQIAAAQIERgkIgKPOYZlEQABMtMwSIECAAAECBAgQIECAAAECWwUEwK2Xf+DdAuADR/QEAgQIECBAgAABAgQIECBA4LqAAHid2A/cEhAAb8n6XgIECBAgQIAAAQIECBAgQOAlAQHwpWsue4sAuOzgnkuAAAECBAgQIECAAAECBAh8EhAAP7H50AQBAXDCFexAgAABAgQIECBAgAABAgQITBcQAKdfyH4/BQRAfw4CBAgQIECAAAECBAgQIECAwFlAADwbmRgqIAAOPYy1CBAgQIAAAQIECBAgQIAAgVECAuCoc1gmERAAEy2zBAgQIECAAAECBAgQIECAwFYBAXDr5R94twD4wBE9gQABAgQIECBAgAABAgQIELguIABeJ/YDtwQEwFuyvpcAAQIECBAgQIAAAQIECBB4SUAAfOmay94iAC47uOcSIECAAAECBAgQIECAAAECnwQEwE9sPjRBQACccAU7ECBAgAABAgQIECBAgAABAtMFBMDpF7LfTwEB0J+DAAECBAgQIECAAAECBAgQIHAWEADPRiaGCgiAQw9jLQIECBAgQIAAAQIECBAgQGCUgAA46hyWSQQEwETLLAECBAgQIECAAAECBAgQILBVQADcevkH3i0APnBETyBAgAABAgQIECBAgAABAgSuCwiA14n9wC0BAfCWrO8lQIAAAQIECBAgQIAAAQIEXhIQAF+65rK3CIDLDu65BAgQIECAAAECBAgQIECAwCcBAfATmw9NEBAAJ1zBDgQIECBAgAABAgQIECBAgMB0AQFw+oXs91NAAPTnIECAAAECBAgQIECAAAECBAicBQTAs5GJoQIC4NDDWIsAAQIECBAgQIAAAQIECBAYJSAAjjqHZRIBATDRMkuAAAECBAgQIECAAAECBAhsFRAAt17+gXcLgA8c0RMIECBAgAABAgQIECBAgACB6wIC4HViP3BLQAC8Jet7CRAgQIAAAQIECBAgQIAAgZcEBMCXrrnsLQLgsoN7LgECBAgQIECAAAECBAgQIPBJQAD8xOZDEwQEwAlXsAMBAgQIECBAgAABAgQIECAwXUAAnH4h+/0UEAD9OQgQIECAAAECBAgQIECAAAECZwEB8GxkggABAgQIECBAgAABAgQIECBAgACBMoG/sn2tS4AAAQIECBAgQIAAAQIECBAgQIBAICAABlhGCRAgQIAAAQIECBAgQIAAAQIECLQJCIBtF7MvAQIECBAgQIAAAQIECBAgQIAAgUBAAAywjBIgQIAAAQIECBAgQIAAAQIECBBoExAA2y5mXwIECBAgQIAAAQIECBAgQIAAAQKBgAAYYBklQIAAAQIECBAgQIAAAQIECBAg0CYgALZdzL4ECBAgQIAAAQIECBAgQIAAAQIEAgEBMMAySoAAAQIECBAgQIAAAQIECBAgQKBNQABsu5h9CRAgQIAAAQIE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\" width=\"640\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Saving figure cart_pole_plot\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.close() # or else nbagg sometimes plots in the previous cell\n",
|
||
"img = render_cart_pole(env, obs)\n",
|
||
"plt.imshow(img)\n",
|
||
"plt.axis(\"off\")\n",
|
||
"save_fig(\"cart_pole_plot\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(400, 600, 3)"
|
||
]
|
||
},
|
||
"execution_count": 30,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"img.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Notice that the game is over when the pole tilts too much, not when it actually falls. Now let's reset the environment and push the cart to right instead:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 31,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"obs = env.reset()\n",
|
||
"while True:\n",
|
||
" obs, reward, done, info = env.step(1)\n",
|
||
" if done:\n",
|
||
" break"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 32,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4Xuzd0bVcR3IlUMCMsYMyY+yA3Gg3IDtkRo8dMoOz0OJjs9msi3q3Misi42z96lVmxD75oXXWpfD1i/8hQIAAAQIECBAgQIAAAQIECBAgQGCswNexm1mMAAECBAgQIECAAAECBAgQIECAAIEvCkCPgAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A0QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKAC9AQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDdAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAD0BggQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgN4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQGyBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQAHoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAb4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegNECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgAvQECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA3QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAA9AYIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDeAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0BsgQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAB6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQG+AAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDRAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAL0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgN0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAPQGCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA3gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAbIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAegMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkBvgAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A0QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKAC9AQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDdAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAD0BggQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgN4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQGyBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQAHoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAb4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegNECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgAvQECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA3QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAA9AYIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDeAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0BsgQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAB6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQG+AAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDRAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAL0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgN0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAPQGCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA3gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAbIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAegMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkBvgAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A0QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKAC9AQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDdAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAD0BggQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgN4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQGyBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQAHoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAb4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegNECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgAvQECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA3QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAA9AYIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDeAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0BsgQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAB6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQG+AAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDRAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAL0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgN0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAPQGCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA3gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAbIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAegMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkBvgAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A0QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKAC9AQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDdAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAD0BkoFfv31119LB3A5AQIECBAgQIAAAQIECBAIEPj69asOKCDnRysKPzj8DqsrADukYAYCBAgQIECAAAECBAgQmC6gAJye8PV+CsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHyxogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSd7bwxeA99z8apGAAnARpGMIECBAgAABAgQIECBAgMCFgAIw+3koALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7asFFIDVCbifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YkUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5K8t4cvAO+5+dUiAQXgIkjHECBAgAABAgQIECBAgACBCwEFYPbzUABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdtXCygAqxNwPwECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sWKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW8PXwDec/OrRQIKwEWQjiFAgAABAgQIECBAgAABAhcCCsDs56EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIVwVw9vq2rxZQAFYn4H4CBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSLFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLeHr4AvOfmV4sEFICLIB1DgAABAgQIECBAgAABAgQuBBSA2c9DAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkK8K4Oz1bV8toACsTsD9BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkvT18AXjPza8WCSgAF0E6hgABAgQIECBAgAABAgQIXAgoALOfhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfFcDZ69u+WkABWJ2A+wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXt7+ALwnptfLRJQAC6CdAwBAgQIECBAgAABAgQIELgQUABmPw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCviqAs9e3fbWAArA6AfcTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpL39vAF4D03v1okoABcBOkYAgQIECBAgAABAgQIECBwIaAAzH4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxVAGevb/tqAQVgdQLuJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCvlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQk7+3hC8B7bn61SEABuAjSMQQIECBAgAABAgQIECBA4EJAAZj9PBSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qgDOXt/21QIKwOoE3E+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHyxogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSd7bwxeA99z8apGAAnARpGMIECBAgAABAgQIECBAgMCFgAIw+3koALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7asFFIDVCbifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YkUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5K8t4cvAO+5+dUiAQXgIkjHECBAgAABAgQIECBAgACBCwEFYPbzUABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdtXCygAqxNwPwECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sWKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW8PXwDec/OrRQIKwEWQjiFAgAABAgQIECBAgAABAhcCCsDs56EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIVwVw9vq2rxZQAFYn4H4CBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSLFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLeHr4AvOfmV4sEFICLIB1DgAABAgQIECBAgAABAgQuBBSA2c9DAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkK8K4Oz1bV8toACsTsD9BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkvT18AXjPza8WCSgAF0E6hgABAgQIECBAgAABAgQIXAgoALOfhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfFcDZ69u+WkABWJ2A+wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXt7+ALwnptfLRJQAC6CdAwBAgQIECBAgAABAgQIELgQUABmPw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCviqAs9e3fbWAArA6AfcTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpL39vAF4D03v1okoABcBOkYAgQIECBAgAABAgQIECBwIaAAzH4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxVAGevb/tqAQVgdQLuJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCvlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQk7+3hC8B7bn61SEABuAjSMQQIECBAgAABAgQIECBA4EJAAZj9PBSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qgDOXt/21QIKwOoE3E+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHyxogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSd7bwxeA99z8apGAAnARpGMIECBAgAABAgQIECBAgMCFgAIw+3koALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7asFFIDVCbifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YkUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5K8t4cvAO+5+dUiAQXgIkjHECBAgAABAgQIECBAgACBCwEFYPbzUABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdtXCygAqxNwPwECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sWKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW8PXwDec/OrRQIKwEWQjiFAgAABAgQIECBAgAABAhcCCsDs56EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIVwVw9vq2rxZQAFYn4H4CBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSLFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLeHr4AvOfmV4sEFICLIB1DgAABAgQIECBAgAABAgQuBBSA2c9DAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkK8K4Oz1bV8toACsTsD9BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkvT18AXjPza8WCSgAF0E6hgABAgQIECBAgAABAgQIXAgoALOfhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfFcDZ69u+WkABWJ2A+wkQIECAAAECBAgQIEAgQWExmqUAACAASURBVEABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXt7+ALwnptfLRJQAC6CdAwBAgQIECBAgAABAgQIELgQUABmPw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCviqAs9e3fbWAArA6AfcTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpL39vAF4D03v1okoABcBOkYAgQIECBAgAABAgQIECBwIaAAzH4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxVAGevb/tqAQVgdQLuJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCvlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQk7+3hC8B7bn61SEABuAjSMQQIECBAgAABAgQIECBA4EJAAZj9PBSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qgDOXt/21QIKwOoE3E+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHyxogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSd7bwxeA99z8apGAAnARpGMIECBAgAABAgQIECBAgMCFgAIw+3koALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7asFFIDVCbifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YkUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5K8t4cvAO+5+dUiAQXgIkjHECBAgAABAgQIECBAgACBCwEFYPbzUABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdtXCygAqxNwPwECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sWKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW8PXwDec/OrRQIKwEWQjiFAgAABAgQIECBAgAABAhcCCsDs56EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIVwVw9vq2rxZQAFYn4H4CBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSLFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLeHr4AvOfmV4sEFICLIB1DgAABAgQIECBAgAABAgQuBBSA2c9DAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkK8K4Oz1bV8toACsTsD9BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkvT18AXjPza8WCSgAF0E6hgABAgQIECBAgAABAgQIXAgoALOfhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfFcDZ69u+WkABWJ2A+wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXt7+ALwnptfLRJQAC6CdAwBAgQIECBAgAABAgQIELgQUABmPw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCviqAs9e3fbWAArA6AfcTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpL39vAF4D03v1okoABcBOkYAgQIECBAgAABAgQIECBwIaAAzH4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxVAGevb/tqAQVgdQLuJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCvlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQk7+3hC8B7bn61SEABuAjSMQQIECBAgAABAgQIECBA4EJAAZj9PBSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qgDOXt/21QIKwOoE3E+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHyxogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSd7bwxeA99z8apGAAnARpGMIECBAgAABAgQIECBAgMCFgAIw+3koALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7asFFIDVCbifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YkUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5K8t4cvAO+5+dUiAQXgIkjHECBAgAABAgQIECBAgACBCwEFYPbzUABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdtXCygAqxNwPwECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sWKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW8PXwDec/OrRQIKwEWQjiFAgAABAgQIECBAgAABAhcCCsDs56EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIVwVw9vq2rxZQAFYn4H4CBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSLFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLeHr4AvOfmV4sEFICLIB1DgAABAgQIECBAgAABAgQuBBSA2c9DAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkK8K4Oz1bV8toACsTsD9BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkvT18AXjPza8WCSgAF0E6hgABAgQIECBAgAABAgQIXAgoALOfhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfFcDZ69u+WkABWJ2A+wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXt7+ALwnptfLRJQAC6CdAwBAgQIECBAgAABAgQIELgQUABmPw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCviqAs9e3fbWAArA6AfcTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpL39vAF4D03v1okoABcBOkYAgQIECBAgAABAgQIECBwIaAAzH4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxVAGevb/tqAQVgdQLuJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCvlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQk7+3hC8B7bn61SEABuAjSMQQIECBAgAABAgQIECBA4EJAAZj9PBSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qgDOXt/21QIKwOoE3E+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHyxogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSd7bwxeA99z8apGAAnARpGMIECBAgAABAgQIECBAgMCFgAIw+3koALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7asFFIDVCbifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YkUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5K8t4cvAO+5+dUiAQXgIkjHECBAgAABAgQIECBAgACBCwEFYPbzUABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdtXCygAqxNwPwECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sWKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW8PXwDec/OrRQIKwEWQjiFAgAABAgQIECBAgAABAhcCCsDs56EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIVwVw9vq2rxZQAFYn4H4CBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSLFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLeHr4AvOfmV4sEFICLIB1DgAABAgQIECBAgAABAgQuBBSA2c9DAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkK8K4Oz1bV8toACsTsD9BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkvT18AXjPza8WCSgAF0E6hgABAgQIECBAgAABAgQIXAgoALOfhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfFcDZ69u+WkABWJ2A+wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXt7+ALwnptfLRJQAC6CdAwBAgQIECBAgAABAgQIELgQUABmPw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCviqAs9e3fbWAArA6AfcTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpL39vAF4D03v1okoABcBOkYAgQIECBAgAABAgQIECBwIaAAzH4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxVAGevb/tqAQVgdQLuJ0CAAAECBAgQIECAAIEE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AegNECBAgAABAgQIECBAgACB/QIKwP3GnW9QAHZOJ2A2BWBAyFYkQIAAAQIECBAgQIAAgXIBBWB5BKUDKABL+V2uAPQGCBAgQIAAAQIECBAgQIDAfgEF4H7jzjcoADunEzCbAjAgZCsSIECAAAECBAgQIECAQLmAArA8gtIBFICl/C5XAHoDBAgQIECAAAECBAgQIEBgv4ACcL9x5xsUgJ3TCZhNARgQshUJECBAgAABAgQIECBAoFxAAVgeQekACsBSfpcrAL0BAgQIECBAgAABAgQIECCwX0ABuN+48w0KwM7pBMymAAwI2YoECBAgQIAAAQIECBAgUC6gACyPoHQABWApv8sVgN4AAQIECBAgQIAAAQIECBDYL6AA3G/c+QYFYOd0AmZTAAaEbEUCBAgQIECAAAECBAgQKBdQAJZHUDqAArCU3+UKQG+AAAECBAgQIECAAAECBAjsF1AA7jfufIMCsHM6AbMpAANCtiIBAgQIECBAgAABAgQIlAsoAMsjKB1AAVjK73IFoDdAgAABAgQIECBAgAABAgT2CygA9xt3vkEB2DmdgNkUgAEhW5EAAQIECBAgQIAAAQIEygUUgOURlA6gACzld7kC0BsgQIAAAQIECBAgQIAAAQL7BRSA+40736AA7JxOwGwKwICQrUiAAAECBAgQIECAAAEC5QIKwPIISgdQAJbyu1wB6A0QIECAAAECBAgQIECAAIH9AgrA/cadb1AAdk4nYDYFYEDIViRAgAABAgQIECBAgACBcgEFYHkEpQMoAEv5Xa4A9AYIECBAgAABAgQIECBAgMB+AQXgfuPONygAO6cTMJsCMCBkKxIgQIAAAQIECBAgQIBAuYACsDyC0gEUgKX8LlcAegMECBAgQIAAAQIECBAgQGC/gAJwv3HnGxSAndMJmE0BGBCyFQkQIECAAAECBAgQIECgXEABWB5B6QAKwFJ+lysAvQECBAgQIECAAAECBAgQILBfQAG437jzDQrAzukEzKYADAjZigQIECBAgAABAgQIECBQLqAALI+gdAAFYCm/yxWA3gABAgQIECBAgAABAgQIENgvoADcb9z5BgVg53QCZlMABoRsRQIECBAgQIAAAQIECBAoF1AAlkdQOoACsJTf5QpAb4AAAQIECBAgQIAAAQIECOwXUADuN+58gwKwczoBsykAA0K2IgECBAgQ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DSdAgAABAgQIECBAgAABAgQIECCwFRAAt75eJ0CAAAECBAgQIECAAAECBAgQIJAKCIApv+EECBAgQIAAAQIECBAgQIAAAQIEtgIC4NbX6wQIECBAgAABAgQIECBAgAABAgRSAQEw5TecAAECBAgQIECAAAECBAgQIECAwFZAANz6ep0AAQIECBAgQIAAAQIECBAgQIBAKiAApvyGEyBAgAABAgQIECBAgAABAgQIENgKCIBbX68TIECAAAECBAgQIECAAAECBAgQSAUEwJTfcAIECBAgQIAAAQIECBAgQIAAAQJbAQFw6+t1AgQIECBAgAABAgQIECBAgAABAqmAAJjyG06AAAECBAgQIECAAAECBAgQIEBgKyAAbn29ToAAAQIECBAgQIAAAQIECBAgQCAVEABTfsMJECBAgAABAgQIECBAgAABAgQIbAUEwK2v1wkQIECAAAECBAgQIECAAAECBAikAgJgym84AQIECBAgQIAAAQIECBAgQIAAga2AALj19ToBAgQIECBAgAABAgQIECBAgACBVEAATPkNJ0CAAAECBAgQIECAAAECBAgQILAVEAC3vl4nQIAAAQIECBAgQIAAAQIECBAgkAoIgCm/4QQIECBAgAABAgQIECBAgAABAgS2AgLg1tfrBAgQIECAAAECBAgQIECAAAECBFIBATDlN5wAAQIECBAgQIAAAQIECBAgQIDAVkAA3Pp6nQABAgQIECBAgAABAgQIECBAgEAqIACm/IYTIECAAAECBAgQIECAAAECBAgQ2AoIgFtfrxMgQIAAAQIECBAgQIAAAQIECBBIBQTAlN9wAgQIECBAgAABAgQIECBAgAABAlsBAXDr63UCBAgQIECAAAECBAgQIECAAAECqYAAmPIbToAAAQIECBAgQIAAAQIECBAgQGArIABufb1OgAABAgQIECBAgAABAgQIECBAIBUQAFN+wwkQIECAAAECBAgQIECAAAECBAhsBQTAra/XCRAgQIAAAQIECBAgQIAAAQIECKQCAmDKbzgBAgQIECBAgAABAgQIECBAgACBrYAAuPX1OgECBAgQIECAAAECBAgQIECAAIFUQABM+Q0nQIAAAQIECBAgQIAAAQIECBAgsBUQALe+XidAgAABAgQIECBAgAABAgQIECCQCgiAKb/hBAgQIECAAAECBAgQIECAAAECBLYCAuDW1+sECBAgQIAAAQIECBAgQIAAAQIEUgEBMOU3nAABAgQIECBAgAABAgQIECBAgMBWQADc+nqdAAECBAgQIECAAAECBAgQIECAQCogAKb8hhMgQIAAAQIECBAgQIAAAQIECBDYCgiAW1+vEyBAgAABAgQIECBAgAABAgQIEEgFBMCU33ACBAgQIECAAAECBAgQIECAAAECWwEBcOvrdQIECBAgQIAAAQIECBAgQIAAAQKpgACY8htOgAABAgQIECBAgAABAgQIECBAYCsgAG59vU6AAAECBAgQIECAAAECBAgQIEAgFRAAU37DCRAgQIAAAQIECBAgQIAAAQIECGwFBMCtr9cJECBAgAABAgQIECBAgAABAgQIpAICYMpvOAECBAgQIECAAAECBAgQIECAAIGtgAC49fU6AQIECBAgQIAAAQIECBAgQIAAgVRAAEz5DSdAgAABAgQIECBAgAABAgQIECCwFRAAt75eJ0CAAAECBAgQIECAAAECBAgQIJAKCIApv+EECBAgQIAAAQIECBAgQIAAAQIEtgIC4NbX6wQIECBAgAABAgQIECBAgAABAgRSAQEw5TecAAECBAgQIECAAAECBAgQIECAwFZAANz6ep0AAQIECBAgQIAAAQIECBAgQIBAKiAApvyGEyBAgAABAgQIECBAgAABAgQIENgKCIBbX68TIECAAAECBAgQIECAAAECBAgQSAUEwJTfcAIECBAgQIAAAQIECBAgQIAAAQJbAQFw6+t1AgQIECBAgAABAgQIECBAgAABAqmAAJjyG06AAAECBAgQIECAAAECBAgQIEBgKyAAbn29ToAAAQIECBAgQIAAAQIECBAgQCAVEABTfsMJECBAgAABAgQIECBAgAABAgQIbAUEwK2v1wkQIECAAAECBAgQIECAAAECBAikAgJgym84AQIECBAgQIAAAQIECBAgQIAAga2AALj19ToBAgQIECBAgAABAgQIECBAgACBVEAATPkNJ0CAAAECBAgQIECAAAECBAgQILAVEAC3vl4nQIAAAQIECBAgQIAAAQIECBAgkAoIgCm/4QQIECBAgAABAgQIECBAgAABAgS2AgLg1tfrBAgQIECAAAECBAgQIECAAAECBFIBATDlN5wAAQIECBAgQIAAAQIECBAgQIDAVkAA3Pp6nQABAgQIECBAgAABAgQIECBAgEAqIACm/IYTIECAAAECBAgQIECAAAECBAgQ2AoIgFtfrxMgQIAAAQIECBAgQIAAAQIECBBIBQTAlN9wAgQIECBAgAABAgQIECBAgAABAlsBAXDr63UCBAgQIECAAAECBAgQIECAAAECqYAAmPIbToAAAQIECBAgQIAAAQIECBAgQGArIABufb1OgAABAgQIECBAgAABAgQIECBAIBUQAFN+wwkQIECAAAECBAgQIECAAAECBAhsBQTAra/XCRAgQIAAAQIECBAgQIAAAQIECKQCAmDKbzgBAgQIECBAgAABAgQIECBAgACBrYAAuPX1OgECBAgQIECAAAECBAgQIECAAIFUQABM+Q0nQIAAAQIECBAgQIAAAQIECBAgsBUQALe+XidAgAABAgQIECBAgAABAgQIECCQCgiAKb/hBAgQIECAAAECBAgQIECAAAECBLYCAuDW1+sECBAgQIAAAQIECBAgQIAAAQIEUgEBMOU3nAABAgQIECBAgAABAgQIECBAgMBWQADc+nqdAAECBAgQIECAAAECBAgQIECAQCogAKb8hhMgQIAAAQIECBAgQIAAAQIECBDYCgiAW1+vEyBAgAABAgQIECBAgAABAgQIEEgFBMCU33ACBAgQIECAAAECBAgQIECAAAECWwEBcOvrdQIECBAgQIAAAQIECBAgQIAAAQKpgACY8htOgAABAgQIECBAgAABAgQIECBAYCsgAG59vU6AAAECBAgQIECAAAECBAgQIEAgFRAAU37DCRAgQIAAAQIECBAgQIAAAQIECGwFBMCtr9cJECBAgAABAgQIECBAgAABAgQIpAICYMpvOAECBAgQIECAAAECBAgQIECAAIGtgAC49fU6AQIECBAgQIAAAQIECBAgQIAAgVRAAEz5DSdAgAABAgQIECBAgAABAgQIECCwFRAAt75eJ0CAAAECBAgQIECAAAECBAgQIJAKCIApv+EECBAgQIAAAQIECBAgQIAAAQIEtgIC4NbX6wQIECBAgAABAgQIECBAgAABAgRSAQEw5TecAAECBAgQIECAAAECBAgQIECAwFZAANz6ep0AAQIECBAgQIAAAQIECBAgQIBAKiAApvyGEyBAgAABAgQIECBAgAABAgQIENgKCIBbX68TIECAAAECBAgQIECAAAECBAgQSAUEwJTfcAIECBAgQIAAAQIECBAgQIAAAQJbAQFw6+t1AgQIECBAgAABAgQIECBAgAABAqmAAJjyG06AAAECBAgQIECAAAECBAgQIEBgKyAAbn29ToAAAQIECBAgQIAAAQIECBAgQCAVEABTfsMJECBAgAABAgQIECBAgAABAgQIbAUEwK2v1wkQIECAAAECBAgQIECAAAECBAikAgJgym84AQIECBAgQIAAAQIECBAgQIAAga2AALj19ToBAgQIECBAgAABAgQIECBAgACBVEAATPkNJ0CAAAECBAgQIECAAAECBAgQILAVEAC3vl4nQIAAAQIECBAgQIAAAQIECBAgkAoIgCm/4QQIECBAgAABAgQIECBAgAABAgS2AgLg1tfrBAgQIECAAAECBAgQIECAAAECBFIBATDlN5wAAQIECBAgQIAAAQIECBAgQIDAVkAA3Pp6nQABAgQIECBAgAABAgQIECBAgEAqIACm/IYTIECAAAECBAgQIECAAAECBAgQ2AoIgFtfrxMgQIAAAQIECBAgQIAAAQIECBBIBQTAlN9wAgQIECBAgAABAgQIECBAgAABAlsBAXDr63UCBAgQIECAAAECBAgQIECAAAECqYAAmPIbToAAAQIECBAgQIAAAQIECBAgQGArIABufb1OgAABAgQIECBAgAABAgQIECBAIBUQAFN+wwkQIECAAAECBAgQIECAAAECBAhsBQTAra/XCRAgQIAAAQIECBAgQIAAAQIECKQCAmDKbzgBAgQIECBAgAABAgQIECBAgACBrYAAuPX1OgECBAgQIECAAAECBAgQIECAAIFUQABM+Q0nQIAAAQIECBAgQIAAAQIECBAgsBUQALe+XidAgAABAgQIECBAgAABAgQIECCQCgiAKb/hBAgQIECAAAECBAgQIECAAAECBLYCAuDW1+sECBAgQIAAAQIECBAgQIAAAQIEUgEBMOU3nAABAgQIECBAgAABAgQIECBAgMBWQADc+nqdAAECBAgQIECAAAECBAgQIECAQCogAKb8hhMgQIAAAQIECBAgQIAAAQIECBDYCgiAW1+vEyBAgAABAgQIECBAgAABAgQIEEgFBMCU33ACBAgQIECAAAECBAgQIECAAAECWwEBcOvrdQIECBAgQIAAAQIECBAgQIAAAQKpgACY8htOgAABAgQIECBAgAABAgQIECBAYCsgAG59vU6AAAECBAgQIECAAAECBAgQIEAgFRAAU37DCRAgQIAAAQIECBAgQIAAAQIECGwFHgcdbIRrevbdAAAAAElFTkSuQmCC\" width=\"640\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_cart_pole(env, obs)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Looks like it's doing what we're telling it to do. Now how can we make the poll remain upright? We will need to define a _policy_ for that. This is the strategy that the agent will use to select an action at each step. It can use all the past actions and observations to decide what to do."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# A simple hard-coded policy"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's hard code a simple strategy: if the pole is tilting to the left, then push the cart to the left, and _vice versa_. Let's see if that works:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 33,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"frames = []\n",
|
||
"\n",
|
||
"n_max_steps = 1000\n",
|
||
"n_change_steps = 10\n",
|
||
"\n",
|
||
"obs = env.reset()\n",
|
||
"for step in range(n_max_steps):\n",
|
||
" img = render_cart_pole(env, obs)\n",
|
||
" frames.append(img)\n",
|
||
"\n",
|
||
" # hard-coded policy\n",
|
||
" position, velocity, angle, angular_velocity = obs\n",
|
||
" if angle < 0:\n",
|
||
" action = 0\n",
|
||
" else:\n",
|
||
" action = 1\n",
|
||
"\n",
|
||
" obs, reward, done, info = env.step(action)\n",
|
||
" if done:\n",
|
||
" break"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 34,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4Xuzd4bEcyXEtYKwZzw7IjGcH5AbdgOyQGXp2yIx9AVKglruYvrd6aiYr83z8x9jp6szvFCMYJxqL3774DwECBAgQIECAAAECBAgQIECAAAECYwV+G7uZxQgQIECAAAECBAgQIECAAAECBAgQ+KIAdAkIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHegVOD333//vXQALydAgAABAgQIECBAgAABAgECv/32mw4oIOdHKwo/OPwTVlcAnpCCGQgQIECAAAECBAgQIEBguoACcHrC1/spALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sWKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA755O0VgCenYzYCBAgQIECAAAECBAgQmCKgAJyS5L09fAF4z81TmwQUgJsgHUOAAAECBAgQIECAAAECBC4EFIDZ10MBmJ1/+fYKwPIIDECAAAECBAgQIECAAAECAQIKwICQrwrg7PVtXy2gAKxOwPsJECBAgAABAgQIECBAIEFAAZiQ8uMdfQGYnX/59grA8ggMQIAAAQIECBAgQIAAAQIBAgrAgJAvVlQAZudfvr0CsDwCAxAgQIAAAQIECBAgQIBAgIACMCBkBWB2yCdvrwA8OR2zESBAgAABAgQIECBAgMAUAQXglCTv7eELwHtuntokoADcBOkYAgQIECBAgAABAgQIECBwIaAAzL4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxVAGevb/tqAQVgdQLeT4AAAQIECBAgQIAAAQIJAgrAhJQf7+gLwOz8y7dXAJZHYAACBAgQIECAAAECBAgQCBBQAAaEfLGiAjA7//LtFYDlERiAAAECBAgQIECAAAECBAIEFIABISsAs0M+eXsF4MnpmI0AAQIECBAgQIAAAQIEpggoAKckeW8PXwDec/PUJgEF4CZIxxAgQIAAAQIECBAgQIAAgQsBBWD29VAAZudfvr0CsDwCAxAgQIAAAQIECBAgQIBAgIACMCDkqwI4e33bVwsoAKsT8H4CBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSLFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgd8snbKwBPTsdsBAgQIECAAAECBAgQIDBFQAE4Jcl7e/gC8J6bpzYJKAA3QTqGAAECBAgQIECAAAECBAhcCCgAs6+HAjA7//LtFYDlERiAAAECBAgQIECAAAECBAIEFIABIV8VwNnr275aQAFYnYD3EyBAgAABAgQIECBAgECCgAIwIeXHO/oCMDv/8u0VgOURGIAAAQIECBAgQIAAAQIEAgQUgAEhX6yoAMzOv3x7BWB5BAYgQIAAAQIECBAgQIAAgQABBWBAyArA7JBP3l4BeHI6ZiNAgAABAgQIECBAgACBKQIKwClJ3tvDF4D33Dy1SUABuAnSMQQIECBAgAABAgQIECBA4EJAAZh9PRSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qgDOXt/21QIKwOoEvJ8AAQIECBAgQIAAAQIEEgQUgAkpP97RF4DZ+ZdvrwAsj8AABAgQIECAAAECBAgQIBAgoAAMCPliRQVgdv7l2ysAyyMwAAECBAgQIECAAAECBAgECCgAA0JWAGaHfPL2CsCT0zEbAQIECBAgQIAAAQIECEwRUABOSfLeHr4AvOfmqU0CCsBNkI4hQIAAAQIECBAgQIAAAQIXAgrA7OuhAMzOv3x7BWB5BAYgQIAAAQIECBAgQIAAgQABBWBAyFcFcPb6tq8WUABWJ+D9BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+STt1cAnpyO2QgQIECAAAECBAgQIEBgioACcEqS9/bwBeA9N09tElAAboJ0DAECBAgQIECAAAECBAgQuBBQAGZfDwVgdv7l2ysAyyMwAAECBAgQIECAAAECBAgECCgAA0K+KoCz17d9tYACsDoB7ydAgAABAgQIECBAgACBBAEFYELKj3f0BWB2/uXbKwDLIzAAAQIECBAgQIAAAQIECAQIKAADQr5YUQGYnX/59grA8ggMQIAAAQIECBAgQIAAAQIBAgrAgJAVgNkhn7y9AvDkdMxGgAABAgQIECBAgAABAlMEFIBTkry3hy8A77l5apOAAnATpGMIECBAgAABAgQIECBAgMCFgAIw+3ooALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7asFFIDVCXg/AQIECBAgQIAAAQIECCQIKAATUn68oy8As/Mv314BWB6BAQgQIECAAAECBAgQIEAgQEABGBDyxYoKwOz8y7dXAJZHYAACBAgQIECAAAECBAgQCBBQAAaErADMDvnk7RWAJ6djNgIECBAgQIAAAQIECBCYIqAAnJLkvT18AXjPzVObBBSAmyAdQ4AAAQIECBAgQIAAAQIELgQUgNnXQwGYnX/59grA8ggMQIAAAQIECBAgQIAAAQIBAgrAgJCvCuDs9W1fLaAArE7A+wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbIJ2+vADw5HbMRIECAAAECBAgQIECAwBQBBeCUJO/t4QvAe26e2iSgANwE6RgCBAgQIECAAAECBAgQIHAhoADMvh4KwOz8y7dXAJZHYAACBAgQIECAAAECBAgQCBBQAAaEfFUAZ69v+2oBBWB1At5PgAABAgQIECBAgAABAgkCCsCElB/v6AvA7PzLt1cAlkdgAAIECBAgQIAAAQIECBAIEFAABoR8saICMDv/8u0VgOURGIAAAQIECBAgQIAAAQIEAgQUgAEhKwCzQz55ewXgyemYjQABAgQIECBAgAABAgSmCCgApyR5bw9fAN5z89QmAQXgJkjHECBAgAABAgQIECBAgACBCwEFYPb1UABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdtXCygAqxPwfgIECBAgQIAAAQIECBBIEFAAJqT8eEdfAGbnX769ArA8AgMQIECAAAECBAgQIECAQICAAjAg5IsVFYDZ+ZdvrwAsj8AABAgQIECAAAECBAgQIBAgoAAMCFkBmB3yydsrAE9O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BAgQIBAgoAAMCPliRQVgdv7l2ysAyyMwAAECBAgQIECAAAECBAgECCgAA0JWAGaHfPL2CsCT0zEbAQIECBAgQIAAAQIECEwRUABOSfLeHr4AvOfmqU0CCsBNkI4hQIAAAQIECBAgQIAAAQIXAgrA7OuhAMzOv3x7BWB5BAYgQIAAAQIECBAgQIAAgQABBWBAyFcFcPb6tq8WUABWJ+D9BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIFysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+STt1cAnpyO2QgQIECAAAECBAgQIEBgioACcEqS9/bwBeA9N09tElAAboJ0DAECBAgQIECAAAECBAgQuBBQAGZfDwVgdv7l2ysAyyMwAAECBAgQIECAAAECBAgECCgAA0K+KoCz17d9tYACsDoB7ydAgAABAgQIECBAgACBBAEFYELKj3f0BWB2/uXbKwDLIzAAAQIECBAgQIAAAQIECAQIKAADQr5YUQGYnX/59grA8ggMQIAAAQIECBAgQIAAAQIBAgrAgJAVgNkhn7y9AvDkdMxGgAABAgQIECBAgAABAlMEFIBTkry3hy8A77l5apOAAnATpGMIECBAgAABAgQIECBAgMCFgAIw+3ooALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lUBnL2+7asFFIDVCXg/AQIECBAgQIAAAQIECCQIKAATUn68oy8As/Mv314BWB6BAQgQIECAAAECBAgQIEAgQEABGBDyxYoKwOz8y7dXAJZHYAACBAgQIECAAAECBAgQCBBQAAaErADMDvnk7RWAJ6djNgIECBAgQIAAAQIECBCYIqAAnJLkvT18AXjPzVObBBSAmyAdQ4AAAQIECBAgQIAAAQIELgQUgNnXQwGYnX/59grA8ggMQIAAAQIECBAgQIAAAQIBAgrAgJCvCuDs9W1fLaAArE7A+wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkC9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbIJ2+vADw5HbMRIECAAAECBAgQIECAwBQBBeCUJO/t4QvAe26e2iSgANwE6RgCBAgQIECAAAECBAgQIHAhoADMvh4KwOz8y7dXAJZHYAACBAgQIECAAAECBAgQCBBQAAaEfFUAZ69v+2oBBWB1At5PgAABAgQIECBAgAABAgkCCsCElB/v6AvA7PzLt1cAlkdgAAIECBAgQIAAAQIECBAIEFAABoR8saICMDv/8u0VgOURGIAAAQIECBAgQIAAAQIEAgQUgAEhKwCzQz55ewXgyemYjQABAgQIECBAgAABAgSmCCgApyR5bw9fAN5z89QmAQXgJkjHECBAgAABAgQIECBAgACBCwEFYPb1UABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSrAjh7fdtXCygAqxPwfgIECBAgQIAAAQIECBBIEFAAJqT8eEdfAGbnX769ArA8AgMQIECAAAECBAgQIECAQICAAjAg5IsVFYDZ+ZdvrwAsj8AABAgQIECAAAECBAgQIBAgoAAMCFkBmB3yydsrAE9Ox2wECBAgQIAAAQIECBAgMEVAATglyXt7+ALwnpunNgkoADdBOoYAAQIECBAgQIAAAQIECFwIKACzr4cCMDv/8u0VgOURGIAAAQIECBAgQIAAAQIEAgQUgAEhXxXA2evbvlpAAVidgPcTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskE/eXgF4cjpmI0CAAAECBAgQIECAAIEpAgrAKUne28MXgPfcPLVJQAG4CdIxBAgQIECAAAECBAgQIEDgQkABmH09FIDZ+ZdvrwAsj8AABAgQIECAAAECBAgQIBAgoAAMCPmqAM5e3/bVAgrA6gS8nwABAgQIECBAgAABAgQSBBSACSk/3tEXgNn5l2+vACyPwAAECBAgQIAAAQIECBAgECCgAAwI+WJFBWB2/uXbKwDLIzAAAQIECBAgQIAAAQIECAQIKAADQlYAZod88vYKwJPTMRsBAgQIECBAgAABAgQITBFQAE5J8t4evgC85+apTQIKwE2QjiFAgAABAgQIECBAgAABAhcCCsDs66EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIVwVw9vq2rxZQAFYn4P0ECBAgQIAAAQIECBAgkCCgAExI+fGOvgDMzr98ewVgeQQGIECAAAECBAgQIECAAIEAAQVgQMgXKyoAs/Mv314BWB6BAQgQIECAAAECBAgQIEAgQEABGBCyAjA75JO3VwCenI7ZCBAgQIAAAQIECBAgQGCKgAJwSpL39vAF4D03T20SUABugnQMAQIECBAgQIAAAQIECBC4EFAAZl8PBWB2/uXbKwDLIzAAAQIECBAgQIAAAQIECAQIKAADQr4qgLPXt321gAKwOgHvJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCvlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SGfvL0C8OR0zEaAAAECBAgQIECAAAECUwQUgFOSvLeHLwDvuXlqk4ACcBOkYwgQIECAAAECBAgQIECAwIWAAjD7eigAs/Mv314BWB6BAQgQIECAAAECBAgQIEAgQEABGBDyVQGcvb7tqwUUgNUJeD8BAgQIECBAgAABAgQIJAgoABNSfryjLwCz8y/fXgFYHoEBCBAgQIAAAQIECBAgQCBAQAEYEPLFigrA7PzLt1cAlkdgAAIECBAgQIAAAQIECBAIEFAABoSsAMwO+eTtFYAnp2M2AgQIECBAgAABAgQIEJgioACckuS9PXwBeM/NU5sEFICbIB1DgAABAgQIECBAgAABAgQuBBSA2ddDAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkK8K4Oz1bV8toACsTsD7CRAgQIAAAQIECBAgQCBBQAGYkPLjHX0BmJ1/+fYKwPIIDECAAAECBAgQIECAAAECAQIKwICQL1ZUAGbnX769ArA8AgMQIECAAAECBAgQIECAQICAAjAgZAVgdsgnb68APDkdsxEgQIAAAQIECBAgQIDAFAEF4JQk7+3hC8B7bp7aJKAA3ATpGAIECBAgQIAAAQIECBAgcCGgAMy+HgrA7PzLt1cAlkdgAAIECBAgQIAAAQIECBAIEFAABoR8VQBnr2/7agEFYHUC3k+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHyxogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALNDPnl7BeDJ6ZiNAAECBAgQIECAAAECBKYIKACnJHlvD18A3nPz1CYBBeAmSMcQIECAAAECBAgQIECAAIELAQVg9vVQAGbnX769ArA8AgMQIECAAAECBAgQIECAQICAAjAg5KsCOHt921cLKACrE/B+AgQIECBAgAABAgQIEEgQUAAmpPx4R18AZudfvr0CsDwCAxAgQIAAAQIECBAgQIBAgIACMCDkixUVgNn5l2+vACyPwAAECBAgQIAAAQIECBAgECCgAAwIWQGYHfLJ2ysAT07HbAQIECBAgAABAgQIECAwRUABOCXJe3v4AvCem6c2CSgAN0E6hgABAgQIECBAgAABAgQIXAgoALOvhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASFfFcDZ69u+WkABWJ2A9xMgQIAAAQIECBAgQIBAgoACMCHlxzv6AjA7//LtFYDlERiAAAECBAgQIECAAAECBAIEFIABIV+sqADMzr98ewVgeQQGIECAAAECBAgQIECAAIEAAQVgQMgKwOyQT95eAXhyOmYjQIAAAQIECBAgQIAAgSkCCsApSd7bwxeA99w8tUlAAbgJ0jEECBAgQIAAAQIECBAgQOBCQAGYfT0UgNn5l2+vACyPwAAECBAgQIAAAQIECBAgECCgAAwI+aoAzl7f9tUCCsDqBLyfAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YkUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh3zy9grAk9MxGwECBAgQIECAAAECBAhMEVAATkny3h6+ALzn5qlNAgrATZCOIUCAAAECBAgQIECAAAECFwIKwOzroQDMzr98ewVgeQQGIECAAAECBAgQIECAAIEAAQVgQMhXBXD2+ravFlAAVifg/QQIECBAgAABAgQIECCQIKAATEj58Y6+AMzOv3x7BWB5BAYgQIAAAQIECBAgQIAAgQABBWBAyBcrKgCz8y/fXgFYHoEBCBAgQIAAAQIECBAgQCBAQAEYELICMDvkk7dXAJ6cjtkIECBAgAABAgQIECBAYIqAAnBKkvf28AXgPTdPbRJQAG6CdAwBAgQIECBAgAABAgQIELgQUABmXw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCviqAs9e3fbWAArA6Ae8n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IECAAAECBAgQIECAAIF1AQXgutmkJxSAk9JsuIsCsGFoRiZAgAABAgQIECBAgACBdgIKwHaRbR1YAbiV02GrAgrAVTG/J0CAAAECBAgQIECAAAEC6wIKwHWzSU8oACel2XAXBWDD0IxMgAABAgQIECBAgAABAu0EFIDtIts6sAJwK6fDVgUUgKtifk+AAAECBAgQIECAAAECBNYFFIDrZpOeUABOSrPhLgrAhqEZmQABAgQIECBAgAABAgTaCSgA20W2dWAF4FZOh60KKABXxfyeAAECBAgQIECAAAECBAisCygA180mPaEAnJRmw10UgA1DMzIBAgQIECBAgAABAgQItBNQALaLbOvACsCtnA5bFVAAror5PQECBAgQIECAAAECBAgQWBdQAK6bTXpCATgpzYa7KAAbhmZkAgQIECBAgAABAgQIEGgnoABsF9nWgRWAWzkdtiqgAFwV83sCBAgQIECAAAECBAgQILAuoABcN5v0hAJwUpoNd1EANgzNyAQIECBAgAABAgQIECDQTkAB2C6yrQMrALdyOmxVQAG4Kub3BAgQIECAAAECBAgQIEBgXUABuG426QkF4KQ0G+6iAGwYmpEJECBAgAABAgQIECBAoJ2AArBdZFsHVgBu5XTYqoACcFXM7wkQIECAAAECBAgQIECAwLqAAnDdbNITCsBJaTbcRQHYMDQjEyBAgAABAgQIECBAgEA7AQVgu8i2DqwA3MrpsFUBBeCqmN8TIECAAAECBAgQIECAAIF1AQXgutmkJxSAk9JsuIsCsGFoRiZAgAABAgQIECBAgACBdgIKwHaRbR1YAbiV02GrAgrAVTG/J0CAAAECBAgQIECAAAEC6wIKwHWzSU8oACel2XAXBWDD0IxMgAABAgQIECBAgAABAu0EFIDtIts6sAJwK6fDVgUUgKtifk+AAAECBAgQIECAAAECBNYFFIDrZpOeUABOSrPhLgrAhqEZmQABAgQIECBAgAABAgTaCSgA20W2dWAF4FZOh60KKABXxfyeAAECBAgQIECAAAECBAisCygA180mPaEAnJRmw10UgA1DMzIBAgQIECBAgAABAgQItBNQALaLbOvACsCtnA5bFVAAror5PQECBAgQIECAAAECBAgQWBdQAK6bTXpCATgpzYa7KAAbhmZkAgQIECBAgAABAgQIEGgnoABsF9nWgRWA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pmK+J0CAAAECBAgQIECAAAECuYAAmJv99IcA+NM1B98iAA4ezcoECBAgQIAAAQIECBAgMCcgAM6drLqwAFjlNIwAAQIECBAgQIAAAQIECBAgQIDALQEB8NY9bEOAAAECBAgQIECAAAECBAgQIECgKiAAVjkNI0CAAAECBAgQIECAAAECBAgQIHBLQAC8dQ/bECBAgAABAgQIECBAgAABAgQIEKgKCIBVTsMIECBAgAABAgQIECBAgAABAgQI3BIQAG/dwzYECBAgQIAAAQIECBAgQIAAAQIEqgICYJXTMAIECBAgQIAAAQIECBAgQIAAAQK3BATAW/ewDQECBAgQIECAAAECBAgQIECAAIGqgABY5TSMAAECBAgQIECAAAECBAgQIECAwC0BAfDWPWxDgAABAgQIECBAgAABAgQIECBAoCogAFY5DSNAgAABAgQIECBAgAABAgQIECBwS0AAvHUP2xAgQIAAAQIECBAgQIAAAQIECBCoCgiAVU7DCBAgQIAAAQIECBAgQIAAAQIECNwSEABv3cM2BAgQIECAAAECBAgQIECAAAECBKoCAmCV0zACBAgQIECAAAECBAgQIECAAAECtwQEwFv3sA0BAgQIECBAgAABAgQIECBAgACBqoAAWOU0jAABAgQIECBAgAABAgQIECBAgMAtAQHw1j1sQ4AAAQIECBAgQIAAAQIECBAgQKAqIABWOQ0jQIAAAQIECBAgQIAAAQIECBAgcEtAALx1D9sQIECAAAECBAgQIECAAAECBAgQqAoIgFVOwwgQIECAAAECBAgQIECAAAECBAjcEhAAb93DNgQIECBAgAABAgQIECBAgAABAgSqAgJgldMwAgQIECBAgAABAgQIECBAgAABArcEBMBb97ANAQIECBAgQIAAAQIECBAgQIAAgaqAAFjlNIwAAQIECBAgQIAAAQIECBAgQIDALQEB8NY9bEOAAAECBAgQIECAAAECBAgQIECgKiAAVjkNI0CAAAECBAgQIECAAAECBAgQIHBLQAC8dQ/bECBAgAABAgQIECBAgAABAgQIEKgKCIBVTsMIECBAgAABAgQIECBAgAABAgQI3BIQAG/dwzYECBAgQIAAAQIECBAgQIAAAQIEqgICYJXTMAIECBAgQIAAAQIECBAgQIAAAQK3BATAW/ewDQECBAgQIECAAAECBAgQIECAAIGqgABY5TSMAAECBAgQIECAAAECBAgQIECAwC0BAfDWPWxDgAABAgQIECBAgAABAgQIECBAoCogAFY5DSNAgAABAgQIECBAgAABAgQIECBwS0AAvHUP2xAgQIAAAQIECBAgQIAAAQIECBCoCgiAVU7DCBAgQIAAAQIECBAgQIAAAQIECNwSEABv3cM2BAgQIECAAAECBAgQIECAAAECBKoCAmCV0zACBAgQIECAAAECBAgQIECAAAECtwQEwFv3sA0BAgQIECBAgAABAgQIECBAgACBqoAAWOU0jAABAgQIECBAgAABAgQIECBAgMAtAQHw1j1sQ4AAAQIECBAgQIAAAQIECBAgQKAqIABWOQ0jQIAAAQIECBAgQIAAAQIECBAgcEtAALx1D9sQIECAAAECBAgQIECAAAECBAgQqAoIgFVOwwgQIECAAAECBAgQIECAAAECBAjcEhAAb93DNgQIECBAgAABAgQIECBAgAABAgSqAgJgldMwAgQIECBAgAABAgQIECBAgAABArcEBMBb97ANAQIECBAgQIAAAQIECBAgQIAAgaqAAFjlNIwAAQIECBAgQIAAAQIECBAgQIDALQEB8NY9bEOAAAECBAgQIECAAAECBAgQIECgKiAAVjkNI0CAAAECBAgQIECAAAECBAgQIHBLQAC8dQ/bECBAgAABAgQIECBAgAABAgQIEKgKCIBVTsMIECBAgAABAgQIECBAgAABAgQI3BIQAG/dwzYECBAgQIAAAQIECBAgQIAAAQIEqgICYJXTMAIECBAgQIAAAQIECBAgQIAAAQK3BATAW/ewDQECBAgQIECAAAECBAgQIECAAIGqgABY5TSMAAECBAgQIECAAAECBAgQIECAwC0BAfDWPWxDgAABAgQIECBAgAABAgQIECBAoCogAFY5DSNAgAABAgQIECBAgAABAgQIECBwS0AAvHUP2xAgQIAAAQIECBAgQIAAAQIECBCoCgiAVU7DCBAgQIAAAQIECBAgQIAAAQIECNwSEABv3cM2BAgQIECAAAECBAgQIECAAAECBKoCAmCV0zACBAgQIECAAAECBAgQIECAAAECtwQEwFv3sA0BAgQIECBAgAABAgQIECBAgACBqoAAWOU0jAABAgQIECBAgAABAgQIECBAgMAtAQHw1j1sQ4AAAQIECBAgQIAAAQIECBAgQKAqIABWOQ0jQIAAAQIECBAgQIAAAQIECBAgcEtAALx1D9sQIECAAAECBAgQIECAAAECBAgQqAoIgFVOwwgQIECAAAECBAgQIECAAAECBAjcEhAAb93DNgQIECBAgAABAgQIECBAgAABAgSqAgJgldMwAgQIECBAgAABAgQIECBAgAABArcEBMBb97ANAQIECBAgQIAAAQIECBAgQIAAgaqAAFjlNIwAAQIECBAgQIAAAQIECBAgQIDALQEB8NY9bEOAAAECBAgQIECAAAECBAgQIECgKiAAVjkNI0CAAAECBAgQIECAAAECBAgQIHBLQAC8dQ/bECBAgAABAgQIECBAgAABAgQIEKgKCIBVTsMIECBAgAABAgQIECBAgAABAgQI3BIQAG/dwzYECBAgQIAAAQIECBAgQIAAAQIEqgICYJXTMAIECBAgQIAAAQIECBAgQIAAAQK3BATAW/ewDQECBAgQIECAAAECBAgQIECAAIGqgABY5TSMAAECBAgQIECAAAECBAgQIECAwC0BAfDWPWxDgAABAgQIECBAgAABAgQIECBAoCogAFY5DSNAgAABAgQIECBAgAABAgQIECBwS0AAvHUP2xAgQIAAAQIECBAgQIAAAQIECBCoCgiAVU7DCBAgQIAAAQIECBAgQIAAAQIECNwSEABv3cM2BAgQIECAAAECBAgQIECAAAECBKoCAmCV0zACBAgQIECAAAECBAgQIECAAAECtwQEwFv3sA0BAgQIECBAgAABAgQIECBAgACBqoAAWOU0jAABAgQIECBAgAABAgQIECBAgMAtAQHw1j1sQ4AAAQIECBAgQIAAAQIECBAgQKAqIABWOQ0jQIAAAQIECBAgQIAAAQIECBAgcEtAALx1D9sQIECAAAECBAgQIECAAAECBAgQqAoIgFVOwwgQIECAAAECBAgQIECAAAECBAjcEhAAb93DNgQIECBAgAABAgQIECBAgAABAgSqAgJgldMwAgQIECBAgAABAgQIECBAgAABArcEBMBb97ANAQIECBAgQIAAAQIECBAgQIAAgaqAAFjlNIwAAQIECBAgQIAAAQIECBAgQIDALQEB8NY9bEOAAAECBAgQIECAAAECBAgQIECgKiAAVjkNI0CAAAECBAgQIECAAAECBAgQIHBLQAC8dQ/bECBAgAABAgQIECBAgAABAgQIEKgKCIBVTsMIECBAgAABAgQIECBAgAABAgQI3BIQAG/dwzYECBAgQIAAAQIECBAgQIAAAQIEqgICYJXTMAIECBAgQIAAAQIECBAgQIAAAQK3BATAW/ewDQECBAgQIECAAAECBAgQIECAAIGqgABY5TSMAAECBAgQIECAAAECBAgQIECAwC0BAfDWPWxDgAABAgQIECBAgAABAgQIECBAoCogAFY5DSNAgAABAgQIECBAgAABAgQIECBwS0AAvHUP2xAgQIAAAQIECBAgQIAAAQIECBCoCgiAVU7DCBAgQIAAAQIECBAgQIAAAQIECNwSEABv3cM2BAgQIECAAAECBAgQIECAAAECBKoCAmCV0zACBAgQIECAAAECBAgQIECAAAECtwQEwFv3sA0BAgQIECBAgAABAgQIECBAgACBqoAAWOU0jAABAgQIECBAgAABAgQIECBAgMAtAQHw1j1sQ4AAAQIECBAgQIAAAQIECBAgQKAqIABWOQ0jQIAAAQIECBAgQIAAAQIECBAgcEtAALx1D9sQIECAAAECBAgQIECAAAECBAgQqAoIgFVOwwgQIECAAAECBAgQIECAAAECBAjcEhAAb93DNgQIECBAgAABAgQIECBAgAABAgSqAgJgldMwAgQIECBAgAABAgQIECBAgAABArcEBMBb97ANAQIECBAgQIAAAQIECBAgQIAAgaqAAFjlNIwAAQIECBAgQIAAAQIECBAgQIDALQEB8NY9bEOAAAECBAgQIECAAAECBAgQIECgKiAAVjkNI0CAAAECBAgQIECAAAECBAgQIHBLQAC8dQ/bECBAgAABAgQIECBAgAABAgQIEKgKCIBVTsMIECBAgAABAgQIECBAgAABAgQI3BIQAG/dwzYECBAgQIAAAQIECBAgQIAAAQIEqgICYJXTMAIECBAgQIAAAQIECBAgQIAAAQK3BATAW/ewDQECBAgQIECAAAECBAgQIECAAIGqgABY5TSMAAECBAgQIECAAAECBAgQIECAwC0BAfDWPWxDgAABAgQIECBAgAABAgQIECBAoCogAFY5DSNAgAABAgQIECBAgAABAgQIECBwS0AAvHUP2xAgQIAAAQIECBAgQIAAAQIECBCoCgiAVU7DCBAgQIAAAQIECBAgQIAAAQIECNwSEABv3cM2BAgQIECAAAECBAgQIECAAAECBKoCAmCV0zACBAgQIECAAAECBAgQIECAAAECtwQEwFv3sA0BAgQIECBAgAABAgQIECBAgACBqoAAWOU0jAABAgQIECBAgAABAgQIECBAgMAtAQHw1j1sQ4AAAQIECBAgQIAAAQIECBAgQKAqIABWOQ0jQIAAAQIECBAgQIAAAQIECBAgcEtAALx1D9sQIECAAAECBAgQIECAAAECBAgQqAoIgFVOwwgQIECAAAECBAgQIECAAAECBAjcEhAAb93DNgQIECBAgAABAgQIECBAgAABAgSqAgJgldMwAgQIECBAgAABAgQIECBAgAABArcEBMBb97ANAQIECBAgQIAAAQIECBAgQIAAgaqAAFjlNIwAAQIECBAgQIAAAQIECBAgQIDALYEHv4dohDoaaHYAAAAASUVORK5CYII=\" width=\"640\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"video = plot_animation(frames)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Nope, the system is unstable and after just a few wobbles, the pole ends up too tilted: game over. We will need to be smarter than that!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Neural Network Policies"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's create a neural network that will take observations as inputs, and output the action to take for each observation. To choose an action, the network will first estimate a probability for each action, then select an action randomly according to the estimated probabilities. In the case of the Cart-Pole environment, there are just two possible actions (left or right), so we only need one output neuron: it will output the probability `p` of the action 0 (left), and of course the probability of action 1 (right) will be `1 - p`."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note: instead of using the `fully_connected()` function from the `tensorflow.contrib.layers` module (as in the book), we now use the `dense()` function from the `tf.layers` module, which did not exist when this chapter was written. This is preferable because anything in contrib may change or be deleted without notice, while `tf.layers` is part of the official API. As you will see, the code is mostly the same.\n",
|
||
"\n",
|
||
"The main differences relevant to this chapter are:\n",
|
||
"* the `_fn` suffix was removed in all the parameters that had it (for example the `activation_fn` parameter was renamed to `activation`).\n",
|
||
"* the `weights` parameter was renamed to `kernel`,\n",
|
||
"* the default activation is `None` instead of `tf.nn.relu`"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import tensorflow as tf\n",
|
||
"\n",
|
||
"# 1. Specify the network architecture\n",
|
||
"n_inputs = 4 # == env.observation_space.shape[0]\n",
|
||
"n_hidden = 4 # it's a simple task, we don't need more than this\n",
|
||
"n_outputs = 1 # only outputs the probability of accelerating left\n",
|
||
"initializer = tf.contrib.layers.variance_scaling_initializer()\n",
|
||
"\n",
|
||
"# 2. Build the neural network\n",
|
||
"X = tf.placeholder(tf.float32, shape=[None, n_inputs])\n",
|
||
"hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu,\n",
|
||
" kernel_initializer=initializer)\n",
|
||
"outputs = tf.layers.dense(hidden, n_outputs, activation=tf.nn.sigmoid,\n",
|
||
" kernel_initializer=initializer)\n",
|
||
"\n",
|
||
"# 3. Select a random action based on the estimated probabilities\n",
|
||
"p_left_and_right = tf.concat(axis=1, values=[outputs, 1 - outputs])\n",
|
||
"action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)\n",
|
||
"\n",
|
||
"init = tf.global_variables_initializer()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In this particular environment, the past actions and observations can safely be ignored, since each observation contains the environment's full state. If there were some hidden state then you may need to consider past actions and observations in order to try to infer the hidden state of the environment. For example, if the environment only revealed the position of the cart but not its velocity, you would have to consider not only the current observation but also the previous observation in order to estimate the current velocity. Another example is if the observations are noisy: you may want to use the past few observations to estimate the most likely current state. Our problem is thus as simple as can be: the current observation is noise-free and contains the environment's full state."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"You may wonder why we are picking a random action based on the probability given by the policy network, rather than just picking the action with the highest probability. This approach lets the agent find the right balance between _exploring_ new actions and _exploiting_ the actions that are known to work well. Here's an analogy: suppose you go to a restaurant for the first time, and all the dishes look equally appealing so you randomly pick one. If it turns out to be good, you can increase the probability to order it next time, but you shouldn't increase that probability to 100%, or else you will never try out the other dishes, some of which may be even better than the one you tried."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let's randomly initialize this policy neural network and use it to play one game:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"n_max_steps = 1000\n",
|
||
"frames = []\n",
|
||
"\n",
|
||
"with tf.Session() as sess:\n",
|
||
" init.run()\n",
|
||
" obs = env.reset()\n",
|
||
" for step in range(n_max_steps):\n",
|
||
" img = render_cart_pole(env, obs)\n",
|
||
" frames.append(img)\n",
|
||
" action_val = action.eval(feed_dict={X: obs.reshape(1, n_inputs)})\n",
|
||
" obs, reward, done, info = env.step(action_val[0][0])\n",
|
||
" if done:\n",
|
||
" break\n",
|
||
"\n",
|
||
"env.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Now let's look at how well this randomly initialized policy network performed:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4Xuzd0ZEkx5EEUKwYJ8dSjJNjqQbUGMpBMXhynBg4W5DDIwbTNdWVWR2Z4Y8//EBVdsTzpBnNrWDz7Rf/IUCAAAECBAgQIECAAAECBAgQIECgrcC3tptZjAABAgQIECBAgAABAgQIECBAgACBXxSALgEBAgQIECBAgAABAgQIECBAgACBxgIKwMbhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQINBYQAHYOFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEGgsoABuHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgEBjAQVg43CtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQaCygAGwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKNBRSAjcO1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAoLGAArBxuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAg0FlAANg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcYCCsDG4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECDQWEAB2DhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBBoLKAAbh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIBAYwEFYONwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEGgsoABsHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECjQUUgI3DtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQKCxgAKwcbhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQINBZQADYO12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHGAgrAxuFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAg0FhAAdg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQaCygAG4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAQGMBBWDjcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBBoLKAAbByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAo0FFICNw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIECgsYACsHG4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECDQWUAA2DtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBxgIKwMbhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQINBYQAHYOFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEGgsoABuHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgEBjAQVg43CtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQaCygAGwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKNBRSAjcO1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAoLGAArBxuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAg0FlAANg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcYCCsDG4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECDQWEAB2DhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBBoLKAAbh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIBAYwEFYONwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEGgsoABsHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECjQUUgI3DtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQKCxgAKwcbhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQINBZQADYO12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHGAgrAxuFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAg0FhAAdg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQaCygAG4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAQGMBBWDjcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBBoLKAAbByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAo0FFICNw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIECgsYACsHG4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECDQWUAA2DtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBxgIKwMbhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQINBYQAHYOFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEGgsoABuHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgEBjAQVg43CtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQaCygAGwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKNBRSAjcO1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAoLGAArBxuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAg0FlAANg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcYCCsDG4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECDQWEAB2DhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBBoLKAAbh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIBAYwEFYONwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEGgsoABsHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECjQUUgI3DtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQKCxgAKwcbhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQINBZQADYO12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHGAgrAxuFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAg0FhAAdg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQaCygAG4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAQGMBBWDjcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBBoLKAAbByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAo0F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\" width=\"640\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"video = plot_animation(frames)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Yeah... pretty bad. The neural network will have to learn to do better. First let's see if it is capable of learning the basic policy we used earlier: go left if the pole is tilting left, and go right if it is tilting right. The following code defines the same neural network but we add the target probabilities `y`, and the training operations (`cross_entropy`, `optimizer` and `training_op`):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 38,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import tensorflow as tf\n",
|
||
"\n",
|
||
"reset_graph()\n",
|
||
"\n",
|
||
"n_inputs = 4\n",
|
||
"n_hidden = 4\n",
|
||
"n_outputs = 1\n",
|
||
"\n",
|
||
"learning_rate = 0.01\n",
|
||
"\n",
|
||
"initializer = tf.contrib.layers.variance_scaling_initializer()\n",
|
||
"\n",
|
||
"X = tf.placeholder(tf.float32, shape=[None, n_inputs])\n",
|
||
"y = tf.placeholder(tf.float32, shape=[None, n_outputs])\n",
|
||
"\n",
|
||
"hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)\n",
|
||
"logits = tf.layers.dense(hidden, n_outputs)\n",
|
||
"outputs = tf.nn.sigmoid(logits) # probability of action 0 (left)\n",
|
||
"p_left_and_right = tf.concat(axis=1, values=[outputs, 1 - outputs])\n",
|
||
"action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)\n",
|
||
"\n",
|
||
"cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)\n",
|
||
"optimizer = tf.train.AdamOptimizer(learning_rate)\n",
|
||
"training_op = optimizer.minimize(cross_entropy)\n",
|
||
"\n",
|
||
"init = tf.global_variables_initializer()\n",
|
||
"saver = tf.train.Saver()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can make the same net play in 10 different environments in parallel, and train for 1000 iterations. We also reset environments when they are done."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 39,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"n_environments = 10\n",
|
||
"n_iterations = 1000\n",
|
||
"\n",
|
||
"envs = [gym.make(\"CartPole-v0\") for _ in range(n_environments)]\n",
|
||
"observations = [env.reset() for env in envs]\n",
|
||
"\n",
|
||
"with tf.Session() as sess:\n",
|
||
" init.run()\n",
|
||
" for iteration in range(n_iterations):\n",
|
||
" target_probas = np.array([([1.] if obs[2] < 0 else [0.]) for obs in observations]) # if angle<0 we want proba(left)=1., or else proba(left)=0.\n",
|
||
" action_val, _ = sess.run([action, training_op], feed_dict={X: np.array(observations), y: target_probas})\n",
|
||
" for env_index, env in enumerate(envs):\n",
|
||
" obs, reward, done, info = env.step(action_val[env_index][0])\n",
|
||
" observations[env_index] = obs if not done else env.reset()\n",
|
||
" saver.save(sess, \"./my_policy_net_basic.ckpt\")\n",
|
||
"\n",
|
||
"for env in envs:\n",
|
||
" env.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 40,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def render_policy_net(model_path, action, X, n_max_steps = 1000):\n",
|
||
" frames = []\n",
|
||
" env = gym.make(\"CartPole-v0\")\n",
|
||
" obs = env.reset()\n",
|
||
" with tf.Session() as sess:\n",
|
||
" saver.restore(sess, model_path)\n",
|
||
" for step in range(n_max_steps):\n",
|
||
" img = render_cart_pole(env, obs)\n",
|
||
" frames.append(img)\n",
|
||
" action_val = action.eval(feed_dict={X: obs.reshape(1, n_inputs)})\n",
|
||
" obs, reward, done, info = env.step(action_val[0][0])\n",
|
||
" if done:\n",
|
||
" break\n",
|
||
" env.close()\n",
|
||
" return frames "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 41,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"INFO:tensorflow:Restoring parameters from ./my_policy_net_basic.ckpt\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4Xuzd0bEkx5ElUECMkaMpxsjRVINqNOUYMbhyjBhYa4JvtwF05avKigz39Hv4QxtDZYb7ufHBuZbk+/UX/yJAgAABAgQIECBAgAABAgQIECBAYKzAr2M3sxgBAgQIECBAgAABAgQIECBAgAABAr8oAF0CAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdIECAAAECBAgQIECAAAECBAgQIDBYQAE4OFyrESBAgAABAgQIECBAgAABAgQIEFAAugMECBAgQIAAAQIECBAgQIAAAQIEBgsoAAeHazUCBAgQIECAAAECBAgQIECAAAECCkB3gAABAgQIECBAgAABAgQIECBAgMBgAQXg4HCtRoAAAQIECBAgQIAAAQIECBAgQEAB6A4QIECAAAECBAgQIECAAAECBAgQGCygABwcrtUIECBAgAABAgQIECBAgAABAgQIKADdAQIECBAgQIAAAQIECBAgQIAAAQKDBRSAg8O1GgECBAgQIECAAAECBAgQIECAAAEFoDtAgAABAgQIECBAgAABAgQIECBAYLCAAnBwuFYjQIAAAQIECBAgQIAAAQIECBAgoAB0BwgQIECAAAECBAgQIECAAAECBAgMFlAADg7XagQIECBAgAABAgQIECBAgAABAgQUgO4AAQIECBAgQIAAAQIECBAgQIAAgcECCsDB4VqNAAECBAgQIECAAAECBAgQIECAgALQHSBAgAABAgQIECBAgAABAgQIECAwWEABODhcqxEgQIAAAQIECBAgQIAAAQIECBBQALoDBAgQIECAAAECBAgQIECAAAECBAYLKAAHh2s1AgQIECBAgAABAgQIECBAgAABAgpAd4AAAQIECBAgQIAAAQIECBAgQIDAYAEF4OBwrUaAAAECBAgQIECAAAECBAgQIEBAAegOECBAgAABAgQIECBAgAABAgQIEBgsoAAcHK7VCBAgQIAAAQIECBAgQIAAAQIECCgA3QECBAgQIECAAAECBAgQIECAAAECgwUUgIPDtRoBAgQIECBAgAABAgQIECBAgAABBaA7QIAAAQIECBAgQIAAAQIECBAgQGCwgAJwcLhWI0CAAAECBAgQIECAAAECBAgQIKAAdAcIECBAgAABAgQIECBAgAABAgQIDBZQAA4O12oECBAgQIAAAQIECBAgQIAAAQIEFIDuAAECBAgQIECAAAECBAgQIECAAIHBAgrAweFajQABAgQIECBAgAABAgQIECBAgIAC0B0gQIAAAQIECBAgQIAAAQIECBAgMFhAATg4XKsRIECAAAECBAgQIECAAAECBAgQUAC6AwQIECBAgAABAgQIECBAgAABAgQGCygAB4drNQIECBAgQIAAAQIECBAgQIAAAQIKQHeAAAECBAgQIECAAAECBAgQIECAwGABBeDgcK1GgAABAgQIECBAgAABAgQIECBAQAHoDhAgQIAAAQIECBAgQIAAAQIECBAYLKAAHByu1QgQIECAAAECBAgQIECAAAECBAgoAN0BAgQIECBAgAABAgQIECBAgAABAoMFFICDw7UaAQIECBAgQIAAAQIECBAgQIAAAQWgO0CAAAECBAgQIECAAAECBAgQIEBgsIACcHC4ViNAgAABAgQIECBAgAABAgQIECCgAHQHCBAgQIAAAQIECBAgQIAAAQIECAwWUAAODtdqBAgQIECAAAECBAgQIECAAAECBBSA7gABAgQIECBAgAABAgQIECBAgACBwQIKwMHhWo0AAQIECBAgQIAAAQIECBAgQICAAtAdKBX47bfffisdwOEECBAgQIAAAQIECBAgQCBA4Ndff9UBBeT8aEXhB4ffYXUFYIcUzECAAAECBAgQIECAAAEC0wUUgNMTPt5PAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkA9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXN7+ALwnJunFgkoABdBeg0BAgQIECBAgAABAgQIEDgQUABmXw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPiqAs9e3fbWAArA6AecTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpLn9vAF4Dk3Ty0SUAAugvQaAgQIECBAgAABAgQIECBwIKAAzL4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxUAGevb/tqAQVgdQLOJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQkz+3hC8Bzbp5aJKAAXATpNQQIECBAgAABAgQIECBA4EBAAZh9PRSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qADOXt/21QIKwOoEnE+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHywogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSZ7bwxeA59w8tUhAAbgI0msIECBAgAABAgQIECBAgMCBgAIw+3ooALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lEBnL2+7asFFIDVCTifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YEUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5I8t4cvAM+5eWqRgAJwEaTXECBAgAABAgQIECBAgACBAwEFYPb1UABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSjAjh7fdtXCygAqxNwPgECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sGKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW4PXwCec/PUIgEF4CJIryFAgAABAgQIECBAgAABAgcCCsDs66EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIRwVw9vq2rxZQAFYn4HwCBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSDFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLcHr4APOfmqUUCCsBFkF5DgAABAgQIECBAgAABAgQOBBSA2ddDAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkI8K4Oz1bV8toACsTsD5BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIBysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkuT18AXjOzVOLBBSAiyC9hgABAgQIECBAgAABAgQIHAgoALOvhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfFcDZ69u+WkABWJ2A8wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkA9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXN7+ALwnJunFgkoABdBeg0BAgQIECBAgAABAgQIEDgQUABmXw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPiqAs9e3fbWAArA6AecTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpLn9vAF4Dk3Ty0SUAAugvQaAgQIECBAgAABAgQIECBwIKAAzL4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxUAGevb/tqAQVgdQLOJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQkz+3hC8Bzbp5aJKAAXATpNQQIECBAgAABAgQIECBA4EBAAZh9PRSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qADOXt/21QIKwOoEnE+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHywogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSZ7bwxeA59w8tUhAAbgI0msIECBAgAABAgQIECBAgMCBgAIw+3ooALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lEBnL2+7asFFIDVCTifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YEUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5I8t4cvAM+5eWqRgAJwEaTXECBAgAABAgQIECBAgACBAwEFYPb1UABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSjAjh7fdtXCygAqxNwPgECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sGKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW4PXwCec/PUIgEF4CJIryFAgAABAgQIECBAgAABAgcCCsDs66EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIRwVw9vq2rxZQAFYn4HwCBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSDFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLcHr4APOfmqUUCCsBFkF5DgAABAgQIECBAgAABAgQOBBSA2ddDAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkI8K4Oz1bV8toACsTsD5BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIBysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkuT18AXjOzVOLBBSAiyC9hgABAgQIECBAgAABAgQIHAgoALOvhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfFcDZ69u+WkABWJ2A8wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkA9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXN7+ALwnJunFgkoABdBeg0BAgQIECBAgAABAgQIEDgQUABmXw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPiqAs9e3fbWAArA6AecTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpLn9vAF4Dk3Ty0SUAAugvQaAgQIECBAgAABAgQIECBwIKAAzL4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxUAGevb/tqAQVgdQLOJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQkz+3hC8Bzbp5aJKAAXATpNQQIECBAgAABAgQIECBA4EBAAZh9PRSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qADOXt/21QIKwOoEnE+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHywogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSZ7bwxeA59w8tUhAAbgI0msIECBAgAABAgQIECBAgMCBgAIw+3ooALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lEBnL2+7asFFIDVCTifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YEUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5I8t4cvAM+5eWqRgAJwEaTXECBAgAABAgQIECBAgACBAwEFYPb1UABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSjAjh7fdtXCygAqxNwPgECBAgQIECAAAECBINNLD0AACAASURBVAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sGKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW4PXwCec/PUIgEF4CJIryFAgAABAgQIECBAgAABAgcCCsDs66EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIRwVw9vq2rxZQAFYn4HwCBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSDFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLcHr4APOfmqUUCCsBFkF5DgAABAgQIECBAgAABAgQOBBSA2ddDAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkI8K4Oz1bV8toACsTsD5BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIBysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkuT18AXjOzVOLBBSAiyC9hgABAgQIECBAgAABAgQIHAgoALOvhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfFcDZ69u+WkABWJ2A8wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkA9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXN7+ALwnJunFgkoABdBeg0BAgQIECBAgAABAgQIEDgQUABmXw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPiqAs9e3fbWAArA6AecTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpLn9vAF4Dk3Ty0SUAAugvQaAgQIECBAgAABAgQIECBwIKAAzL4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxUAGevb/tqAQVgdQLOJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQkz+3hC8Bzbp5aJKAAXATpNQQIECBAgAABAgQIECBA4EBAAZh9PRSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qADOXt/21QIKwOoEnE+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHywogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSZ7bwxeA59w8tUhAAbgI0msIECBAgAABAgQIECBAgMCBgAIw+3ooALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lEBnL2+7asFFIDVCTifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YEUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5I8t4cvAM+5eWqRgAJwEaTXECBAgAABAgQIECBAgACBAwEFYPb1UABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSjAjh7fdtXCygAqxNwPgECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sGKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW4PXwCec/PUIgEF4CJIryFAgAABAgQIECBAgAABAgcCCsDs66EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIRwVw9vq2rxZQAFYn4HwCBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSDFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLcHr4APOfmqUUCCsBFkF5DgAABAgQIECBAgAABAgQOBBSA2ddDAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkI8K4Oz1bV8toACsTsD5BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIBysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkuT18AXjOzVOLBBSAiyC9hgABAgQIECBAgAABAgQIHAgoALOvhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfFcDZ69u+WkABWJ2A8wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkA9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXN7+ALwnJunFgkoABdBeg0BAgQIECBAgAABAgQIEDgQUABmXw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPiqAs9e3fbWAArA6AecTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpLn9vAF4Dk3Ty0SUAAugvQaAgQIECBAgAABAgQIECBwIKAAzL4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxUAGevb/tqAQVgdQLOJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQkz+3hC8Bzbp5aJKAAXATpNQQIECBAgAABAgQIECBA4EBAAZh9PRSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qADOXt/21QIKwOoEnE+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHywogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSZ7bwxeA59w8tUhAAbgI0msIECBAgAABAgQIECBAgMCBgAIw+3ooALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lEBnL2+7asFFIDVCTifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YEUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5I8t4cvAM+5eWqRgAJwEaTXECBAgAABAgQIECBAgACBAwEFYPb1UABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSjAjh7fdtXCygAqxNwPgECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sGKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW4PXwCec/PUIgEF4CJIryFAgAABAgQIECBAgAABAgcCCsDs66EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIRwVw9vq2rxZQAFYn4HwCBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSDFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLcHr4APOfmqUUCCsBFkF5DgAABAgQIECBAgAABAgQOBBSA2ddDAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkI8K4Oz1bV8toACsTsD5BAgQIECAAAECBAgQIJAgoABMSPnxjr4AzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIBysqALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQsgIwO+TO2ysAO6djNgIECBAgQIAAAQIECBCYIqAAnJLkuT18AXjOzVOLBBSAiyC9hgABAgQIECBAgAABAgQIHAgoALOvhwIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfFcDZ69u+WkABWJ2A8wkQIECAAAECBAgQIEAgQUABmJDy4x19AZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkA9WVABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIGQFYHbInbdXAHZOx2wECBAgQIAAAQIECBAgMEVAATglyXN7+ALwnJunFgkoABdBeg0BAgQIECBAgAABAgQIEDgQUABmXw8FYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPiqAs9e3fbWAArA6AecTIECAAAECBAgQIECAQIKAAjAh5cc7+gIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASEfrKgAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDICsDskDtvrwDsnI7ZCBAgQIAAAQIECBAgQGCKgAJwSpLn9vAF4Dk3Ty0SUAAugvQaAgQIECBAgAABAgQIECBwIKAAzL4eCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHxUAGevb/tqAQVgdQLOJ0CAAAECBAgQIECAAIEEAQVgQsqPd/QFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCPlhRAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkBWA2SF33l4B2DkdsxEgQIAAAQIECBAgQIDAFAEF4JQkz+3hC8Bzbp5aJKAAXATpNQQIECBAgAABAgQIECBA4EBAAZh9PRSA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5qADOXt/21QIKwOoEnE+AAAECBAgQIECAAAECCQIKwISUH+/oC8Ds/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhHywogIwO//y7RWA5REYgAABAgQIECBAgAABAgQCBBSAASErALND7ry9ArBzOmYjQIAAAQIECBAgQIAAgSkCCsApSZ7bwxeA59w8tUhAAbgI0msIECBAgAABAgQIECBAgMCBgAIw+3ooALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8lEBnL2+7asFFIDVCTifAAECBAgQIECAAAECBBIEFIAJKT/e0ReA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAj5YEUFYHb+5dsrAMsjMAABAgQIECBAgAABAgQIBAgoAANCVgBmh9x5ewVg53TMRoAAAQIECBAgQIAAAQJTBBSAU5I8t4cvAM+5eWqRgAJwEaTXECBAgAABAgQIECBAgACBAwEFYPb1UABm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSjAjh7fdtXCygAqxNwPgECBAgQIECAAAECBAgkCCgAE1J+vKMvALPzL99eAVgegQEIECBAgAABAgQIECBAIEBAARgQ8sGKCsDs/Mu3VwCWR2AAAgQIECBAgAABAgQIEAgQUAAGhKwAzA658/YKwM7pmI0AAQIECBAgQIAAAQIEpggoAKckeW4PXwCec/PUIgEF4CJIryFAgAABAgQIECBAgAABAgcCCsDs66EAzM6/fHsFYHkEBiBAgAABAgQIECBAgACBAAEFYEDIRwVw9vq2rxZQAFYn4HwCBAgQIECAAAECBAgQSBBQACak/HhHXwBm51++vQKwPAIDECBAgAABAgQIECBAgECAgAIwIOSDFRWA2fmXb68ALI/AAAQIECBAgAABAgQIECAQIKAADAhZAZgdcuftFYCd0zEbAQIECBAgQIAAAQIECEwRUABOSfLcHr4APOfmqUUCCsBFkF5DgAABAgQIECBAgAABAgQOBBSA2ddDAZidf/n2CsDyCAxAgAABAgQIECBAgAABAgECCsCAkI8K4Oz1bV8toACsTsD5BAgQIECAAAECBAgQ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CxgAP4PHzhkAY4WIQ4AAAQIECBAgQIAAAQIECBAgQGBSwAA4qektAgQIECBAgAABAgQIECBAgAABAjEBA2CsEHEIECBAgAABAgQIECBAgAABAgQITAoYACc1vUWAAAECBAgQIECAAAECBAgQIEAgJmAAjBUiDgECBAgQIECAAAECBAgQIECAAIFJAQPgpKa3CBAgQIAAAQIECBAgQIAAAQIECMQEDICxQsQhQIAAAQIECBAgQIAAAQIECBAgMClgAJzU9BYBAgQIECBAgAABAgQIECBAgACBmIABMFaIOAQIECBAgAABAgQIECBAgAABAgQmBQyAk5reIkCAAAECBAgQIECAAAECBAgQIBATMADGChGHAAECBAgQIECAAAECBAgQIECAwKSAAXBS01sECBAgQIAAAQIECBAgQIAAAQIEYgIGwFgh4hAgQIAAAQIECBAgQIAAAQIECBCYFDAATmp6iwABAgQIECBAgAABAgQIECBAgEBMwAAYK0QcAgQIECBAgAABAgQIECBAgAABApMCBsBJTW8RIECAAAECBAgQIECAAAECBAgQiAkYAGOFiEOAAAECBAgQIECAAAECBAgQIEBgUsAAOKnpLQIECBAgQIAAAQIECBAgQIAAAQIxAQNgrBBxCBAgQIAAAQIECBAgQIAAAQIECEwKGAAnNb1FgAABAgQIECBAgAABAgQIECBAICZgAIwVIg4BAgQIECBAgAABAgQIECBAgACBSQED4KSmtwgQIECAAAECBAgQIECAAAECBAjEBAyAsULEIUCAAAECBAgQIECAAAECBAgQIDApYACc1PQWAQIECBAgQIAAAQIECBAgQIAAgZiAATBWiDgECBAgQIAAAQIECBAgQIAAAQIEJgUMgJOa3iJAgAABAgQIECBAgAABAgQIECAQEzAAxgoRhwABAgQIECBAgAABAgQIECBAgMCkgAFwUtNbBAgQIECAAAECBAgQIECAAAECBGICBsBYIeIQIECAAAECBAgQIECAAAECBAgQmBQwAE5qeosAAQIECBAgQIAAAQIECBAgQIBATMAAGCtEHAIECBAgQIAAAQIECBAgQIAAAQKTAgbASU1vESBAgAABAgQIECBAgAABAgQIEIgJGABjhYhDgAABAgQIECBAgAABAgQIECBAYFLAADip6S0CBAgQIECAAAECBAgQIECAAAECMQEDYKwQcQgQIECAAAECBAgQIECAAAECBAhMChgAJzW9RYAAAQIECBAgQIAAAQIECBAgQCAmYACMFSIOAQIECBAgQIAAAQIECBAgQIAAgUkBA+CkprcIECBAgAABAgQIECBAgAABAgQIxAQMgLFCxCFAgAABAgQIECBAgAABAgQIECAwKWAAnNT0FgECBAgQIECAAAECBAgQIECAAIGYgAEwVog4BAgQIECAAAECBAgQIECAAAECBCYFDICTmt4iQIAAAQIECBAgQIAAAQIECBAgEBMwAMYKEYcAAQIECBAgQIAAAQIECBAgQIDApIABcFLTWwQIECBAgAABAgQIECBAgAABAgRiAgbAWCHiECBAgAABAgQIECBAgAABAgQIEJgUMABOanqLAAECBAgQIECAAAECBAgQIECAQEzAABgrRBwCBAgQIECAAAECBAgQIECAAAECkwIGwElNbxEgQIAAAQIECBAgQIAAAQIECBCICRgAY4WIQ4AAAQIECBAgQIAAAQIECBAgQGBSwAA4qektAgQIECBAgAABAgQIECBAgAABAjEBA2CsEHEIECBAgAABAgQIECBAgAABAgQITAoYACc1vUWAAAECBAgQIECAAAECBAgQIEAgJmAAjBUiDgECBAgQIECAAAECBAgQIECAAIFJAQPgpKa3CBAgQIAAAQIECBAgQIAAAQIECMQEDICxQsQhQIAAAQIECBAgQIAAAQIECBAgMClgAJzU9BYBAgQIECBAgAABAgQIECBAgACBmIABMFaIOAQIECBAgAABAgQIECBAgAABAgQmBQyAk5reIkCAAAECBAgQIECAAAECBAgQIBATMADGChGHAAECBAgQIECAAAECBAgQIECAwKSAAXBS01sECBAgQIAAAQIECBAgQIAAAQIEYgIGwFgh4hAgQIAAAQIECBAgQIAAAQIECBCYFDAATmp6iwABAgQIECBAgAABAgQIECBAgEBMwAAYK0QcAgQIECBAgAABAgQIECBAgAABApMCBsBJTW8RIECAAAECBAgQIECAAAECBAgQiAkYAGOFiEOAAAECBAgQIECAAAECBAgQIEBgUsAAOKnpLQIECBAgQIAAAQIECBAgQIAAAQIxAQNgrBBxCBAgQIAAAQIECBAgQIAAAQIECEwKGAAnNb1FgAABAgQIECBAgAABAgQIECBAICZgAIwVIg4BAgQIECBAgAABAgQIECBAgACBSQED4KSmtwgQIECAAAECBAgQIECAAAECBAjEBAyAsULEIUCAAAECBAgQIECAAAECBAgQIDApYACc1PQWAQIECBAgQIAAAQIECBAgQIAAgZiAATBWiDgECBAgQIAAAQIECBAgQIAAAQIEJgUMgJOa3iJAgAABAgQIECBAgAABAgQIECAQEzAAxgoRhwABAgQIECBAgAABAgQIECBAgMCkgAFwUtNbBAgQIECAAAECBAgQIECAAAECBGICBsBYIeIQIECAAAECBAgQIECAAAECBAgQmBQwAE5qeosAAQIECBAgQIAAAQIECBAgQIBATMAAGCtEHAIECBAgQIAAAQIECBAgQIAAAQKTAgbASU1vESBAgAABAgQIECBAgAABAgQIEIgJGABjhYhDgAABAgQIECBAgAABAgQIECBAYFLAADip6S0CBAgQIECAAAECBAgQIECAAAECMQEDYKwQcQgQIECAAAECBAgQIECAAAECBAhMChgAJzW9RYAAAQIECBAgQIAAAQIECBAgQCAmYACMFSIOAQIECBAgQIAAAQIECBAgQIAAgUkBA+CkprcIECBAgAABAgQIECBAgAABAgQIxAQMgLFCxCFAgAABAgQIECBAgAABAgQIECAwKWAAnNT0FgECBAgQIECAAAECBAgQIECAAIGYgAEwVog4BAgQIECAAAECBAgQIECAAAECBCYFDICTmt4iQIAAAQIECBAgQIAAAQIECBAgEBMwAMYKEYcAAQIECBAgQIAAAQIECBAgQIDApIABcFLTWwQIECBAgAABAgQIECBAgAABAgRiAgbAWCHiECBAgAABAgQIECBAgAABAgQIEJgUMABOanqLAAECBAgQIECAAAECBAgQIECAQEzAABgrRBwCBAgQIECAAAECBAgQIECAAAECkwIGwElNbxEgQIAAAQIECBAgQIAAAQIECBCICRgAY4WIQ4AAAQIECBAgQIAAAQIECBAgQGBSwAA4qektAgQIECBAgAABAgQIECBAgAABAjEBA2CsEHEIECBAgAABAgQIECBAgAABAgQITAoYACc1vUWAAAECBAgQIECAAAECBAgQIEAgJmAAjBUiDgECBAgQIECAAAECBAgQIECAAIFJAQPgpKa3CBAgQIAAAQIECBAgQIAAAQIECMQEDICxQsQhQIAAAQIECBAgQIAAAQIECBAgMClgAJzU9BYBAgQIECBAgAABAgQIECBAgACBmIABMFaIOAQIECBAgAABAgQIECBAgAABAgQmBQyAk5reIkCAAAECBAgQIECAAAECBAgQIBATMADGChGHAAECBAgQIECAAAECBAgQIECAwKSAAXBS01sECBAgQIAAAQIECBAgQIAAAQIEYgIGwFgh4hAgQIAAAQIECBAgQIAAAQIECBCYFDAATmp6iwABAgQIECBAgAABAgQIECBAgEBMwAAYK0QcAgQIECBAgAABAgQIECBAgAABApMCBsBJTW8RIECAAAECBAgQIECAAAECBAgQiAkYAGOFiEOAAAECBAgQIECAAAECBAgQIEBgUsAAOKnpLQIECBAgQIAAAQIECBAgQIAAAQIxAQNgrBBxCBAgQIAAAQIECBAgQIAAAQIECEwKGAAnNb1FgAABAgQIECBAgAABAgQIECBAICZgAIwVIg4BAgQIECBAgAABAgQIECBAgACBSQED4KSmtwgQIECAAAECBAgQIECAAAECBAjEBAyAsULEIUCAAAECBAgQIECAAAECBAgQIDApYACc1PQWAQIECBAgQIAAAQIECBAgQIAAgZiAATBWiDgECBAgQIAAAQIECBAgQIAAAQIEJgUMgJOa3iJAgAABAgQIECBAgAABAgQIECAQEzAAxgoRhwABAgQIECBAgAABAgQIECBAgMCkgAFwUtNbBAgQIECAAAECBAgQIECAAAECBGICBsBYIeIQIECAAAECBAgQIECAAAECBAgQmBQwAE5qeosAAQIECBAgQIAAAQIECBAgQIBATMAAGCtEHAIECBAgQIAAAQIECBAgQIAAAQKTAgbASU1vESBAgAABAgQIECBAgAABAgQIEIgJGABjhYhDgAABAgQIECBAgAABAgQIECBAYFLAADip6S0CBAgQIECAAAECBAgQIECAAAECMQEDYKwQcQgQIECAAAECBAgQIECAAAECBAhMChgAJzW9RYAAAQIECBAgQIAAAQIECBAgQCAmYACMFSIOAQIECBAgQIAAAQIECBAgQIAAgUkBA+CkprcIECBAgAABAgQIECBAgAABAgQIxAQMgLFCxCFAgAABAgQIECBAgAABAgQIECAwKWAAnNT0FgECBAgQIECAAAECBAgQIECAAIGYgAEwVog4BAgQIECAAAECBAgQIECAAAECBCYFDICTmt4iQIAAAQIECBAgQIAAAQIECBAgEBMwAMYKEYcAAQIECBAgQIAAAQIECBAgQIDApIABcFLTWwQIECBAgAABAgQIECBAgAABAgRiAgbAWCHiECBAgAABAgQIECBAgAABAgQIEJgUMABOanqLAAECBAgQIECAAAECBAgQIECAQEzAABgrRBwCBAgQIECAAAECBAgQIECAAAECkwIGwElNbxEgQIAAAQIECBAgQIAAAQIECBCICRgAY4WIQ4AAAQIECBAgQIAAAQIECBAgQGBS4AGIxWeEkTvsCAAAAABJRU5ErkJggg==\" width=\"640\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"frames = render_policy_net(\"./my_policy_net_basic.ckpt\", action, X)\n",
|
||
"video = plot_animation(frames)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Looks like it learned the policy correctly. Now let's see if it can learn a better policy on its own."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Policy Gradients"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"To train this neural network we will need to define the target probabilities `y`. If an action is good we should increase its probability, and conversely if it is bad we should reduce it. But how do we know whether an action is good or bad? The problem is that most actions have delayed effects, so when you win or lose points in a game, it is not clear which actions contributed to this result: was it just the last action? Or the last 10? Or just one action 50 steps earlier? This is called the _credit assignment problem_.\n",
|
||
"\n",
|
||
"The _Policy Gradients_ algorithm tackles this problem by first playing multiple games, then making the actions in good games slightly more likely, while actions in bad games are made slightly less likely. First we play, then we go back and think about what we did."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 42,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import tensorflow as tf\n",
|
||
"\n",
|
||
"reset_graph()\n",
|
||
"\n",
|
||
"n_inputs = 4\n",
|
||
"n_hidden = 4\n",
|
||
"n_outputs = 1\n",
|
||
"\n",
|
||
"learning_rate = 0.01\n",
|
||
"\n",
|
||
"initializer = tf.contrib.layers.variance_scaling_initializer()\n",
|
||
"\n",
|
||
"X = tf.placeholder(tf.float32, shape=[None, n_inputs])\n",
|
||
"\n",
|
||
"hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)\n",
|
||
"logits = tf.layers.dense(hidden, n_outputs)\n",
|
||
"outputs = tf.nn.sigmoid(logits) # probability of action 0 (left)\n",
|
||
"p_left_and_right = tf.concat(axis=1, values=[outputs, 1 - outputs])\n",
|
||
"action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)\n",
|
||
"\n",
|
||
"y = 1. - tf.to_float(action)\n",
|
||
"cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)\n",
|
||
"optimizer = tf.train.AdamOptimizer(learning_rate)\n",
|
||
"grads_and_vars = optimizer.compute_gradients(cross_entropy)\n",
|
||
"gradients = [grad for grad, variable in grads_and_vars]\n",
|
||
"gradient_placeholders = []\n",
|
||
"grads_and_vars_feed = []\n",
|
||
"for grad, variable in grads_and_vars:\n",
|
||
" gradient_placeholder = tf.placeholder(tf.float32, shape=grad.get_shape())\n",
|
||
" gradient_placeholders.append(gradient_placeholder)\n",
|
||
" grads_and_vars_feed.append((gradient_placeholder, variable))\n",
|
||
"training_op = optimizer.apply_gradients(grads_and_vars_feed)\n",
|
||
"\n",
|
||
"init = tf.global_variables_initializer()\n",
|
||
"saver = tf.train.Saver()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def discount_rewards(rewards, discount_rate):\n",
|
||
" discounted_rewards = np.zeros(len(rewards))\n",
|
||
" cumulative_rewards = 0\n",
|
||
" for step in reversed(range(len(rewards))):\n",
|
||
" cumulative_rewards = rewards[step] + cumulative_rewards * discount_rate\n",
|
||
" discounted_rewards[step] = cumulative_rewards\n",
|
||
" return discounted_rewards\n",
|
||
"\n",
|
||
"def discount_and_normalize_rewards(all_rewards, discount_rate):\n",
|
||
" all_discounted_rewards = [discount_rewards(rewards, discount_rate) for rewards in all_rewards]\n",
|
||
" flat_rewards = np.concatenate(all_discounted_rewards)\n",
|
||
" reward_mean = flat_rewards.mean()\n",
|
||
" reward_std = flat_rewards.std()\n",
|
||
" return [(discounted_rewards - reward_mean)/reward_std for discounted_rewards in all_discounted_rewards]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([-22., -40., -50.])"
|
||
]
|
||
},
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"discount_rewards([10, 0, -50], discount_rate=0.8)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 45,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[array([-0.28435071, -0.86597718, -1.18910299]),\n",
|
||
" array([ 1.26665318, 1.0727777 ])]"
|
||
]
|
||
},
|
||
"execution_count": 45,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"discount_and_normalize_rewards([[10, 0, -50], [10, 20]], discount_rate=0.8)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 46,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Iteration: 249"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"env = gym.make(\"CartPole-v0\")\n",
|
||
"\n",
|
||
"n_games_per_update = 10\n",
|
||
"n_max_steps = 1000\n",
|
||
"n_iterations = 250\n",
|
||
"save_iterations = 10\n",
|
||
"discount_rate = 0.95\n",
|
||
"\n",
|
||
"with tf.Session() as sess:\n",
|
||
" init.run()\n",
|
||
" for iteration in range(n_iterations):\n",
|
||
" print(\"\\rIteration: {}\".format(iteration), end=\"\")\n",
|
||
" all_rewards = []\n",
|
||
" all_gradients = []\n",
|
||
" for game in range(n_games_per_update):\n",
|
||
" current_rewards = []\n",
|
||
" current_gradients = []\n",
|
||
" obs = env.reset()\n",
|
||
" for step in range(n_max_steps):\n",
|
||
" action_val, gradients_val = sess.run([action, gradients], feed_dict={X: obs.reshape(1, n_inputs)})\n",
|
||
" obs, reward, done, info = env.step(action_val[0][0])\n",
|
||
" current_rewards.append(reward)\n",
|
||
" current_gradients.append(gradients_val)\n",
|
||
" if done:\n",
|
||
" break\n",
|
||
" all_rewards.append(current_rewards)\n",
|
||
" all_gradients.append(current_gradients)\n",
|
||
"\n",
|
||
" all_rewards = discount_and_normalize_rewards(all_rewards, discount_rate=discount_rate)\n",
|
||
" feed_dict = {}\n",
|
||
" for var_index, gradient_placeholder in enumerate(gradient_placeholders):\n",
|
||
" mean_gradients = np.mean([reward * all_gradients[game_index][step][var_index]\n",
|
||
" for game_index, rewards in enumerate(all_rewards)\n",
|
||
" for step, reward in enumerate(rewards)], axis=0)\n",
|
||
" feed_dict[gradient_placeholder] = mean_gradients\n",
|
||
" sess.run(training_op, feed_dict=feed_dict)\n",
|
||
" if iteration % save_iterations == 0:\n",
|
||
" saver.save(sess, \"./my_policy_net_pg.ckpt\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 47,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"env.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 48,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"INFO:tensorflow:Restoring parameters from ./my_policy_net_pg.ckpt\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAgAElEQVR4Xuzd0a0sSXqd0RkzaAdpBu0YujFuzNhBMyg7aEYLZFOQAFVFdedE9R8nvsUXPtyuzNhrBwRoIw/45z/5HwIECBAgQIAAAQIECBAgQIAAAQIErhX487XJBCNAgAABAgQIECBAgAABAgQIECBA4E8GQJeAAAECBAgQIECAAAECBAgQIECAwMUCBsCLyxWNAAECBAgQIECAAAECBAgQIECAgAHQHSBAgAABAgQIECBAgAABAgQIECBwsYAB8OJyRSNAgAABAgQIECBAgAABAgQIECBgAHQHCBAgQIAAAQIECBAgQIAAAQIECFwsYAC8uFzRCBAgQIAAAQIECBAgQIAAAQIECBgA3QECBAgQIECAAAECBAgQIECAAAECFwsYAC8uVzQCBAgQIECAAAECBAgQIECAAAECBkB3gAABAgQIECBAgAABAgQIECBAgMDFAgbAi8sVjQABAgQIECBAgAABAgQIECBAgIAB0B0gQIAAAQIECBAgQIAAAQIECBAgcLGAAfDickUjQIAAAQIECBAgQIAAAQIECBAgYAB0BwgQIECAAAECBAgQIECAAAECBAhcLGAAvLhc0QgQIECAAAECBAgQIECAAAECBAgYAN0BAgQIECBAgAABAgQIECBAgAABAhcLGAAvLlc0AgQIECBAgAABAgQIECBAgAABAgZAd4AAAQIECBAgQIAAAQIECBAgQIDAxQIGwIvLFY0AAQIECBAgQIAAAQIECBAgQICAAdAdIECAAAECBAgQIECAAAECBAgQIHCxgAHw4nJFI0CAAAECBAgQIECAAAECBAgQIGAAdAcIECBAgAABAgQIECBAgAABAgQIXCxgALy4XNEIECBAgAABAgQIECBAgAABAgQIGADdAQIECBAgQIAAAQIECBAgQIAAAQIXCxgALy5XNAIECBAgQIAAAQIECBAgQIAAAQIGQHeAAAECBAgQIECAAAECBAgQIECAwMUCBsCLyxWNAAECBAgQIECAAAECBAgQIECAgAHQHSBAgAABAgQIECBAgAABAgQIECBwsYAB8OJyRSNAgAABAgQIECBAgAABAgQIECBgAHQHCBAgQIAAAQIECBAgQIAAAQIECFwsYAC8uFzRCBAgQIAAAQIECBAgQIAAAQIECBgA3QECBAgQIECAAAECBAgQIECAAAECFwsYAC8uVzQCBAgQIECAAAECBAgQIECAAAECBkB3gAABAgQIECBAgAABAgQIECBAgMDFAgbAi8sVjQABAgQIECBAgAABAgQIECBAgIAB0B0gQIAAAQIECBAgQIAAAQIECBAgcLGAAfDickUjQIAAAQIECBAgQIAAAQIECBAgYAB0BwgQIECAAAECBAgQIECAAAECBAhcLGAAvLhc0QgQIECAAAECBAgQIECAAAECBAgYAN0BAgQIECBAgAABAgQIECBAgAABAhcLGAAvLlc0AgQIECBAgAABAgQIECBAgAABAgZAd4AAAQIECBAgQIAAAQIECBAgQIDAxQIGwIvLFY0AAQIECBAgQIAAAQIECBAgQICAAdAdIECAAAECBAgQIECAAAECBAgQIHCxgAHw4nJFI0CAAAECBAgQIECAAAECBAgQIGAAdAcIECBAgAABAgQIECBAgAABAgQIXCxgALy4XNEIECBAgAABAgQIECBAgAABAgQIGADdAQIECBAgQIAAAQIECBAgQIAAAQIXCxgALy5XNAIECBAgQIAAAQIECBAgQIAAAQIGQHeAAAECBAgQIECAAAECBAgQIECAwMUCBsCLyxWNAAECBAgQIECAAAECBAgQIECAgAHQHSBAgAABAgQIECBAgAABAgQIECBwsYAB8OJyRSNAgAABAgQIECBAgAABAgQIECBgAHQHCBAgQIAAAQIECBAgQIAAAQIECFwsYAC8uFzRCBAgQIAAAQIECBAgQIAAAQIECBgA3QECBAgQIECAAAECBAgQIECAAAECFwsYAC8uVzQCBAgQIECAAAECBAgQIECAAAECBkB3gAABAgQIECBAgAABAgQIECBAgMDFAgbAi8sVjQABAgQIECBAgAABAgQIECBAgIAB0B0gQIAAAQIECBAgQIAAAQIECBAgcLGAAfDickUjQIAAAQIECBAgQIAAAQIECBAgYAB0BwgQIECAAAECBAgQIECAAAECBAhcLGAAvLhc0QgQIECAAAECBAgQIECAAAECBAgYAN0BAgQIECBAgAABAgQIECBAgAABAhcLGAAvLlc0AgQIECBAgAABAgQIECBAgAABAgZAd4AAAQIECBAgQIAAAQIECBAgQIDAxQIGwIvLFY0AAQIECBAgQIAAAQIECBAgQICAAdAdIECAAAECBAgQIECAAAECBAgQIHCxgAHw4nJFI0CAAAECBAgQIECAAAECBAgQIGAAdAcIECBAgAABAgQIECBAgAABAgQIXCxgALy4XNEIECBAgAABAgQIECBAgAABAgQIGADdAQIECBAgQIAAAQIECBAgQIAAAQIXCxgALy5XNAIECBAgQIAAAQIECBAgQIAAAQIGQHeAAAECBAgQIECAAAECBAgQIECAwMUCBsCLyxWNAAECBAgQIECAAAECBAgQIECAgAHQHSBAgAABAgQIECBAgAABAgQIECBwsYAB8OJyRSNAgAABAgQIECBAgAABAgQIECBgAHQHCBAgQIAAAQIECBAgQIAAAQIECFwsYAC8uFzRCBAgQIAAAQIECBAgQIAAAQIECBgA3QECBAgQIECAAAECBAgQIECAAAECFwsYAC8uVzQCBAgQIECAAAECBAgQIECAAAECBkB3gAABAgQIECBAgAABAgQIECBAgMDFAgbAi8sVjQABAgQIECBAgAABAgQIECBAgIAB0B0gQIAAAQIECBAgQIAAAQIECBAgcLGAAfDickUjQIAAAQIECBAgQIAAAQIECBAgYAB0BwgQIECAAAECBAgQIECAAAECBAhcLGAAvLhc0QgQIECAAAECBAgQIECAAAECBAgYAN0BAgQIECBAgAABAgQIECBAgAABAhcLGAAvLlc0AgQIECBAgAABAgQIECBAgAABAgZAd4AAAQIECBAgQIAAAQIECBAgQIDAxQIGwIvLFY0AAQIECBAgQIAAAQIECBAgQICAAdAdIECAAAECBAgQIECAAAECBAgQIHCxgAHw4nJFI0CAAAECBAgQIECAAAECBAgQIGAAdAcIECBAgAABAgQIECBAgAABAgQIXCxgALy4XNEIECBAgAABAgQIECBAgAABAgQIGADdAQIECBAgQIAAAQIECBAgQIAAAQIXCxgALy5XNAIECBAgQIAAAQIECBAgQIAAAQIGQHeAAAECBAgQIECAAAECBAgQIECAwMUCBsCLyxWNAAECBAgQIECAAAECBAgQIECAgAHQHSBAgAABAgQIECBAgAABAgQIECBwsYAB8OJyRSNAgAABAgQIECBAgAABAgQIECBgAHQHCBAgQIAAAQIECBAgQIAAAQIECFwsYAC8uFzRCBAgQIAAAQIECBAgQIAAAQIECBgA3QECBAgQIECAAAECBAgQIECAAAECFwsYAC8uVzQCBAgQIECAAAECBAgQIECAAAECBkB3gAABAgQIECBAgAABAgQIECBAgMDFAgbAi8sVjQABAgQIECBAgAABAgQIECBAgIAB0B0gQIAAAQIECBAgQIAAAQIECBAgcLGAAfDickUjQIAAAQIECBAgQIAAAQIECBAgYAB0BwgQIECAAAECBAgQIECAAAECBAhcLGAAvLhc0QgQIECAAAECBAgQIECAAAECBAgYAN0BAgQIECBAgAABAgQIECBAgAABAhcLGAAvLlc0AgQIECBAgAABAgQIECBAgAABAgZAd4AAAQIECBAgQIAAAQIECBAgQIDAxQIGwIvLFY0AAQIECBAgQIAAAQIECBAgQICAAdAdIECAAAECBAgQIECAAAECBAgQIHCxgAHw4nJFI0CAAAECBAgQIECAAAECBAgQIGAAdAcIECBAgAABAgQIECBAgAABAgQIXCxgALy4XNEIECBAgAABAgQIECBAgAABAgQIGADdAQIECBAgQIAAAQIECBAgQIAAAQIXCxgALy5XNAIECBAgQIAAAQIECBAgQIAAAQIGQHeAAAECBAgQIECAAAECBAgQIECAwMUCBsCLyxWNAAECBAgQIECAAAECBAgQIECAgAHQHSBAgAABAgQIECBAgAABAgQIECBwsYAB8OJyRSNAgAABAgQIECBAgAABAgQIECBgAHQHCBAgQIAAAQIECBAgQIAAAQIECFwsYAC8uFzRCBAgQIAAAQIECBAgQIAAAQIECBgA3QECBAgQIECAAAECBAgQIECAAAECFwsYAC8uVzQCBAgQIECAAAECBAgQIECAAAECBkB3gAABAgQIECBAgAABAgQIECBAgMDFAgbAi8sVjQABAgQIECBAgAABAgQIECBAgIAB0B0gQIAAAQIECBAgQIAAAQIECBAgcLGAAfDickUjQIAAAQIECBAgQIAAAQIECBAgYAB0BwgQIECAAAECBAgQIECAAAECBAhcLGAAvLhc0QgQIECAAAECBAgQIECAAAECBAgYAN0BAgQIECBAgAABAgQIECBAgAABAhcLGAAvLlc0AgQIECBAgAABAgQIECBAgAABAgZAd4AAAQIECBAgQIAAAQIECBAgQIDAxQIGwIvLFY0AAQIECBAgQIAAAQIECBAgQICAAdAdIECAAAECBAgQIECAAAECBAgQIHCxgAHw4nJFI0CAAAECBAgQIECAAAECBAgQIGAAdAcIECBAgAABAgQIECBAgAABAgQIXCxgALy4XNEIECBAgAABAgQIECBAgAABAgQIGADdAQIECBAgQIAAAQIECBAgQIAAAQIXCxgALy5XNAIECBAgQIAAAQIECBAgQIAAAQIGQHeAAAECBAgQIECAAAECBAgQIECAwMUCBsCLyxWNAAECBAgQIECAAAECBAgQIECAgAHQHSBAgAABAgQIECBAgAABAgQIECBwsYAB8OJyRSNAgAABAgQIECBAgAABAgQIECBgAHQHCBAgQIAAAQIECBAgQIAAAQIECFwsYAC8uFzRCBAgQIAAAQIECBAgQIAAAQIECBgA3QECBAgQIECAAAECBAgQIECAAAECFwsYAC8uVzQCBAgQIECAAAECBAgQIECAAAECBkB3YFTgl19++WX0AF5OgAABAgQIECBAgAABAgQCAn/+859tQIGe30VUfrj8E6IbAE9owRkIECBAgAABAgQIECBA4HYBA+DtDa/zGQDb/Y+nNwCOV+AABAgQIECAAAECBAgQIBAQMAAGSl5ENAC2+x9PbwAcr8ABCBAgQIAAAQIECBAgQCAgYAAMlGwAbJd8cnoD4MntOBsBAgQIECBAgAABAgQI3CJgALylyWc5fAH4zM2vNgkYADdBegwBAgQIECBAgAABAgQIEFgIGADb18MA2O5/PL0BcLwCByBAgAABAgQIECBAgACBgIABMFDyagBux5d+WsAAON2A9xMgQIAAAQIECBAgQIBAQcAAWGj5fUZfALb7H09vAByvwAEIECBAgAABAgQIECBAICBgAAyUvIhoAGz3P57eADhegQMQIECAAAECBAgQIECAQEDAABgo2QDYLvnk9AbAk9txNgIECBAgQIAAAQIECBC4RcAAeEuTz3L4AvCZm19tEjAAboL0GAIECBAgQIAAAQIECBAgsBAwALavhwGw3f94egPgeAUOQIAAAQIECBAgQIAAAQIBAQNgoOTVANyOL/20gAFwugHvJ0CAAAECBAgQIECAAIGCgAGw0PL7jL4AbPc/nt4AOF6BAxAgQIAAAQIECBAgQIBAQMAAGCh5EdEA2O5/PL0BcLwCByBAgAABAgQIECBAgACBgIABMFCyAbBd8snpDYAnt+NsBAgQIECAAAECBAgQIHCL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NwECBAgQIECAQFXAAFht/tfc/gS43f94egPgeAUOEBUwAEaLF5sAAQIECBAgQCArYADMVm8AbFd/RnoD4Bk9OEVPwADY61xiAgQIECBAgACBtoABMN5/O7700wIGwOkGvL8qYACsNi83AQIECBAgQIBAVcAAWG3+19z+BLjd/3h6A+B4BQ4QFTAARosXmwABAgQIECBAICtgAMxWbwBsV39GegPgGT04RU/AANjrXGICBAgQIECAAIG2gAEw3n87vvTTAgbA6Qa8vypgAKw2LzcBAgQIECBAgEBVwABYbf7X3P4EuN3/eHoD4HgFDhAVMABGixebAAECBAgQIEAgK2AAzFZvAGxXf0Z6A+AZPThFT8AA2OtcYgIECBAgQIAAgbaAATDefzu+9NMCBsDpBry/KmAArDYvNwECBAgQIECAQFXAAFht/tfc/gS43f94egPgeAUOEBUwAEaLF5sAAQIECBAgQCArYADMVm8AbFd/RnoD4Bk9OEVPwADY61xiAgQIECBAgACBtoABMN5/O7700wIGwOkGvL8qYACsNi83AQIECBAgQIBAVcAAWG3+19z+BLjd/3h6A+B4BQ4QFTAARosXmwABAgQIECBAICtgAMxWbwBsV39GegPgGT04RU/AANjrXGICBAgQIECAAIG2gAEw3n87vvTTAgbA6Qa8vypgAKw2LzcBAgQIECBAgEBVwABYbf7X3P4EuN3/eHoD4HgFDhAVMABGixebAAECBAgQIEAgK2AAzFZvAGxXf0Z6A+AZPThFT8AA2OtcYgIECBAgQIAAgbaAATDefzu+9NMCBsDpBry/KmAArDYvNwECBAgQIECAQFXAAFht/tfc/gS43f94egPgeAUOEBUwAEaLF5sAAQIECBAgQCArYADMVm8AbFd/RnoD4Bk9OEVPwADY61xiAgQIECBAgACBtoABMN5/O7700wIGwOkGvL8qYACsNi83AQIECBAgQIBAVcAAWG3+19z+BLjd/3h6A+B4BQ4QFTAARosXmwABAgQIECBAICtgAMxWbwBsV39GegPgGT04RVfgHx0C//kvf+viSU6AAAECBAgQIEDgBwkYAH9QWV84qi8Av4Dqkb9dwAD42638lwS+IWAA/IaqZxIgQIAAAQIECBA4T8AAeF4nf+SJDIB/pLZ3/X8CBkCXgsCsgAFw1t/bCRAgQIAAAQIE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lHwagNvxpV8LGADXDfh9AgQIECBAgAABAgQIECgIGAALLf/P6AVgu/95egPgvAIHECBAgAABAgQIECBAgEBAwAAYKPkQ0QDY7n+e3gA4r8ABBAgQIECAAAECBAgQIBAQMAAGSjYAtkuWngABAgQIECBAgAABAgQIECBAoCvgBWC3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl0BA2C3e8kJECBAgAABAgQIECBAgAABAgQCAgbAQMkiEiBAgAABAgQIECBAgAABAgQIdAUMgN3uJSdAgAABAgQIECBAgAABAgQIEAgIGAADJYtIgAABAgQIECBAgAABAgQIECDQFTAAdruXnAABAgQIECBAgAABAgQIECBAICBgAAyULCIBAgQIECBAgAABAgQIECBAgEBXwADY7V5yAgQIECBAgAABAgQIECBAgACBgIABMFCyiAQIECBAgAABAgQIECBAgAABAl2BH3BdaoRT8D9UAAAAAElFTkSuQmCC\" width=\"640\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"frames = render_policy_net(\"./my_policy_net_pg.ckpt\", action, X, n_max_steps=1000)\n",
|
||
"video = plot_animation(frames)\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Markov Chains"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 49,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"States: 0 0 3 \n",
|
||
"States: 0 1 2 1 2 1 2 1 2 1 3 \n",
|
||
"States: 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 3 \n",
|
||
"States: 0 3 \n",
|
||
"States: 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 3 \n",
|
||
"States: 0 1 3 \n",
|
||
"States: 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...\n",
|
||
"States: 0 0 3 \n",
|
||
"States: 0 0 0 1 2 1 2 1 3 \n",
|
||
"States: 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 3 \n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"transition_probabilities = [\n",
|
||
" [0.7, 0.2, 0.0, 0.1], # from s0 to s0, s1, s2, s3\n",
|
||
" [0.0, 0.0, 0.9, 0.1], # from s1 to ...\n",
|
||
" [0.0, 1.0, 0.0, 0.0], # from s2 to ...\n",
|
||
" [0.0, 0.0, 0.0, 1.0], # from s3 to ...\n",
|
||
" ]\n",
|
||
"\n",
|
||
"n_max_steps = 50\n",
|
||
"\n",
|
||
"def print_sequence(start_state=0):\n",
|
||
" current_state = start_state\n",
|
||
" print(\"States:\", end=\" \")\n",
|
||
" for step in range(n_max_steps):\n",
|
||
" print(current_state, end=\" \")\n",
|
||
" if current_state == 3:\n",
|
||
" break\n",
|
||
" current_state = np.random.choice(range(4), p=transition_probabilities[current_state])\n",
|
||
" else:\n",
|
||
" print(\"...\", end=\"\")\n",
|
||
" print()\n",
|
||
"\n",
|
||
"for _ in range(10):\n",
|
||
" print_sequence()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Markov Decision Process"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"policy_fire\n",
|
||
"States (+rewards): 0 (10) 0 (10) 0 1 (-50) 2 2 2 (40) 0 (10) 0 (10) 0 (10) ... Total rewards = 210\n",
|
||
"States (+rewards): 0 1 (-50) 2 (40) 0 (10) 0 (10) 0 1 (-50) 2 2 (40) 0 (10) ... Total rewards = 70\n",
|
||
"States (+rewards): 0 (10) 0 1 (-50) 2 (40) 0 (10) 0 (10) 0 (10) 0 (10) 0 (10) 0 (10) ... Total rewards = 70\n",
|
||
"States (+rewards): 0 1 (-50) 2 1 (-50) 2 (40) 0 (10) 0 1 (-50) 2 (40) 0 ... Total rewards = -10\n",
|
||
"States (+rewards): 0 1 (-50) 2 (40) 0 (10) 0 (10) 0 1 (-50) 2 (40) 0 (10) 0 (10) ... Total rewards = 290\n",
|
||
"Summary: mean=121.1, std=129.333766, min=-330, max=470\n",
|
||
"\n",
|
||
"policy_random\n",
|
||
"States (+rewards): 0 1 (-50) 2 1 (-50) 2 (40) 0 1 (-50) 2 2 (40) 0 ... Total rewards = -60\n",
|
||
"States (+rewards): 0 (10) 0 0 0 0 0 (10) 0 0 0 (10) 0 ... Total rewards = -30\n",
|
||
"States (+rewards): 0 1 1 (-50) 2 (40) 0 0 1 1 1 1 ... Total rewards = 10\n",
|
||
"States (+rewards): 0 (10) 0 (10) 0 0 0 0 1 (-50) 2 (40) 0 0 ... Total rewards = 0\n",
|
||
"States (+rewards): 0 0 (10) 0 1 (-50) 2 (40) 0 0 0 0 (10) 0 (10) ... Total rewards = 40\n",
|
||
"Summary: mean=-22.1, std=88.152740, min=-380, max=200\n",
|
||
"\n",
|
||
"policy_safe\n",
|
||
"States (+rewards): 0 1 1 1 1 1 1 1 1 1 ... Total rewards = 0\n",
|
||
"States (+rewards): 0 1 1 1 1 1 1 1 1 1 ... Total rewards = 0\n",
|
||
"States (+rewards): 0 (10) 0 (10) 0 (10) 0 1 1 1 1 1 1 ... Total rewards = 30\n",
|
||
"States (+rewards): 0 (10) 0 1 1 1 1 1 1 1 1 ... Total rewards = 10\n",
|
||
"States (+rewards): 0 1 1 1 1 1 1 1 1 1 ... Total rewards = 0\n",
|
||
"Summary: mean=22.3, std=26.244312, min=0, max=170\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"transition_probabilities = [\n",
|
||
" [[0.7, 0.3, 0.0], [1.0, 0.0, 0.0], [0.8, 0.2, 0.0]], # in s0, if action a0 then proba 0.7 to state s0 and 0.3 to state s1, etc.\n",
|
||
" [[0.0, 1.0, 0.0], None, [0.0, 0.0, 1.0]],\n",
|
||
" [None, [0.8, 0.1, 0.1], None],\n",
|
||
" ]\n",
|
||
"\n",
|
||
"rewards = [\n",
|
||
" [[+10, 0, 0], [0, 0, 0], [0, 0, 0]],\n",
|
||
" [[0, 0, 0], [0, 0, 0], [0, 0, -50]],\n",
|
||
" [[0, 0, 0], [+40, 0, 0], [0, 0, 0]],\n",
|
||
" ]\n",
|
||
"\n",
|
||
"possible_actions = [[0, 1, 2], [0, 2], [1]]\n",
|
||
"\n",
|
||
"def policy_fire(state):\n",
|
||
" return [0, 2, 1][state]\n",
|
||
"\n",
|
||
"def policy_random(state):\n",
|
||
" return np.random.choice(possible_actions[state])\n",
|
||
"\n",
|
||
"def policy_safe(state):\n",
|
||
" return [0, 0, 1][state]\n",
|
||
"\n",
|
||
"class MDPEnvironment(object):\n",
|
||
" def __init__(self, start_state=0):\n",
|
||
" self.start_state=start_state\n",
|
||
" self.reset()\n",
|
||
" def reset(self):\n",
|
||
" self.total_rewards = 0\n",
|
||
" self.state = self.start_state\n",
|
||
" def step(self, action):\n",
|
||
" next_state = np.random.choice(range(3), p=transition_probabilities[self.state][action])\n",
|
||
" reward = rewards[self.state][action][next_state]\n",
|
||
" self.state = next_state\n",
|
||
" self.total_rewards += reward\n",
|
||
" return self.state, reward\n",
|
||
"\n",
|
||
"def run_episode(policy, n_steps, start_state=0, display=True):\n",
|
||
" env = MDPEnvironment()\n",
|
||
" if display:\n",
|
||
" print(\"States (+rewards):\", end=\" \")\n",
|
||
" for step in range(n_steps):\n",
|
||
" if display:\n",
|
||
" if step == 10:\n",
|
||
" print(\"...\", end=\" \")\n",
|
||
" elif step < 10:\n",
|
||
" print(env.state, end=\" \")\n",
|
||
" action = policy(env.state)\n",
|
||
" state, reward = env.step(action)\n",
|
||
" if display and step < 10:\n",
|
||
" if reward:\n",
|
||
" print(\"({})\".format(reward), end=\" \")\n",
|
||
" if display:\n",
|
||
" print(\"Total rewards =\", env.total_rewards)\n",
|
||
" return env.total_rewards\n",
|
||
"\n",
|
||
"for policy in (policy_fire, policy_random, policy_safe):\n",
|
||
" all_totals = []\n",
|
||
" print(policy.__name__)\n",
|
||
" for episode in range(1000):\n",
|
||
" all_totals.append(run_episode(policy, n_steps=100, display=(episode<5)))\n",
|
||
" print(\"Summary: mean={:.1f}, std={:1f}, min={}, max={}\".format(np.mean(all_totals), np.std(all_totals), np.min(all_totals), np.max(all_totals)))\n",
|
||
" print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Q-Learning"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Q-Learning works by watching an agent play (e.g., randomly) and gradually improving its estimates of the Q-Values. Once it has accurate Q-Value estimates (or close enough), then the optimal policy consists in choosing the action that has the highest Q-Value (i.e., the greedy policy)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 51,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"n_states = 3\n",
|
||
"n_actions = 3\n",
|
||
"n_steps = 20000\n",
|
||
"alpha = 0.01\n",
|
||
"gamma = 0.99\n",
|
||
"exploration_policy = policy_random\n",
|
||
"q_values = np.full((n_states, n_actions), -np.inf)\n",
|
||
"for state, actions in enumerate(possible_actions):\n",
|
||
" q_values[state][actions]=0\n",
|
||
"\n",
|
||
"env = MDPEnvironment()\n",
|
||
"for step in range(n_steps):\n",
|
||
" action = exploration_policy(env.state)\n",
|
||
" state = env.state\n",
|
||
" next_state, reward = env.step(action)\n",
|
||
" next_value = np.max(q_values[next_state]) # greedy policy\n",
|
||
" q_values[state, action] = (1-alpha)*q_values[state, action] + alpha*(reward + gamma * next_value)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 52,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def optimal_policy(state):\n",
|
||
" return np.argmax(q_values[state])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 53,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 39.13508139, 38.88079412, 35.23025716],\n",
|
||
" [ 18.9117071 , -inf, 20.54567816],\n",
|
||
" [ -inf, 72.53192111, -inf]])"
|
||
]
|
||
},
|
||
"execution_count": 53,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"q_values"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 54,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"States (+rewards): 0 (10) 0 (10) 0 1 (-50) 2 (40) 0 (10) 0 1 (-50) 2 (40) 0 (10) ... Total rewards = 230\n",
|
||
"States (+rewards): 0 (10) 0 (10) 0 (10) 0 1 (-50) 2 2 1 (-50) 2 (40) 0 (10) ... Total rewards = 90\n",
|
||
"States (+rewards): 0 1 (-50) 2 (40) 0 (10) 0 (10) 0 (10) 0 (10) 0 (10) 0 (10) 0 (10) ... Total rewards = 170\n",
|
||
"States (+rewards): 0 1 (-50) 2 (40) 0 (10) 0 (10) 0 (10) 0 (10) 0 (10) 0 (10) 0 (10) ... Total rewards = 220\n",
|
||
"States (+rewards): 0 1 (-50) 2 (40) 0 (10) 0 1 (-50) 2 (40) 0 (10) 0 (10) 0 (10) ... Total rewards = -50\n",
|
||
"Summary: mean=125.6, std=127.363464, min=-290, max=500\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"all_totals = []\n",
|
||
"for episode in range(1000):\n",
|
||
" all_totals.append(run_episode(optimal_policy, n_steps=100, display=(episode<5)))\n",
|
||
"print(\"Summary: mean={:.1f}, std={:1f}, min={}, max={}\".format(np.mean(all_totals), np.std(all_totals), np.min(all_totals), np.max(all_totals)))\n",
|
||
"print()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Learning to Play MsPacman Using the DQN Algorithm"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"**Warning**: Unfortunately, the first version of the book contained two important errors in this section.\n",
|
||
"\n",
|
||
"1. The actor DQN and critic DQN should have been named _online DQN_ and _target DQN_ respectively. Actor-critic algorithms are a distinct class of algorithms.\n",
|
||
"2. The online DQN is the one that learns and is copied to the target DQN at regular intervals. The target DQN's only role is to estimate the next state's Q-Values for each possible action. This is needed to compute the target Q-Values for training the online DQN, as shown in this equation:\n",
|
||
"\n",
|
||
"$y(s,a) = \\text{r} + \\gamma . \\underset{a'}{\\max} \\, Q_\\text{target}(s', a')$\n",
|
||
"\n",
|
||
"* $y(s,a)$ is the target Q-Value to train the online DQN for the state-action pair $(s, a)$.\n",
|
||
"* $r$ is the reward actually collected after playing action $a$ in state $s$.\n",
|
||
"* $\\gamma$ is the discount rate.\n",
|
||
"* $s'$ is the state actually reached after played action $a$ in state $s$.\n",
|
||
"* $a'$ is one of the possible actions in state $s'$.\n",
|
||
"* $Q_\\text{target}(s', a')$ is the target DQN's estimate of the Q-Value of playing action $a'$ while in state $s'$.\n",
|
||
"\n",
|
||
"I hope these errors did not affect you, and if they did, I sincerely apologize."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Creating the MsPacman environment"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 55,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"(210, 160, 3)"
|
||
]
|
||
},
|
||
"execution_count": 55,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"env = gym.make(\"MsPacman-v0\")\n",
|
||
"obs = env.reset()\n",
|
||
"obs.shape"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 56,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Discrete(9)"
|
||
]
|
||
},
|
||
"execution_count": 56,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"env.action_space"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Preprocessing"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Preprocessing the images is optional but greatly speeds up training."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 57,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"mspacman_color = 210 + 164 + 74\n",
|
||
"\n",
|
||
"def preprocess_observation(obs):\n",
|
||
" img = obs[1:176:2, ::2] # crop and downsize\n",
|
||
" img = img.sum(axis=2) # to greyscale\n",
|
||
" img[img==mspacman_color] = 0 # Improve contrast\n",
|
||
" img = (img // 3 - 128).astype(np.int8) # normalize from -128 to 127\n",
|
||
" return img.reshape(88, 80, 1)\n",
|
||
"\n",
|
||
"img = preprocess_observation(obs)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note: the `preprocess_observation()` function is slightly different from the one in the book: instead of representing pixels as 64-bit floats from -1.0 to 1.0, it represents them as 8-bit integers from -128 to 127. The benefit is that the replay memory will take up about 6.5 GB of RAM instead of 52 GB. The reduced precision has no impact on training."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 58,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" fig.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" event.shiftKey = false;\n",
|
||
" // Send a \"J\" for go to next cell\n",
|
||
" event.which = 74;\n",
|
||
" event.keyCode = 74;\n",
|
||
" manager.command_mode();\n",
|
||
" manager.handle_keydown(event);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACJgAAAV4CAYAAADmffVBAAAgAElEQVR4XuydCfh90Vjv3+tWtwElKpWQsYjIECpdM6WQlCHczJIpNMgQGco8l7lQpmQImV0a6EaUynCjFBFRopKm+3y0lvva9rDOPmf/zvnt83mfx8P/d9Zee63Pmo7zftf7/rfQJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkMELgv0lHAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACYwQUmDg/JCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgARGCSgwcYJIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCYwSUGDiBJGABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISGCWgwMQJIgEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQwSkCBiRNEAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSGCUgAITJ4gEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQwCgBBSZOEAlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBUQIKTJwgEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAKjBBSYOEEkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABEYJKDBxgkhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJjBJQYOIEkYAEJLAdgb+IiHOVKr4+Ivj3Sdj/ioinlhf9ckTw79NqvxQRNy2N/+GI4N+HZGtifUhcD70t/zMiXlsa+bqI4N/HaHeKiIdHxH9GxKUj4k3HCME+S2CFBJ4VET8YER+OiAtExN+vsI92SQISkIAEJCABCUhAAhKQgAQkIAEJSEACEtgxAQUmOwZqdRKQwIkQQNBxrYi4RkScNyK+KiK+ICL+JiLeHxGvjojfiIjfP4HWKDDZHrICk+0ZWsPuCSgw+a+99V0RceaIwBl9gxHMfKfESX2p9J+LRcQXlWfeGxHn3nKYzhYR14uIa0fE+SPi7BHxLxHxwYh4T0QgBHrNBiKYc0bEzSLieyKC/33GiPjriHhLRPxKRLygCGu2bPYij39jRFwlIr49Ir4pIr42Ir44Ij5WhI6/U8R69GUTQyjJGF6y/PclIuJMqYJt/r8DbYb31SLiHBHxP8qZ/YaIeFo5uzdp61TZLA7sK/upwou5yfcF5vjrpyqd+Pw85bvJFSPiGyKCOXuWiPhkEXAwTxmT34qI34yIf56oL+9DQ0X/tfSDut8YEU9vXAPni4i3R8TnRcSjI+IOW/bdxyUgAQlIQAISkIAEJCABCUhAAhKQgAQkIIEjILDNj8RHgMcuSkACB0YAR83PRMSti0Nkqnkvj4i7RsQfTxXc4nMFJlvAK48qMNmeoTWME5gjFpnzzNrG4XERcdsisrhwcUb39RExAsI+hChDto3AhO+rt4mIB0bEl05A/sciFJkai5tHxCMj4ktGCr4qIm5cBCxT9Z3U54hKiCjDeLTYcwu7j04U/uqIeFtEnHWi3Nz/7/DTEXHviPj8kfqfWc73j7d0rKHMlMCkr4r/HRE3iYi/aqg/F7lg6R8RQc7Q+CxzlT7ffyT6WYvApO91z46IW0bEFEsioNHffyuCmHc3tt1iEpCABCQgAQlIQAISkIAEJCABCUhAAhKQwJESmPsj8ZHistsSkMAeCVwoIl4WEV+X2oBDhNu6OC65xf41EXG5jpOTv98oIp63UNsVmGwPVoHJ9gytYZzAHLHInGfWNA5EGyF6CYIAInlcZ6RzLU7wuQITvqs+ISJukd5PKo/fTcIPIpl8c4ni0SIwIYrGkzv1EfmE6B9EAyGCR7U/iohvi4hPHMjg/mQR2tTmkLqINjJWfxcRX1GimvDf1f4kIr4zIj4y0gfG+88b+jjn/zvcNyLumer+QIngQVQPIqRkscwrIuK7i+ChoTmjRbLABKEFUVKyfWFJccf41kg7fP5nEXGZCV65nutHxFM6dTAucKcuuLOOvrJE+SHKSTYikPDdhihsXeuurcf2lKHtRITh+w9ReKoRxYbn+a40ZHy3op0YUXt+aFvoPi8BCUhAAhKQgAQkIAEJSEACEpCABCQgAQmsm8CcH4nXTcTeSUACh0gAB8hvlzDztA9nzEMi4qE9DiBC7nODmM+rg+0/yg1dnCfa4RFQYHJ4Y7K2Fh27WGTOeJIy40fLg0TNIJrHkFW+CBzeVNKNkHKEqA4/Vx6aKzBhL79LqeNDEXG34gj/957GkJLkuiUixFBbaROROmokDc4FomIhTKlGepNfS2fOU0tqlzkcd/1MFZi8NSKeGBFEqugKR0gZd+fC4b+XBjynnI1D7akCE4Q0fxAR/6eMIyIMolxU2/T/O1ypM3ceHBH3iAjS01Qj9RICDd6FEekEUcq2lgUmY/OPqC1E6/mB9MLHRMTtGxrAGmGtVCNSDHP2SRHx4YHnSUPEPL1jEYZQDIHJ+3rKdwUmY/yJxsN6q+uW6m5X+jbWFaK2IEBiTZF2EFaaBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIFeApv+SCxGCUhAAidNAIcTjkpulWP/FBHfFRGvm2gI4f4pc/5SDufht5Rb3ifdB983TkCBiTNkaQIKTDYjTBqa95f0MUS1wOlMRIYhO0tJrUK0hmytDv6her89Il4fEXxf/WBEXD4i/u9mXfmc0ggtrlf+SoQH6kSE2LVrRMRLyx9xvF9kJEVQfhYnfxarbNJcok9MRUr5viIEeGFDxYhMHpbKfWNEvGPgOaJgEFnj7R0emwgc+qpGqFIjwjwrIhCT9BkpkH6hfEC0Edrytw19HCuyyfxDiPOG1FbGkHmNoHVsfr42pex7c0Rcc4OUSoicSEFF6ieET9sKTGo7ifZ2tfIPIv0QoWXMiFry9FIAcQwiLk0CEpCABCQgAQlIQAISkIAEJCABCUhAAhKQQC8BBSZODAlI4NAJdEPrc+v31xsbfa5yU/1MpTyOSm7paodFQIHJYY3HGlujwGSzUb1VRDy+PPKgiPiJzR7/TOlNHPx9r3hLRFysfHDtiGgRVYw19asi4q8j4gylEI53HPBD9sqIuHL58FEl4sRY/d8fEZTjmT/dkNlNI+J+EXGFklZlw8d7iyOa+MuSPo4CRILJgpOWd2wjMEFYgsAEQ8RDlJS/Gngp/5/knUkU+mMR8fCWBo6U2XT+3aQTreWyJQ1f3ytgS3sRX2FE/SBNE2mWNjWEsAioENZ0bQ7/3A/SSSGUGTO+IxFthQhwRAn62h2lKNqUg+UlIAEJSEACEpCABCQgAQlIQAISkIAEJCCBU0BAgckpGCSbKIEjJvDFxRn15YXBCyLiOhvy6N7g/tbk8MpV1RDx/A0HH/8mCsoPRwSOzXOWlDs4gL4sPfgXEYGQBSPsPf8eM1JN3DwiLhcRXxkRpJTg1j83uxFacGv6Z0qKAOq5T/l3t87sOCN9Af/u2pBTnfQPOJAvXRyPvPNPIoKb/TiVx25s13dwE/7qEfEdEXHhUg/RZnBm4Wj7rZK+ocXJuqTAhLbBBocvKQhwpJFO4l0R8ZsljUE3vUQLa26e3zAiuPkNC9Ix4aAjPQjpNFod4aT0uFmJonC+iDhzccT+Q5n7f1Tm4ovKXBmbW7Tp+hHxPRFxydImHOk4DN9Yxpc1NBaJYmjOEDXoxqVe1gVRGlhbOK+fVxoFU27ht9g5yjyhfUSH4N84WLMRRYP30iZEBjhy4fPJwhrH9fNLKpO+CBTUldfSVLu6KTTmiFKIGkCKLiJvnL2kYYE/KUeYE6RjmVpffeuBvZB5zJzDGc0eRL2kDiOVB5E4dmlEfyKyB8ZeRWSHObapgz+/4zLpvUTdYJ1ta7eMiCdsMF9vFBHPKOWZ63Wv72sH8+UVZcz/pszboWgh3efZR9jHWQ+85xI7iN5R34Egs56bpHK5w4YQ5wgc6ivuHxF3L/+ATY2qMdSEny4iGz7nDKlzcMMmf6b4pvPvohHxh+llY4JWIrH8aipL3+jjrm0Of75n1Law35AyacpeUvZbyrHvcj5qEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQ+h4ACEyeFBCRwyAS40Y2ztRrOJpxOmxgpBz4QEfw3Rn2IRrrWFZjg3EYo0L35y+3kOQITHDxPLoKEofaTmgBHII6re5dCuxSYXLU4o3GyDhmOcBxlY6kJcoqJsbFAyPDIiLhrEREMlV1CYPJ55ab+j0QEN82HDEHMnTq31rtlu2KenyqiBhzvQ/YbZRzHUmUgfrjHRPtq/QgTcEIPGU7IJ6Xb9EPlEJoQZYH0J33WFVVcq6yDPmEXAhNSWiAMqWsC0RIprabsxyPi50uhPsczaUBw3nKjfspwCNM+Url07aQEJojFaO+VJhpLehdEIgiRhqy7HhDS/NqEwIJIT3XPmOI19Tl7HmIp1g2COgR+/zb10MDnmzr4czUIZ25X/oBQgbWyrTFGNUULQpNbT1T4NZ21grinmwaoVoH46VUpxQrnDusJ4dWY0R7Sk9R9in7fftuOpucRgLGesMclpq2vmCNwqHUTHYYoIBhCE1LBjBl7ahVLITxDyPYvrQ3tKbfp/GN883ghMMoikvyK/J0BISVixiVsDn/EgE8rjSFiDALZKSO6Delx5s6Tqfr9XAISkIAEJCABCUhAAhKQgAQkIAEJSEACElgJAQUmKxlIuyGBlRLIjtZWJ0kfCm6g4yjCiDBCpJGuZWcRt6hxTBMRgugWpNZBcIET+eKdW+ytEUyyk493f7REpuC/iaxB6h4igLw7IohWgfMe26XAhLYi2iHaw+9FBLfruTFPpIAceYKby9xgHjJECkSCwemMYw2nOUINHIIwIi0CIfarIUJA6DFkuxaY0CciW3xvemGXN1Fq8q1uRCaIYfosOylxNhJJg/7TXwRPjBmRURhDUnBUe21EIOrpc87fMSIekcoyv+CKUxphDk59opsQtQHH85jA5Hrlc+Yr9s+lLsabsb5AcfIiusFYS4wRURa6lp2ZzHsiqVyztAlRBOPNd4dvKg5MmOGor6Il/g3LKUMUQrQADGdojRJRn7tNEa/w7/eV9yJk+aciFoPLt5S21DJEOelGo2Ee8x/mI5GIMFKkMD+6xrNZpNEawYQxxyleU2VQL3OCNYZz/EJlvtT3faJE/xmKOpLXA3vRj5ZoSqwx5hsczhYRRCJCCFeN6DXPngLf8DlRGxC0YKSIYQ7PtU0d/Pk9OT0OAgnGjHnL3GBsEH8wH4j4gbCDfeY9Ew3NdVJPTQM09hi867pmT0E8NmQIrV5d5mada+wLQ6KUHygChiou+cWIuO1c2APPIZhAOIEhjvu5DeufI3CoryBCVxWfEfHq5RPv/qIyprUYe8TbNmxvLr7p/GOs+C5QjchXjGfXarSuKoBj30DktYTN4f/iiPju0hjOrPr9Z6x9iAPZszDOdM4NTQISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDA5xBQYOKkkIAEDpkATrnqtMXhiSN9jnEb/FHpQdJxdCM4ZIEJggAcfvcqURZySgscSvlGdYvAhJQ4RJeo9tCIwHGc60GYgWP5GuXv1XG1K4EJ76JOokvcpIhLans4C0ibkAUPONoQGPQZt9CJdIKzEAFC16gPUQIRW0gdg5FKh3QefbZrgUmOjsH7cKjiAPxUejnpS0hJUZ3njDlpTaqDLbczOympA2EK/cehjyOuGnMGB+7Ppr/13dpH6IGQBJEAxjPMib7UKQhNiCICxwf1wOPWPGOKYxZhCvUQ7QExQrbzlP7SR2xIRJSdmTChrTh4cVB2Hb11LRBZiJQqGKIVxByIb4YMcUqtiwgvOO+7kV5I80PfWPdDznmEYogKatoN5tstBl7aKhbJj7c+89KybnmWftAGUl5lI2UR4g/GAUPkg/O8O058ltdDXbdEe8GBjaCiGnPjuUVowt8QV5BmaSwF0siwfOYj5tndyr+YT0QgmmubOvjre3DgEz2liqIQlhB5h3YhIOsz1g/7JfN/yODHWsHYa1/W0DEiyPB+jL3lwRPPMC6Iy6qACoEU+2lX/IKQh3lS+8j8Rai17fjl5uWIIPydfoxFz+nr2hyBA/VwpmURG6KwlpRBpH6q5wYCHOb4XNt0/j2g7Me8j/nE3oRIpmt5z+OzFvHM3D5swp+5zT5R1yx7OGJIzqsp41nWXBU7MY/7+j5Vj59LQAISkIAEJCABCUhAAhKQgAQkIAEJSEACKyegwGTlA2z3JHDKCeDgqc43IorgPJxjRKt4TXoQJ3s3ekAWmFCUdAxjjspa3ZTABGfNe1NED27Mc3O+zxAuIMKozkzK7EpgQl2IIYj6QASFPsORhxMX28VNehxbROXASKvzgwPv3aXAhDQViIdqSiRC/ldneff1CCSICFF54xQmKkTXspOSz6j/m3uiZdTnEJjUdB4IDoi0kIU4WWDBPKyijzlzm9v1tc0/FhEPH6mEdBM4y4mogRG5piuo6Tozid5wkYmUSXyXID3NuUq9U85WBD8/UcoSuYQIJnONqC04zHHmf7Kw7nOKtopFcjtanunuLQirXjLQmXNHxFtT1JGhqAd5PVAVgi6ESn2GA5xoKYzt0JhuyhbRRRXtIHjI4rhN69rUwV/rRzyUBRmIc+r+QZoy1ippfBAzMQZVNMLzCGTq/Mrt7UbHYC8kosmUEVEKwRPG3EUQNmUIJGhjTZtClBVEJpwXGNF02BNr1CHSmZC6jYhDuzKEOOy/dX9jrbPmN7VNBA65bgQlRDyq1ipY+KOy5/Bca5SZoT5tMv9oL4yIRoWNRf4gXRlpjaqx9zHGS1iX/2N7XsJZhnAWQRFnIMaZg0BnKmpMro69pIrgeG8VDi7RL+uUgAQkIAEJSEACEpCABCQgAQlIQAISkIAETikBBSandOBstgSOgABOEhyJ1UgpkqOQbIKA1BnZkdiX5iALTEihgcOoL7VJ971TAhPC1BOuHkNsgBOoL2pBrbd7M3qXAhNuzP/6CDhu9BONAePG8yU2gTxQFgcjjjvSj9SIHd2iuxSY5NQq3J7HUU3KmCHLaQEoQ1qad3YKdwUmRKR5ykidOPsQXHx1KdN1kuaoAi+IiOvM5IzIBcECxvxmvKaiHxB15ZnlmUeXyDX59V1nJqmNiBIyZYixqghiTDTC9w4EV6SFwqbEKFPv5fMcsWYohUmLWKT7rpZniEBRhQ8IEYg2M2a5rUSxQSDRHbO8HhBRnLOIZ4bqRXyBIxkjEhHjuo0x/2t6jNYoH0Pv28TBn+sgFVlf1AXWHWdBFsnl6E/UAc+r9KQ2QfRBdIxqrRE1Mt/HRAQRsVoM8Q8O+pp+jLMCkQnrlpRpVVyCkAGR1S7FJbQPARPCTIy6efdQFKmx/swVmCBsQdBWDYEPIrApQ+TBvowRiYMoOnNtav6xV3PWs27Zv2o6HyKt0O++NGK0hXWWU6qRqqovmlduN2f5WUc6ggC0L01bl38LC1KqsU66KcOmniVqGdHGMNgR5UuTgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJPBZBBSYOCEkIIFDJYDjldQC1Ug7QQqBOUbaiJzKhNvHOGCyZYEJQhacMy02JTAhnUINVz8WxSO/Cwc8TmVsVwITHHuIdvrSsNR3kzYGpzf20QlnWH0GRzTpP0hlhJMNh10+WxBPEMEDo0+kBunaLgUmMK6plEj5c+eGQcw35m9borfkx7KTkpQlCGWGosDU5x6W3o2DGmFHNcQV9bY7Iiqcqe9qaGe3CJEUSOmAtaTuoFxOW4EohSgO2brOTByizIUpy9EKYINzPadzqc/j5GatYURHQXA1lk6Hcjh9ibxANAjaQ3SanCYFUdCVSp2ktcopiup7W8Qi3T62PIMDGqYYUSleOAEKkQP9ru3vEznk9YCgAkHTmP1kiXJCGebdXaYGa+JzBHCsZYy5SQqmuTbl4B+ql6g+RBfKBlsY9xnRnxAzIN7AcJQz17Lldcff2bO6aWv66ia6SI2yM5aGqe9Z9j5EJpxBGGca84X2YuxXN2xYA5vyJ+IKvOpePBYFZ6ruuQIThAo5zRrRvFpENFnkcM+IuN9UA0c+74oDp6qifYj+blfW6VB5UtzldhFpbWofy98V+uplnsC6a3MEJtTBWcv3mOdPdTp9jgC1Ch7ZV0jNpUlAAhKQgAQkIAEJSEACEpCABCQgAQlIQAIS+CwCCkycEBKQwKES2GcEk5tGBE7FFpsSmLwyIq5cKsLxiwN4ynKqml0JTP4wIojkMmbcqP9UKUD0lnrDvu8ZIrPgyCfSQKsNpaTYpcAEIVF15hLVAZZTRoSOmrboiRFxq84D2UlJOpacwmiobkQuOI8xxCM1ikEt/4aUrgJBBukWcASSMqdPmNH3npy64zcbneWc+0Qlwf42IhA8ZMvOTKKw1HQJUwz5/M1JsHKjkmKi+xx8EYthpPMhrc+QIT4hJQlpmxAutdiQOKxFLNKtf+qZrggO4QARR6bs7SVSDuX6OOX1gEAKodSYkcbmCaUA6Wz49zaWU5ORzulPtqhsrsAE0VpX2NIXXSg3LUeL4u9EEELMU+2kI5jU9zKPEU0QTSkbznyi37REytpkCNifSM9T0ya9KiKIRDP3PXMFJocWwaSFIeISUhWNRRmjnjkRTHYlMOn7/26IdxDfEcWKs4xITtVunfaHKQZEn2JPwjjfEexpEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQ+i4ACEyeEBCRwyASyo3NIaNHS/itExGtSQW7H48jPliOYfFdE4LBvsSmBCSlM6q36VsEDjvc7lZfvSmDSd6O/r385XcfQGUHaBdIvbGpEFMg32uvzuxSY5OgL39pJ0TDU3p8oQgY+R+TxfZ2C2UmOU5hUQ1PGu99YCv1dRHx554ELlTlJpI9sOIGZM3B6eUnzMXQzHrHLNmmMqJeb99myM5mIEPSj1RBDVAEVqZZw+GdDJILDv6ahoO19aVB4BuHSqyPiLK0vL+WeGhE363lmSizS95qpZ3LqLdIwfXFjW9lbSA2E9aX+yuuBvtCnMcvzk5QW/Hsby/vuRSLij7eobK7ABDEJQpxqpNoigs2YMZdJU0IqFqybEoy/Z/HWkOCt+44s5ELwROSgTe0mnXQjREI6/0BEp03rzuXZV9g7aioWRDpXbIi4NPbOuQKTHNWI+tkD2QunLEeU6qYXm3q2+3mefx/vCEeZL0SYYa9BBFSN9xMRCQHekBEFDVFgNdLs1KhUm7Qxn6WtEUxa/r9brpe5dtHGKFlEdiOiDqbAZJORtKwEJCABCUhAAhKQgAQkIAEJSEACEpCABI6IQMuPlEeEw65KQAIHRuDPShoDmvW8EslgThNvHxFENqiGM+n9nYqywARBSk3jMfW+KYFJ7sM1I+IlUxUWx849SrldCUyGnFfd5kwJTK4SEa9IDxGJAwc4jkxC8hONA4dWtRauuxSYINDgNjfWGn3hRyPi0eUZbvvTx2zZSckN75ouY2woeffbSoGhaDCIS0i1gPO5piTp1sk8xVlIZIqu5WgtDdOqt0j3e8CUqGLsPaRYIgUI/Okzztsc0QPhDusYGxMMIERBXFAjPlDH44vghPVEyh4EHXWutggs5vRr6pmcxqUvGswQq19LIiXW+f07BTddDy3932R+HEKKnG60EZjV1FdjfSFSE850jCgTdV3XZxCYVAEKUT1e1gAGoVWNWtSaiipXe/kiWOwKkFgDnDUfamhDSxHWy2+nlGREnuHdLSmuxuqfKzDJ6biovy8dVN974VEjK7WKMofa3yJwQmjCHvzYiPjCUhEiMISmQ9ZN/9M6l7r1LSUwoU/vTqn26Bvn3JSZImeKkJ9LQAISkIAEJCABCUhAAhKQgAQkIAEJSEACn8nNLgoJSEACh0iA2/g4fjAc1183s5E57DuCkG6qAqptEUL0vX5KYDIngglRIIgGgR2awARxSRVgPKWkO8milC6jnDZlSLizqUN9bBqclggmuQ8IKi4TETgtLxcR3xYRpIjKhqMch3m2PLcQbxB9ZVubElVM1Y/D/mqlEMKux6QHEJfU6DB3j4gHDlTGDXpu0mMIbHDuf2DkxVlANhTBY06/pp45iQgmpOtgfYzZrgUm70gpnTaJ5tTXxhYH/1DfPpIi/8AAFlOGwIL1gyHeekDngbekVGGt0TGIulMjDZF65DemGpE+py2siTOWv/G/EVoQ8QIjOgz74li0jJbXka7pt9LZhriA/WRs3bTUS5m5AhOeJWJJjVhE1B6iMo0ZAg/EY9UQC1WhXmt7c7lN5h+pYfiuUI1n2U/6jHZy1tTUXUT0uu+MBi4lMKEpnM91zbCmmXdTxhxCOIeN9X+qHj+XgAQkIAEJSEACEpCABCQgAQlIQAISkIAEVkzACCYrHly7JoEVEMjOIbozlGJlrKs49nCyVQffUAqNpQQmRMQg3D72YxFB+pspe066rX9IAhMiUxAB4Asi4j8i4qsbbt8TfeJspcMnITDJUT2IeEDkgyn7hYjA2Yw9MSJu1Xkgz0PS0tRoBmP1fn9EPLcUoE0XmGpE+vzzy5zBQV6dfXx86RIpphbFWXvV8o8fiQj6sa1NiSqm6s+pI36vCGd4BiczjnocsgiSzj2SUuLJKc3N3SLiIRMv5fO7lDInKTDBqY/wrRpRF1qEAkRnIQUMhlP7Vzv921RwtWuBSU7hwx7mPj4AACAASURBVFpgTcy1TRz83XcQdYkIHNicCCZEbCByQzZY36D8gag4dd0P9Y8oPDnaFWltiKLTYojGEOSdqRQmbdR1SjoW+lbTshB1hTQ2cyONIH6hvguW9zAnEZcgftyFbSMw+d2IuGxpBKmFSDE0Zgjsavo6Unh9SSci1qb92XT+vTAiEBFhRORi3/7kwEtfW8Q3fNySwqmvmiUFJkRGQsiHtabwek8SKTHuzCtNAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMBnEVBg4oSQgAQOmQDOJZw8ZymNxPlz7Q0bTCQQIoJU+9aIIOVB15YSmGTn97Mj4voN7c9RUQ5JYIIjE5EAxn8jMBmzC0UEaRqqnYTAJItzEPMg6pmynFbjthHxi50HspMSZyOCmX+cqPSh6d2t496tEjEGghbS7WA/GxH3SoW4MX/P8m8ifiDu2Na2FZiwZv+mOIZpy/lKqoZbJKHCVLqmLHBoiXqQU5gMCUwQp9W0V1PvrwxbWNBXUoFg14qIF00MAHOHZ85QyvWlDdm3wOTnI4JUMBjz+K5bTKpNHfz5Vcx19j+sxYFPWpB/SClw+sbjlhHxhFLnO5PQZ6iLiFGqAOgvU+SRKSSI0F6ZUl8hBqM9NX0Y64L5iEgJI7IKQkQifmxiZ40IhA4XKQ+RXgZRDn3blW0jMMkiBxiwnscMEUqNOkM0jSowmtuXTecfIh3OrJpmje8Pjxh4OWf5M9NnRG7K6eNa2rykwITz706lEZxXVWQ71C5SOH087U187yJKiyYBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlI4LMIKDBxQkhAAodO4H4l1UFt5yapQEhDQAqC6lh5fYmC0tfnpQQm10wpFT5Rbq1/bAQ6EStwrFU7JIEJERpwYGL0oaY+GOoOaV2IIlDtJAQmRCSokTyIXHOekRvotOuSnaggRJboOme7kXSm0pYQ4YWb4NV53JqKo49jFqrgGL91KkREE6KEYNxQJ/UT4oVtrEVUMVV/TkmFA5U5nNcXTv4njVTykoggNQs2td4vUUQ4tbohgQnCsjeWQkRVqGlUxvrSwuJZEfGDpRJSFNUUQEP1ItZ4cPnwr8t+0E0xtW+ByXVT5B8iMNWUWFPj3vf5pg7+XAfCqpweBef/u0YawZxh7mBEWELM0xVsIJKDexX4EF2jzou+qnOUoL40VX3PMCfhVvdHhCZExehGwiA6BuuiCvVIJ3blDZz6pNF6TUTwPoy+Mmf/aM5AjTyzjcAEoU0VdBKRhMhFOepP97XsvTXaE1GJsjh0TrfmzL+8fzFXOEOqMCi3AREK7T1v+eN7I+Kby9nY2tYlBSY5AhDrpka4GWpbPk82jbrV2l/LSUACEpCABCQgAQlIQAISkIAEJCABCUhAAisgoMBkBYNoFySwcgLcqv39iCAaBkaKlmtEBGKRMTt7Ce9enVXc4P2WEQflUgITbtXjeCLVAva4iLjdQMMRJtAvnOHVDklgglOWNA5fWho3FkIfBz4OrnoTnEdOQmCC05WUFlVUREoGbsX3GbxpI6ksMCIBkKqia12BCVF1cCQORRvITkPmHWNPZIVq3AxHoIMTfMpyRBbEVjViSX0up2nAkY2g6VNTlZY0R0Qb6fahRVQxVT03+V9WCuGoJDIDa4DvHDjZWZtjIqssTEJsgaCnz9gbEGOxrqsNCUyIGEFbMNqCo3vKWlgwp3HyVxuLuILg7a1JeHDviCAKTdf2LTBhfpLairVLRIMvj4h/m4I18PkcB3+u6tVpTY4JeEgrhdjq4uXhF5R0NH3NInUVKaww5g/RbboiHz4j/RQCEwxxxEVLJJUxFBcr86FG3WJusCYRgPUZgjbOHoQvGGIMBD15v+h7jrlP22oKLcYJcUpfdK6ZQ/eZx7YRmNQ+1bRiY5GWSMdE2iKM/iDsaEk5Nda/OfOPMSGKSRUh9aVaqu+EP3sw5zyGSIjxrpG+ptgvJTBBOMlcqP8/D9EladTGDEFPTUc29j1lqk9+LgEJSEACEpCABCQgAQlIQAISkIAEJCABCaycgAKTlQ+w3ZPASghwk/23k7DhX0sUAG43f6TTR0QDhK4nSkBNXYEj/yYRgXNryJYSmPC+nJaBfz+oCAWyEIDoIE8pziluS5MeBTskgQntIV0EaSMwUvkQvaHr1PyBkg4FsQcCC4QM2EkITHgP6T1I81ENYQbpZTJvHLo48mvKBhzoOAtrRJA8T7KTkjqYY6SuYZ69OxXEIc+7SQtRz9d7lH936+PvpOL5tcKxOy8Zf+bNo1JdiHaIvpGNtfGGJKih/Xcc6AfPIbhizEgFhEP3xZ36WkQVg4uofAAHohQgJMGeFxFExcDo7/UmKsiOfRz/dytpKnDyV0MwwvjBJM+xIYEJbcJpj2Me47Y+wrUxa2Xx0iJ6oy6iFN0sIhAxZCPKBNFOaDeGSAnBQl8Kin0LTGhfjn5wuTLHJnD1fjzHwd/lxpyuQrUnRgRpS3KKKvbOp0bEd5cHWaOML6mv+gwBAVE+EKVgTy/rIdfJXsUYkoIGo37GdcxIU4PYoD4DQ6KqIIocM8STPFfPKyKqsAYQWfQZe8NvpMgyiFfYx6ZEl3PGj2e2FZggMCOiSzX2ZoRynOPVODOY919U/jAkvtq0D3PnH6lvajo71irrdki4hwAFUVw1vpMg1HhyEWr1tZnoNtQPhyo+HUrdtSl/hEbsg7Vezjb2mrdPwMuRo5i3pCrTJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQl8DgEFJk4KCUjgtBDAkY7D4xypwThOcK4TkQDnD6kGcIbWCBsURaxx4x6Hb7ffSwpM2Gu5fX+t9FKcULyTiCD0CYfmF5bUKi8sTlSKDznasuNsyKne6iDPLPJN/r4zAmco4orqCKQ8Y0AIfoQXpJwgVQuGMxhBAxECsJMSmHDznAgG39PhjROXiB1fV9pSRTwUw2n9iIHFkFkjsMHZiAOb+UcEBEQmZ4qIy6d0F1SFwxfnajf6Qzciyl8Wh3dNP4Qwg6gqRI6oNnbznxvzz07iCZ6hTX9Q5hfzCuc1Tsaatocy8FlCYELdD4+IO/XwZA28qGHTyQIHiv956Q+RT85f1jmiA6LVPLKItig3tBb4DIY3LO/G6U+UFdhX4Qpr8QGpba3rB7HS76RUGVRBtBSEEexLrBmiEtX1hJCBKC8802eHIDDJ0SQQxP1Ew5iR9ojICdmYw6w3DEHBn/bUc4tOmqNuESIvPDb9EVEOa5koK8xn9pUqHGI/Io0Ue8+Y3byTpol9gWgjiJDqeNXnEaMgPhsSfNRyRNxgzdMm9gUibWXRylh7ON/oE2l9iEzCOulLy0IdjAeiq2qsc/bgFuPc4UwZMiLqkM4nG9GgahoY/t4n3LnXxLpG4IeorhqpZ2BERCPEV/S/GpGYEDjMjZqT2z5XYMIcID1TjWLCnCJF2ZAhukRQUs9FyjEXSdH3Z0UIy7/5bsL5gRipCpwoy1j/dESQEq1rXYFJXgu1LHshaw2Weaz4nH2YPXLMOL9YT5yJnEPM4V3wn3itH0tAAhKQgAQkIAEJSEACEpCABCQgAQlIQAKnkYACk9M4arZZAsdLACc5ET1wSNaQ9GM0XhERdy2OoilqSwpMeDeOGxzH9VZ0X3u4YXydEm3l7qXAkPBhXwITmoXzE6FFder29QVn3B2Ks/SkBSa0h/mByIFIHTlNT7etCBZwwDE2Q9ZlzdgQlaOm1ul7jtvgjDURLbpGeg5S37ScwUTfIdIJbcw3/rt1krIHBycOxhYj+gxzjZQt2VpFFVPvoB0IkbLh3EYENtaPWh7RBpFBcvqb7jsRKxANBbEPESawMYEJKWqIDlEjq3Tr66bO2YQF7WVN9KVYyu/B2YzIZSx6yiEITHCEI94h+hDiHpzWfWlkct/yHjo1P/LnQ8KzXAZBCOsZR/iQITy5TRFbtbyfcwRRWY2w1PcMKXoQKH6gpcKIuGBEPLDs4X1rf6waBGBEtCDa1lBKHZ7P86OxWZ8pNpUeam7dpLEa20PZ6xBQIETJwopu+4nyg5hjKkVQa7/nCkyoP6cnYw0glhwTXRAZB/EO0ViqMGWqnYiWeA9RttiT+6wrMJmqs36OYI5oVs9oeOBGqRwiF743aRKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEegm0OLdEJwEJSODQCJw7Iq5d0gJwGxjhCU4rbuCSmoOb6EQBmUqBkfu1tMCkvovUBzg2ifRBu7k5j9MZxxpOcm68/0JxlPLMkONunwIT2kWUkh8rqRzOWRxv3EonKgOOxpquoYXrpg71TebjhUtqCyKJEEkBBzWONyKuIGAg0kE3zVK3/j7WRGv5oYjAMYdjkcgD1MOcYxyJoDJmCBKYC6R4QRxC9APSJmCIXmgfaaGeNhD1Yahu6mRtUC8pEqiT2/GsjXeWqBpESCDiQZ9gYBNRxdQ4IAD5xlSIeU00ilZDlMVaQahDhAMETdyupx9EbCEiCZFIWtZCfSdrjpQWcMJhzHyoYrVtBCa1flKVkIKIiBcIWdiXaPNbypzA2TslsNl0PWzS/1b2lCPtB6wweBFZYsyWFJjwXqIq0FcibHAGnKXsn+8oaxlRG/vpJsbehXiFaD78b6J1ICYhKghjxTqeEtZs8r5dlJ0rAuHd+xKY1H6zH7CmmU/sx6wPeLMfIQ7LqXR2wWobgQlRRojWUv+/EimSqpBtrG3s5URgQWxGf0mZxFxFNMT8JOUO4jvSnRFBaiqFUovAhDmKWIW9BtEgezzfKVpFTkTP4T1Ec+I71ZDYZRdjYh0SkIAEJCABCUhAAhKQgAQkIAEJSEACEpDAKSegwOSUD6DNl4AEVkkAkQapfjCiZJBqQ5OABCRwkgQQcSB0QgSAYA/hkiYBCayLAOmASOXD/yckChOiSU0CEpCABCQgAQlIQAISkIAEJCABCUhAAhKQwCABBSZODglIQAKHRYA0Hu8uaV0+FRGkqvjkYTXR1khAAkdC4HElzRQREogGRBovTQISWA+BGhGH9D9EXCGimiYBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYJCAAhMnhwQkIIHDIcCe/PyIuFZpEmlASA+iSUACEtgHAVI5EcXkzCXlxg320QjfKQEJLELgvEU0RpSix0TE7Rd5i5VKQAISkIAEJCABCUhAAhKQgAQkIAEJSEACqyKgwGRVw2lnJCCBAyZw34j4SET8SkT8bU87SUfxiCQu+feSHudNB9wnmyYBCayfwJ0i4uERQRSTS0XEm9ffZXsogaMg8MwiYv1wRFwgIv7+KHptJyUgAQlIQAISkIAEJCABCUhAAhKQgAQkIIGtCCgw2QqfD0tAAhJoJpDD0L8tIt4RER+LiDNGxDdExMVLWpxa4X0i4meaa7egBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggQUJKDBZEK5VS0ACEkgEqsBkCso/R8S9IuIhUwX9XAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMBJEVBgclKkfY8EJHDsBL6spL+5YkRcOCK+IiLOVqKWfDQi3hkRr46IJ0fEB44dlv2XgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQOi4ACk8MaD1sjAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEDo6AApODGxIbJAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABA6LgAKTwxoPWyMBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQOjoACk4MbEhskAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEDouAApPDGg9bIwEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABA6OgAKTgxsSGyQBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQOi4ACk8MaD1sjAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEDo6AApODGxIbJAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABA6LgAKTwxoPWyMBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQOjoACk4MbklkN+s9ZT/mQBCQgAQlIQAISkIAEJCABCUjguAj4O8hxjbe9lYAEJCABCUhAAhKQgAQkIAEJSGCHBPxhZYcw91iVApM9wvfVEpCABCQgAQlIQAISkIAEJHBqCPg7yKkZKhsqAQlIQAISkIAEJCABCUhAAhKQwKER8IeVQxuRee1RYDKPm09JQAISkIAEJCABCUhAAhKQwHER8HeQ4xpveysBCUhAAhKQgAQkIAEJSEACEpDADgn4w8oOYe6xKgUme4TvqyUgAQlIQAISkIAEJCABCUjg1BDwd5BTM1Q2VAISkIAEJCABCUhAAhKQgAQkIIFDI+APK4c2IvPao8BkHjefkoAEJCABCUhAAhKQgAQkIIHjIuDvIMc13vZWAhKQgAQkIAEJSEACEpCABCQggR0S8IeVHcLcY1UKTPYI31dLQAISkIAEJCABCUhAAhKQwKkh4O8gp2aobKgEJCABCUhAAhKQgAQkIAEJSEACh0bAH1YObURmtOd9d7yjApMZ3HxEAhKQgAQkIAEJSEACEpCABI6LwDke+Uh/BzmuIbe3EpCABCQgAQlIQAISkIAEJCABCeyQgD+s7BDmvqpSYLIv8r5XAhKQgAQkIAEJSEACEpCABE4TAQUmp2m0bKsEJCABCUhAAhKQgAQkIAEJSEACh0ZAgcmhjciM9igwmQHNRyQgAQlIQAISkIAEJCABCUjg6AgoMDm6IbfDEpCABCQgAQlIQAISkIAEJCABCeyQgAKTHcLcV1UKTPZF3vdKQAISkIAEJCABCUhAAhKQwGkioMDkNI2WbZWABCQgAQlIQAISkIAEJCABCUjg0AgoMDm0EZnRHgUmM6D5iAQkIAEJSEACEpCABCQgAQkcHQEFJkc35HZYAhKQgAQkIAEJSEACEpCABCQggR0SUGCyQ5j7qkqByb7I+14JSEACEpCABCQgAQlIQAISOE0EFJicptGyrRKQgAQkIAEJSEACEpCABCQgAQkcGgEFJoc2IjPas7TA5BzP++oZrfIRCUhgDoH3XfcDcx5rfsb13IzKghKQgAQkcIoIeH6eosGyqRKYILD4en7kI/0dxFkoAQlIQAISkIAEJCABCUhAAhKQgARmEvCHlZngDukxBSaHNBq2RQLbEVj8B3UFY9sNkE9LQAISkMBBEvD8PMhhsVESmEVg8fWswGTWuPiQBCQgAQlIQAISkIAEJCABCUhAAhKAgAKTFcwDBSYrGES7IIFCYPEf1BWYONckIAEJSGCFBDw/VzioduloCSy+nhWYHO3csuMSkIAEJCABCUhAAhKQgAQkIAEJbE9Agcn2DPdegwKTvQ+BDZDAzggs/oO6ApOdjZUVSUACEpDA4RDw/DycsbAlEtiWwOLrWYHJtkPk8xKQgAQkIAEJSEACEpCABCQgAQkcMQEFJisYfAUmKxhEuyCBQmDxH9QVmDjXJCABCUhghQQ8P1c4qHbpaAksvp4VmBzt3LLjEpCABCQgAQlIQAISkIAEJCABCWxPQIHJ9gz3XoMCk70PgQ2QwM4ILP6DugKTnY2VFUlAAhKQwOEQ8Pw8nLGwJRLYlsDi61mBybZD5PMSkIAEJCABCUhAAhKQgAQkIAEJHDEBBSYrGHwFJisYRLsggUJg8R/UFZg41yQgAQlIYIUEPD9XOKh26WgJLL6eFZgc7dyy4xKQgAQkIAEJSEACEpCABCQgAQlsT0CByfYM916DApO9D4ENkMDOCCz+g7oCk52NlRVJQAISkMDhEPD8PJyxsCUS2JbA4utZgcm2Q+TzEpCABCQgAQlIQAISkIAEJCABCRwxAQUmKxh8BSYrGES7IIFCYPEf1BWYONckIAEJSGCFBDw/VzioduloCSy+nhWYHO3csuMSkIAEJCABCUhAAhKQgAQkIAEJbE9Agcn2DPdegwKTvQ+BDZDAzggs/oO6ApOdjZUVSUACEpDA4RDw/DycsbAlEtiWwOLrWYHJtkPk8xKQgAQkIAEJSEACEpCABCQgAQkcMQEFJisYfAUmKxhEuyCBQmDxH9QVmDjXJCABCUhghQQ8P1c4qHbpaAksvp4VmBzt3LLjEpCABCQgAQlIQAISkIAEJCABCWxPQIHJ9gz3XoMCk70PgQ2QwM4ILP6DugKTnY2VFUlAAhKQwOEQ8Pw8nLGwJRLYlsDi61mBybZD5PMSkIAEJCABCUhAAhKQgAQkIAEJHDEBBSYrGHwFJisYRLsggUJg8R/UFZg41yQgAQlIYIUEPD9XOKh26WgJLL6eFZgc7dyy4xKQgAQkIAEJSEACEpCABCQgAQlsT0CByfYM916DApO9D4ENkMDOCCz+g7oCk52NlRVJQAISkMDhEPD8PJyxsCUS2JbA4utZgcm2Q+TzEpCABCQgAQlIQAISkIAEJCABCRwxAQUmKxh8BSYrGES7IIFCYPEf1BWYONckIAEJSGCFBDw/VzioduloCSy+nhWYHO3csuMSkIAEJCABCUhAAhKQgAQkIAEJbE9Agcn2DPdegwKTvQ+BDZDAzggs/oO6ApOdjZUVSUACEpDA4RDw/DycsbAlEtiWwOLrWYHJtkPk8xKQgAQkIAEJSEACEpCABCQgAQkcMQEFJisYfAUmKxhEuyCBQmDxH9QVmDjXJCABCUhghQQ8P1c4qHbpaAksvp4VmBzt3LLjEpCABCQgAQlIQAISkIAEJCABCWxPQIHJ9gz3XoMCk70PgQ2QwM4ILP6DugKTnY2VFUlAAhKQwOEQ8Pw8nLGwJRLYlsDi61mBybZD5PMSkIAEJCABCUhAAhKQgAQkIAEJHDEBBSYrGHwFJisYRLsggUJg8R/UFZg41yQgAQlIYIUEPD9XOKh26WgJLL6eFZgc7dyy4xKQgAQkIAEJSEACEpCABCQgAQlsT0CByfYM916DApO9D4ENkMDOCCz+g7oCk52NlRVJQAISkMDhEPD8PJyxsCUS2JbA4utZgcm2Q+TzEpCABCQgAQlIQAISkIAEJCABCRwxAQUmKxh8BSYrGES7IIFCYPEf1BWYONckIAEJSGCFBDw/VzioduloCSy+nhWYHO3csuMSkIAEJCABCUhAAhKQgAQkIAEJbE9Agcn2DPdegwKTvQ+BDZDAzggs/oO6ApOdjZUVSUACEpDA4RDw/DycsbAlEtiWwOLrWYHJtkPk8xKQgAQkIAEJSEACEpCABCQgAQkcMQEFJisYfAUmKxhEuyCBQmDxH9QVmDjXJCABCUhghQQ8P1c4qHbpaAksvp4VmBzt3LLjEpCABCQgAQlIQAISkIAEJCABCWxPQIHJ9gz3XoMCk70PgQ2QwM4ILP6DugKTnY2VFUlAAhKQwOEQ8Pw8nLGwJRLYlsDi61mBybZD5PMSkIAEJCABCUhAAhKQgAQkIAEJHDEBBSYrGHwFJisYRLsggUJg8R/UFZg41yQgAQlIYIUEPD9XOKh26WgJLL6eFZgc7dyy4xKQgAQkIAEJSEACEpCABCQgAQlsT0CByfYM916DApO9D4ENkMDOCCz+g7oCk52NlRVJQAISkMDhEPD8PJyxsCUS2JbA4utZgcm2Q+TzEpCABCQgAQlIQAISkIAEJCABCRwxAQUmKxh8BSYrGES7IIFCYPEf1BWYONckIAEJSGCFBDw/VzioduloCSy+nhWYHO3csuMSkIAEJCABCUhAAhKQgAQkIAEJbE9Agcn2DPdegwKTvQ+BDZDAzggs/oO6ApOdjZUVSUACEpDA4RDw/DycsbAlEtiWwOLrWYHJtkPk8xKQgAQkIAEJSEACEpCABCQgAQkcMQEFJisYfAUmKxhEuyCBQmDxH9QVmDjXJCABCUhghQQ8P1c4qHbpaAksvp4VmBzt3LLjEpCABCQgAQlIQAISkIAEJCABCWxPQIHJ9gz3XoMCk70PgQ2QwM4ILP6DugKTnY2VFUlAAhKQwOEQ8Pw8nLGwJRLYlsDi61mBybZD5PMSkIAEJCABCUhAAhKQgAQkIAEJHDEBBSYrGHwFJisYRLsggUJg8R/UFZg41yQgAQlIYIUEPD9XOKh26WgJLL6eFZgc7dyy4xKQgAQkIAEJSEACEpCABCQgAQlsT0CByfYM917DGgQmi/+IeAJO9dPeh6Xbz0I5x8LjYB+mt6Olx4AWLD0O9mF6nJceA9fz9BicRAnHuY3y0nvG0uOwdPvdt49jHrlvt42z63ma0yr2JAUm0wNtCQlIQAISkIAEJCABCUhAAhKQgAQkMEBAgckKpoYCk+lBXMUPoYozJgd6aafAGpwzroXJafTpAkvPpaXHYen2r2EtnEQf2mbb/FKOcxu7077elm7/Gva8NfTB9ex6biMwXWrpubSKPUmByfREsoQEJCABCUhAAhKQgAQkIAEJSEACEhggoMBkBVNDgcn0IK7ih1AFJpMDvfQP6ifhkF66D66FyWn06QKnfRyWbv8a1sJJ9KFtts0v5Ti3sVt631t6HJZu/xr2vDX0Yel5dBJ7nn2Y3pNcz9OMTmQ9KzBpGwhLSUACEpCABCQgAQlIQAISkIAEJCCBHgIKTFYwLRSYTA+iP+ZOM9IpMM1oDc4Z10LbOC+9HpYeh6Xbv4a1cBJ9aJtt80s5zm3sTvt6W7r9J+LMXVgku4Y+uJ5dz20EpkstPZdWsScpMJmeSJaQgAQkIAEJRJZ0mwAAIABJREFUSEACEpCABCQgAQlIQAIDBBSYrGBqKDCZHsRV/BC6sHNm6R+jT8KZax9cC9ME2kosPZeW3pOWbr/ruW0eLV3KcW4jfNrX29LtX4M4Yw19cD27ntsITJdaei6tYk9SYDI9kSwhAQlIQAISkIAEJCABCUhAAhKQgAQGCCgwWcHUUGAyPYir+CFUgcnkQC/9g/oanOquhclp9OkCS8+lpcdh6favYS2cRB/aZtv8Uo5zG7vTvt6Wbv8a9rw19MH17HpuIzBdaum5tIo9SYHJ9ESyhAQkIAEJSEACEpCABCQgAQlIQAISGCCgwGQFU0OByfQgruKHUAUmkwO99A/qJ+GQXroProXJafTpAqd9HJZu/xrWwkn0oW22zS/lOLexW3rfW3oclm7/Gva8NfRh6Xl0EnuefZjek1zP04xOZD0rMGkbCEtJQAISkIAEJCABCUhAAhKQgAQkIIEeAgpMVjAtFJhMD6I/5k4z0ikwzWgNzhnXQts4L70elh6Hpdu/hrVwEn1om23zSznObexO+3pbuv0n4sxdWCS7hj64nl3PbQSmSy09l1axJykwmZ5IlpCABCQgAQlIQAISkIAEJCABCUhAAgMEFJisYGooMJkexFX8ELqwc2bpH6NPwplrH1wL0wTaSiw9l5bek5Zuv+u5bR4tXcpxbiN82tfb0u1fgzhjDX1wPbue2whMl1p6Lq1iT1JgMj2RLCEBCUhAAhKQgAQkIAEJSEACEpCABAYIKDBZwdRQYDI9iKv4IVSByeRAL/2D+hqc6q6FyWn06QJLz6Wlx2Hp9q9hLZxEH9pm2/xSjnMbu9O+3pZu/xr2vDX0wfXsem4jMF1q6bm0ij1Jgcn0RLKEBCQgAQlIQAISkIAEJCABCUhAAhIYIKDAZAVTQ4HJ9CCu4odQBSaTA730D+on4ZBeug+uhclp9OkCp30clm7/GtbCSfShbbbNL+U4t7Fbet9behyWbv8a9rw19GHpeXQSe559mN6TXM/TjE5kPSswaRsIS0lAAhKQgAQkIAEJSEACEpCABCQggR4CCkxWMC0UmEwPoj/mTjPSKTDNaA3OGddC2zgvvR6WHoel27+GtXASfWibbfNLOc5t7E77elu6/SfizF1YJLuGPrieXc9tBKZLLT2XVrEnKTCZnkiWkIAEJCABCUhAAhKQgAQkIAEJSEACAwQUmKxgaqxBYLKCYbALEtgJgTU4BXYCwkokIAEJSEACGxDw/NwAlkUlcOAEFl/PCkwOfAbYPAlIQAISkIAEJCABCUhAAhKQgAQOmYACk0Menca2KTBpBGUxCZwCAov/oH4Ct8hPAWabKAEJSEACKyPg+bmyAbU7R01g8fWswOSo55edl4AEJCABCUhAAhKQgAQkIAEJSGA7AgpMtuN3EE8rMDmIYbAREtgJgcV/UFdgspNxshIJSEACEjgsAp6fhzUetkYC2xBYfD0rMNlmeHxWAhKQgAQkIAEJSEACEpCABCQggSMnoMBkBRNAgckKBtEuSKAQWPwHdQUmzjUJSEACElghAc/PFQ6qXTpaAouvZwUmRzu37LgEJCABCUhAAhKQgAQkIAEJSEAC2xNQYLI9w73XoMBk70NgAySwMwKL/6CuwGRnY2VFEpCABCRwOAQ8Pw9nLGyJBLYlsPh6VmCy7RD5vAQkIAEJSEACEpCABCQgAQlIQAJHTECByQoGX4HJCgbRLkigEFj8B3UFJs41CUhAAhJYIQHPzxUOql06WgKLr2cFJkc7t+y4BCQgAQlIQAISkIAEJCABCUhAAtsTUGCyPcO916DAZO9DYAMksDMCi/+grsBkZ2NlRRKQgAQkcDgEPD8PZyxsiQS2JbD4elZgsu0Q+bwEJCABCZwMgf8dEd9ZXnWFiODfh2S/FBE3LQ364Yjg39r6CfxMRNy7dPM+EcG/j9FeEBHXiogPRsT5IuIfjxGCfZaABD6HwP+KiKeWv/5yRPDvk7A3RMRlIuLtEfHNEfGvJ/FS33HcBBSYrGD8FZisYBDtggQKgcV/UFdg4lyTgAQkIIEVEvD8XOGg2qWjJbD4elZgcrRzy44vQiA7wPte8ImI+EhE/GFEvCoinhYRH1ukJVYqgfURUGCyvjFdQ48UmERcPSJ+swzmbSLi8RMDiw/uKhFx/Yi4dEScIyLOGBGckX8dEW+OiOdGxEsi4t83mCSXjYgbF6fyuSPiTBHxzxHxNxHxlohABPO8iPiXDeo86aIXKQ74bytCnS8t7f3b8t0BJs+MiI9v2LArFQEcDvevLXW+LyJeHhFPjoh3bFifxSXQSmBfAhMEqVWIepeIeFhrgy0ngbkEFJjMJXdAzykwOaDBsCkS2JLA4j+oKzDZcoR8XAISkIAEDpGA5+chjoptksA8AouvZwUm8wbGpyTQT2BKYNJ96h8i4vZFaCJTCUhgnIACE2fI0gTmiEXmPLN0P06y/jNExB9FxIUj4q8i4rwTkQIQfjw9Ir69oZF/EBE/VCIQjBU/axFJEEFlyt5dhBa/M1XwhD//woh4TETcvOG9CGZuFREvaih75oh4QkT84EhZIjsQheeBDfVZRAKbEtiXwIR2vi4iLh8Rfx8RX1/+e9P2W14CzQQUmDSjOtyCCkwOd2xsmQQ2JbD4D+oKTDYdEstLQAISkMApIOD5eQoGySZKoJHA4utZgUnjSFhMAk0EsgP89yPi/6Sn+M3xyyLiUhFx/k5tty4OoKaXWEgCR0pAgcmRDvwJdnuOWGTOMyfYpcVfdaOIeEZ5y50i4pEjbzx7RLwxIs6VyhBFA4HKByLia0oqC/67GpE7vjUi3jNQ7xdFxO9GxMXS5x8uEUuo+yuK+OU86fN/iogrRsTvLU6n7QV8P3hp/FckmGoIUN8UEe+NCKKYfENEXCh9TmSX60XE80de8fkR8bLS11rsjyMC4Q6Clu+IiK9OzyMyuW9bky0lgWYC+xSYXKOsLRp7/4i4R3OrLSiBGQQUmMyAdmiPKDA5tBGxPRKYT2DxH9QVmMwfHJ+UgAQkIIGDJeD5ebBDY8MksDGBxdezApONx8QHJDBCIDvA7xMROB777DolHz1OI4xw/eeLCJxhmgQk0E9AgYkzY2kCxy4WmcMXcQhpXRBtIFZAGDFkv1Sih9Rz7w4R8ZSI+Lf0AKIIonOQzuILyt9/IyK+d6DSPGb/GRH3LM+SGqcaPj8iePxiEWvw97dFxEXndHiBZ7IDnuofVb4//F3nXVeLiCeVlEJ89KEi1vnkQJsQi8ADo8wPR8SzUln43i8i7lb+Br8rlKgPC3TTKo+UwD4FJqx9ohbV6CWk4/rHIx0Hu30CBBSYnADkpV+hwGRpwtYvgZMjsPgP6gpMTm4wfZMEJCABCZwYAc/PE0PtiySwOIHF17MCk8XH0BccFYFWgQlQvjsiXpzoEJr+7kdFy85KYDMCCkw242XpzQkoMNmM2ZUi4lXlkV+OCBzJQ/bFEUE0EiKOYHeOiEeMlL9rRDy4fE60DiKRdAUXfPwXKSIK0VOIojJk3x8Rz00fIjBBaDJmX7KFQ/qMEfGJBqR5b3thRFx75BmioOXoaAhvEOB07StL1Bfaj90mIh4/UC+ik5pC5w0RcbmGNltEAq0E9ikwoY1ELfnZ0tgfjYjHtjbcchLYlIACk02JHWB5BSYHOCg2SQIzCSz+g7oCk5kj42MSkIAEJHDIBDw/D3l0bJsENiOw+HpWYLLZgFhaAuMENhGYUNNbSzoA/jcpdS4tYAlIYJCAAhMnx9IEFJhsRvhXI+IG5ZHviojfHHkcMccfps9Jl/M3I+WJhvLX6fNLRsSbO+XPHBEfS3+7zETam88r5RG7YAhOnjfShgtGxGsi4i6dyB8tlEjZQ3oaorG8aOKBj0bEWUqZ60fEsyfKvzMiLlDKIMR5aE95opI8qPz9XSXFDhFK+uycEfHnEXGG8uG3lBRDLf20jASmCOxbYMJaYc1gpIe6xFSD/VwCcwkoMJlL7oCeU2ByQINhUySwJYHFf1BXYLLlCPm4BCQgAQkcIgHPz0McFdskgXkEFl/PCkzmDYxPSaCfwKYCk8dFxG1LVR+JiLN1qs03swnvzb/PGxE3iwiceYT6PmtEkKIAZ1affV25VX7V8izlCQ/+3oh4dUQ8ISJwPo1ZTmtAiH3+TT23iIjrltDj3NTGGUidv9DgnOpzOPz3iLhecViScgEH4xdGBCmFXtDTQHjRhmsUZ9uXR8THI+Kvyq36p0bEn244Wb+qpHC4SkTgXOTWPPbhiPiTiHhtRDynjMVY1aR5wFH4PRGBY5R6cN6R0uCNpQ76NOTwy3VzY/2m5VY58+BMEfGvEfH3ZRzfUtr1kpGb9rCC+dUj4kIRASt4MxfeHxFvj4jfjYjnF0fjFDYiFzBW31HGiVvyzGGiAXCb/skRkVNUjNUHlxtHxA+VVBtfFhEfLM5oxrCO/ZICE1JPcIP/2yMCxzfjx1jhjCKiwK8U5ie9Tur7rhgRNyoiNNY06+1TEYFjGscwjnciSbyi/H2snazdOhe+ocxN0mewfpnfMH/TxAToE2IQmeKGhSP1Vo4XL3vW7Uud7Dm3nppg5XPqgz3GWr5wz3PnKvvh5cv8gQ8CAlK10Kffjgiia7DuhizPrammdSN1bCpKYW4x168VEbAh0gTr+QOlrUSTeOVUIzqRO+r5wJkAW6JawIV3sR9S30PKftFQdVMR1jz7IuPOvssew5wcMqJi/E768H9MlOfznPoFASZCzGxfU/av+jf27KnzDM7MTewHOhFNct2MC+v/a0sKH4Q0v9ZE5r9SBrGWWGswYb9kHg4ZZRgrjL2IdTxmRBlBTIP9eIr0kp+BdY1EQnQ0oqSNGXPkyqUA0R7u1djXlmKcFTeJCIQrzBPmDWfOM8r6JkVS3/eMbt19ZTgvOB/5LsL3I85wzjYEO5yRXWPe0ha+QyF64mwmQg5nzm+VNiEq6jPWK3MCo26+owylJ8rPc2Yz72o0mW8u39tyGcafM+j7yvc55h/ffzhHEWKR5uX3SuS7HMFmiP95Sj85O+DCXPyP0k++M/JdDSET51yf8X4i7f3Pwon9hH7wnQFWzEH2qpc3TIA5ApNvLN8LmJO8m/FETPae8k7SXWUB2lQz+P7Gdx+M/2b+aRLYOQEFJjtHevIVKjA5eea+UQJLEVj8B3UFJksNnfVKQAISkMAeCXh+7hG+r5bAjgksvp4VmOx4xKzuyAlsKjC5f0qLg4PxCzr8ugITRCKkAMDpkI1b4V2BCU57HJ/cYu6Wz8/i2OGWMyHEh8QOXacON0FxtOHc6zOcNfcr7x+aEl2HAw4wnB04+LvWJzBBZPOwiPjSkTlHOx4dEdzw5n+PGbxg8BPFOT1WFicNDsQh8QoOmScVp85YPTi8uUGPwKPPuG1PKHduwLcY84k+dA1HNqKBekN+rC7agpN6yHDeP604ncbqwfGDwAaH3Zjh6EVA8q0jhRC94EBEuPKdpdwVIoL1tq3hRCMKAw7gMfu/RTwxJrxYYp3gkKR9CAZa7JZl7g2VvV1EME/G1g37APMF8duQYKArqmDtknqkTwCCU5a9DecoRpoTxn1MjFDb/9IiIOPffU5yUqgQXaLFp4Mz9OYR8U89cE5KYMI8RzCDw3fMcPYjriGlzJB1zwfOAObg0NjiqMbRjxBtF8acRHyFEakDod+Ysa8gdqk2FSWDKAN1vXE+IorrppvBKY+QqJ5xOOfZL4YMMQHO8RqpY0qQghO7iqE4KxEA/PpEP1kDiEuqOBFHPKIRRDhD9mdpTvxYRDx8pCznAqKAup/3CVLggRCg9hOhCe0YM9YXewOGOKXvLN503jAX2RcQbA4Z7+Ic/Lmyz1OuClm7z3T3WPblZ0YE51LX+gQmzP9HJYHRUJtIX4gILEfHqWWZkzUCBmWqAG6MDULYJ5YCfdHqiLDBOYioosXOHxHMmT5DmEVEG+Ytc2XMWFcIT7pz8w7l+xVCnSlDjINQC4HpkG0iMKH9fM+F2dj72c8QVz1mqoHlc74Lkh4HGxJlNVZlMQkME2j5MiK/AyegwOTAB8jmSWADAov/oK7AZIPRsKgEJCABCZwWAp6fp2WkbKcEpgksvp4VmEwPgiUk0E5gU4FJjmCCI7E6pOobswORH8RruHuc9zhlcH4g8sDxdtnUTH6Ux+HLjd5qCAe49crNYaIf4OjMTk6cH0NChuzUwbF8x+LcwtmHc4HbtbQDp39NPcB7x25BZ4cDjl8cJjhtcOIRSYPbujgacEL+VCeCCYIRHMvV/iUiXhcRf1naRTtgUg2HIA6sIQENvHCCIWSphvMbhxxjgBMGhzjt48YyhtOcFEddw4GFw6neRscJgpCEehCm4EhirKrjB4crEUr6UkXgZLzTwBjiOMQxxE1cnKRYn8CE6Cn0o74vtwdupJhgHiCYYezGBCY4v7j1XBnAk9vcCG2ol5v+RJHgljNG/Tidcbb2GTfPGevsVCMaB+3lWRy1NW0UaSy4+b5LgQk33VlHeR3UW+K8H7ZZ+MJ8JwJMjsKQ+7XEOsFZfu30EpyKRKwhcglzjD2DsTt3KTMmMHlEWbu1OvYcWONwxyHNnP6m9C5EA9xgZ952LQtMcPAhNiDNBrf5idRAhCT2GaIs0H7WSk7rMRSVKL+HvrHXMXeZa/SRNZ6NvQOnP59TP//B0Vkdp/Qpjy+ClWv27AXsaexBzDfWI4YjuC9SAOuZyAvVWiOYsDZIIVP3SNpM/awfBDiwym0lEgdOfvbsPsvnA+OOGIK9DEaMK8ILIpsgeKvrH3ENY8w629ayw/anI+IBDRWyXzAmGGPBvOkT/9FePq/CBCIi4XDuM/b3undTP1GV+kREPPuUIl7gf7OX1YgdQ03HV4hYEEEjxrxij6/Cmu5z7GV8D0C4hjG+9IGxGDPEkncuBTgTOGuGxp3IIvcpZZnv7JNdhkTIqOcT84w5NxVpg72tpjhif+F82cY4v2FRI61QF+sZ0SF7KXOd+c1YM1+JTEGUJqxFYMJ5h2AAEQsCideX+hGWsNY4F3MEE/givKj+X8aE976vrBs4cl7Wz+H3bT1zie9Jjy/t5GwjQsiU5YgzCD+I4lSN85LoGlUkw37LHk+EDTgxdpytjGmNcjckMGHPJfpN/j7IWuDMYl7RN+piftXx7RPiIPZBbIsxLrSF+cgc4tzmzMliQlgxzpybfdYqMEFQSUQUuFfjTCZCF8JEvtfxWRY3t+49iGBq6ikEfAi2NQnsnIACk50jPfkKFZicPHPfKIGlCCz+g7oCk6WGznolIAEJSGCPBDw/9wjfV0tgxwQWX88KTHY8YlZ35AQ2FZgQeYQQ7VjfrdbsQER4geMBhwoOryyWwJGTf9i/b0Tcs9SL85ioBTiquwILHGUIS+qNdxy1pH/pWnacI7zAGYqI4kc6jjMcFbSNW+QY7cXZh4iga9nhQN9wMiES4e/0O1vuHzexcSTVm604xHBGZYEG5RG3EL2lGlEOcOL1WXam8DkOc5zGfTdycUDDE7EPTqFsOFwYR1JGwBpnFk6wbph+QteTZqPeEKcPhOvPhvOHsYMLzkMiLxA5pE8kg+ADAQ2OJByx2bJAAZEGjmgcNV1DYICjDIfvbXo+x/FD36oYhDaT8gTnTzYEK/CsqZ9IC8AzfTfBaWt13DKveAYHcDZ4MycJkV/nHp/vIoJJjo7BbX8c2AgWsuFwxCnFmGE46VizfakXdr1OspMYRyMOsuoA7g4R7SOFB6kPiPTSNTjXuYFjlfXAHMRhng2uTy9OSP6Ok7EK23K5LKqo65eoRuwJ2TGOEIq1ynuyY5y5yJwdM+YX0QYw9gaEEl1jjfM+Ig4MRftgD2Jena88TDqmLBAZ6hdOfPo5ZS0CE/ZG0kfh3MWIvMB44TjNhoOdPZk9BGMsh6LX5POB/Z9xYO2yN+d9gn0Jp219N9Fp6rqb6tvY54gnqhiHVGCMwZQxhjjAqwAPxzTRruDAfsdeRp1EYsKJjSFYQhTUt4fwOemY2JtwrmPsSez/ONURDyBUYs3+ZNpzEfUgqMgRVYbazhyGGWlVMPYhxJvd/iJo4DtATb+D2IXISH17RfddtJHvA1W8BwtS2sAKwRD7KvsoIglYY4gBOTdY813LznTOxtqmsfFBUJfPNEQyQyKXqXHmc8agRtTiuwAiWUSTWbDGvkUEEvZ55jBnN9YiMKn7DlG+GNsc3Yb5xblZ38U4wJKxZPzYixBIdYVIRAFi/dRUKqT7Y0/LxjzjXOO/WWfsK4gwhixz5ZxhjHPEEMRtiP8w5iXfnxAOdQ2/NecRbJgbfXO3Cu54lv7zXZDvIbw3GxwQa/JuooN11xb7A8IWvj8MRVhjTXGm0CaM75ys5T5rFZhwJtV1hsAOMU43UhnnCSIf5hLzhX6yx09F6EHcW7myJhGrtKQoHBlaP5JA/0KVyyknoMDklA+gzZdAIrD4D+oKTJxvEpCABCSwQgKenyscVLt0tAQWX88KTI52btnxRQhsIjAhMkB2UOGUJ1JHtuxA5O8t4di55U+UA36E5xYyjpuuCCC/A4cyUUgwbqnijOz+6J4d55TDMY+Tqy+yAYIIbodWZzC3lblN3LXscOAznK9EiyASxpjhaK71IVyh/UOpNgizTqh3DKc6KRq6oeBxOtDvmkqAMWAs5hg34utt5qk0Bwg2cNBWRxa3f2sKEd6NQ7UKBXB4MfZzDKc7YhWcd9x+7qaYaK0T5xHOKgynE+KAvvGv9eU5g/Pv5zsvgvs70m1x5gPOpT6jLDe6c3ScbQUmed5X3kOpQ1hTOMKrEOveiUVu767XCWIynKDYUPqjlvHjhjxOam6es1ZYP3mudevAkY1zHNERIisik3QdsVlUwfM4b4lWMzYncCbXvYj5SASZIdEAdRIppEaQQfzTFU+19L2WYQxZ5/SJdTeUkqlFLNJ9b8sziFVwamMIvBAPDYkbiMaR07DgCEZU17V8PrBnIzYg6kyf5fOGPQDBCw76uYazmzlRU9OMpezovoM9kohROcpUXztw4iNYRKjQFUJ1y+PsZr9kro4ZjmUEVEQ9GEtZ062D85TnEAVhzF/GqQq+6D/nf42sgFiEfnIGtxptpw9VdDr0HNwRc7GvwqjPEOsRIQ1DgMJ8mzLGI4sqEe70CR2m6uFz5hfRSur8GDtX2ZfYXxERVmsRmFCW+YFocsw42zlrGCNsKo0SYhzaw/7EvGPfQqiUjQgk9b1TezMCD74PYH3iLsayRpsj2s2rWgD3lCEaD9+9qjFXu4LJmVUPPsaZCFuYMReJwtIXkahFYIJIpO5znBN8JxpLEZbrbEnRxTxg3dZoTpwJRNrSJLBTAkYw2SnO/VSmwGQ/3H2rBJYgsPgP6gpMlhg265SABCQggT0T8Pzc8wD4egnskMDi61mByQ5Hy6ok8GkHU03hMXb7nZQROBpwrGD86I3zo+twzA7EMadoRp/TqpBeBZHFlPHj/NVKIUKn41zOlh3nODJp65hohZvn+VZ1n6OqKzDBOToUnaG2Bcc3N3yrkT4H4cGQIeKAYQ0rz+3+Gtq+PsMN5RqxA4c2EVLm3GrN0SZoExyn6rl+ub1NWxASVDEM/75huUnN/+Z2c02fMDWW3c8RFHCbu4aX3/R5yvM8DjZutDNXcYR+aKIiHK08w2/tiIe6TlMEJ9xox1rmNk68u6d3biswyTe9XxQR15roD22tIhkcaUSDGBNi7WKd0F/6jbWu5b5u5BvyrXOJdCvcHsdwfmbBA3/rCkwQSiHgmDKiSrDGsDHRCFEBiPKBkZYBB+aYGGXqvXxeI9YwNuy9fWlLWsQi3XdNPcMawNleo0hMic9yW/nfzNUqbMjvzufDWKQTnum2gfXIupxrRGGgT9WIuDKVgiW/C9ETHIhwUR2++XOc1ESd4fzqRooaajPRDJhTrFP2/j4jGhF1TkU76HuWdjIWVQzAXkh0Gc5ChI81QgztRWA55hwf6gNCFqKPELmnnlvdskSjYR0PiYkoT2SfGnkIMVlOUzP0bsYwC8mITNGNsNM6X4jyRSQwDCc+63lM0ETUiiwwbBGYMN84Z/oicuV2sre/oPyB/86p8Ib6g3iHKCFYX/QzouzU9FlE+EAc0yes4Ozk85r+kPQu3YhuiPNqKigiqCBOmmN8fyIqD8Y85/vFSVhO9Ti0r7QITHK0Nb4jD6Whyn3izOH7JXs6jPuizuXyCC1rKiLWKOtWk8BOCSgw2SnO/VSmwGQ/3H2rBJYgsPgP6gpMlhg265SABCQggT0T8Pzc8wD4egnskMDi61mByQ5Hy6ok8FkCE0L2VwdERYNTk4gi9SZt/TvOmHrbOGPMDsQWpyTPcuOYiA9Ya4j77DzHGV3TUtS2ZIEJDuKa2mVsyBGpXLwU4DY1Duts2eGAgwjnQJ+DJj9DqHrC4WPcMK71j7WDvpBqA+tzuvx5RHCTFWuJEDP0Lm5oP6B8CM8HN6wHxqem9kGUgmCmWr7Ni1MEh9aUqKPvlTg/a3oXHE4w2NQum5xiOOmJhtBiiIEQBeH84UZ7Fgjk9BqMT3VGDtWbw9tTZluBCdzhj7U4s5ifpK2okW7oFze3s+16nZDKhbRIGOuJOdGNJNIyDjikr1oKsv+wN01ZTrGBaK3ewK/PZVFFa4QEns2RFV6bIv5020OUmJqehhv+pPOaMoRP9I+5wl6Lwzz7ekiTgTMSI4oL0ZW6NiUW6WvD1DM5RQZ7HJERphyhRFkgjRBWU8d0353PBxz0RNgYsywkRBjRl0ppinH9HEd4FfcxJ4cEHX31fX1J28G6Y3wQICDuY39AVIETHkYYEXEQa9boSUPt4zkEFezhOPVhhiMfkQdzgYg1OUIGESg4T6bOnO77qJvoK1WQhsiBKCU1cgkObxzXc/ZqGNJPBI9Ea+JcJD1QTcfC+VDnL+1CGIcQsZv+hM9yxKmhKGLdvrG3ZR7sN7x/jsGopsAJR/ZKAAAgAElEQVRiXEi1NWb0lzVRI560CExahIG8E1EpKVUw9jXaNmXsIzXKE8KHmvYvP8f8Zx1gnImcjV1DjMT+hXEeEiGuazlVHN+Tanq5qTbmzxFXEZ2n8uM7Gt/VdmGckwiUOPM4x5mneV+FVU2VNbQPTQlMEG/RfupG+Ec0nZa1mcUtrEnmxJjl76Vzvw/tgql1rJiAApMVDK4CkxUMol2QQCGw+A/qCkycaxKQgAQksEICnp8rHFS7dLQEFl/PCkyOdm7Z8UUI5AgmLS8gRD+CDqKZ9Fl2IA6lScjPkQql3pomcsUTWxpR0rTgsMceUm4/50ez47zv877XIATBgYfhzKvREGrZ7HAYczTnuukPN9QxHAsIc6bsB1OYeCIiVPENz+HExBFZjRvo+Vb+VN35cxwbpA3CuEn8noaH+R26MmLc6i1nHsWRiTik3rblc+YJTmEcX0Npgbqv5RY2t7ExhB7c4EZkAvNWJyjiAsL8Y4gJ+hzzfd3FKUekA+ybUiQC+o1j9gvKZ6035XFA1rQa2whMGOec8qBViFVvS9PsG0XEr3Y6vet1wnrG+V6d90Q4whlJKh+cmy0OOJqIw46IERgpJYi8MGWkk6pO9D6BRxZV9KV9GKqfPuEwZ34jHsDp300/wbPvSkK8KcchAijSWuEQb/XtDKXJmBKL9PVr6hnmyjPKg0NO5m69LXtTPh8Q2yG6GzNSbSFIwLYR0/E8IpAqPujuXWNtwFGN0IXUGghKOBee04kGhLMZJztnTd0jECjUiBzd+hFskuaNOcvcJuIEooIcMYN5gUMZB/6ZSwVEr6r779R6yJ/TJiL6dIV2zFnEJUNpa8bewd5PH9gn2adJC8Sc7qaMI9IFkT7qvjok+Nt3BBPOWqKWYH0RkPpYIHzjLMBaBCZDqcq6dXNmEVUN4+xriSzD/Kxp6d6UBBS57iyWYz7UyDa5TI2axN/6IqHwd6LH5Wg0cGCMEQaS7rDFEFAh0sIQfNH+bVJgUQ/COKIBkfqMyDotNiSEnhKYIJ6q0XI451tT+9DvOmdIKVcFyENtZc9i78JuXqIktfTLMhJoJtD6JaS5QguePAEFJifP3DdKYCkCi/+grsBkqaGzXglIQAIS2CMBz889wvfVEtgxgcXXswKTHY+Y1R05gSmBySfKLV0cHq8q0Qm4tTlk2YHYkoIC59Q2aQ9oBw7sKuKo7cqOc9K4kM5lynAI4iDD+m4AZ4cDDkaEIFOGOKI6vcccjrme7HjppokhnHsNR49jst7+nWpH3+c4oUiLM9cQC3RTRSAqenFEnLFTKeIM3vf6cmuam/pD6XgQJzDX+lIk4ARELPLqIlxB8NRnOHpxjm1j+TY8EQVyWoNWgUe+Mb6NwCRHX8CBy+35FsspCKYi/exqneAUJ4oJgoxs7CUIjQjxj+hoSFzA3Bka15Y+U4b5ceVO4SyqaIlQkB8n9QERNLC+aD85egDORpzp/zrQ2JsV0cymPp2bpugwueopsUhfM6aeIb0RUWAw5hDpwFqMuVn3JFJw5bRjPJ/PB6IUEY1pzPI+PuTAb2kXZbLAhDEaSueS6yP6AeljqjjiikXoNvROzqEqkkRQd94eMRJ7JvsCZx821S8EGqQkqcb50I001sKAtiA4y+uyNTpGX/05usxYej2epa/s/0StwDg7OUOzZfFDa4QhxHs5sk5farsWNpThew0iB6w1alJOkdIiMEEchEhoyhCUIGybawg9q1gm14FQCUEqZyz7E8LFD6cCCJ4QCBIZhvnL50PilhxpLb+DSFuIIvhuyfefPjEe5dlPa0oZotjlSDdz+o3ohfrqHGutY0j0MyUwueaWEZVoH1F77jfR0JyiTYFJ66habiMCm34Z2ahyC58MAQUmJ8PZt0jgJAgs/oO6ApOTGEbfIQEJSEACJ0zA8/OEgfs6CSxIYPH1rMBkwdGz6iMkkAUmU06iFjzZgUhaAf49Ztnp11J/XxluzuIMyJYdkzj9EKFMGbdJqxAFgQOOvWxTDoe++qmHNBdYy21VymXRDTd6s0NwjpN0qN/5xvYUm6HP+36XxnGM04YUIaT86DNuziO4wQHVZ9y4R/BAxJeaDqhbjlvP3P7lXd1b8zlyzNy+ZUEIjjeicVRDBNGX5qH7rnz7eBuBCekDahSWTaIvEMmj3lK/R0Tcv9PAJdYJr0AQc6+IwAnXFZrUJnD7+8490WW60VrmjB8iFiIzZJsSVYy9h9QZNU1Fn/M7O1vHIhUhukMgVoVZiBeIlvSG4tglcgtirGotAos5/Zp6hrlCRAqsNd0PZbNjvC/lxabnQ0v/W+fHnBQ5WXSIyAMn9pixH+IsrynliMRERIVsOUIVZWtKrrF6X5kEU3NSkiCQ4azP0bB4H0Iu+sT828SyCJKoLtTf3YO79eU9GXEKUSay5RRXiBTO3tCgnMqJ4q3Cv76qOWtr1IscvWqsGaR4qlFDWgQmU2Ki+i7EH13xZgOOzxRBJDJ0bub0NndNkb54OK979jvGZMyuU6KNIcjpM0SkREohSghp87LlKEmcBTWqxyb9rGWJpsP3mSoQov+sE85MIrMhHmJfraLWqf2Peqe+7+X2z2kzz7R85zZFzly6PtdMQIFJM6rDLajA5HDHxpZJYFMCi/+grsBk0yGxvAQkIAEJnAICnp+nYJBsogQaCSy+nhWYNI6ExSTQRGDfApPs9MO5Wh0ETY0fKbR0BJM+UUtfcw45ggkRJIgygA2l39hmHLgljZOZ/yCMISJJV3AyFIK/vpffvYnacvmIuFxJKYIAIRtRMRBvZAfnI0oqJ8rh/Cd6xzZmBJP/T28q0k/mDDfGrs4DnIhZcEIUnBsk8QbPdlkTpSBHj5k7ji1OxaG6uRWP07vuT6Sv+ONSGKc0UQFwbmPM0yGHPWKSW5ZypJPgFv9Y6qjnlbXJI0PO6Tn9mnrmJCKYtAgQdykwQbCQU8EQBWhKFEFaripU6hOL9M0XUt3cqnzQJ84hPVMVRLaKRX4qIh5Q6hxKfzI0d0ldxDlfI0QQ3QKhTxU+cu4iptwkKgqiPuYQ1icW6WsL67ym6OoTyXEW1ahGCAEYnyy26qvz6iXCDp99dMuoH3MimCCeQGQxtj7nzOHcFlKxEPFmV8Y5XPcnItog0sE4a0lvg0AUQ3iUI+eMvf+cZZ3UM7rWWZ8hygyfISyttssIJndP4kkEfJw5zOshI30eohdsSOQxJTC5dol0Rx2tEXfmjCHCVgSuGHsR4klNAjsloMBkpzj3U5kCk/1w960SWILA4j+oKzBZYtisUwISkIAE9kzA83PPA+DrJbBDAouvZwUmOxwtq5LApx1PpDXBWm5TTiHb9IY6N59xzlZDlEBkim0tO3VIl3K3hgofUyJmUJTb1tVJWB+dcjj0vSLf2ibaBlFMpizfcOdWbr51jrPwg6mCr+k4Tafqzp/j4L5q+UNr6P5N6u+WRVzy3SWyBQ56DOc6Dq33b1DxxSPi9sXhXh9jfBnnatkh25rOaKwJ/P6Os5PIKhhCCW5dT1mO6LBNBJNuVA9ubA+lLshtwoFYHcvcuK4O3lpmiXUyxoQUDYiZ2GtwSmL0g/+dnf2wrqkOWlJtTY0Dn0+JKqbqeFJEkKIAIyoFggOMSAwvLf8bB22NXtFXH8796sC9VEkbMvbenMbqJAUm+XY+UVZqOpextiKwQYRTjTmb93b+vun5MMc5P9RG1jBRh6rIjX2V/XXMcIjX8UQYxByYMqIE4fDGiDxS99j6HE77Gh2LskSNmDLejTgJ654JY8+yTyCSuXApREoiznvWHGmqqsgEQQMppVr2NKrKQqlfSVE8xtqSU/0QoaPupfUZUisxPqRnwS4bEW+cAJOFBaQSQcg211i7pBHCWgWXiHJYx9guI5gQ2aae+6SnIk3VLg0RBsJNrAriSP9EajGMCCDsU/8x86VfV3ggRqzp3F5SIlrVKnMUHL7zId4jiswco920HyNyGsKuMcuRveYKTJifpPrDPhQRfDfbtbEWSIVYo9kQlYax0SSwUwIKTHaKcz+VKTDZD3ffKoElCCz+g7oCkyWGzTolIAEJSGDPBDw/9zwAvl4COySw+HpWYLLD0bIqCexdYMIQEDodhwSGE4q0MttadkySpuQ7GirEucZtYey2JcR6fmyOwAThBsISjFvItf6x5jyypIehzLMj4vqdwjgJa/h7wvPj4Jtj942Ie5YHW52Ec97TfYaIFH+aHDI47Z8yo+Is3iEUPreWq2Vn2fuKgKGGx5/xqk8/kp2JLemOcEznG9vbCEx4P877GiXjWhHxoomOnK08Ux22pOJ4R+eZJdZJC18cuQgXqogER/dr0oOvT2u21bE/9d5tBSbcHsdZj7FnsQaZU8+ICAQZ2JRIDxENjnSM/8Z5OGQ4XD+cIr4MObBzNImp99d3TbHIqUeIMsO8I0LEmBHJgYgOGCI4xINd26fAhLYQ7aim8/ieiHjxRJ+yIx5n+YOmJlk5N25dyvWlGXlhiVxDkV+ICM6IKUPM9MBS6PdTH8aeY/2zpqqYD8c04pLqoEZog9OffQkjShDrsCVaRj6jED8ggpgyzrFnlkLM67qX5ecQiSB4wBAJ/txEpVkkSUon0nLNtSw6yAKyofrgR2SOKljapcDkaRFx4/LiVhHSJv3O6QBJmUMaQb4D3LBUwv7AXrKtZaEaoqIzpT2PvR9hU90P+1Jqtb4/CykRVCLQGTIiTvGdoKZgmiswYdxZM/UM47xHpLRLu2A6s2F1ll1Wbl0SqAQUmKxgLigwWcEg2gUJFAKL/6CuwMS5JgEJSEACKyTg+bnCQbVLR0tg8fWswORo55YdX4TAviOY0KnHFUEH//v5KSXENh3OjnOcwDi0EWYMGTe8a8oLyvQ54+cITHB24PyoRhoAwqkPGbd9aWd1vuGorDfX6zOZF6HuST8zRzyBoxWHK4bjm5QVOQLBNvynns2pP7iFXp2nU8/lz3EQV5EFQg6cMdVw+uDkJt0K1iLImHo3TscfL4W4Wc8N5jHD4ZmjE2wrMHlWRBDdBmtZJ3eNiAeX8kSSIMx+d54ssU6mONbPs6ALx2Z1PvM5nOGN/UGJGDNnjue2TIkqptqNDwbnfBXDITghwghrhshL2JSTkQgN9Ub/VOof0kflqDxDDuycsog0Kj891ZGGaC70lTlTnbCkmCLV1Jgh1iBCEcZYVmd1fmbfApNHpyhSrE2c92NGlI9rlgItqWDgxn5f9yL2tRrNpL4ntwHBF2fNlOWoJ0Nscx3MLcQlNQUaaTYQl3TPQOYiApEqzkMwgcgEYc2Y5bmJ4xsx0VQ6mxz1hHOrCknye4hEVUU8iARq9KW+trAO6Q+CAewSZa+YYjn0eRZdUC8RRMYiaiDufHqqbJcCkx8o4lKqJ60T0USm+G7Sb85F1jciiU+UOUhkHMQeRC1BPMec2dYQlORUNd2Ia0R+IgIUxvlGGqU5hlixpuWZSil03U6Ek7kCE9qZ2//wlHZnTh/6nsnzoC8a0q7eYz1HTkCByQomgAKTFQyiXZBAIbD4D+oKTJxrEpCABCSwQgKenyscVLt0tAQWX88KTI52btnxRQgcgsAE8QfOpOooGnLU9AHAAZpTxtQy2XHO33AUIjLoc1LzXhx4NcT6UMSTOQIT3v265MAj0gYOPG7z9tnDIuLO5QMcM6SZwAGUDccXTswamaLlpvfQ5CEiA45yDAcGzlTS1kwZ6Q1wqnODt9pZy43uqWf5PEcD4fY0t6gxhCGf39PnvjpzdJi+McuRHUjBQ0j+1lQ8hLvvim3gnm9Gc8Oc6BV9dr6IeGsSHlBmW4EJz+coH1ePCG7w99m5yvurwAYWRKzp2q7XCVETWlL3sOZwYNYoF6TnqOkZaCPROxAj1Pa3RubgWdrAvCTyRrZtBSbUhWCgpsYhgg5ru86BFtHR21K6GfaTXx4YP4QqCHBw0FYb2hdZP7QFoz7qnbIWFjCvESEQHiBWGFo/3xsRROaohpiBKDRd27fAJLezRTCCsOYRpROcHeyVff3KY5SjMVGeOZKNc+gF6Q836QgVusxyNCY+G5s3fE6UA6KA1WhZjBnjQXqmPjtjRMACoSLG+uWdzNUhYy6wv1VjniCoGzKc/8znGq1iKEIGwsr3pH1zLHoR6b6qIGFIsDLSpM/5CFEOrGobEblVgV63MPsT/a+RxPh8lwIT9kfER5wj2FNLeq4WkR3jSTnEbGOW936EppyPWMu6aN3ncyQkhCsIWvL3C/Z9vndUYzwRmmxqWQg2Fn2FlFHMwyoS5D3bCExYV3yHxhAjIZZpjcA39N019z2L0cbm46a8LC+BzyKgwGQFE0KByQoG0S5IoBBY/Ad1BSbONQlIQAISWCEBz88VDqpdOloCi69nBSZHO7fs+CIEDkFgQseywxPnCEILwuP3OavJR48DDAc/Doq+VAzZeYJDA0EEYee5pfzxRBJn3OMj4nrlb7yb29wIFro2V2DCTW2cklVAgzMEp/CH0gtoH46O6rzmI26Jw6HPuOXNbe9qj4kIRAR9aSyIVIIYA2cZN32zfVNE4JzDKYXhaMKpWiObdN+NyIIoGqQQulUnxQRjeO3CkwgbfcIf3oMgpt7qRwRA5JR6WxqHHSkaEJzgaCJCRJ+RSgkHI44ujKgNRG/Ixrtw+hOdBqM9d4gIoqfg7OoadX1fRNymCDmIANI1HH3VgU96EyLMdEUCl4wIUmPQlzr3qGdbgQl15BvTCI9uVt6V28lNfthV5yRsL1rSEXT7s+t1Ah8EY08q0WWIbtA1hEjMRRyyGEIqnG1E0cmW1xt/Z/2S0on0NF3DP8I6IyUDz+Go7gqzWkQVPVV/1p9ypCNELMzVKkxrSZvEHGX+Y6xVonx0RUII0Ogrt/1xEtfoKEMO7MuUNUydRDsgIsbHJjrSwoK9EZEBIjcMcRVpTrKwgL/zN9ZrjczC/oaQo8/2LTCBJelZcHRzDrDmxwR1CAkQPCA+wBhz9j3SqWTjTGIveGhKmYGIrjrtu2XZh9lLMSJTICpEJJRFUcxpziUif9AOjLWM+GgotdKZi4P7UqU8USoQuRCdYswQMjEPa1QmGPEcqcyGDEFYnfvsp8wp1nU30gbzmT2yziPWJRE5eEef5dRt7Ams5+ekgggQEbMQuadan5Bnosu9HxPRpp5N9IkzmMg9+bxgXyeKDOuOcagpUnYpMKFxfLdB7FG/NxBphvbkiGi5ExcrghvmJykBc0S2vs4iKOr7nvP95Ywc48d8IlUTEVyYB31riPlN2h3OQ2woAgdjW79/Mf8ZfyI3/VOnAQhqEXRwhjMn8h5Hn/kehzEmfL/qij8RXPE39se8r24jMOF93TOUdYAwpHv+UBbxEsJQ5grfW2u6riHWOTILYp2hsZ8z131GAp8hoMBkBZNBgckKBtEuSKAQWPwHdQUmzjUJSEACElghAc/PFQ6qXTpaAouvZwUmRzu37PgiBA5FYMLvmzinb5p6idMCgQE3r3E24DzDuYOzvDpduVlfRQYZUP7RHwcCogmiIeBUJAoE4g6c2jjIal08P5ZiYq7AhHpzupLqBCF6CA5DHLmID3C8V0OgQSj3oRvLODR/PSJIE1MNXohFCO/PbVr6h9igCnAu3uMc5lmiljw7OYj5G8xJTYITHKcIDnu4VychZXg3aTGqdUVC1IGTC5EQTkHagQigill4DodeTiPD+OY0DrwfJz43y3Fc1nbgoKxGehycR303tinHjWJELNVoD8ITBCfMO5zHOG9w3NaoMDiK+wQmjBWMczoeHND8DccWAgScRtTL+DCmOMWwXQhMiKzyO0XEUfuDsw9BEONPP3BqV38BTK5WnkkIPvM/d71Ocn04C7mFj1MMxzxOfeYPjk0EVdVwDtYIHN02Zmczn1EnAgfqxYHHXCL1D87V6oSnHA7zJQQm1M185H3ZiEiEIGQqegvzlzXBTfpqrDMc+ax15nEVROHwZ59CSIcNObCZswg36q185jURmWhL3T9wBrPGq7UITCiL2A7HdhWPUB9zjfYyhjjZq5CJ8v+PvTt2te3btry+fpmRCBr48GKi8AxKTa8oekEw0EDKwMhrUolQCgoG9QcIaiB6E6tMNCgwkQciGGlQClUUmBhckEIjqUBBUVADA3ky9j2n2HXYZ/cx91qtr77m/OykqPfra87ev62NMfcds521lxeXvj8LDzw7YLJ6fP/NF//st/k+Whvf/2/rG0dWKO37i/71f19zrD1kveRez5818/c/J7T++9q31l73/huP3t9jrdH1HPrOdf23FQ76a990W15ebN9/Q8baX1bo4KNQwPdrr736v/z2XFs+WMGLn/Xw48zr+bp8s3pbIa6l/fqTUD/7WUGy1e/3P+f2fe7V35plPVfX8+f9nwBa/lmBpPeBkR+vv54VK1jxPbyy/vsKOq11suZbfb0Plf7s25k+0/Rn/22FRVYY9P2L//XsWd889j0Ys+6/nr9rz197/wq1rZ/1u8sKhv34835PPPLtbOs66xtc/uI77y1+a+2tP7O3gnnLP4vF+kaZ93vKP7wRMFnXX3vR9/1m/f/XfrP20599w9r32d6v4xUCWv0sFqun9Yxcz93vwZL1mVWz/PzRnwdcvlvhk/fM13NrPefW70frWbaeG+t6339HWvd4H15cuq1rfw9trXuu5876U0/r94YVpP3ez/q/rb31+5+7uzdgsu69/lTfP/NO+PX76ton1zpa63b97rnWy+rjeyBpfZPKe0Y/+mb9PrJ+t1k/65nz/RuJvuJrn0HgUwICJicwiIDJDBHTB6Ezpryvi18JN5QA0z6iQSnBW0Fah70uVCGAAAK3m317zwXpfZsOtQ5pDeoO5lfw0Z5GaS/9SsBkTwhVCOwRmBIw+d7tv/btmzzWC4TqZ71s+f6nb36s/fGlzjqoX//q/KNvO1mfXS+u1zemvA87/HjNewIm61p/7ts3kqwXKj/7WX2sbyNZ/1L5xz/x8eNn1ovl9S+5V+33lxafXXe93Fgv5j/6WS+o1rcQrBeCOz/rBdOf/SGwsvpY//J452eFIVa45Mc/27JeJK1gSjXP93ss/66v1f/o21K+16wAyV+63W7rX2bvnKOvF1f/+id/vmQFCdafA/ns5dB64fQvffPnIwMma6YVMlkvyd+/gP2I+f/07RsyVrjgZz+PXifvv9K/8sEKey3P/Cxc8v3z/+Ltdvv3vwU4qmuu/76+OWK9BP7xWx52QxXVPT7y+Wff2vHj9da3RCx/fBSM+167/oTK2m9+9y5099nL6RUSWyGI98Gd9/f98U/nHGGxXgyvbyJ4H+r6iNEKcq1vZPlZuGR9ZkLAZH2jxvc/Y7H7J4XWn75Y++PPnh/veawA1AodfPbtH6t+vVBf3wDx/qX4z7y3QncraLReulc/K9ixgg7rWXb0Gw9WsGUxWR7/2Z/UeX//1fuaofomhvWZ5YsVmHj/p5R+NsvqY31zy1r7P/tZIYjl4x+/uariU/33FQZYa+mz/XUFa1YAdAURl+fXz3oevv/TR9/vc0/AZF1jBRPXt3OswMHOz/rWixV2WN9eU/28/xNQq3Y9v99/M9rPPv/+T31V91jeXc/CxexnPyt8uPa69Y1c74NcH9V/D5q+/ya6Vbe8uMJwn+1Ta/2sb2BbPlzBpPVzb8BkXWP1vK631s370Nhn3l3+Xt969bOf9a1s/9a3/7h+L16/F/pBIEJg5xfjyI1d9HEEBEwex/KeK6UPQu/pbcpnHarXSqR9RINag1WR1mGvC1UIIICAgMmuB9L7tudnrURag7qD+RV8tKdR2ksCJns6qEJgk8C0gMlqe337wHqZtv4Myvd/mbv+5fJ6ofA3v/2Zl9X3+nMh3/+0yo/jfvRSZ/0L3/VtCetF0PqX4evbD9ZLmPUvyf/Db/9C+jNs9wZM1rXXS+X1cmO9sFwvRFb4Yc215lgvPf/jjReTP/a4vrlg9bZ4rW8TWPdY32Cy/jXyetm0vsJ+fXvB+pfY1c96MbX+zM36F/krSLFetq0X9evl4PqX8Otf5a5//bv+9fZH366yuK4+1r/eX/+Kev3/V6Bm/YmBFdxYLzwX7/UC9Gf/On69IF0v99bX/K/Ay5ppabdeni9W63Pfv5Hh+4viaq7131fAZoVR1r/qX99osv419Pe+Vhhj/Qv5db31r6l//DMPP15/vVD6l7+9SF7f7LJeiP6v3/7F9HpBu15QLj7v19cjvsHkfR/rq/bXy7J/4tu3J6x/+b80X//aeb3oXH8OoPqX6Il1sr6xYH3TwgomrH8d//d/W9PLk+sbh5Yn1zclrBfT7/9M1GcarsDR+uaD9W0s689/LD+s9bv+pfvy9fLV+paBtSd8/1ffP17vSKjis15WyGCt1/cvQpcOn30rw4/XW9/6sEJM61uAvr8QXd/6sP5V+9JtBVbWz5GX02u9/flvfljMF5/v743uCZisPtbaWy+J196wvr1l9b+8tYJd6xsr1p8MWZpWPxMCJqvH9W0Hi9f6poG1z1V/Umh9Zr0EX4GHf+52u61vg1pBr/Uyee1J6zmygk1r3S8PfvQnuD5is74JY/05ocV1BdZWL999vfaT5YcVRlrhyGotV+xT/315bK33xWYFTdbzaD3D1x66vkVn7Ufrxf8KKf34Z0+qntZ11zeDrFDWWneLwVp76xm0Aj9HAzTV/d7/9zXP2uPXM2g9p9cs635r31oBv9XLmmvtw+vnZ/v7kTX8s/7WXrM8sry39tX1bTnrubp4Lp+s4OgKcKx+fvwTVp/NvLR6/yfH/qHNb7xZ/aw+1sxL8/WNXsu7az2snta+sPpY3l374s/+pNOPva37L+YrBLZ+d1jcVxh17Y1rza5n8/pd5qM/BbiutZisPXD9qbvV09q3Vi8rELM0W72s4O7Os+Arv++t59Lqf/l2fZvY+l1sPZfXN7us31tWH+ub69Ye8VkQb/AuX90AACAASURBVK2p9TvJejasvWl9q8xHf3LniJ/VIvBTAgImJzCHgMkMEdMHoTOmvK8Lh+o1v7SPaFBrsCrSOux1oQoBBBAQMNn1QHrf9vyslUhrUHcwv4KP9jRKe0nAZE8HVQhcnMAjXupcHKHxEUAAgVMSWN86sQIP6+ffuN1u/8EppzRUmsAKt61gxfpZoY8V9nilnxXeWb8rrZ8VFFuhTj/PJ7ACyCuEsn4++7ONz+9UB6cgIGByAhkFTGaImD4InTHlfV04VK/5pX1Eg1qDVZHWYa8LVQgggICAya4H0vu252etRFqDuoP5FXy0p1HaSwImezqoQuDiBARMLm4A4yOAAAI/IbD+vNj6RoT1DTvrGzH+gcHfEELEmQTWN0etb01aP8tD61uDXu3nv30XKllhk/XNYn6eT+D7N5+tb31b37a2/l8/CMQICJjE0PZdWMCkj/Vnd0ofhM6Y8r4uHKrX/NI+okGtwapI67DXhSoEEEBAwGTXA+l92/OzViKtQd3B/Ao+2tMo7SUBkz0dVCFwcQICJhc3gPERQACBTwisP22y/qTI+vlXbrfbf4QWApsE1p9e+avf/qzR+si/e7vd/sLmZ6eUrT/ztP4s3PpZf3Lm79v403BTej9zH//k7Xb7b74N+G/ebrd/78zDmm0GAQGTGTrc1YWAyV34Hvbh9EHowxp94oUcqtfw0z6iQa3BqkjrsNeFKgQQQEDAZNcD6X3b87NWIq1B3cH8Cj7a0yjtJQGTPR1UIXBxAgImFzeA8RFAAIGCwH9+u93++dvt9r/cbrd/8Ha7/T+IXZ7AX7zdbv/d7Xb7z2632//1AY0/c7vd/tLtdvvHv/23//vbN+H8zy9E7u+43W7/9bsZ/BmWOeL9tdvt9o/dbrf/4Xa7/aO+WWmOMGfuRMDkBOqeIWASP0T8kz+KK52eIT5Aww0cqteQ0z6iQa3BqkjrsNeFKgQQQEDAZNcD6X3b87NWIq1B3cH8Cj7a0yjtJQGTPR1UIXBxAgImFzeA8RFAAAEEEDhI4PufJ/l/b7fbf3+73f7H2+22QiR/5+12+0e+hUm+v4/909vt9udut9t/cvAezyj/V7+FqP6u2+32T99ut199a+J/u91uf/ztW0ye0Zd7IoDAkwkImDxZgEfcXsCkpthxmJs+CK2nnF/RocN8Cp93mPYRDfYcktZhrwtVCCCAgIDJrgfS+7bnZ61EWoO6g/kVfLSnUdpLAiZ7OqhC4OIEBEwubgDjI4AAAgggcJDA94BJ9bH/83a7/fnb7fafVoVD/vtHc/1/t9vtX7jdbv/FkB61gQACTyAgYPIE6I++pYBJTbTjMDd9EFpPOb+iQ4f5FD7vMO0jGuw5JK3DXheqEEAAAQGTXQ+k923Pz1qJtAZ1B/Mr+GhPo7SXBEz2dFCFwMUJCJhc3ADGRwABBBBA4CCBv/d2u/3Z2+32T337Zo+/53a7/d3frvG/3263399ut//qdrv9x7fbbYVMXuXnfcDk/7jdbutPsfzbt9vtr77KAPpEAIEMAQGTDNfWqwqY1Lg7DnPTB6H1lPMrOnSYT+HzDtM+osGeQ9I67HWhCgEEEBAw2fVAet/2/KyVSGtQdzC/go/2NEp7ScBkTwdVCCCAAAIIIIAAAggggAACCCCAwEcEBExO4AsBk1rEjsPc9EFoPeX8ig4d5lP4vMO0j2iw55C0DntdqEIAAQQETHY9kN63PT9rJdIa1B3Mr+CjPY3SXhIw2dNBFQIIIIAAAggggAACCCCAAAIIIPARAQGTE/hCwKQWseMwN30QWk85v6JDh/kUPu8w7SMa7DkkrcNeF6oQQAABAZNdD6T3bc/PWom0BnUH8yv4aE+jtJcETPZ0UIUAAggggAACCCCAAAIIIIAAAgh8REDA5AS+EDCpRew4zE0fhNZTzq/o0GE+hc87TPuIBnsOSeuw14UqBBBAQMBk1wPpfdvzs1YirUHdwfwKPtrTKO0lAZM9HVQhgAACCCCAAAIIIIAAAggggAACHxEQMDmBLwRMahE7DnPTB6H1lPMrOnSYT+HzDtM+osGeQ9I67HWhCgEEEBAw2fVAet/2/KyVSGtQdzC/go/2NEp7ScBkTwdVCCCAAAIIIIAAAggggAACCCCAwEcEBExO4AsBk1rEjsPc9EFoPeX8ig4d5lP4vMO0j2iw55C0DntdqEIAAQQETHY9kN63PT9rJdIa1B3Mr+CjPY3SXhIw2dNBFQIIIIAAAggggAACCCCAAAIIIPARAQGTE/hCwKQWseMwN30QWk85v6JDh/kUPu8w7SMa7DkkrcNeF6oQQAABAZNdD6T3bc/PWom0BnUH8yv4aE+jtJcETPZ0UIUAAggggAACCCCAAAIIIIAAAgh8REDA5AS+EDCpRew4zE0fhNZTzq/o0GE+hc87TPuIBnsOSeuw14UqBBBAQMBk1wPpfdvzs1YirUHdwfwKPtrTKO0lAZM9HVQhgAACCCCAAAIIIIAAAggggAACHxEQMDmBLwRMahE7DnPTB6H1lPMrOnSYT+HzDtM+osGeQ9I67HWhCgEEEBAw2fVAet/2/KyVSGtQdzC/go/2NEp7ScBkTwdVCCCAAAIIIIAAAggggAACCCCAwEcEBExO4AsBk1rEjsPc9EFoPeX8ig4d5lP4vMO0j2iw55C0DntdqEIAAQQETHY9kN63PT9rJdIa1B3Mr+CjPY3SXhIw2dNBFQIIIIAAAggggAACCCCAAAIIIPARAQGTE/hCwKQWseMwN30QWk85v6JDh/kUPu8w7SMa7DkkrcNeF6oQQAABAZNdD6T3bc/PWom0BnUH8yv4aE+jtJcETPZ0SFf96Z/+6Z+m7+H6CCCAAAIIIIAAAggggAACCLw6gV9++WVcnmNcQ68u8jP6FzCpqXcc5qYPQusp51d06DCfwucdpn1Egz2HpHXY60IVAgggIGCy64H0vu35WSuR1qDuYH4FH+1plPaSgMmeDukqAZM0YddHAAEEEEAAAQQQQAABBBA4AwEBkzOoOHAGAZNalI7D3PRBaD3l/IoOHeZT+LzDtI9osOeQtA57XahCAAEEBEx2PZDetz0/ayXSGtQdzK/goz2N0l4SMNnTIV0lYJIm7PoIIIAAAggggAACCCCAAAJnICBgcgYVB84gYFKL0nGYmz4IraecX9Ghw3wKn3eY9hEN9hyS1mGvC1UIIICAgMmuB9L7tudnrURag7qD+RV8tKdR2ksCJns6pKsETNKEXR8BBBBAAAEEEEAAAQQQQOAMBARMzqDiwBkETGpROg5z0weh9ZTzKzp0mE/h8w7TPqLBnkPSOux1oQoBBBAQMNn1QHrf9vyslUhrUHcwv4KP9jRKe0nAZE+HdJWASZqw6yOAAAIIIIAAAggggAACCJyBgIDJGVQcOIOASS1Kx2Fu+iC0nnJ+RYcO8yl83mHaRzTYc0hah70uVCGAAAICJrseSO/bnp+1EmkN6g7mV/DRnkZpLwmY7OmQrhIwSRN2fQQQQAABBBBAAAEEEEAAgTMQEDA5g4oDZxAwqUXpOMxNH4TWU86v6NBhPoXPO0z7iAZ7DknrsNeFKgQQQEDAZNcD6X3b87NWIq1B3cH8Cj7a0yjtJQGTPR3SVQImacKujwACCCCAAAIIIIAAAgggcAYCAiZnUHHgDAImtSgdh7npg9B6yvkVHTrMp/B5h2kf0WDPIWkd9rpQhQACCAiY7HogvW97ftZKpDWoO5hfwUd7GqW9JGCyp0O6SsAkTdj1EUAAAQQQQAABBBBAAAEEzkBAwOQMKg6cQcCkFqXjMDd9EFpPOb+iQ4f5FD7vMO0jGuw5JK3DXheqEEAAAQGTXQ+k923Pz1qJtAZ1B/Mr+GhPo7SXBEz2dEhXCZikCbs+AggggAACCCCAAAIIIIDAGQgImJxBxYEzCJjUonQc5qYPQusp51d06DCfwucdpn1Egz2HpHXY60IVAgggIGCy64H0vu35WSuR1qDuYH4FH+1plPaSgMmeDukqAZM0YddHAAEEEEAAAQQQQAABBBA4AwEBkzOoOHAGAZNalI7D3PRBaD3l/IoOHeZT+LzDtI9osOeQtA57XahCAAEEBEx2PZDetz0/ayXSGtQdzK/goz2N0l4SMNnTIV0lYJIm7PoIIIAAAggggAACCCCAAAJnICBgcgYVB84gYFKL0nGYmz4IraecX9Ghw3wKn3eY9hEN9hyS1mGvC1UIIICAgMmuB9L7tudnrURag7qD+RV8tKdR2ksCJns6pKvSAZPf/va36RFcHwEEvhH4y3/5L0dZWM9RvC6OAAIIIPAkAp6fTwLvtggECKTXs4BJQDSXvN0ETGoXdBzmpg9C6ynnV6R16NDg1WdI979cmNbhDDPMX606RACBKQTOsOeZoXZT+tm5Okjr0DFDTXJ2RVqD2dPvd5f2koDJvhbJSgGTJF3XRqCXQPpAXcCkV093QwABBBDoIeD52cPZXRDoIJBezwImHSpe8B4CJrXoHYe56YPQesr5FWkdOjR49RnS/S8XpnU4wwzzV6sOEUBgCoEz7HlmqN2UfnauDtI6dMxQk5xdkdZg9vT73aW9JGCyr0WyUsAkSde1EeglkD5QFzDp1dPdEEAAAQR6CHh+9nB2FwQ6CKTXs4BJh4oXvIeASS16x2Fu+iC0nnJ+RVqHDg1efYZ0/8uFaR3OMMP81apDBBCYQuAMe54Zajeln52rg7QOHTPUJGdXpDWYPf1+d2kvCZjsa5GsFDBJ0nVtBHoJpA/UBUx69XQ3BBBAAIEeAp6fPZzdBYEOAun1LGDSoeIF7yFgUovecZibPgitp5xfkdahQ4NXnyHd/3JhWoczzDB/teoQAQSmEDjDnmeG2k3pZ+fqIK1Dxww1ydkVaQ1mT7/fXdpLAib7WiQrBUySdF0bgV4C6QN1AZNePd0NAQQQQKCHgOdnD2d3QaCDQHo9C5h0qHjBewiY1KJ3HOamD0LrKedXpHXo0ODVZ0j3v1yY1uEMM8xfrTpEAIEpBM6w55mhdlP62bk6SOvQMUNNcnZFWoPZ0+93l/aSgMm+FslKAZMkXddGoJdA+kBdwKRXT3dDAAEEEOgh4PnZw9ldEOggkF7PAiYdKl7wHgImtegdh7npg9B6yvkVaR06NHj1GdL9LxemdTjDDPNXqw4RQGAKgTPseWao3ZR+dq4O0jp0zFCTnF2R1mD29Pvdpb0kYLKvRbJSwCRJ17UR6CWQPlAXMOnV090QQAABBHoIeH72cHYXBDoIpNezgEmHihe8h4BJLXrHYW76ILSecn5FWocODV59hnT/y4VpHc4ww/zVqkMEEJhC4Ax7nhlqN6WfnauDtA4dM9QkZ1ekNZg9/X53aS8JmOxrkawUMEnSdW0EegmkD9QFTHr1dDcEEEAAgR4Cnp89nN0FgQ4C6fUsYNKh4gXvIWBSi95xmJs+CK2nnF+R1qFDg1efId3/cmFahzPMMH+16hABBKYQOMOeZ4baTeln5+ogrUPHDDXJ2RVpDWZPv99d2ksCJvtaJCsFTJJ0XRuBXgLpA3UBk1493Q0BBBBAoIeA52cPZ3dBoINAej0LmHSoeMF7CJjUoncc5qYPQusp51ekdejQ4NVnSPe/XJjW4QwzzF+tOkQAgSkEzrDnmaF2U/rZuTpI69AxQ01ydkVag9nT73eX9pKAyb4WyUoBkyRd10agl0D6QF3ApFdPd0MAAQQQ6CHg+dnD2V0Q6CCQXs8CJh0qXvAeAia16B2HuemD0HrK+RVpHTo0ePUZ0v0vF6Z1OMMM81erDhFAYAqBM+x5ZqjdlH52rg7SOnTMUJOcXZHWYPb0+92lvSRgsq9FslLAJEnXtRHoJZA+UBcw6dXT3RBAAAEEegh4fvZwdhcEOgik17OASYeKF7yHgEktesdhbvogtJ5yfkVahw4NXn2GdP/LhWkdzjDD/NWqQwQQmELgDHueGWo3pZ+dq4O0Dh0z1CRnV6Q1mD39fndpLwmY7GuRrBQwSdJ1bQR6CaQP1AVMevV0NwQQQACBHgKenz2c3QWBDgLp9Sxg0qHiBe8hYFKL3nGYmz4IraecX5HWoUODV58h3f9yYVqHM8wwf7XqEAEEphA4w55nhtpN6Wfn6iCtQ8cMNcnZFWkNZk+/313aSwIm+1okKwVMknRdG4FeAukDdQGTXj3dDQEEEECgh4DnZw9nd0Ggg0B6PQuYdKh4wXsImNSidxzmpg9C6ynnV3ToMJ/C5x2mfUSDPYekddjrQhUCCCCQDwWchXF63/b8rJ2S1qDuYH4FH+1plPaSgMmeDukqAZM0YddHoI9A+kBdwKRPS3dCAAEEEOgj4PnZx9qdEEgTSK9nAZO0ghe9voBJLXzHYW76ILSecn5Fhw7zKXzeYdpHNNhzSFqHvS5UIYAAAgImux5I79uen7USaQ3qDuZX8NGeRmkvCZjs6ZCuEjBJE3Z9BPoIpA/UBUz6tHQnBBBAAIE+Ap6ffazdCYE0gfR6FjBJK3jR6wuY1MJ3HOamD0LrKedXdOgwn8LnHaZ9RIM9h6R12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng7pKgGTNGHXR6CPQPpAXcCkT0t3QgABBBDoI+D52cfanRBIE0ivZwGTtIIXvb6ASS18x2Fu+iC0nnJ+RYcO8yl83mHaRzTYc0hah70uVCGAAAICJrseSO/bnp+1EmkN6g7mV/DRnkZpLwmY7OmQrhIwSRN2fQT6CKQP1AVM+rR0JwQQQACBPgKen32s3QmBNIH0ehYwSSt40esLmNTCdxzmpg9C6ynnV3ToMJ/C5x2mfUSDPYekddjrQhUCCCAgYLLrgfS+7flZK5HWoO5gfgUf7WmU9pKAyZ4O6SoBkzRh10egj0D6QF3ApE9Ld0IAAQQQ6CPg+dnH2p0QSBNIr2cBk7SCF72+gEktfMdhbvogtJ5yfkWHDvMpfN5h2kc02HNIWoe9LlQhgAACAia7Hkjv256ftRJpDeoO5lfw0Z5GaS8JmOzpkK4SMEkTdn0E+gikD9QFTPq0dCcEEEAAgT4Cnp99rN0JgTSB9HoWMEkreNHrnyFgcgbp0gehZ2DkUL1WMe0jGtQarIq0DntdqEIAAQQETHY9kN63PT9rJdIa1B3Mr+CjPY3SXhIw2dMhXSVgkibs+gj0EUgfqAuY9GnpTggggAACfQQ8P/tYuxMCaQLp9SxgklbwotcXMJkhfPogdMaU93XhUL3ml/YRDWoNVkVah70uVCGAAAICJrseSO/bnp+1EmkN6g7mV/DRnkZpLwmY7OmQrhIwSRN2fQT6CKQP1AVM+rR0JwQQQACBPgKen32s3QmBNIH0ehYwSSt40esLmMwQPn0QOmPK+7pwqF7zS/uIBrUGqyKtw14XqhBAAAEBk10PpPdtz89aibQGdQfzK/hoT6O0lwRM9nRIVwmYpAm7PgJ9BNIH6gImfVq6EwIIIIBAHwHPzz7W7oRAmkB6PQuYpBW86PUFTGYInz4InTHlfV04VK/5pX1Eg1qDVZHWYa8LVQgggICAya4H0vu252etRFqDuoP5FXy0p1HaSwImezqkqwRM0oRdH4E+AukDdQGTPi3dCQEEEECgj4DnZx9rd0IgTSC9ngVM0gpe9PoCJjOETx+Ezpjyvi4cqtf80j6iQa3BqkjrsNeFKgQQQEDAZNcD6X3b87NWIq1B3cH8Cj7a0yjtJQGTPR3SVQImacKuj0AfgfSBuoBJn5buhAACCCDQR8Dzs4+1OyGQJpBezwImaQUven0BkxnCpw9CZ0x5XxcO1Wt+aR/RoNZgVaR12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng7pKgGTNGHXR6CPQPpAXcCkT0t3QgABBBDoI+D52cfanRBIE0ivZwGTtIIXvb6AyQzh0wehM6a8rwuH6jW/tI9oUGuwKtI67HWhCgEEEBAw2fVAet/2/KyVSGtQdzC/go/2NEp7ScBkT4d01RkCJulDxI6X6q8+Q7r/tQ7SOpih3m3SGqwO0jqYodY5rYH1XGvQUUHnPcrpPSOtQ7p/+/Y1fGTf3tPZeq45nWFPEjCpdVbxBQICJl+AFvhI+iA00HL7JR2q18jTPqJBrcGqSOuw14UqBBBAQMBk1wPpfdvzs1YirUHdwfwKPtrTKO0lAZM9HdJVAiY14TMchKZnSB+oe7FR+9RLvj1G6bVwBh2s5zle2uvka1V03uOW3jPSOqT7P8Oed4YZ0j7ye9jefpHWwXqeoYOAyZ4Oqg4SEDA5CCxUnj4IDbXdelmH6jXutI9oUGuwKtI67HWhCgEEEBAw2fVAet/2/KyVSGtQdzC/go/2NEp7ScBkT4d0lYBJTdhhbs0ofaDuxUatwRlekJlhT+f0nmQ9z9Bhr4uvV9F5j92rr7d0//bta/jI72F7Oqf3Vet5hg4CJns6qDpIQMDkILBQefogNNR262Udqte40z6iQa3BqkjrsNeFKgQQQEDAZNcD6X3b87NWIq1B3cH8Cj7a0yjtJQGTPR3SVQImNWGHuTWj9IG6Fxu1Bl7y7TGynmtO1nPNqGNP2uvi61V03mOX3jPSOqT79+y5ho869rz0WjjDDNbz3npLe0nAZE8HVQcJCJgcBBYqTx+EhtpuvaxD9Rp32kc0qDVYFWkd9rpQhQACCAiY7HogvW97ftZKpDWoO5hfwUd7GqW9JGCyp0O6SsCkJuwwt2aUPsg9w0uBM8xgLdRr4QwvW63nPZ071sNeJ1+rovMet7TOaR3S/Z9hzzvDDGkfneF3mDPMYD3v7dvp9SBgsqeDqoMEBEwOAguVpw9CQ223Xtaheo077SMa1BqsirQOe12oQgABBARMdj2Q3rc9P2sl0hrUHcyv4KM9jdJeEjDZ0yFdJWBSE3aYWzNKH+Se4aXAGWawFuq14EXlHqO0l86wJ+2R/HrVGRiZodY/vdbOsOedYQZroV4Lfg/bY5T20hn2JAGTPS+pOkhAwOQgsFB5+iA01HbrZR2q17jTPqJBrcGqSOuw14UqBBBAQMBk1wPpfdvzs1YirUHdwfwKPtrTKO0lAZM9HdJVAiY14TMchKZnSB9Gn+GlwBlmSPvoDC/5zjCD9Vw/FzrW814XX6+i8x679L6X1iHd/xn2vDPMkPZRx55nhnpPsp5rRh3rWcBkTwdVBwkImBwEFipPH4SG2m69rEP1GnfaRzSoNVgVaR32ulCFAAIICJjseiC9b3t+1kqkNag7mF/BR3sapb0kYLKnQ7pKwKQm7DC3ZuSlQM3oDC9nrIU9ndPrIa1Duv8zrIWOGfbc9vUqOu+xe/X1lu5/UUx7yQy1V9MadOx5Zqh1thZqRh17koDJng6qDhIQMDkILFSePggNtd16WYfqNe60j2hQa7Aq0jrsdaEKAQQQEDDZ9UB63/b8rJVIa1B3ML+Cj/Y0SntJwGRPh3SVgElN2GFuzchLgZrRGV7OWAt7OqfXQ1qHdP9nWAsdM+y57etVdN5j9+rrLd3/opj2khlqr6Y16NjzzFDrbC3UjDr2JAGTPR1UHSQgYHIQWKg8fRAaarv1sg7Va9xpH9Gg1mBVpHXY60IVAgggIGCy64H0vu35WSuR1qDuYH4FH+1plPaSgMmeDukqAZOasMPcmpGXAjWjM7ycsRb2dE6vh7QO6f7PsBY6Zthz29er6LzH7tXXW7r/RTHtJTPUXk1r0LHnmaHW2VqoGXXsSQImezqoOkhAwOQgsFB5+iA01HbrZR2q17jTPqJBrcGqSOuw14UqBBBAQMBk1wPpfdvzs1YirUHdwfwKPtrTKO0lAZM9HdJVAiY1YYe5NSMvBWpGZ3g5Yy3s6ZxeD2kd0v2fYS10zLDntq9X0XmP3auvt3T/i2LaS2aovZrWoGPPM0Ots7VQM+rYkwRM9nRQdZCAgMlBYKHy9EFoqO3WyzpUr3GnfUSDWoNVkdZhrwtVCCCAgIDJrgfS+7bnZ61EWoO6g/kVfLSnUdpLAiZ7OqSrBExqwg5za0ZeCtSMzvByxlrY0zm9HtI6pPs/w1romGHPbV+vovMeu1dfb+n+F8W0l8xQezWtQceeZ4ZaZ2uhZtSxJwmY7Omg6iABAZODwELl6YPQUNutl3WoXuNO+4gGtQarIq3DXheqEEAAAQGTXQ+k923Pz1qJtAZ1B/Mr+GhPo7SXBEz2dEhXnSFgkmbk+gi8CoH0y5mOFxuvwlqfCCCAAALnIeD5eR4tTYJAej0LmPBYhICASQTr4YumD0IPNzTwAw7Va1HSPqJBrcGqSOuw14UqBBBAQMBk1wPpfdvzs1YirUHdwfwKPtrTKO0lAZM9HdJVAiZpwq6PQB+B9IG6gEmflu6EAAIIINBHwPOzj7U7IZAmkF7PAiZpBS96fQGTGcKnD0JnTHlfFw7Va35pH9Gg1mBVpHXY60IVAgggIGCy64H0vu35WSuR1qDuYH4FH+1plPaSgMmeDukqAZM0YddHoI9A+kBdwKRPS3dCAAEEEOgj4PnZx9qdEEgTSK9nAZO0ghe9voDJDOHTB6EzpryvC4fqNb+0j2hQa7Aq0jrsdaEKAQQQEDDZ9UB63/b8rJVIa1B3ML+Cj/Y0SntJwGRPh3SVgEmasOsj0EcgfaAuYNKnpTshgAACCPQR8PzsY+1OCKQJpNezgElawYteX8BkhvDpg9AZU97XhUP1ml/aRzSoNVgVaR32ulCFAAIICJjseiC9b3t+1kqkNag7mF/BR3sapb0kYLKnQ7pKwCRN2PUR6COQPlAXMOnT0p0QQAABBPoIeH72sXYnBNIE0utZwCSt4EWvL2AyQ/j0QeiMKe/rwqF6zS/tIxrUGqyKtA57XahCAAEEBEx2PZDetz0/ayXSGtQdzK/goz2N0l4SMNnTIV0lYJIm7PoI9BFIH6gLmPRp6U4IIIAAAn0EPD/7WLsTAmkC6fUsYJJWoKYQwwAAIABJREFU8KLXFzCZIXz6IHTGlPd14VC95pf2EQ1qDVZFWoe9LlQhgAACAia7Hkjv256ftRJpDeoO5lfw0Z5GaS8JmOzpkK4SMEkTdn0E+gikD9QFTPq0dCcEEEAAgT4Cnp99rN0JgTSB9HoWMEkreNHrC5hcVHhjI4AAAggggAACCCCAAAInIyBgcjJBfzKOgMk1dDblNQikD9QFTK7hI1MigAACVyPg+Xk1xc17ZgLp9Sxgcmb3PHE2AZMnwndrBBBAAAEEEEAAAQQQQACBhxEQMHkYytEXEjAZLY/mEDhEIH2gLmBySA7FCCCAAAIvQsDz80WE0iYCGwTS61nAZEMEJccJCJgcZ+YTCCCAAAIIIIAAAggggAAC8wgImMzTJNGRgEmCqmsi8BwC6QN1AZPn6OquCCCAAAJZAp6fWb6ujkAngfR6FjDpVPNC9xIwuZDYRkUAAQQQQAABBBBAAAEETkxAwOTE4r4bTcDkGjqb8hoE0gfqAibX8JEpEUAAgasR8Py8muLmPTOB9HoWMDmze544m4DJE+G7NQIIIIAAAggggAACCCCAwMMICJg8DOXoCwmYjJZHcwgcIpA+UBcwOSSHYgQQQACBFyHg+fkiQmkTgQ0C6fUsYLIhgpLjBARMjjPzCQQQQAABBBBAAAEEEEAAgXkEBEzmaZLoSMAkQdU1EXgOgfSBuoDJc3R1VwQQQACBLAHPzyxfV0egk0B6PQuYdKp5oXsJmFxIbKMigAACCCCAAAIIIIAAAicmIGByYnHfjSZgcg2dTXkNAukDdQGTa/jIlAgggMDVCHh+Xk1x856ZQHo9C5ic2T1PnE3A5Inw3RoBBBBAAAEEEEAAAQQQQOBhBARMHoZy9IUETEbLozkEDhFIH6gLmBySQzECCCCAwIsQ8Px8EaG0icAGgfR6FjDZEEHJcQICJseZ+QQCCCCAAAIIIIAAAggggMA8AgIm8zRJdCRgkqDqmgg8h0D6QF3A5Dm6uisCCCCAQJaA52eWr6sj0EkgvZ4FTDrVvNC9BEwuJLZREUAAAQQQQAABBBBAAIETExAwObG470YTMLmGzqa8BoH0gbqAyTV8ZEoEEEDgagQ8P6+muHnPTCC9ngVMzuyeJ84mYPJE+G6NAAIIIIAAAggggAACCCDwMAICJg9DOfpCAiaj5dEcAocIpA/UBUwOyaEYAQQQQOBFCHh+vohQ2kRgg0B6PQuYbIig5DgBAZPjzHwCAQQQQAABBBBAAAEEEEBgHgEBk3maJDoSMElQdU0EnkMgfaAuYPIcXd0VAQQQQCBLwPMzy9fVEegkkF7PAiadal7oXgImFxLbqAgggAACCCCAAAIIIIDAiQkImJxY3HejCZhcQ2dTXoNA+kBdwOQaPjIlAgggcDUCnp9XU9y8ZyaQXs8CJmd2zxNnEzB5Iny3RgABBBBAAAEEEEAAAQQQeBgBAZOHoRx9IQGT0fJoDoFDBNIH6gImh+RQjAACCCDwIgQ8P19EKG0isEEgvZ4FTDZEUHKcgIDJcWY+gQACCCCAAAIIIIAAAgggMI+AgMk8TRIdCZgkqLomAs8hkD5QFzB5jq7uigACCCCQJeD5meXr6gh0EkivZwGTTjUvdC8BkwuJbVQEEEAAAQQQQAABBBBA4MQEBExOLO670QRMrqGzKa9BIH2gLmByDR+ZEgEEELgaAc/Pqylu3jMTSK9nAZMzu+eJswmYPBG+WyOAAAIIIIAAAggggAACCDyMgIDJw1COvpCAyWh5NIfAIQLpA3UBk0NyKEYAAQQQeBECnp8vIpQ2EdggkF7PAiYbIig5TkDA5Dgzn0AAAQQQQAABBBBAAAEEEJhHQMBkniaJjgRMElRdE4HnEEgfqAuYPEdXd0UAAQQQyBLw/MzydXUEOgmk17OASaeaF7qXgMmFxDYqAggggAACCCCAAAIIIHBiAgImJxb33WgCJtfQ2ZTXIJA+UBcwuYaPTIkAAghcjYDn59UUN++ZCaTXs4DJmd3zxNkETJ4I360RQAABBBBAAAEEEEAAAQQeRkDA5GEoR19IwGS0PJpD4BCB9IG6gMkhORQjgAACCLwIAc/PFxFKmwhsEEivZwGTDRGUHCcgYHKcmU8ggAACCCCAAAIIIIAAAgjMIyBgMk+TREcCJgmqronAcwikD9QFTJ6jq7sigAACCGQJeH5m+bo6Ap0E0utZwKRTzQvdS8DkQmIbFQEEEEAAAQQQQAABBBA4MQEBkxOL+240AZNr6GzKaxBIH6gLmFzDR6ZEAAEErkbA8/Nqipv3zATS61nA5MzueeJsAiZPhO/WCCCAAAIIIIAAAggggAACDyMgYPIwlKMvJGAyWh7NIXCIQPpAXcDkkByKEUAAAQRehIDn54sIpU0ENgik17OAyYYISo4TEDA5zswnEEAAAQQQQAABBBBAAAEE5hEQMJmnSaIjAZMEVddE4DkE0gfqAibP0dVdEUAAAQSyBDw/s3xdHYFOAun1LGDSqeaF7iVgciGxjYoAAggggAACCCCAAAIInJiAgMmJxX03moDJNXQ25TUIpA/UBUyu4SNTIoAAAlcj4Pl5NcXNe2YC6fUsYHJm9zxxNgGTJ8J3awQQQAABBBBAAAEEEEAAgYcREDB5GMrRFxIwGS2P5hA4RCB9oC5gckgOxQgggAACL0LA8/NFhNImAhsE0utZwGRDBCXHCQiYHGfmEwgggAACCCCAAAIIIIAAAvMICJjM0yTRkYBJgqprIvAcAukDdQGT5+jqrggggAACWQKen1m+ro5AJ4H0ehYw6VTzQvcSMLmQ2EZFAAEEEEAAAQQQQAABBE5MQMDkxOK+G03A5Bo6m/IaBNIH6gIm1/CRKRFAAIGrEfD8vJri5j0zgfR6FjA5s3ueOJuAyRPhuzUCCCCAAAIIIIAAAggggMDDCAiYPAzl6AsJmIyWR3MIHCKQPlAXMDkkh2IEEEAAgRch4Pn5IkJpE4ENAun1LGCyIYKS4wQETI4z8wkEEEAAAQQQQAABBBBAAIF5BARM5mmS6OgMAZP0IWLHS/X0DAnvdF+zQ4fumR59v7SPaLCnWFqHvS5UIYAAArebfXvPBel9mw61DmkN6g7mV/DRnkZpLwmY7Omg6iCBMwRM4oeIf/JHB6keL3/1GdL9L6K/Cutghtq3aQ1WB2kdzFDrnNbAeq416Kig8x7l9J6R1iHdv337Gj6yb+/pbD3XnE6xJ/3ud7/Uk6pIExAwqQl3HOamD0LrKedXdOgwn8LnHaZ9RIM9h6R12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng6qDhIQMKmBneIgVDijFDr9UuAML2eshdJGbwVpL6V1SPd/hrXQMcOe275eRec9dq++3tL9n2HPO8MM1rP1vEegrkp76RR7koBJbaSGCgGTGnLHYW76ILSecn5Fhw7zKXzeYdpHNNhzSFqHvS5UIYAAAgImux5I79uen7USaQ3qDuZX8NGeRmkvCZjs6aDqIAEBkxrYKQ5CBUxKodMH6h0vpNMzWAuljd4KXl2HdP9nWAsdM+y57etVdN5jl9730jqk+z/DnneGGdI+6tjzzFDvSdZzzahlPQuY7AkRrhIwqQF3HOamD0LrKedXdOgwn8LnHaZ9RIM9h6R12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng6qDhIQMKmBOcytGXkpUDM6w8sZa2FP5/R6SOuQ7v8Ma6Fjhj23fb2KznvsXn29pftveZkbDsmeYQbr2XreI1BXpb10ij1JwKQ2UkOFgEkNueMwN30QWk85v6JDh/kUPu8w7SMa7DkkrcNeF6oQQAABAZNdD6T3bc/PWom0BnUH8yv4aE+jtJcETPZ0UHWQgIBJDewUB6HhlzPpw+iOl7lmsBZqAnsVaS+l96R0/9bzno/SVXTeI/zq6y3d/6KY9pIZaq+mNbBv1xpYC3uMTrGeBUz2xA5XCZjUgDsOc9MHofWU8ys6dJhP4fMO0z6iwZ5D0jrsdaEKAQQQEDDZ9UB63/b8rJVIa1B3ML+Cj/Y0SntJwGRPB1UHCQiY1MBOcRAqYFIK7eVMiehmLdSMzvCCyVrY07ljPex18rUqOu9xS+uc1iHd/xn2vDPMkPbRYpT2khnqPSmtwRnWQssMAia1WRsqBExqyB2HuemD0HrK+RUdOsyn8HmHaR/RYM8haR32ulCFAAIICJjseiC9b3t+1kqkNag7mF/BR3sapb0kYLKng6qDBARMamAOc2tGXgrUjM7wcsZa2NM5vR7SOqT7P8Na6Jhhz21fr6LzHrtXX2/p/lte5oZDsmeYwXq2nvcI1FVpL51iTxIwqY3UUCFgUkPuOMxNH4TWU86v6NBhPoXPO0z7iAZ7DknrsNeFKgQQQEDAZNcD6X3b87NWIq1B3cH8Cj7a0yjtJQGTPR1UHSQgYFIDO8VBaPjlTPowuuNlrhmshZrAXkXaS+k9Kd2/9bzno3QVnfcIv/p6S/e/KKa9ZIbaq2kN7Nu1BtbCHqNTrGcBkz2xw1UCJjXgjsPc9EFoPeX8ig4d5lP4vMO0j2iw55C0DntdqEIAAQQETHY9kN63PT9rJdIa1B3Mr+CjPY3SXhIw2dNB1UECAiY1sFMchAqYlEJ7OVMiin89vpcztQZe8u0xOsN63pv061VnYGSGWn+/w9SMzvDssRb2dE6vh7QO6f7PsBZaZhAw2Vtw4SoBkxpwx2Fu+iC0nnJ+RYcO8yl83mHaRzTYc0hah70uVCGAAAICJrseSO/bnp+1EmkN6g7mV/DRnkZpLwmY7Omg6iABAZMamMPcmlH6QH11kNbBDLXOaQ1aXgqEw1ZnmMFaqNdCx56018XXq+i8xy6976V1SPd/hj3vDDOkfdSx55mh3pOs55pRy3oWMNkTIlwlYFID7jjMTR+E1lPOr+jQYT6FzztM+4gGew5J67DXhSoEEEBAwGTXA+l92/OzViKtQd3B/Ao+2tMo7SUBkz0dVB0kIGBSA3OYWzPyUqBmdIaXM9bCns7p9ZDWId3/GdZCxwx7bvt6FZ332L36ekv33/IyVzCwNKv1XCJ6K0ivh7QO6f6t500fCZjsgQpXCZjUgDsOc9MHofWU8ys6dJhP4fMO0z6iwZ5D0jrsdaEKAQQQEDDZ9UB63/b8rJVIa1B3ML+Cj/Y0SntJwGRPB1UHCQiY1MAc5taM0gfqZ3gpcIYZrIV6LZzh5Yz1vKdzx3rY6+RrVXTe45bWOa1Duv8z7HlnmCHtozP8DnOGGaznvX07vR5+JWCyJ0S4SsCkBtxxmJs+CK2nnF/RocN8Cp93mPYRDfYcktZhrwtVCCCAgIDJrgfS+7bnZ61EWoO6g/kVfLSnUdpLAiZ7Oqg6SOAMAZODIytHAAEEEEAAAQQQQAABBBA4IQEBkxOK+sFIAia1zh2HuemD0HrK+RUdOsyn8HmHaR/RYM8haR32ulCFAAIICJjseiC9b3t+1kqkNag7mF/BR3sapb0kYLKng6qDBARMDgJTjgACCCCAAAIIIIAAAgggMJKAgMlIWR7elIBJjbTjMDd9EFpPOb+iQ4f5FD7vMO0jGuw5JK3DXheqEEAAAQGTXQ+k923Pz1qJtAZ1B/Mr+GhPo7SXBEz2dFB1kICAyUFgyhFAAAEEEEAAAQQQQAABBEYSEDAZKcvDmxIwqZF2HOamD0LrKedXdOgwn8LnHaZ9RIM9h6R12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng6qDhIQMDkITDkCCCCAAAIIIIAAAggggMBIAgImI2V5eFMCJjXSjsPc9EFoPeX8ig4d5lP4vMO0j2iw55C0DntdqEIAAQQETHY9kN63PT9rJdIa1B3Mr+CjPY3SXhIw2dNB1UECAiYHgSlHAAEEEEAAAQQQQAABBBAYSUDAZKQsD29KwKRG2nGYmz4IraecX9Ghw3wKn3eY9hEN9hyS1mGvC1UIIICAgMmuB9L7tudnrURag7qD+RV8tKdR2ksCJns6qDpIQMDkIDDlCCCAAAIIIIAAAggggAACIwkImIyU5eFNCZjUSDsOc9MHofWU8ys6dJhP4fMO0z6iwZ5D0jrsdaEKAQQQEDDZ9UB63/b8rJVIa1B3ML+Cj/Y0SntJwGRPB1UHCQiYHASmHAEEEEAAAQQQQAABBBBAYCQBAZORsjy8KQGTGmnHYW76ILSecn5Fhw7zKXzeYdpHNNhzSFqHvS5UIYAAAgImux5I79uen7USaQ3qDuZX8NGeRmkvCZjs6aDqIAEBk4PAlCOAAAIIIIAAAggggAACCIwkIGAyUpaHNyVgUiPtOMxNH4TWU86v6NBhPoXPO0z7iAZ7DknrsNeFKgQQQEDAZNcD6X3b87NWIq1B3cH8Cj7a0yjtJQGTPR1UHSQgYHIQmHIEEEAAAQQQQAABBBBAAIGRBARMRsry8KYETGqkHYe56YPQesr5FR06zKfweYdpH9FgzyFpHfa6UIUAAggImOx6IL1ve37WSqQ1qDuYX8FHexqlvSRgsqeDqoMEBEwOAlOOAAIIIIAAAggggAACCCAwkoCAyUhZHt6UgEmNtOMwN30QWk85v6JDh/kUPu8w7SMa7DkkrcNeF6oQQAABAZNdD6T3bc/PWom0BnUH8yv4aE+jtJcETPZ0UHWQgIDJQWDKEUAAAQQQQAABBBBAAAEERhIQMBkpy8ObEjCpkXYc5qYPQusp51d06DCfwucdpn1Egz2HpHXY60IVAgggIGCy64H0vu35WSuR1qDuYH4FH+1plPaSgMmeDqoOEhAwOQhMOQIIIIAAAggggAACCCCAwEgCAiYjZXl4UwImNdKOw9z0QWg95fyKDh3mU/i8w7SPaLDnkLQOe12oQgABBARMdj2Q3rc9P2sl0hrUHcyv4KM9jdJeEjDZ00HVQQICJgeBKUcAAQQQQAABBBBAAAEEEBhJQMBkpCwPb0rApEbacZibPgitp5xfkdahQ4NXnyHd/3JhWoczzDB/teoQAQSmEDjDnmeG2k3pZ+fqIK1Dxww1ydkVaQ1mT7/fXdpLAib7Wqg8QEDA5AAspQgggAACCCCAAAIIIIAAAmMJCJiMleahjQmY1Dg7DnPTB6H1lPMr0jp0aPDqM6T7Xy5M63CGGeavVh0igMAUAmfY88xQuyn97FwdpHXomKEmObsircHs6fe7S3tJwGRfC5UHCAiYHIClFAEEEEAAAQQQQAABBBBAYCwBAZOx0jy0MQGTGmfHYW76ILSecn5FWocODV59hnT/y4VpHc4ww/zVqkMEEJhC4Ax7nhlqN6WfnauDtA4dM9QkZ1ekNZg9/X53aS8JmOxrofIAAQGTA7CUIoAAAggggAACCCCAAAIIjCUgYDJWmoc2JmBS4+w4zE0fhNZTzq9I69ChwavPkO5/uTCtwxlmmL9adYgAAlMInGHPM0PtpvSzc3WQ1qFjhprk7Iq0BrOn3+8u7SUBk30tVB4gIGByAJZSBBBAAAEEEEAAAQQQQACBsQQETMZK89DGBExqnB2HuemD0HrK+RVpHTo0ePUZ0v0vF6Z1OMMM81erDhFAYAqBM+x5ZqjdlH52rg7SOnTMUJOcXZHWYPb0+92lvSRgsq+FygMEBEwOwFKKAAIIIIAAAggggAACCCAwloCAyVhpHtqYgEmNs+MwN30QWk85vyKtQ4cGrz5Duv/lwrQOZ5hh/mrVIQIITCFwhj3PDLWb0s/O1UFah44ZapKzK9IazJ5+v7u0lwRM9rVQeYCAgMkBWEoRQAABBBBAAAEEEEAAAQTGEhAwGSvNQxsTMKlxdhzmpg9C6ynnV6R16NDg1WdI979cmNbhDDPMX606RACBKQTOsOeZoXZT+tm5Okjr0DFDTXJ2RVqD2dPvd5f2koDJvhYqDxAQMDkASykCCCCAAAIIIIAAAggggMBYAgImY6V5aGMCJjXOjsPc9EFoPeX8irQOHRq8+gzp/pcL0zqcYYb5q1WHCCAwhcAZ9jwz1G5KPztXB2kdOmaoSc6uSGswe/r97tJeEjDZ10LlAQICJgdgKUUAAQQQQAABBBBAAAEEEBhLQMBkrDQPbUzApMbZcZibPgitp5xfkdahQ4NXnyHd/3JhWoczzDB/teoQAQSmEDjDnmeG2k3pZ+fqIK1Dxww1ydkVaQ1mT7/fXdpLAib7Wqg8QEDA5AAspQgggAACCCCAAAIIIIAAAmMJCJiMleahjQmY1Dg7DnPTB6H1lPMr0jp0aPDqM6T7Xy5M63CGGeavVh0igMAUAmfY88xQuyn97FwdpHXomKEmObsircHs6fe7S3tJwGRfC5UHCAiYHIClFAEEEEAAAQQQQAABBBBAYCwBAZOx0jy0MQGTGmfHYW76ILSecn5FWocODV59hnT/y4VpHc4ww/zVqkMEEJhC4Ax7nhlqN6WfnauDtA4dM9QkZ1ekNZg9/X53aS8JmOxrofIAAQGTA7CUIoAAAggggAACCCCAAAIIjCUgYDJWmoc2JmBS4+w4zE0fhNZTzq9I69ChwavPkO5/uTCtwxlmmL9adYgAAlMInGHPM0PtpvSzc3WQ1qFjhprk7Iq0BrOn3+8u7SUBk30tVB4gIGByAJZSBBBAAAEEEEAAAQQQQACBsQQETMZK89DGBExqnB2HuemD0HrK+RUdOsyn8HmHaR/RYM8haR32ulCFAAII5EMBZ2Gc3rc9P2unpDWoO5hfwUd7GqW9JGCyp4OqgwQETA4CU44AAggggAACCCCAAAIIIDCSgIDJSFke3pSASY204zA3fRBaTzm/okOH+RQ+7zDtIxrsOSStw14XqhBAAAEBk10PpPdtz89aibQGdQfzK/hoT6O0lwRM9nRQdZCAgMlBYMoRQAABBBBAAAEEEEAAAQRGEhAwGSnLw5sSMKmRdhzmpg9C6ynnV3ToMJ/C5x2mfUSDPYekddjrQhUCCCAgYLLrgfS+7flZK5HWoO5gfgUf7WmU9pKAyZ4Oqg4SEDA5CEw5AggggAACCCCAAAIIIIDASAICJiNleXhTAiY10o7D3PRBaD3l/IoOHeZT+LzDtI9osOeQtA57XahCAAEEBEx2PZDetz0/ayXSGtQdzK/goz2N0l4SMNnTQdVBAgImB4EpRwABBBBAAAEEEEAAAQQQGElAwGSkLA9vSsCkRtpxmJs+CK2nnF/RocN8Cp93mPYRDfYcktZhrwtVCCCAgIDJrgfS+7bnZ61EWoO6g/kVfLSnUdpLAiZ7Oqg6SEDA5CAw5QgggAACCCCAAAIIIIAAAiMJCJiMlOXhTQmY1Eg7DnPTB6H1lPMrOnSYT+HzDtM+osGeQ9I67HWhCgEEEBAw2fVAet/2/KyVSGtQdzC/go/2NEp7ScBkTwdVBwkImBwEphwBBBBAAAEEEEAAAQQQQGAkAQGTkbI8vCkBkxppx2Fu+iC0nnJ+RYcO8yl83mHaRzTYc0hah70uVCGAAAICJrseSO/bnp+1EmkN6g7mV/DRnkZpLwmY7Omg6iCBdMDkYDsjy3/1J380sq9JTaUPctesdKgV79Ch7mJ2BR/V+vBRzUjFdQjYM2qt7Rk1Iz6qGXX4iA4zdKi7mF3xq9/97pfZHV6jOwGTWueOw9z0QWg95fyKDh3mU/i8w7SPaLDnkLQOe12oQgABBARMdj2Q3rc9P2sl0hrUHcyv4KM9jdJeEjDZ00HVQQICJjUwh9E1Iy8FakYdFR06dMyRvIf1XNPlo5qRiusQsGfUWtszakZ8VDPq8BEdZuhQdzG7QsBkhj4CJrUOHYe56YPQesr5FR06zKfweYdpH9FgzyFpHfa6UIUAAggImOx6IL1ve37WSqQ1qDuYX8FHexqlvSRgsqeDqoMEBExqYA6ja0ZeCtSMOio6dOiYI3kP67mmy0c1IxXXIWDPqLW2Z9SM+Khm1OEjOszQoe5idoWAyQx9BExqHToOc9MHofWU8ys6dJhP4fMO0z6iwZ5D0jrsdaEKAQQQEDDZ9UB63/b8rJVIa1B3ML+Cj/Y0SntJwGRPB1UHCQiY1MAcRteMvBSoGXVUdOjQMUfyHtZzTZePakYqrkPAnlFrbc+oGfFRzajDR3SYoUPdxewKAZMZ+giY1Dp0HOamD0LrKedXdOgwn8LnHaZ9RIM9h6R12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng6qDhIQMKmBOYyuGXkpUDPqqOjQoWOO5D2s55ouH9WMVFyHgD2j1tqeUTPio5pRh4/oMEOHuovZFQImM/QRMKl16DjMTR+E1lPOr+jQYT6FzztM+4gGew5J67DXhSoEEEBAwGTXA+l92/OzViKtQd3B/Ao+2tMo7SUBkz0dVB0kIGBSA3MYXTPyUqBm1FHRoUPHHMl7WM81XT6qGam4DgF7Rq21PaNmxEc1ow4f0WGGDnUXsysETGboc4aAyQyS93WRPgi9r7sZn3aoXuuQ9hENag1WRVqHvS5UIYAAAgImux5I79uen7USaQ3qDuZX8NGeRmkvCZjs6aDqIAEBkxqYw+iakZcCNaOOig4dOuZI3sN6runyUc1IxXUI2DNqre0ZNSM+qhl1+IgOM3Sou5hdIWAyQx8Bkxk6pA9CZ0x5XxcO1Wt+aR/RoNZgVaR12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng6qDhIQMKmBOYyuGXkpUDPqqOjQoWOO5D2s55ouH9WMVFyHgD2j1tqeUTPio5pRh4/oMEOHuovZFQImM/QRMJmhQ/ogdMaU93XhUL3ml/YRDWoNVkVah70uVCGAAAICJrseSO/bnp+1EmkN6g7mV/DRnkZpLwmY7Omg6iABAZMamMPompGXAjWjjooOHTrmSN7Deq7p8lHNSMV1CNgzaq3tGTUjPqoZdfiIDjN0qLuYXSFgMkMfAZMZOqQPQmdMeV+QsW6mAAAgAElEQVQXDtVrfmkf0aDWYFWkddjrQhUCCCAgYLLrgfS+7flZK5HWoO5gfgUf7WmU9pKAyZ4Oqg4SEDCpgTmMrhl5KVAz6qjo0KFjjuQ9rOeaLh/VjFRch4A9o9banlEz4qOaUYeP6DBDh7qL2RUCJjP0ETCZoUP6IHTGlPd14VC95pf2EQ1qDVZFWoe9LlQhgAACAia7Hkjv256ftRJpDeoO5lfw0Z5GaS8JmOzpoOogAQGTGpjD6JqRlwI1o46KDh065kjew3qu6fJRzUjFdQjYM2qt7Rk1Iz6qGXX4iA4zdKi7mF0hYDJDHwGTGTqkD0JnTHlfFw7Va35pH9Gg1mBVpHXY60IVAgggIGCy64H0vu35WSuR1qDuYH4FH+1plPaSgMmeDqoOEhAwqYE5jK4ZeSlQM+qo6NChY47kPaznmi4f1YxUXIeAPaPW2p5RM+KjmlGHj+gwQ4e6i9kVAiYz9BEwmaFD+iB0xpT3deFQveaX9hENag1WRVqHvS5UIYAAAgImux5I79uen7USaQ3qDuZX8NGeRmkvCZjs6aDqIAEBkxqYw+iakZcCNaOOig4dOuZI3sN6runyUc1IxXUI2DNqre0ZNSM+qhl1+IgOM3Sou5hdIWAyQx8Bkxk6pA9CZ0x5XxcO1Wt+aR/RoNZgVaR12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng6qDhIQMKmBOYyuGXkpUDPqqOjQoWOO5D2s55ouH9WMVFyHgD2j1tqeUTPio5pRh4/oMEOHuovZFQImM/QRMJmhQ/ogdMaU93XhUL3ml/YRDWoNVkVah70uVCGAAAICJrseSO/bnp+1EmkN6g7mV/DRnkZpLwmY7Omg6iABAZMamMPompGXAjWjjooOHTrmSN7Deq7p8lHNSMV1CNgzaq3tGTUjPqoZdfiIDjN0qLuYXSFgMkMfAZMZOqQPQmdMeV8XDtVrfmkf0aDWYFWkddjrQhUCCCAgYLLrgfS+7flZK5HWoO5gfgUf7WmU9pKAyZ4Oqg4SEDCpgTmMrhl5KVAz6qjo0KFjjuQ9rOeaLh/VjFRch4A9o9banlEz4qOaUYeP6DBDh7qL2RUCJjP0ETCZoUP6IHTGlPd14VC95pf2EQ1qDVZFWoe9LlQhgAACAia7Hkjv256ftRJpDeoO5lfw0Z5GaS8JmOzpoOogAQGTGpjD6JqRlwI1o46KDh065kjew3qu6fJRzUjFdQjYM2qt7Rk1Iz6qGXX4iA4zdKi7mF0hYDJDHwGTGTqkD0JnTHlfFw7Va35pH9Gg1mBVpHXY60IVAgggIGCy64H0vu35WSuR1qDuYH4FH+1plPaSgMmeDqoOEhAwqYE5jK4ZeSlQM+qo6NChY47kPaznmi4f1YxUXIeAPaPW2p5RM+KjmlGHj+gwQ4e6i9kVAiYz9BEwmaFD+iB0xpT3deFQveaX9hENag1WRVqHvS5UIYAAAgImux5I79uen7USaQ3qDuZX8NGeRmkvCZjs6aDqIAEBkxqYw+iakZcCNaOOig4dOuZI3sN6runyUc1IxXUI2DNqre0ZNSM+qhl1+IgOM3Sou5hdIWAyQx8Bkxk6pA9CZ0x5XxcO1Wt+aR/RoNZgVaR12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng6qDhIQMKmBOYyuGXkpUDPqqOjQoWOO5D2s55ouH9WMVFyHgD2j1tqeUTPio5pRh4/oMEOHuovZFQImM/QRMJmhQ/ogdMaU93XhUL3ml/YRDWoNVkVah70uVCGAAAICJrseSO/bnp+1EmkN6g7mV/DRnkZpLwmY7Omg6iABAZMamMPompGXAjWjjooOHTrmSN7Deq7p8lHNSMV1CNgzaq3tGTUjPqoZdfiIDjN0qLuYXSFgMkMfAZMZOqQPQmdMeV8XDtVrfmkf0aDWYFWkddjrQhUCCCAgYLLrgfS+7flZK5HWoO5gfgUf7WmU9pKAyZ4Oqg4SEDCpgTmMrhl5KVAz6qjo0KFjjuQ9rOeaLh/VjFRch4A9o9banlEz4qOaUYeP6DBDh7qL2RUCJjP0ETCZoUP6IHTGlPd14VC95pf2EQ1qDVZFWoe9LlQhgAACAia7Hkjv256ftRJpDeoO5lfw0Z5GaS8JmOzpoOogAQGTGpjD6JqRlwI1o46KDh065kjew3qu6fJRzUjFdQjYM2qt7Rk1Iz6qGXX4iA4zdKi7mF0hYDJDHwGTGTqkD0JnTHlfFw7Va35pH9Gg1mBVpHXY60IVAgggIGCy64H0vu35WSuR1qDuYH4FH+1plPaSgMmeDqoOEhAwqYE5jK4ZeSlQM+qo6NChY47kPaznmi4f1YxUXIeAPaPW2p5RM+KjmlGHj+gwQ4e6i9kVAiYz9BEwmaFD+iB0xpT3deFQveaX9hENag1WRVqHvS5UIYAAAgImux5I79uen7USaQ3qDuZX8NGeRmkvCZjs6aDqIAEBkxqYw+iakZcCNaOOig4dOuZI3sN6runyUc1IxXUI2DNqre0ZNSM+qhl1+IgOM3Sou5hdIWAyQx8Bkxk6pA9CZ0x5XxcO1Wt+aR/RoNZgVaR12OtCFQIIICBgsuuB9L7t+Vkrkdag7mB+BR/taZT2koDJng6qDhIQMKmBOYyuGXkpUDPqqOjQoWOO5D2s55ouH9WMVFyHgD2j1tqeUTPio5pRh4/oMEOHuovZFQImM/QRMJmhQ/ogdMaU93XhUL3ml/YRDWoNVkVah70uVCGAAAICJrseSO/bnp+1EmkN6g7mV/DRnkZpLwmY7Omg6iABAZMamMPompGXAjWjjooOHTrmSN7Deq7p8lHNSMV1CNgzaq3tGTUjPqoZdfiIDjN0qLuYXSFgMkMfAZMZOqQPQmdMeV8XDtVrfmkf0aDWYFWkddjrQhUCCCAgYLLrgfS+7flZK5HWoO5gfgUf7WmU9pKAyZ4Oqg4SEDCpgTmMrhl5KVAz6qjo0KFjjuQ9rOeaLh/VjFRch4A9o9banlEz4qOaUYeP6DBDh7qL2RUCJjP0ETCZoUP6IHTGlPd14VC95pf2EQ1qDVZFWoe9LlQhgAACAia7Hkjv256ftRJpDeoO5lfw0Z5GaS8JmOzpoOogAQGTGpjD6JqRlwI1o46KDh065kjew3qu6fJRzUjFdQjYM2qt7Rk1Iz6qGXX4iA4zdKi7mF0hYDJDHwGTGTqkD0JnTHlfFw7Va35pH9Gg1mBVpHXY60IVAgggIGCy64H0vu35WSuR1qDuYH4FH+1plPaSgMmeDqoOEhAwqYE5jK4ZeSlQM+qo6NChY47kPaznmi4f1YxUXIeAPaPW2p5RM+KjmlGHj+gwQ4e6i9kVAiYz9BEwmaFD+iB0xpT3deFQveaX9hENag1WRVqHvS5UIYAAAgImux5I79uen7USaQ3qDuZX8NGeRmkvCZjs6aDqIAEBkxpYx2F0+lA9PUO6/6WSGWqvduhQdzG7Iu2jNX1ah/QM6f5nO0R3CPztBF59vaX779jzzuDJtA4d+7YZaiemdUhrYD3XGr/9b5Lf/e6XvUpVSQICJkm6ro0AAggggAACCCCAAAIIINBFQMCki7T7PJSAgEmN8wyHuekZ0gfqb4e5f/JHtVh3VJjhDngv9NG0jzpezqRn6FgLL2QZrV6cwKuvt3T/HXveGSyY1qFj3zZD7cS0DmkNrOda47f/TSJgsgcqXCVgEgbs8ggggAACCCCAAAIIIIAAAi0EBExaMLvJowkImNREz3CYm54hfaD+dpgrYFKatUOHsonhBWkfdbycSc/AR8NNrL1WAq++3tL9d+x5rYKHbpbWoWPfNkNtjrQOaQ2s51rjt/9NImCyBypcJWASBuzyCCCAAAIIIIAAAggggAACLQQETFowu8mjCQiY1ETPcJibniF9oP52mCtgUpq1Q4eyieEFaR91vJxJz8BHw02svVYCr77e0v137HmtgodultahY982Q22OtA5pDaznWuO3/00iYLIHKlwlYBIG7PIIIIAAAggggAACCCCAAAItBARMWjC7yaMJCJjURM9wmJueIX2g/naYK2BSmrVDh7KJ4QVpH3W8nEnPwEfDTay9VgKvvt7S/Xfsea2Ch26W1qFj3zZDbY60DmkNrOda47f/TSJgsgcqXCVgEgbs8ggggAACCCCAAAIIIIAAAi0EBExaMLvJowkImNREz3CYm54hfaD+dpgrYFKatUOHsonhBWkfdbycSc/AR8NNrL1WAq++3tL9d+x5rYKHbpbWoWPfNkNtjrQOaQ2s51rjt/9NImCyBypcJWASBuzyCCCAAAIIIIAAAggggAACLQQETFowu8mjCQiY1ETPcJibniF9oP52mCtgUpq1Q4eyieEFaR91vJxJz8BHw02svVYCr77e0v137HmtgodultahY982Q22OtA5pDaznWuO3/00iYLIHKlwlYBIG7PIIIIAAAggggAACCCCAAAItBARMWjC7yaMJCJjURM9wmJueIX2g/naYK2BSmrVDh7KJ4QVpH3W8nEnPwEfDTay9VgKvvt7S/Xfsea2Ch26W1qFj3zZDbY60DmkNrOda47f/TSJgsgcqXCVgEgbs8ggggAACCCCAAAIIIIAAAi0EBExaMLvJowkImNREz3CYm54hfaD+dpgrYFKatUOHsonhBWkfdbycSc/AR8NNrL1WAq++3tL9d+x5rYKHbpbWoWPfNkNtjrQOaQ2s51rjt/9NImCyBypcJWASBuzyCCCAAAIIIIAAAggggAACLQQETFowu8mjCQiY1ETPcJibniF9oP52mCtgUpq1Q4eyieEFaR91vJxJz8BHw02svVYCr77e0v137HmtgodultahY982Q22OtA5pDaznWuO3/00iYLIHKlwlYBIG7PIIIIAAAggggAACCCCAAAItBARMWjC7yaMJCJjURM9wmJueIX2g/naYK2BSmrVDh7KJ4QVpH3W8nEnPwEfDTay9VgKvvt7S/Xfsea2Ch26W1qFj3zZDbY60DmkNrOda47f/TSJgsgcqXCVgEgbs8ggggAACCCCAAAIIIIAAAi0EBExaMLvJowkImNREz3CYm54hfaD+dpgrYFKatUOHsonhBWkfdbycSc/A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tMBDAgZMHoL3tQQIECBAgAABAgQIECDwKgEDJgXiMmBSIARbIECAAAECBAgQIECAAIHbAgZMbhNa4CEBAyYPwftaAgQIECBAgAABAgQIEHiVgAGTAnEZMCkQgi0QIECAAAECBAgQIECAwG0BAya3CS3wkIABk4fgfS0BAgQIECBAgAABAgQIvErAgEmBuAyYFAjBFggQIECAAAECBAgQIEDgtoABk9uEFnhIwIDJQ/C+lgABAgQIECBAgAABAgReJWDApEBcBkwKhGALBAgQIECAAAECBAgQIHBbwIDJbUILPCRgwOQheF9LgAABAgQIECBAgAABAq8SMGBSIC4DJgVCsAUCBAgQIECAAAECBAgQuC1gwOQ2oQUeEjBg8hC8ryVAgAABAgQIECBAgACBVwkYMCkQlwGTAiHYAgECBAgQIECAAAECBAjcFjBgcpvQAg8JGDB5CN7XEiBAgAABAgQIECBAgMCrBAyYFIjLgEmBEGyBAAECBAgQIECAAAECBG4LGDC5TWiBhwQMmDwE72sJECBAgAABAgQIECBA4FUCBkwKxGXApEAItkCAAAECBAgQIECAAAECtwUMmNwmtMBDAgZMHoL3tQQIECBAgAABAgQIECDwKgEDJgXiMmBSIARbIECAAAECBAgQIECAAIHbAgZMbhNa4CEBAyYPwftaAgQIECBAgAABAgQIEHiVgAGTAnEZMCkQgi0QIECAAAECBAgQIECAwG0BAya3CS3wkIABk4fgfS0BAgQIECBAgAABAgQIvErAgEmBuAyYFAjBFggQIECAAAECBAgQIEDgtoABk9uEFnhIwIDJQ/C+lgABAgQIECBAgAABAgReJWDApEBcBkwKhGALBAgQIECAAAECBAgQIHBbwIDJbUILPCRgwOQheF9LgAABAgQIECBAgAABAq8SMGBSIC4DJgVCsAUCBAgQIECAAAECBAgQuC1gwOQ2oQUeEjBg8hC8ryVAgAABAgQIECBAgACBVwkYMCkQlwGTAiHYAgECBAgQIECAAAECBAjcFjBgcpvQAg8JGDB5CN7XEiBAgAABAgQIECBAgMCrBAyYFIjLgEmBEGyBAAECBAgQIECAAAECBG4LGDC5TWiBhwQMmDwE72sJECBAgAABAgQIECBA4FUCBkwKxGXApEAItkCAAAECBAgQIECAAAECtwUMmNwmtMBDAgZM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uAZMeuToFAQIECBAgAABAgQIECCQK+AdJNfX6gQIECBAgAABAgQIECBAgEBjAQ8rPcI1YNIjR6cgQIAAAQIECBAgQIAAgVwB7yC5vlYnQIAAAQIECBAgQIAAAQIEGgt4WOkRrgGTHjk6BQECBAgQIECAAAECBAjkCngHyfW1OgECBAgQIECAAAECBAgQINBYwMNKj3ANmPTI0SkIECBAgAABAgQIECBAIFfAO0iur9UJECBAgAABAgQIECBAgACBxgIeVnqEa8CkR45OQRG1MusAAAsvSURBVIAAAQIECBAgQIAAAQK5At5Bcn2tToAAAQIECBAgQIAAAQIECDQW8LDSI1wDJj1ydAoCBAgQIECAAAECBAgQyBXwDpLra3UCBAgQIECAAAECBAgQIECgsYCHlcbhOhoBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYIeAAZMditYgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDQWMGDSOFxHI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjsEDBgskPRGgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBxgIGTBqH62gECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgR0CBkx2KFqDAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINBYwIBJ43AdjQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECCwQ8CAyQ5FaxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEGgsYMGkcrqMRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBHYIGDDZoWgNAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBjAQMmjcN1NAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDADgEDJjsUrUGAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQaCxgwKRxuI5GgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIENghYMBkh6I1CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNBQyYNA7X0QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECOwQMmOxQtAYBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoLGAAZPG4ToaAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGCHgAGTHYrWIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0FjBg0jhcRyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI7BAwYLJD0RoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgcYCBkwah+toBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEdAgZMdihagwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQWMCASeNwHY0AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsEPAgMkORWsQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBBoLGDBpHK6jESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR2CBgw2aFoDQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAYwEDJo3DdTQCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwA4BAyY7FK1BgACB/79dO6YBAABAGObfNSa4lhogobwQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQFjAwSQ8rmoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYeAg8lDUQYBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAICzgYBIeVzUCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwEPAweShKIMAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgEBZwMAmPqxoBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA4CHgYPJQlEGAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQCAs4mITHVY0AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg8BBwMHkoyiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIhAUcTMLjqkaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeAg4mDwUZRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEwgIOJuFxVSNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIPAQcTB6KMggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECYQEHk/C4qhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEHgIOJg9FGQQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBsICDSXhc1QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECDwEHk4eiDAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWMDBJDyuagQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBh4CDyUNRBgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEAgLOBgEh5XNQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAQ8DB5KEogwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAQFnAwCY+rGgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDgIeBg8lCUQYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAICziYhMdVjQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDwEHAweSjKIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiEBRxMwuOqRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4CDiYPBRlECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTCAg4m4XFVI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg8BBxMHooyCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJhAQeT8LiqESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQeAg4mD0UZBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGwgINJeFzVCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIPAQeTh6IMAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBYwMEkPK5qBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGHgIPJQ1EGAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAs4GASHlc1AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMBDwMHkoSiDAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIBAWcDAJj6saAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOAhMAiGPOVTOwEWAAAAAElFTkSuQmCC\" width=\"1100\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Saving figure preprocessing_plot\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.figure(figsize=(11, 7))\n",
|
||
"plt.subplot(121)\n",
|
||
"plt.title(\"Original observation (160×210 RGB)\")\n",
|
||
"plt.imshow(obs)\n",
|
||
"plt.axis(\"off\")\n",
|
||
"plt.subplot(122)\n",
|
||
"plt.title(\"Preprocessed observation (88×80 greyscale)\")\n",
|
||
"plt.imshow(img.reshape(88, 80), interpolation=\"nearest\", cmap=\"gray\")\n",
|
||
"plt.axis(\"off\")\n",
|
||
"save_fig(\"preprocessing_plot\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Build DQN"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note: instead of using `tf.contrib.layers.convolution2d()` or `tf.contrib.layers.conv2d()` (as in the first version of the book), we now use the `tf.layers.conv2d()`, which did not exist when this chapter was written. This is preferable because anything in contrib may change or be deleted without notice, while `tf.layers` is part of the official API. As you will see, the code is mostly the same, except that the parameter names have changed slightly:\n",
|
||
"* the `num_outputs` parameter was renamed to `filters`,\n",
|
||
"* the `stride` parameter was renamed to `strides`,\n",
|
||
"* the `_fn` suffix was removed from parameter names that had it (e.g., `activation_fn` was renamed to `activation`),\n",
|
||
"* the `weights_initializer` parameter was renamed to `kernel_initializer`,\n",
|
||
"* the weights variable was renamed to `\"kernel\"` (instead of `\"weights\"`), and the biases variable was renamed from `\"biases\"` to `\"bias\"`,\n",
|
||
"* and the default `activation` is now `None` instead of `tf.nn.relu`."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 59,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"reset_graph()\n",
|
||
"\n",
|
||
"input_height = 88\n",
|
||
"input_width = 80\n",
|
||
"input_channels = 1\n",
|
||
"conv_n_maps = [32, 64, 64]\n",
|
||
"conv_kernel_sizes = [(8,8), (4,4), (3,3)]\n",
|
||
"conv_strides = [4, 2, 1]\n",
|
||
"conv_paddings = [\"SAME\"] * 3 \n",
|
||
"conv_activation = [tf.nn.relu] * 3\n",
|
||
"n_hidden_in = 64 * 11 * 10 # conv3 has 64 maps of 11x10 each\n",
|
||
"n_hidden = 512\n",
|
||
"hidden_activation = tf.nn.relu\n",
|
||
"n_outputs = env.action_space.n # 9 discrete actions are available\n",
|
||
"initializer = tf.contrib.layers.variance_scaling_initializer()\n",
|
||
"\n",
|
||
"def q_network(X_state, name):\n",
|
||
" prev_layer = X_state\n",
|
||
" with tf.variable_scope(name) as scope:\n",
|
||
" for n_maps, kernel_size, strides, padding, activation in zip(\n",
|
||
" conv_n_maps, conv_kernel_sizes, conv_strides,\n",
|
||
" conv_paddings, conv_activation):\n",
|
||
" prev_layer = tf.layers.conv2d(\n",
|
||
" prev_layer, filters=n_maps, kernel_size=kernel_size,\n",
|
||
" strides=strides, padding=padding, activation=activation,\n",
|
||
" kernel_initializer=initializer)\n",
|
||
" last_conv_layer_flat = tf.reshape(prev_layer, shape=[-1, n_hidden_in])\n",
|
||
" hidden = tf.layers.dense(last_conv_layer_flat, n_hidden,\n",
|
||
" activation=hidden_activation,\n",
|
||
" kernel_initializer=initializer)\n",
|
||
" outputs = tf.layers.dense(hidden, n_outputs,\n",
|
||
" kernel_initializer=initializer)\n",
|
||
" trainable_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,\n",
|
||
" scope=scope.name)\n",
|
||
" trainable_vars_by_name = {var.name[len(scope.name):]: var\n",
|
||
" for var in trainable_vars}\n",
|
||
" return outputs, trainable_vars_by_name"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 60,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"X_state = tf.placeholder(tf.float32, shape=[None, input_height, input_width,\n",
|
||
" input_channels])\n",
|
||
"online_q_values, online_vars = q_network(X_state, name=\"q_networks/online\")\n",
|
||
"target_q_values, target_vars = q_network(X_state, name=\"q_networks/target\")\n",
|
||
"\n",
|
||
"copy_ops = [target_var.assign(online_vars[var_name])\n",
|
||
" for var_name, target_var in target_vars.items()]\n",
|
||
"copy_online_to_target = tf.group(*copy_ops)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 61,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"{'/conv2d/bias:0': <tf.Variable 'q_networks/online/conv2d/bias:0' shape=(32,) dtype=float32_ref>,\n",
|
||
" '/conv2d/kernel:0': <tf.Variable 'q_networks/online/conv2d/kernel:0' shape=(8, 8, 1, 32) dtype=float32_ref>,\n",
|
||
" '/conv2d_1/bias:0': <tf.Variable 'q_networks/online/conv2d_1/bias:0' shape=(64,) dtype=float32_ref>,\n",
|
||
" '/conv2d_1/kernel:0': <tf.Variable 'q_networks/online/conv2d_1/kernel:0' shape=(4, 4, 32, 64) dtype=float32_ref>,\n",
|
||
" '/conv2d_2/bias:0': <tf.Variable 'q_networks/online/conv2d_2/bias:0' shape=(64,) dtype=float32_ref>,\n",
|
||
" '/conv2d_2/kernel:0': <tf.Variable 'q_networks/online/conv2d_2/kernel:0' shape=(3, 3, 64, 64) dtype=float32_ref>,\n",
|
||
" '/dense/bias:0': <tf.Variable 'q_networks/online/dense/bias:0' shape=(512,) dtype=float32_ref>,\n",
|
||
" '/dense/kernel:0': <tf.Variable 'q_networks/online/dense/kernel:0' shape=(7040, 512) dtype=float32_ref>,\n",
|
||
" '/dense_1/bias:0': <tf.Variable 'q_networks/online/dense_1/bias:0' shape=(9,) dtype=float32_ref>,\n",
|
||
" '/dense_1/kernel:0': <tf.Variable 'q_networks/online/dense_1/kernel:0' shape=(512, 9) dtype=float32_ref>}"
|
||
]
|
||
},
|
||
"execution_count": 61,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"online_vars"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 62,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"learning_rate = 0.001\n",
|
||
"momentum = 0.95\n",
|
||
"\n",
|
||
"with tf.variable_scope(\"train\"):\n",
|
||
" X_action = tf.placeholder(tf.int32, shape=[None])\n",
|
||
" y = tf.placeholder(tf.float32, shape=[None, 1])\n",
|
||
" q_value = tf.reduce_sum(online_q_values * tf.one_hot(X_action, n_outputs),\n",
|
||
" axis=1, keep_dims=True)\n",
|
||
" error = tf.abs(y - q_value)\n",
|
||
" clipped_error = tf.clip_by_value(error, 0.0, 1.0)\n",
|
||
" linear_error = 2 * (error - clipped_error)\n",
|
||
" loss = tf.reduce_mean(tf.square(clipped_error) + linear_error)\n",
|
||
"\n",
|
||
" global_step = tf.Variable(0, trainable=False, name='global_step')\n",
|
||
" optimizer = tf.train.MomentumOptimizer(learning_rate, momentum, use_nesterov=True)\n",
|
||
" training_op = optimizer.minimize(loss, global_step=global_step)\n",
|
||
"\n",
|
||
"init = tf.global_variables_initializer()\n",
|
||
"saver = tf.train.Saver()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note: in the first version of the book, the loss function was simply the squared error between the target Q-Values (`y`) and the estimated Q-Values (`q_value`). However, because the experiences are very noisy, it is better to use a quadratic loss only for small errors (below 1.0) and a linear loss (twice the absolute error) for larger errors, which is what the code above computes. This way large errors don't push the model parameters around as much. Note that we also tweaked some hyperparameters (using a smaller learning rate, and using Nesterov Accelerated Gradients rather than Adam optimization, since adaptive gradient algorithms may sometimes be bad, according to this [paper](https://arxiv.org/abs/1705.08292)). We also tweaked a few other hyperparameters below (a larger replay memory, longer decay for the $\\epsilon$-greedy policy, larger discount rate, less frequent copies of the online DQN to the target DQN, etc.)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 63,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from collections import deque\n",
|
||
"\n",
|
||
"replay_memory_size = 500000\n",
|
||
"replay_memory = deque([], maxlen=replay_memory_size)\n",
|
||
"\n",
|
||
"def sample_memories(batch_size):\n",
|
||
" indices = np.random.permutation(len(replay_memory))[:batch_size]\n",
|
||
" cols = [[], [], [], [], []] # state, action, reward, next_state, continue\n",
|
||
" for idx in indices:\n",
|
||
" memory = replay_memory[idx]\n",
|
||
" for col, value in zip(cols, memory):\n",
|
||
" col.append(value)\n",
|
||
" cols = [np.array(col) for col in cols]\n",
|
||
" return cols[0], cols[1], cols[2].reshape(-1, 1), cols[3], cols[4].reshape(-1, 1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 64,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"eps_min = 0.1\n",
|
||
"eps_max = 1.0\n",
|
||
"eps_decay_steps = 2000000\n",
|
||
"\n",
|
||
"def epsilon_greedy(q_values, step):\n",
|
||
" epsilon = max(eps_min, eps_max - (eps_max-eps_min) * step/eps_decay_steps)\n",
|
||
" if np.random.rand() < epsilon:\n",
|
||
" return np.random.randint(n_outputs) # random action\n",
|
||
" else:\n",
|
||
" return np.argmax(q_values) # optimal action"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 65,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"n_steps = 4000000 # total number of training steps\n",
|
||
"training_start = 10000 # start training after 10,000 game iterations\n",
|
||
"training_interval = 4 # run a training step every 4 game iterations\n",
|
||
"save_steps = 1000 # save the model every 1,000 training steps\n",
|
||
"copy_steps = 10000 # copy online DQN to target DQN every 10,000 training steps\n",
|
||
"discount_rate = 0.99\n",
|
||
"skip_start = 90 # Skip the start of every game (it's just waiting time).\n",
|
||
"batch_size = 50\n",
|
||
"iteration = 0 # game iterations\n",
|
||
"checkpoint_path = \"./my_dqn.ckpt\"\n",
|
||
"done = True # env needs to be reset"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"A few variables for tracking progress:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 66,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"loss_val = np.infty\n",
|
||
"game_length = 0\n",
|
||
"total_max_q = 0\n",
|
||
"mean_max_q = 0.0"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"And now the main training loop!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 67,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"INFO:tensorflow:Restoring parameters from ./my_dqn.ckpt\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[2017-09-25 13:55:15,610] Restoring parameters from ./my_dqn.ckpt\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\r",
|
||
"Iteration 1270171\tTraining step 315001/4000000 (7.9)%\tLoss 2.651937\tMean Max-Q 30.964941 "
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"with tf.Session() as sess:\n",
|
||
" if os.path.isfile(checkpoint_path + \".index\"):\n",
|
||
" saver.restore(sess, checkpoint_path)\n",
|
||
" else:\n",
|
||
" init.run()\n",
|
||
" copy_online_to_target.run()\n",
|
||
" while True:\n",
|
||
" step = global_step.eval()\n",
|
||
" if step >= n_steps:\n",
|
||
" break\n",
|
||
" iteration += 1\n",
|
||
" print(\"\\rIteration {}\\tTraining step {}/{} ({:.1f})%\\tLoss {:5f}\\tMean Max-Q {:5f} \".format(\n",
|
||
" iteration, step, n_steps, step * 100 / n_steps, loss_val, mean_max_q), end=\"\")\n",
|
||
" if done: # game over, start again\n",
|
||
" obs = env.reset()\n",
|
||
" for skip in range(skip_start): # skip the start of each game\n",
|
||
" obs, reward, done, info = env.step(0)\n",
|
||
" state = preprocess_observation(obs)\n",
|
||
"\n",
|
||
" # Online DQN evaluates what to do\n",
|
||
" q_values = online_q_values.eval(feed_dict={X_state: [state]})\n",
|
||
" action = epsilon_greedy(q_values, step)\n",
|
||
"\n",
|
||
" # Online DQN plays\n",
|
||
" obs, reward, done, info = env.step(action)\n",
|
||
" next_state = preprocess_observation(obs)\n",
|
||
"\n",
|
||
" # Let's memorize what happened\n",
|
||
" replay_memory.append((state, action, reward, next_state, 1.0 - done))\n",
|
||
" state = next_state\n",
|
||
"\n",
|
||
" # Compute statistics for tracking progress (not shown in the book)\n",
|
||
" total_max_q += q_values.max()\n",
|
||
" game_length += 1\n",
|
||
" if done:\n",
|
||
" mean_max_q = total_max_q / game_length\n",
|
||
" total_max_q = 0.0\n",
|
||
" game_length = 0\n",
|
||
"\n",
|
||
" if iteration < training_start or iteration % training_interval != 0:\n",
|
||
" continue # only train after warmup period and at regular intervals\n",
|
||
" \n",
|
||
" # Sample memories and use the target DQN to produce the target Q-Value\n",
|
||
" X_state_val, X_action_val, rewards, X_next_state_val, continues = (\n",
|
||
" sample_memories(batch_size))\n",
|
||
" next_q_values = target_q_values.eval(\n",
|
||
" feed_dict={X_state: X_next_state_val})\n",
|
||
" max_next_q_values = np.max(next_q_values, axis=1, keepdims=True)\n",
|
||
" y_val = rewards + continues * discount_rate * max_next_q_values\n",
|
||
"\n",
|
||
" # Train the online DQN\n",
|
||
" _, loss_val = sess.run([training_op, loss], feed_dict={\n",
|
||
" X_state: X_state_val, X_action: X_action_val, y: y_val})\n",
|
||
"\n",
|
||
" # Regularly copy the online DQN to the target DQN\n",
|
||
" if step % copy_steps == 0:\n",
|
||
" copy_online_to_target.run()\n",
|
||
"\n",
|
||
" # And save regularly\n",
|
||
" if step % save_steps == 0:\n",
|
||
" saver.save(sess, checkpoint_path)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"You can interrupt the cell above at any time to test your agent using the cell below. You can then run the cell above once again, it will load the last parameters saved and resume training."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 68,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"INFO:tensorflow:Restoring parameters from ./my_dqn.ckpt\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[2017-09-25 13:53:39,307] Restoring parameters from ./my_dqn.ckpt\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"frames = []\n",
|
||
"n_max_steps = 10000\n",
|
||
"\n",
|
||
"with tf.Session() as sess:\n",
|
||
" saver.restore(sess, checkpoint_path)\n",
|
||
"\n",
|
||
" obs = env.reset()\n",
|
||
" for step in range(n_max_steps):\n",
|
||
" state = preprocess_observation(obs)\n",
|
||
"\n",
|
||
" # Online DQN evaluates what to do\n",
|
||
" q_values = online_q_values.eval(feed_dict={X_state: [state]})\n",
|
||
" action = np.argmax(q_values)\n",
|
||
"\n",
|
||
" # Online DQN plays\n",
|
||
" obs, reward, done, info = env.step(action)\n",
|
||
"\n",
|
||
" img = env.render(mode=\"rgb_array\")\n",
|
||
" frames.append(img)\n",
|
||
"\n",
|
||
" if done:\n",
|
||
" break"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 69,
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" this.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" // select the cell after this one\n",
|
||
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
|
||
" IPython.notebook.select(index + 1);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,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\" width=\"640\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<matplotlib.animation.FuncAnimation at 0x7f79dd797a90>"
|
||
]
|
||
},
|
||
"execution_count": 70,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"plot_animation(frames)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Extra material"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Preprocessing for Breakout"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here is a preprocessing function you can use to train a DQN for the Breakout-v0 Atari game:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 71,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"def preprocess_observation(obs):\n",
|
||
" img = obs[34:194:2, ::2] # crop and downsize\n",
|
||
" return np.mean(img, axis=2).reshape(80, 80) / 255.0"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 72,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[2017-09-25 13:54:27,989] Making new env: Breakout-v0\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"env = gym.make(\"Breakout-v0\")\n",
|
||
"obs = env.reset()\n",
|
||
"for step in range(10):\n",
|
||
" obs, _, _, _ = env.step(1)\n",
|
||
"\n",
|
||
"img = preprocess_observation(obs)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 73,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" this.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" // select the cell after this one\n",
|
||
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
|
||
" IPython.notebook.select(index + 1);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABEwAAAK8CAYAAAD1QyqZAAAgAElEQVR4XuzdBbQlz34W7BrcNbhDggdICBCC2yXB3d1dBncL+sEfd3cLLgkXtxAgJEDwBHcI7nq/9Sbd0Hdzzpna01125um17kruTHdV9fOrM/fUu6t7vygOAgQIECBAgAABAgQIECBAgACBdxJ4wYMAAQIECBAgQIAAAQIECBAgQOCdBQQmZgQBAgQIECBAgAABAgQIECBA4EZAYGJKECBAgAABAgQIECBAgAABAgQEJuYAAQIECBAgQIAAAQIECBAgQOBpATtMzBACBAgQIECAAAECBAgQIECAwI2AwMSUIECAAAECBAgQIECAAAECBAgITMwBAgQIECBAgAABAgQIECBAgMDTAnaYmCEECBAgQIAAAQIECBAgQIAAgRsBgYkpQYAAAQIECBAgQIAAAQIECBAQmJgDBAgQIECAAAECBAgQIECAAIGnBewwMUMIECBAgAABAgQIECBAgAABAjcCAhNTggABAgQIECBAgAABAgQIECAgMDEHCBAgQIAAAQIECBAgQIAAAQJPC9hhYoYQIECAAAECBAgQIECAAAECBG4EBCamBAECBAgQIECAAAECBAgQIEBAYGIOECBAgAABAgQIECBAgAABAgSeFrDDxAwhQIAAAQIECBAgQIAAAQIECNwICExMCQIECBAgQIAAAQIECBAgQICAwMQcIECAAAECBAgQIECAAAECBAg8LWCHiRlCgAABAgQIECBAgAABAgQIELgREJiYEgQIECBAgAABAgQIECBAgAABgYk5QIAAAQIECBAgQIAAAQIECBB4WsAOEzOEAAECBAgQIECAAAECBAgQIHAjIDAxJQgQIECAAAECBAgQIECAAAECAhNzgAABAgQIECBAgAABAgQIECDwtIAdJmYIAQIECBAgQIAAAQIECBAgQOBGQGBiShAgQIAAAQIECBAgQIAAAQIEBCbmAAECBAgQIECAAAECBAgQIEDgaQE7TMwQAgQIECBAgAABAgQIECBAgMCNgMDElCBAgAABAgQIECBAgAABAgQICEzMAQIECBAgQIAAAQIECBAgQIDA0wJ2mJghBAgQIECAAAECBAgQIECAAIEbAYGJKUGAAAECBAgQIECAAAECBAgQEJiYAwQIECBAgAABAgQIECBAgACBpwXsMDFDCBAgQIAAAQIECBAgQIAAAQI3AgITU4IAAQIECBAgQIAAAQIECBAgIDAxBwgQIECAAAECBAgQIECAAAECTwvYYWKGECBAgAABAgQIECBAgAABAgRuBAQmpgQBAgQIECBAgAABAgQIECBAQGBiDhAgQIAAAQIECBAgQIAAAQIEnhaww8QMIUCAAAECBAgQIECAAAECBAjcCAhMTAkCBAgQIECAAAECBAgQIECAgMDEHCBAgAABAgQIECBAgAABAgQIPC1gh4kZQoAAAQIECBAgQIAAAQIECBC4ERCYmBIECBAgQIAAAQIECBAgQIAAAYGJOUCAAAECBAgQIECAAAECBAgQeFrADhMzhAABAgQIECBAgAABAgQIECBwIyAwMSUIECBAgAABAgQIECBAgAABAgITc4AAAQIECBAgQIAAAQIECBAg8LSAHSZmCAECBAgQIECAAAECBAgQIEDgRkBgYkoQIECAAAECBAgQIECAAAECBAQm5gABAgQIECBAgAABAgQIECBA4GkBO0zMEAIECBAgQIAAAQIECBAgQIDAjYDAxJQgQIAAAQIECBAgQIAAAQIECAhMzAECBAgQIECAAAECBAgQIECAwNMCdpiYIQQIECBAgAABAgQIECBAgACBGwGBiSlBgAABAgQIECBAgAABAgQIEBCYmAMECBAgQIAAAQIECBAgQIAAgacF7DAxQwgQIECAAAECBAgQIECAAAECNwICE1OCAAECBAgQIECAAAECBAgQICAwMQcIECBAgAABAgQIECBAgAABAk8L2GFihhAgQIAAAQIECBAgQIAAAQIEbgQEJqYEAQIECBAgQIAAAQIECBAgQEBgYg4QIECAAAECBAgQIECAAAECBJ4WsMPEDCFAgAABAgQIECBAgAABAgQI3AgITEwJAgQIECBAgAABAgQIECBAgIDAxBwgQIAAAQIECBAgQIAAAQIECDwtYIeJGUKAAAECBAgQIECAAAECBAgQuBEQmJgSBAgQIECAAAECBAgQIECAAAGBiTlAgAABAgQIECBAgAABAgQIEHhawA4TM4QAAQIECBAgQIAAAQIECBAgcCMgMDElCBAgQIAAAQIECBAgQIAAAQICE3OAAAECBAgQIECAAAECBAgQIPC0gB0mZggBAgQIECBAgAABAgQIECBA4EZAYGJKECBAgAABAgQIECBAgAABAgQE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CBCoCHj0VJSsuQQUJu4BAQIECFwC3g7uAQECBAgQIBAh4NETEXPLkAqTFkabECBAYLyAt8P4CA1AgAABAgQIVAQ8eipK1lwCChP3gAABAgQuAW8H94AAAQIECBCIEPDoiYi5ZUiFSQujTQgQIDBewNthfIQGIECAAAECBCoCHj0VJWsIECBAgAABAgQIECBAgACBKAGFSVTchiVAgAABAgQIECBAgAABAgQqAgqTipI1BAgQIECAAAECBAgQIECAQJSAwiQqbsMSIECAAAECBAgQIECAAAECFQGFSUXJGgIECBAgQIAAAQIECBAgQCBKQGESFbdhCRAgQIAAAQIECBAgQIAAgYqAwqSiZA0BAgQIECBAgAABAgQIECAQJaAwiYrbsAQIECBAgAABAgQIECBAgEBFQGFSUbKGAAECBAgQIECAAAECBAgQiBJQmETFbVgCBAgQIECAAAECBAgQIECgIqAwqShZQ4AAAQIECBAgQIAAAQIECEQJKEyi4jYsAQIECBAgQIAAAQIECBAgUBFQmFSUrCFAgAABAgQIECBAgAABAgSiBBQmUXEblgABAgQIECBAgAABAgQIEKgIKEwqStYQIECAAAECBAgQIECAAAECUQIKk6i4DUuAAAECBAgQIECAAAECBAhUBBQmFSVrCBAgQIAAAQIECBAgQIAAgSgBhUlU3IYlQIAAAQIECBAgQIAAAQIEKgIKk4qSNQQIECBAgAABAgQIECBAgECUgMIkKm7DEiBAgAABAgQIECBAgAABAhUBhUlFyRoCBAgQIECAAAECBAgQIEAgSkBhEhW3YQkQIECAAAECBAgQIECAAIGKgMKkomQNAQIECBAgQIAAAQIECBAgECWgMImK27AECBAgQIAAAQIECBAgQIBARUBhUlGyhgABAgQIECBAgAABAgQIEIgSUJhExW1YAgQIECBAgAABAgQIECBAoCKgMKkoWUOAAAECBAgQIECAAAECBAhECShMouI2LAECBAgQIECAAAECBAgQIFARUJhUlKwhQIAAAQIECBAgQIAAAQIEogQUJlFxG5YAAQIECBAgQIAAAQIECBCoCChMKkrWECBAgAABAgQIECBAgAABAlECCpOouA1LgAABAgQIECBAgAABAgQIVAQUJhUlawgQIECAAAECBAgQIECAAIEoAYVJVNyGJUCAAAECBAgQIECAAAECBCoCCpOKkjUECBAgQIAAAQIECBAgQIBAlIDCJCpuwxIgQIAAAQIECBAgQIAAAQIVAYVJRckaAgQIECBAgAABAgQIECBAIEpAYRIVt2EJECBAgAABAgQIECBAgACBioDCpKJkDQECBAgQIECAAAECBAgQIBAloDCJituwBAgQIECAAAECBAgQIECAQEVAYVJRsoYAAQIECBAgQIAAAQIECBCIElCYRMVtWAIECBAgQIAAAQIECBAgQKAioDCpKFlDgAABAgQIECBAgAABAgQIRAkoTKLiNiwBAgQIECBAgAABAgQIECBQEVCYVJSsIUCAAAECBAgQIECAAAECBKIEFCZRcRuWAAECBAgQIECAAAECBAgQqAgoTCpK1hAgQIAAAQIECBAgQIAAAQJRAgqTqLgNS4AAAQIECBAgQIAAAQIECFQEFCYVJWsIECBAgAABAgQIECBAgACBKAGFSVTchiVAgAABAgQIECBAgAABAgQqAgqTipI1BAgQIECAAAECBAgQIECAQJSAwiQqbsMSIECAAAECBAgQIECAAAECFQGFSUXJGgIECBAgQIAAAQIECBAgQCBKQGESFbdhCRAgQIAAAQIECBAgQIAAgYqAwqSiZA0BAgQIECBAgAABAgQIECAQJaAwiYrbsAQIECBAgAABAgQIECBAgEBFQGFSUbKGAAECBAgQIECAAAECBAgQiBJQmETFbVgCBAgQIECAAAECBAgQIECgIqAwqShZQ4AAAQIECBAgQIAAAQIECEQJKEyi4jYsAQIECBAgQIAAAQIECBAgUBFQmFSUrCFAgAABAgQIECBAgAABAgSiBBQmUXEblgABAgQIECBAgAABAgQIEKgIKEwqStYQIECAAAECBAgQIECAAAECUQIKk6i4DUuAAAECBAgQIECAAAECBAhUBBQmFSVrCBAgQIAAAQIECBAgQIAAgSgBhUlU3IYlQIAAAQIECBAgQIAAAQIEKgIKk4qSNQQIECBAgAABAgQIECBAgECUgMIkKm7DEiBAgAABAgQIECBAgAABAhUBhUlFyRoCBAgQIECAAAECBAgQIEAgSkBhEhW3YQkQIECAAAECBAgQIECAAIGKgMKkomQNAQIECBAgQIAAAQIECBAgECWgMImK27AECBAgQIAAAQIECBAgQIBARUBhUlGyhgABAgQIECBAgAABAgQIEIgSUJhExW1YAgQIECBAgAABAgQIECBAoCKgMKkoWUOAAAECBAgQIECAAAECBAhECShMouI2LAECBAgQIECAAAECBAgQIFARUJhUlKwhQIAAAQIECBAgQIAAAQIEogQUJlFxG5YAAQIECBAgQIAAAQIECBCoCChMKkrWECBAgAABAgQIECBAgAABAlECCpOouA1LgAABAgQIECBAgAABAgQIVAQUJhUlawgQIECAAAECBAgQIECAAIEoAYVJVNyGJUCAAAECBAgQIECAAAECBCoCCpOKkjUECBAgQIAAAQIECBAgQIBAlIDCJCpuwxIgQIAAAQIECBAgQIAAAQIVAYVJRckaAgQIECBAgAABAgQIECBAIEpAYRIVt2EJECBAgAABAgQIECBAgACBioDCpKJkDQECBAgQIECAAAECBAgQIBAloDCJituwBAgQIECAAAECBAgQIECAQEVAYVJRsoYAAQIECBAgQIAAAQIECBCIElCYRMVtWAIECBAgQIAAAQIECBAgQKAioDCpKFlDgAABAgQIECBAgAABAgQIRAkoTKLiNiwBAgQIECBAgAABAgQIECBQEfgv/vSuu5c4YqkAAAAASUVORK5CYII=\" width=\"1100\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.figure(figsize=(11, 7))\n",
|
||
"plt.subplot(121)\n",
|
||
"plt.title(\"Original observation (160×210 RGB)\")\n",
|
||
"plt.imshow(obs)\n",
|
||
"plt.axis(\"off\")\n",
|
||
"plt.subplot(122)\n",
|
||
"plt.title(\"Preprocessed observation (80×80 grayscale)\")\n",
|
||
"plt.imshow(img, interpolation=\"nearest\", cmap=\"gray\")\n",
|
||
"plt.axis(\"off\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"As you can see, a single image does not give you the direction and speed of the ball, which are crucial informations for playing this game. For this reason, it is best to actually combine several consecutive observations to create the environment's state representation. One way to do that is to create a multi-channel image, with one channel per recent observation. Another is to merge all recent observations into a single-channel image, using `np.max()`. In this case, we need to dim the older images so that the DQN can distinguish the past from the present."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 74,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def combine_observations_multichannel(preprocessed_observations):\n",
|
||
" return np.array(preprocessed_observations).transpose([1, 2, 0])\n",
|
||
"\n",
|
||
"def combine_observations_singlechannel(preprocessed_observations, dim_factor=0.5):\n",
|
||
" dimmed_observations = [obs * dim_factor**index\n",
|
||
" for index, obs in enumerate(reversed(preprocessed_observations))]\n",
|
||
" return np.max(np.array(dimmed_observations), axis=0)\n",
|
||
"\n",
|
||
"n_observations_per_state = 3\n",
|
||
"preprocessed_observations = deque([], maxlen=n_observations_per_state)\n",
|
||
"\n",
|
||
"obs = env.reset()\n",
|
||
"for step in range(10):\n",
|
||
" obs, _, _, _ = env.step(1)\n",
|
||
" preprocessed_observations.append(preprocess_observation(obs))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 75,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/javascript": [
|
||
"/* Put everything inside the global mpl namespace */\n",
|
||
"window.mpl = {};\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.get_websocket_type = function() {\n",
|
||
" if (typeof(WebSocket) !== 'undefined') {\n",
|
||
" return WebSocket;\n",
|
||
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
|
||
" return MozWebSocket;\n",
|
||
" } else {\n",
|
||
" alert('Your browser does not have WebSocket support.' +\n",
|
||
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
|
||
" 'Firefox 4 and 5 are also supported but you ' +\n",
|
||
" 'have to enable WebSockets in about:config.');\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
|
||
" this.id = figure_id;\n",
|
||
"\n",
|
||
" this.ws = websocket;\n",
|
||
"\n",
|
||
" this.supports_binary = (this.ws.binaryType != undefined);\n",
|
||
"\n",
|
||
" if (!this.supports_binary) {\n",
|
||
" var warnings = document.getElementById(\"mpl-warnings\");\n",
|
||
" if (warnings) {\n",
|
||
" warnings.style.display = 'block';\n",
|
||
" warnings.textContent = (\n",
|
||
" \"This browser does not support binary websocket messages. \" +\n",
|
||
" \"Performance may be slow.\");\n",
|
||
" }\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj = new Image();\n",
|
||
"\n",
|
||
" this.context = undefined;\n",
|
||
" this.message = undefined;\n",
|
||
" this.canvas = undefined;\n",
|
||
" this.rubberband_canvas = undefined;\n",
|
||
" this.rubberband_context = undefined;\n",
|
||
" this.format_dropdown = undefined;\n",
|
||
"\n",
|
||
" this.image_mode = 'full';\n",
|
||
"\n",
|
||
" this.root = $('<div/>');\n",
|
||
" this._root_extra_style(this.root)\n",
|
||
" this.root.attr('style', 'display: inline-block');\n",
|
||
"\n",
|
||
" $(parent_element).append(this.root);\n",
|
||
"\n",
|
||
" this._init_header(this);\n",
|
||
" this._init_canvas(this);\n",
|
||
" this._init_toolbar(this);\n",
|
||
"\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" this.waiting = false;\n",
|
||
"\n",
|
||
" this.ws.onopen = function () {\n",
|
||
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
|
||
" fig.send_message(\"send_image_mode\", {});\n",
|
||
" if (mpl.ratio != 1) {\n",
|
||
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
|
||
" }\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.imageObj.onload = function() {\n",
|
||
" if (fig.image_mode == 'full') {\n",
|
||
" // Full images could contain transparency (where diff images\n",
|
||
" // almost always do), so we need to clear the canvas so that\n",
|
||
" // there is no ghosting.\n",
|
||
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
" }\n",
|
||
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
|
||
" };\n",
|
||
"\n",
|
||
" this.imageObj.onunload = function() {\n",
|
||
" this.ws.close();\n",
|
||
" }\n",
|
||
"\n",
|
||
" this.ws.onmessage = this._make_on_message_function(this);\n",
|
||
"\n",
|
||
" this.ondownload = ondownload;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_header = function() {\n",
|
||
" var titlebar = $(\n",
|
||
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
|
||
" 'ui-helper-clearfix\"/>');\n",
|
||
" var titletext = $(\n",
|
||
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
|
||
" 'text-align: center; padding: 3px;\"/>');\n",
|
||
" titlebar.append(titletext)\n",
|
||
" this.root.append(titlebar);\n",
|
||
" this.header = titletext[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_canvas = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var canvas_div = $('<div/>');\n",
|
||
"\n",
|
||
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
|
||
"\n",
|
||
" function canvas_keyboard_event(event) {\n",
|
||
" return fig.key_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
|
||
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
|
||
" this.canvas_div = canvas_div\n",
|
||
" this._canvas_extra_style(canvas_div)\n",
|
||
" this.root.append(canvas_div);\n",
|
||
"\n",
|
||
" var canvas = $('<canvas/>');\n",
|
||
" canvas.addClass('mpl-canvas');\n",
|
||
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
|
||
"\n",
|
||
" this.canvas = canvas[0];\n",
|
||
" this.context = canvas[0].getContext(\"2d\");\n",
|
||
"\n",
|
||
" var backingStore = this.context.backingStorePixelRatio ||\n",
|
||
"\tthis.context.webkitBackingStorePixelRatio ||\n",
|
||
"\tthis.context.mozBackingStorePixelRatio ||\n",
|
||
"\tthis.context.msBackingStorePixelRatio ||\n",
|
||
"\tthis.context.oBackingStorePixelRatio ||\n",
|
||
"\tthis.context.backingStorePixelRatio || 1;\n",
|
||
"\n",
|
||
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
|
||
"\n",
|
||
" var rubberband = $('<canvas/>');\n",
|
||
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
|
||
"\n",
|
||
" var pass_mouse_events = true;\n",
|
||
"\n",
|
||
" canvas_div.resizable({\n",
|
||
" start: function(event, ui) {\n",
|
||
" pass_mouse_events = false;\n",
|
||
" },\n",
|
||
" resize: function(event, ui) {\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" stop: function(event, ui) {\n",
|
||
" pass_mouse_events = true;\n",
|
||
" fig.request_resize(ui.size.width, ui.size.height);\n",
|
||
" },\n",
|
||
" });\n",
|
||
"\n",
|
||
" function mouse_event_fn(event) {\n",
|
||
" if (pass_mouse_events)\n",
|
||
" return fig.mouse_event(event, event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" rubberband.mousedown('button_press', mouse_event_fn);\n",
|
||
" rubberband.mouseup('button_release', mouse_event_fn);\n",
|
||
" // Throttle sequential mouse events to 1 every 20ms.\n",
|
||
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
|
||
"\n",
|
||
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
|
||
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
|
||
"\n",
|
||
" canvas_div.on(\"wheel\", function (event) {\n",
|
||
" event = event.originalEvent;\n",
|
||
" event['data'] = 'scroll'\n",
|
||
" if (event.deltaY < 0) {\n",
|
||
" event.step = 1;\n",
|
||
" } else {\n",
|
||
" event.step = -1;\n",
|
||
" }\n",
|
||
" mouse_event_fn(event);\n",
|
||
" });\n",
|
||
"\n",
|
||
" canvas_div.append(canvas);\n",
|
||
" canvas_div.append(rubberband);\n",
|
||
"\n",
|
||
" this.rubberband = rubberband;\n",
|
||
" this.rubberband_canvas = rubberband[0];\n",
|
||
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
|
||
" this.rubberband_context.strokeStyle = \"#000000\";\n",
|
||
"\n",
|
||
" this._resize_canvas = function(width, height) {\n",
|
||
" // Keep the size of the canvas, canvas container, and rubber band\n",
|
||
" // canvas in synch.\n",
|
||
" canvas_div.css('width', width)\n",
|
||
" canvas_div.css('height', height)\n",
|
||
"\n",
|
||
" canvas.attr('width', width * mpl.ratio);\n",
|
||
" canvas.attr('height', height * mpl.ratio);\n",
|
||
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
|
||
"\n",
|
||
" rubberband.attr('width', width);\n",
|
||
" rubberband.attr('height', height);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
|
||
" // upon first draw.\n",
|
||
" this._resize_canvas(600, 600);\n",
|
||
"\n",
|
||
" // Disable right mouse context menu.\n",
|
||
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
|
||
" return false;\n",
|
||
" });\n",
|
||
"\n",
|
||
" function set_focus () {\n",
|
||
" canvas.focus();\n",
|
||
" canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" window.setTimeout(set_focus, 100);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items) {\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) {\n",
|
||
" // put a spacer in here.\n",
|
||
" continue;\n",
|
||
" }\n",
|
||
" var button = $('<button/>');\n",
|
||
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
|
||
" 'ui-button-icon-only');\n",
|
||
" button.attr('role', 'button');\n",
|
||
" button.attr('aria-disabled', 'false');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
"\n",
|
||
" var icon_img = $('<span/>');\n",
|
||
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
|
||
" icon_img.addClass(image);\n",
|
||
" icon_img.addClass('ui-corner-all');\n",
|
||
"\n",
|
||
" var tooltip_span = $('<span/>');\n",
|
||
" tooltip_span.addClass('ui-button-text');\n",
|
||
" tooltip_span.html(tooltip);\n",
|
||
"\n",
|
||
" button.append(icon_img);\n",
|
||
" button.append(tooltip_span);\n",
|
||
"\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fmt_picker_span = $('<span/>');\n",
|
||
"\n",
|
||
" var fmt_picker = $('<select/>');\n",
|
||
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
|
||
" fmt_picker_span.append(fmt_picker);\n",
|
||
" nav_element.append(fmt_picker_span);\n",
|
||
" this.format_dropdown = fmt_picker[0];\n",
|
||
"\n",
|
||
" for (var ind in mpl.extensions) {\n",
|
||
" var fmt = mpl.extensions[ind];\n",
|
||
" var option = $(\n",
|
||
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
|
||
" fmt_picker.append(option)\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add hover states to the ui-buttons\n",
|
||
" $( \".ui-button\" ).hover(\n",
|
||
" function() { $(this).addClass(\"ui-state-hover\");},\n",
|
||
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
|
||
" );\n",
|
||
"\n",
|
||
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
|
||
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
|
||
" // which will in turn request a refresh of the image.\n",
|
||
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_message = function(type, properties) {\n",
|
||
" properties['type'] = type;\n",
|
||
" properties['figure_id'] = this.id;\n",
|
||
" this.ws.send(JSON.stringify(properties));\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.send_draw_message = function() {\n",
|
||
" if (!this.waiting) {\n",
|
||
" this.waiting = true;\n",
|
||
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" var format_dropdown = fig.format_dropdown;\n",
|
||
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
|
||
" fig.ondownload(fig, format);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
|
||
" var size = msg['size'];\n",
|
||
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
|
||
" fig._resize_canvas(size[0], size[1]);\n",
|
||
" fig.send_message(\"refresh\", {});\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
|
||
" var x0 = msg['x0'] / mpl.ratio;\n",
|
||
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
|
||
" var x1 = msg['x1'] / mpl.ratio;\n",
|
||
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
|
||
" x0 = Math.floor(x0) + 0.5;\n",
|
||
" y0 = Math.floor(y0) + 0.5;\n",
|
||
" x1 = Math.floor(x1) + 0.5;\n",
|
||
" y1 = Math.floor(y1) + 0.5;\n",
|
||
" var min_x = Math.min(x0, x1);\n",
|
||
" var min_y = Math.min(y0, y1);\n",
|
||
" var width = Math.abs(x1 - x0);\n",
|
||
" var height = Math.abs(y1 - y0);\n",
|
||
"\n",
|
||
" fig.rubberband_context.clearRect(\n",
|
||
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
|
||
"\n",
|
||
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
|
||
" // Updates the figure title.\n",
|
||
" fig.header.textContent = msg['label'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
|
||
" var cursor = msg['cursor'];\n",
|
||
" switch(cursor)\n",
|
||
" {\n",
|
||
" case 0:\n",
|
||
" cursor = 'pointer';\n",
|
||
" break;\n",
|
||
" case 1:\n",
|
||
" cursor = 'default';\n",
|
||
" break;\n",
|
||
" case 2:\n",
|
||
" cursor = 'crosshair';\n",
|
||
" break;\n",
|
||
" case 3:\n",
|
||
" cursor = 'move';\n",
|
||
" break;\n",
|
||
" }\n",
|
||
" fig.rubberband_canvas.style.cursor = cursor;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
|
||
" fig.message.textContent = msg['message'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
|
||
" // Request the server to send over a new figure.\n",
|
||
" fig.send_draw_message();\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
|
||
" fig.image_mode = msg['mode'];\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Called whenever the canvas gets updated.\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"// A function to construct a web socket function for onmessage handling.\n",
|
||
"// Called in the figure constructor.\n",
|
||
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
|
||
" return function socket_on_message(evt) {\n",
|
||
" if (evt.data instanceof Blob) {\n",
|
||
" /* FIXME: We get \"Resource interpreted as Image but\n",
|
||
" * transferred with MIME type text/plain:\" errors on\n",
|
||
" * Chrome. But how to set the MIME type? It doesn't seem\n",
|
||
" * to be part of the websocket stream */\n",
|
||
" evt.data.type = \"image/png\";\n",
|
||
"\n",
|
||
" /* Free the memory for the previous frames */\n",
|
||
" if (fig.imageObj.src) {\n",
|
||
" (window.URL || window.webkitURL).revokeObjectURL(\n",
|
||
" fig.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
|
||
" evt.data);\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
|
||
" fig.imageObj.src = evt.data;\n",
|
||
" fig.updated_canvas_event();\n",
|
||
" fig.waiting = false;\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var msg = JSON.parse(evt.data);\n",
|
||
" var msg_type = msg['type'];\n",
|
||
"\n",
|
||
" // Call the \"handle_{type}\" callback, which takes\n",
|
||
" // the figure and JSON message as its only arguments.\n",
|
||
" try {\n",
|
||
" var callback = fig[\"handle_\" + msg_type];\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" if (callback) {\n",
|
||
" try {\n",
|
||
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
|
||
" callback(fig, msg);\n",
|
||
" } catch (e) {\n",
|
||
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
|
||
" }\n",
|
||
" }\n",
|
||
" };\n",
|
||
"}\n",
|
||
"\n",
|
||
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
|
||
"mpl.findpos = function(e) {\n",
|
||
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
|
||
" var targ;\n",
|
||
" if (!e)\n",
|
||
" e = window.event;\n",
|
||
" if (e.target)\n",
|
||
" targ = e.target;\n",
|
||
" else if (e.srcElement)\n",
|
||
" targ = e.srcElement;\n",
|
||
" if (targ.nodeType == 3) // defeat Safari bug\n",
|
||
" targ = targ.parentNode;\n",
|
||
"\n",
|
||
" // jQuery normalizes the pageX and pageY\n",
|
||
" // pageX,Y are the mouse positions relative to the document\n",
|
||
" // offset() returns the position of the element relative to the document\n",
|
||
" var x = e.pageX - $(targ).offset().left;\n",
|
||
" var y = e.pageY - $(targ).offset().top;\n",
|
||
"\n",
|
||
" return {\"x\": x, \"y\": y};\n",
|
||
"};\n",
|
||
"\n",
|
||
"/*\n",
|
||
" * return a copy of an object with only non-object keys\n",
|
||
" * we need this to avoid circular references\n",
|
||
" * http://stackoverflow.com/a/24161582/3208463\n",
|
||
" */\n",
|
||
"function simpleKeys (original) {\n",
|
||
" return Object.keys(original).reduce(function (obj, key) {\n",
|
||
" if (typeof original[key] !== 'object')\n",
|
||
" obj[key] = original[key]\n",
|
||
" return obj;\n",
|
||
" }, {});\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
|
||
" var canvas_pos = mpl.findpos(event)\n",
|
||
"\n",
|
||
" if (name === 'button_press')\n",
|
||
" {\n",
|
||
" this.canvas.focus();\n",
|
||
" this.canvas_div.focus();\n",
|
||
" }\n",
|
||
"\n",
|
||
" var x = canvas_pos.x * mpl.ratio;\n",
|
||
" var y = canvas_pos.y * mpl.ratio;\n",
|
||
"\n",
|
||
" this.send_message(name, {x: x, y: y, button: event.button,\n",
|
||
" step: event.step,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
"\n",
|
||
" /* This prevents the web browser from automatically changing to\n",
|
||
" * the text insertion cursor when the button is pressed. We want\n",
|
||
" * to control all of the cursor setting manually through the\n",
|
||
" * 'cursor' event from matplotlib */\n",
|
||
" event.preventDefault();\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" // Handle any extra behaviour associated with a key event\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.key_event = function(event, name) {\n",
|
||
"\n",
|
||
" // Prevent repeat events\n",
|
||
" if (name == 'key_press')\n",
|
||
" {\n",
|
||
" if (event.which === this._key)\n",
|
||
" return;\n",
|
||
" else\n",
|
||
" this._key = event.which;\n",
|
||
" }\n",
|
||
" if (name == 'key_release')\n",
|
||
" this._key = null;\n",
|
||
"\n",
|
||
" var value = '';\n",
|
||
" if (event.ctrlKey && event.which != 17)\n",
|
||
" value += \"ctrl+\";\n",
|
||
" if (event.altKey && event.which != 18)\n",
|
||
" value += \"alt+\";\n",
|
||
" if (event.shiftKey && event.which != 16)\n",
|
||
" value += \"shift+\";\n",
|
||
"\n",
|
||
" value += 'k';\n",
|
||
" value += event.which.toString();\n",
|
||
"\n",
|
||
" this._key_event_extra(event, name);\n",
|
||
"\n",
|
||
" this.send_message(name, {key: value,\n",
|
||
" guiEvent: simpleKeys(event)});\n",
|
||
" return false;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
|
||
" if (name == 'download') {\n",
|
||
" this.handle_save(this, null);\n",
|
||
" } else {\n",
|
||
" this.send_message(\"toolbar_button\", {name: name});\n",
|
||
" }\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
|
||
" this.message.textContent = tooltip;\n",
|
||
"};\n",
|
||
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
|
||
"\n",
|
||
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
|
||
"\n",
|
||
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
|
||
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
|
||
" // object with the appropriate methods. Currently this is a non binary\n",
|
||
" // socket, so there is still some room for performance tuning.\n",
|
||
" var ws = {};\n",
|
||
"\n",
|
||
" ws.close = function() {\n",
|
||
" comm.close()\n",
|
||
" };\n",
|
||
" ws.send = function(m) {\n",
|
||
" //console.log('sending', m);\n",
|
||
" comm.send(m);\n",
|
||
" };\n",
|
||
" // Register the callback with on_msg.\n",
|
||
" comm.on_msg(function(msg) {\n",
|
||
" //console.log('receiving', msg['content']['data'], msg);\n",
|
||
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
|
||
" ws.onmessage(msg['content']['data'])\n",
|
||
" });\n",
|
||
" return ws;\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.mpl_figure_comm = function(comm, msg) {\n",
|
||
" // This is the function which gets called when the mpl process\n",
|
||
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
|
||
"\n",
|
||
" var id = msg.content.data.id;\n",
|
||
" // Get hold of the div created by the display call when the Comm\n",
|
||
" // socket was opened in Python.\n",
|
||
" var element = $(\"#\" + id);\n",
|
||
" var ws_proxy = comm_websocket_adapter(comm)\n",
|
||
"\n",
|
||
" function ondownload(figure, format) {\n",
|
||
" window.open(figure.imageObj.src);\n",
|
||
" }\n",
|
||
"\n",
|
||
" var fig = new mpl.figure(id, ws_proxy,\n",
|
||
" ondownload,\n",
|
||
" element.get(0));\n",
|
||
"\n",
|
||
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
|
||
" // web socket which is closed, not our websocket->open comm proxy.\n",
|
||
" ws_proxy.onopen();\n",
|
||
"\n",
|
||
" fig.parent_element = element.get(0);\n",
|
||
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
|
||
" if (!fig.cell_info) {\n",
|
||
" console.error(\"Failed to find cell for figure\", id, fig);\n",
|
||
" return;\n",
|
||
" }\n",
|
||
"\n",
|
||
" var output_index = fig.cell_info[2]\n",
|
||
" var cell = fig.cell_info[0];\n",
|
||
"\n",
|
||
"};\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
|
||
" var width = fig.canvas.width/mpl.ratio\n",
|
||
" fig.root.unbind('remove')\n",
|
||
"\n",
|
||
" // Update the output cell to use the data from the current canvas.\n",
|
||
" fig.push_to_output();\n",
|
||
" var dataURL = fig.canvas.toDataURL();\n",
|
||
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
|
||
" // the notebook keyboard shortcuts fail.\n",
|
||
" IPython.keyboard_manager.enable()\n",
|
||
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
|
||
" fig.close_ws(fig, msg);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
|
||
" fig.send_message('closing', msg);\n",
|
||
" // fig.ws.close()\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
|
||
" // Turn the data on the canvas into data in the output cell.\n",
|
||
" var width = this.canvas.width/mpl.ratio\n",
|
||
" var dataURL = this.canvas.toDataURL();\n",
|
||
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.updated_canvas_event = function() {\n",
|
||
" // Tell IPython that the notebook contents must change.\n",
|
||
" IPython.notebook.set_dirty(true);\n",
|
||
" this.send_message(\"ack\", {});\n",
|
||
" var fig = this;\n",
|
||
" // Wait a second, then push the new image to the DOM so\n",
|
||
" // that it is saved nicely (might be nice to debounce this).\n",
|
||
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._init_toolbar = function() {\n",
|
||
" var fig = this;\n",
|
||
"\n",
|
||
" var nav_element = $('<div/>')\n",
|
||
" nav_element.attr('style', 'width: 100%');\n",
|
||
" this.root.append(nav_element);\n",
|
||
"\n",
|
||
" // Define a callback function for later on.\n",
|
||
" function toolbar_event(event) {\n",
|
||
" return fig.toolbar_button_onclick(event['data']);\n",
|
||
" }\n",
|
||
" function toolbar_mouse_event(event) {\n",
|
||
" return fig.toolbar_button_onmouseover(event['data']);\n",
|
||
" }\n",
|
||
"\n",
|
||
" for(var toolbar_ind in mpl.toolbar_items){\n",
|
||
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
|
||
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
|
||
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
|
||
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
|
||
"\n",
|
||
" if (!name) { continue; };\n",
|
||
"\n",
|
||
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
|
||
" button.click(method_name, toolbar_event);\n",
|
||
" button.mouseover(tooltip, toolbar_mouse_event);\n",
|
||
" nav_element.append(button);\n",
|
||
" }\n",
|
||
"\n",
|
||
" // Add the status bar.\n",
|
||
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
|
||
" nav_element.append(status_bar);\n",
|
||
" this.message = status_bar[0];\n",
|
||
"\n",
|
||
" // Add the close button to the window.\n",
|
||
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
|
||
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
|
||
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
|
||
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
|
||
" buttongrp.append(button);\n",
|
||
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
|
||
" titlebar.prepend(buttongrp);\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._root_extra_style = function(el){\n",
|
||
" var fig = this\n",
|
||
" el.on(\"remove\", function(){\n",
|
||
"\tfig.close_ws(fig, {});\n",
|
||
" });\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
|
||
" // this is important to make the div 'focusable\n",
|
||
" el.attr('tabindex', 0)\n",
|
||
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
|
||
" // off when our div gets focus\n",
|
||
"\n",
|
||
" // location in version 3\n",
|
||
" if (IPython.notebook.keyboard_manager) {\n",
|
||
" IPython.notebook.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
" else {\n",
|
||
" // location in version 2\n",
|
||
" IPython.keyboard_manager.register_events(el);\n",
|
||
" }\n",
|
||
"\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
|
||
" var manager = IPython.notebook.keyboard_manager;\n",
|
||
" if (!manager)\n",
|
||
" manager = IPython.keyboard_manager;\n",
|
||
"\n",
|
||
" // Check for shift+enter\n",
|
||
" if (event.shiftKey && event.which == 13) {\n",
|
||
" this.canvas_div.blur();\n",
|
||
" // select the cell after this one\n",
|
||
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
|
||
" IPython.notebook.select(index + 1);\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
|
||
" fig.ondownload(fig, null);\n",
|
||
"}\n",
|
||
"\n",
|
||
"\n",
|
||
"mpl.find_output_cell = function(html_output) {\n",
|
||
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
|
||
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
|
||
" // IPython event is triggered only after the cells have been serialised, which for\n",
|
||
" // our purposes (turning an active figure into a static one), is too late.\n",
|
||
" var cells = IPython.notebook.get_cells();\n",
|
||
" var ncells = cells.length;\n",
|
||
" for (var i=0; i<ncells; i++) {\n",
|
||
" var cell = cells[i];\n",
|
||
" if (cell.cell_type === 'code'){\n",
|
||
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
|
||
" var data = cell.output_area.outputs[j];\n",
|
||
" if (data.data) {\n",
|
||
" // IPython >= 3 moved mimebundle to data attribute of output\n",
|
||
" data = data.data;\n",
|
||
" }\n",
|
||
" if (data['text/html'] == html_output) {\n",
|
||
" return [cell, data, j];\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
" }\n",
|
||
"}\n",
|
||
"\n",
|
||
"// Register the function which deals with the matplotlib target/channel.\n",
|
||
"// The kernel may be null if the page has been refreshed.\n",
|
||
"if (IPython.notebook.kernel != null) {\n",
|
||
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
|
||
"}\n"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.Javascript object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABEwAAAK8CAYAAAD1QyqZAAAgAElEQVR4XuzdB7RsTXYf9HrkHCWwxSBjkGwEDKCRyGAwWcbknGERhDGLcAERFjkYEPCRg0gmmpzBIkdjkjQCBixgRBKyDEhkMGAMw9qoe9zT8+591a+qdtW+99drzZL9fefUrvrt+m6f++/T575rXgQIECBAgAABAgQIECBAgAABAl8i8I4HAQIECBAgQIAAAQIECBAgQIDAlwoITOwIAgQIECBAgAABAgQIECBAgMCdgMDEliBAgAABAgQIECBAgAABAgQICEzsAQIECBAgQIAAAQIECBAgQIDAywLuMLFDCBAgQIAAAQIECBAgQIAAAQJ3AgITW4IAAQIECBAgQIAAAQIECBAgIDCxBwgQIECAAAECBAgQIECAAAECLwu4w8QOIUCAAAECBAgQIECAAAECBAjcCQhMbAkCBAgQIECAAAECBAgQIECAgMDEHiBAgAABAgQIECBAgAABAgQIvCzgDhM7hAABAgQIECBAgAABAgQIECBwJyAwsSUIECBAgAABAgQIECBAgAABAgITe4AAAQIECBAgQIAAAQIECBAg8LKAO0zsEAIECBAgQIAAAQIECBAgQIDAnYDAxJYgQIAAAQIECBAgQIAAAQIECAhM7AECBAgQIECAAAECBAgQIECAwMsC7jCxQwgQIECAAAECBAgQIECAAAECdwICE1uCAAECBAgQIECAAAECBAgQICAwsQcIECBAgAABAgQIECBAgAABAi8LuMPEDiFAgAABAgQIECBAgAABAgQI3AkITGwJAgQIECBAgAABAgQIECBAgIDAxB4gQIAAAQIECBAgQIAAAQIECLws4A4TO4QAAQIECBAgQIAAAQIECBAgcCcgMLElCBAgQIAAAQIECBAgQIAAAQICE3uAAAECBAgQIECAAAECBAgQIPCygDtM7BACBAgQIECAAAECBAgQIECAwJ2AwMSWIECAAAECBAgQIECAAAECBAgITOwBAgQIECBAgAABAgQIECBAgMDLAu4wsUMIECBAgAABAgQIECBAgAABAncCAhNbggABAgQIECBAgAABAgQIECAgMLEHCBAgQIAAAQIECBAgQIAAAQIvC7jDxA4hQIAAAQIECBAgQIAAAQIECNwJCExsCQIECBAgQIAAAQIECBAgQICAwMQeIECAAAECBAgQIECAAAECBAi8LOAOEzuEAAECBAgQIECAAAECBAgQIHAnIDCxJQgQIECAAAECBAgQIECAAAECAhN7gAABAgQIECBAgAABAgQIECDwsoA7TOwQAgQIECBAgAABAgQIECBAgMCdgMDEliBAgAABAgQIECBAgAABAgQICEzsAQIECBAgQIAAAQIECBAgQIDAywLuMLFDCBAgQIAAAQIECBAgQIAAAQJ3AgITW4IAAQIECBAgQIAAAQIECBAgIDCxBwgQIECAAAECBAgQIECAAAECLwu4w8QOIUCAAAECBAgQIECAAAECBAjcCQhMbAkCBAgQIECAAAECBAgQIECAgMDEHiBAgAABAgQIECBAgAABAgQIvCzgDhM7hAABAgQIECBAgAABAgQIECBwJyAwsSUIECBAgAABAgQIECBAgAABAgITe4AAAQIECBAgQIAAAQIECBAg8LKAO0zsEAIECBAgQIAAAQIECBAgQIDAnYDAxJYgQIAAAQIECBAgQIAAAQIECAhM7AECBAgQIECAAAECBAgQIECAwMsC7jCxQwgQIECAAAECBAgQIECAAAECdwICE1uCAAECBAgQIECAAAECBAgQICAwsQcIECBAgAABAgQIECBAgAABAi8LuMPEDiFAgAABAgQIECBAgAABAgQI3AkITGwJAgQIECBAgAABAgQIECBAgIDAxB4gQIAAAQIECBAgQIAAAQIECLws4A4TO4QAAQIECBAgQIAAAQIECBAgcCcgMLElCBAgQIAAAQIECBAgQIAAAQICE3uAAAECBAgQIECAAAECBAgQIPCygDtM7BACBAgQIECAAAECBAgQIECAwJ2AwMSWIECAAAECBAgQIECAAAECBAgITOwBAgQIECBAgAABAgQIECBAgMDLAu4wsUMIECBAgAABAgQIECBAgAABAncCAhNbggABAgQIECBAgAABAgQIECAgMLEHCBAgQIAAAQIECBAgQIAAAQIvC7jDxA4hQIAAAQIECBAgQIAAAQIECNwJCExsCQIECBAgQIAAAQIECBAgQICAwMQeIECAAAECBAgQIECAAAECBAi8LOAOEzuEAAECBAgQIECAAAECBAgQIHAnIDCxJQgQIECAAAECBAgQIECAAAECAhN7gAABAgQIECBAgAABAgQIECDwsoA7TOwQAgQIECBAgAABAgQIECBAgMCdgMDEliBAgAABAgQIECBAgAABAgQICEzsAQIECBAgQIAAAQIECBAgQIDAywLuMLFDCBAgQIAAAQIECBAgQIAAAQJ3AgITW4IAAQIECBAgQIAAAQIECBAgIDCxBwgQIECAAAECBAgQIECAAAECLwu4w8QOIUCAAAECBAgQIECAAAECBAjcCQhMbAkCBAgQIECAAAECBAgQIECAgMDEHiBAgAABAgQIECBAgAABAgQIvCzgDhM7hAABAgQIECBAgAABAgQIECBwJyAwsSUIECBAgAABAgQIECBAgAABAgITe4AAAQIECBAgQIAAAQIECBAg8LKAO0zsEAIECBAgQIAAAQIECBAgQIDAnYDAxJYgQIAAAQIECBAgQIAAAQIECAhM7AECBAgQIECAAAECBAgQIECAwMsC7jCxQwgQIECAAAECBAgQIECAAAECdwICE1uCAAECBAgQIECAAAECBAgQICAwsQcIECBAgAABAgQIECBAgAABAi8LuMPEDiFAgAABAgQIECBAgAABAgQI3AkITGwJAgQIECBAgAABAgQIECBAgIDAxB4gQIAAAQIECBAgQIAAAQIECLws4A4TO4QAAQIECBAgQIAAAQIECBAgcCcgMLElCBAgQIAAAQIECBAgQIAAAQICE3uAAAECBAgQIECAAAECBAgQIPCygDtM7BACBAgQIECAAAECBAgQIECAwJ2AwMSWIECAAAECBAgQIECAAAECBAgITOwBAgQIECBAgAABAgQIECBAgMDLAu4wsUMIECBAgAABAgQIECBAgAABAncCAhNbggABAgQIECBAgAABAgQIECAgMLEHCBAgQIAAAQIECBAgQIAAAQIvC7jDxA4hQIAAAQIECBAgQIAAAQIECNwJCExsCQIECBAgQIAAAQIECBAgQICAwMQeIECAAAECBAgQIECAAAECBAi8LOAOEzuEAAECBAgQIECAAAECBAgQIHAnIDCxJQgQIECAAAECBAgQIECAAAECAhN7gAABAgQIECBAgAABAgQIECDwsoA7TOwQAgQIECBAgAABAgQIECBAgMCdgMDEliBAgAABAgQIECBAgAABAgQICEzsAQIECBAgQIAAAQIECBAgQIDAywLuMLFDCBAgQIAAAQIECBAgQIAAAQJ3AgITW4IAAQIECBAgQIAAAQIECBAgIDCxBwgQIECAAAECBAgQIECAAAECLwu4w8QOIUCAAAECBAgQIECAAAECBAjcCQhMbAkCBAgQIECAAAECBAgQIECAgMDEHiBAgAABAgQIECBAgAABAgQIvCzgDhM7hAABAgQIECBAgAABAgQIECBwJyAwsSUIECBAgAABAgQIECBAgAABAgITe4AAAQIECBAgQIAAAQIECBAg8LKAO0zsEAIECBAgQIAAAQIECBAgQIDAnYDAxJYgQIAAAQIECBAgQIAAAQIECAhM7AECBAgQIECAAAECBAgQIECAwMsC7jCxQwgQIECAAAECBAgQIECAAAECdwICE1uCAAECBAgQIECAAAECBAgQICAwsQcIECBAgAABAgQIECBAgAABAi8LuMPEDiFAgAABAgQIECBAgAABAgQI3AkITGwJAgQIECBAgAABAgQIECBAgIDAxB4gQIAAAQIECBAgQIAAAQIECLws4A4TO4QAAQIECBAgQIAAAQIECBAgcCcgMLElCBAgQIAAAQIECBAgQIAAAQICE3uAAAECBAgQIECAAAECBAgQIPCygDtM7BACBAgQIECAAAECBAgQIECAwJ2AwMSWIECAAAECBAgQIECAAAECBAgITOwBAgQIECBAgAABAgQIECBAgMDLAu4wsUMIEFgp8Oe01v7s1lrPz5o/pLX2k1trP7K19l8+MKl/pbX2Fa21X+uBc04+NNYTr9/i5EmaGwECBAi8VyDev+LneLynrXrF+8O/3Fr7sZdas+tc349/vdbad8wefMN4H3t9sWGqShIgcJpAzy8xp83ZfAgQmCNwvYCI0X6z1tpPuxs2fj58b2vtU621f7q19uM/ouz7ApM/vbX2M1pr/9jdeB97QSMweX9jvqq19kdenP+9j+hdnPLjWmu/fmst+uhFgACBtyzw6csHABEi/Iqttf/+8l72T7TW/pobGIHJebvkY68v3reSP7q19rNba3/7Ry5zxnvzR5Z2GgECHyMgMPkYNecQeB0C1wuI//NyZ0dcBNy+rp9g/V+ttX9hYmDyv7XW/qH3fPr287fWfsHWWtT7wgPEApP3Y31ja+3fba39oQMXdn9ta+0ndt4h9EDLHEqAAIFSAr/x5Y6O+BDh72it/TettV+5tfYbttZ+tdba19ys5hdurf2/rbX/e+EK3WHyGO7MwOQ/bK394MBdoDPemx9bvaMJEBgSEJgM8TmZQGmB6wXE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WgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQIBAeQGBSfkWWgABAgQIECBAgAABAgQIECAwW0BgMlvUeAQIECBAgAABAgQIECBAgEB5AYFJ+RZaAAECBAgQIECAAAECBAgQIDBbQGAyW9R4BAgQIECAAAECBAgQIECAQHkBgUn5FloAAQIECBAgQIAAAQIECBAgMFtAYDJb1HgECBAgQIAAAQIECBAgQOD/22gIDPkQAABC8KBDZvT0SgAAAABJRU5ErkJggg==\" width=\"1100\">"
|
||
],
|
||
"text/plain": [
|
||
"<IPython.core.display.HTML object>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"img1 = combine_observations_multichannel(preprocessed_observations)\n",
|
||
"img2 = combine_observations_singlechannel(preprocessed_observations)\n",
|
||
"\n",
|
||
"plt.figure(figsize=(11, 7))\n",
|
||
"plt.subplot(121)\n",
|
||
"plt.title(\"Multichannel state\")\n",
|
||
"plt.imshow(img1, interpolation=\"nearest\")\n",
|
||
"plt.axis(\"off\")\n",
|
||
"plt.subplot(122)\n",
|
||
"plt.title(\"Singlechannel state\")\n",
|
||
"plt.imshow(img2, interpolation=\"nearest\", cmap=\"gray\")\n",
|
||
"plt.axis(\"off\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Exercise solutions"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Coming soon..."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": true
|
||
},
|
||
"outputs": [],
|
||
"source": []
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.6.3"
|
||
},
|
||
"nav_menu": {},
|
||
"toc": {
|
||
"navigate_menu": true,
|
||
"number_sections": true,
|
||
"sideBar": true,
|
||
"threshold": 6,
|
||
"toc_cell": false,
|
||
"toc_section_display": "block",
|
||
"toc_window_display": false
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 1
|
||
}
|