replot/Examples.ipynb

15125 lines
1.4 MiB

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import replot\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" for i in range(8):\n",
" figure.plot(lambda x: np.sin(x + np.pi * i / 4))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, (-2, 2))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" x = np.linspace(-np.pi, np.pi, 200)\n",
" figure.plot(np.sin, x)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nO29fYyVZ3rfn3SrpEraJE3XceL12jDMjNJEWaVN/6jaSK3Sf7KtGkVKk9jmJTPD0OFtBIJS04ACElSAqLEDtsw64J+gWvjJgwTUhvJiFiizyXgzXl63zHJmzsx5Pw8M2Gx/yf6yG3P1vp9nmMEJMAPn5T7XdT4f6StmLEa6P7rPZb5znnM/z4/8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAzJkzZ85vtre3/3lbW9sllz+dPXv2V0KvCQAAAABqxKxZs37Glb9x9+cv+u9bWlp+3ZXAq6HXBQAAAAA1Ys6cOb/mCuDQg//NFcC7Lr8aak0AAAAAUENaW1t/yhXAW+7Pfz7x/W+58veZK4a/HXptAAAAAFAjXOn7V670nZv4HOBOfwnY5d+FXhcAAABUh+/8we/88o0Fv3fBpS/0WqAx+TFXBO+4tDzuL927d08AAACgsfH/Xn9y+n/KcPc8Sf3B70tqwe+dqFehgAZn1qxZP3//67a2ts0u0/524F9U4+Pfk1u3bMU74aYvuOmNZT/cdMaSW5TOy+iWzUnxc8n+P3sl9dWv/nhtWwWoob29/U9crrvid6O1tXWf/1zgdD/jh8O/uG7etBXvhJu+4KY3lv1w0xkrboVzF2R4aXdc/IZ7e6TYPxA71aNXgGEsDIflwcfNTiy7WffDTWe0u0X5W5LZ/fbku36j27dJebQ46Ra6P4ByNA+H5cHHLfxacMMPN93R7Fa6eE1G1qxMyt+iBZL/4LhE0d3PuYXuD6AcrcNhefBxw01jLPvhpjMa3aLyp5J7r09SXa/E5S+9fq2UvpN6qFvo/gDK0TYclgcfN9w0x7Ifbjqjza18Y0zSmzYk7/p1vCTZ/fslKt15pFvo/gDK0TQclgcfN9y0x7Ifbjqjya3w4VkZXtyZHPRYuVSKH308rVvo/gDK0TIclgcfN9wsxLIfbjqjwS3K3ZSxN3dOHvQYe2OHRJnyjNxC9wdQTqMPh+XBxw03S7Hsh5vONLpbcfCSjKxanpS/ng7Jnzz9RG6h+wMop5GHw/Lg44abtVj2w01nGtUtKn0i2a8fkFTny8lBj43rpDyUfmK30P0BlNOIw2F58HHDzaKbdT/cdKYR3XzRS29Yl7zr5wpg9uDB+OTv07iF7g+gnEYbDsuDjxtuVt2s++GmM43mlj9xKr7U68vfyOpeKQ5ersgtdH8A5TTScFgefNxws+xm3Q83nWkUN3+oY+z116YOery1Kz78Ualb6P4AymmE4bA8+Ljh1gxu1v1w05lGcCsODMrwiiXJ7V2WdEnhzLmquYXuD6Cc0MNhefBxw61Z3Kz74aYzId38DZyz+/bFN3SOD3ps2ijlVKaqbqH7AyiHwdcX3HTGspt1P9x0JpSbf3Rbev2rySXfrrmS6zv0VAc9pnML3R9AOQy+vuCmM5bdrPvhpjP1douiu5J//5ikuucnBz3WrJTSxWs1cwvdH0A5DL6+4KYzlt2s++GmM/V0K48WZXT71smDHpl3dktUGK+pW+j+AMph8PUFN52x7GbdDzedqZdbsX9Ahnt7koMey7qlcL6/Lm6h+wMoh8HXF9x0xrKbdT/cdKbWblHxtmT27pl81290y2Ypj+Tr5ha6P4ByGHx9wU1nLLtZ98NNZ2rpVrpyXUbWrk7K38J5kjtyNP4MYD3dQvcHUA6Dry+46YxlN+t+uOlMLdx8ycsdPhKXvvighyuBpatDQdxC9wdQDoOvL7jpjGU363646Uy13fzlXX+Zd/Kgx7t748vAodxC9wdQDoOvL7jpjGU363646Uw13QrnLsjw0u7koEdvT3zwI7Rb6P4AymHw9QU3nbHsZt0PN52phluUvyWZ3W9PHfTYvi2+5UsjuIXuD6AcBl9fcNMZy27W/XDTmUrd/E2cR9asSMrfogWS/+B4XQ96TOcWuj+Achh8fcFNZyy7WffDTWee1s0/ti33Xp+kul5JnuO7fm38eLfQPn/TLXR/AOUw+PqCm85YdrPuh5vOPI1b+caYpDdtSN7163hJsvv3S1S6E9zlYW6h+wMoh8HXF9x0xrKbdT/cdOZJ3QofnpXhxZ3JQY+VS6X40cfBHR7nFro/gHIYfH3BTWcsu1n3w01nZuoWZW/K2Js7Jw96jL2xQ6JMOfj6p3ML3R9AOc0++BqDm85YdrPuh5vOzMStOHhJRlYtT8pfT4fkT54Ovu6ZuoXuD6CcZh58rcFNZyy7WffDTWce5xaVPpHs1w9IqvPl5KDHxnVSHkoHX/OTuIXuD6CcZhx87cFNZyy7WffDTWce5eaLXnrDuuRdP1cAswcPxid/Q6/3Sd1C9wdoINrb2/9tW1vbxy4X3ddXXBZM9zPNNvgWgpvOWHaz7oebzjzMLX/iVHypN36O7+peKQ5eDr7Op3WrR68AJbjCd7u1tfWX/dezZ89+0RXB7z/77LM/+bifaabBtxLcdMaym3U/3HTmQTd/qGPs9demDnq8tUui3M3ga6zErT7NAlTgCuCtlpaWX/dfuwL4FVcAc+7Lv/u4n2mGwQ+9Ftxws+5m3Q83nbnvVhoYlOEVS5LbuyzpksKZc8HXVg23uhQL0IErf//Gl0CXMVf+Pp0zZ85vTPcz1gcfN13BTW8s++GmNOU7Mt53ML6hc3zQY9NGKacy4ddVpX2rR68AHXzBlb6zrvT9S/+NK4P/zBXB4vPPP/+zj/shP/jj48mLyVK8E276gpveWPbDTV/K/zsl6fWvJpd8u+ZKru+Q3Iw+Db6uau5bfaoFNDyu+P2aK3xDD/439/23/LuCj/s5AQAAMMK9e/fk03NnZHjRguSzfv9llfz/Y6Ohl1UTatsqQA2uAP5cW1vb3VmzZv3ixPetrgCOt7a2Pv+4n/MvImu/+d3/7Qg3fcFNbyz74aYj0VhRxrZvnTzokX1nt3z2V39lwu1h+1afdgEqcKXv9/3tXyZuA3PZfz/dz/jB9y+m0J9nqMXnI3DTF9z0xrIfbo2fQv+ADPf+x+Sgx7JuKZzvN+P2qH2rR68Aw1geDtz0BTe9seyHW+MmKt6WzN49k+/6jW7ZLOWRvAm36fYtdH8A5VgeDtz0BTe9seyHW2OmdOW6jKxdnZS/hfMkd+SoRNFdE24z2bfQ/QGUY3k4cNMX3PTGsh9ujRVf8nKHj8SlL36ihyuBpatDJtyeZN9C9wdQjuXhwE1fcNMby364NU785V1/mff+Jd/Mu3vjy8AW3J5030L3B1CO5eHATV9w0xvLfrg1RgrnLsjw0u7koEdvjxT7B8y4Pc2+he4PoBzLw4GbvuCmN5b9cAubKH9LMrvfnjrosX2blEeLJtwq2bfQ/QGUY3k4cNMX3PTGsh9u4VK6eE1G1qxIyt+iBZL/4PjnDnpodqt030L3B1CO5eHATV9w0xvLfrjVP1H5U8m91yeprleS5/iuXyul76RMuFVr30L3B1CO5eHATV9w0xvLfrjVN+UbY5LetCF516/jJcnu3y9R6Y4Jt2ruW+j+AMqxPBy46QtuemPZD7f6pfDhWRle3Jkc9Fi5VIoffWzGrdr7Fro/gHIsDwdu+oKb3lj2w632iXI3ZezNnZMHPcbe2CFRpmzCrVb7Fro/gHIsDwdu+oKb3lj2w622KQ5ekpFVy5Py19Mh+ZOnzbjVct9C9wdQjuXhwE1fcNMby3641SZR6RPJfv2ApDpfTg56bFwn5aG0Cbd67Fvo/gDKsTwcuOkLbnpj2Q+36scXvfSGdcm7fq4AZg8ejE/+WnCr176F7g+gHMvDgZu+4KY3lv1wq27yJ07Fl3rj5/iu7pXi4GUzbvXct9D9AZRjeThw0xfc9MayH27ViT/UMfb6a1MHPd7aFR/+sOAWYt9C9wdQjuXhwE1fcNMby364VZ7iwKAMr1iS3N5lSZcUzpwz4xZq30L3B1CO5eHATV9w0xvLfrg9ffwNnLP79sU3dI4PemzaKOVUxoRb6H0L3R9AOZaHAzd9wU1vLPvh9nTxj25Lr381ueTbNVdyfYeqftCjmfctdH8A5VgeDtz0BTe9seyH25Mliu5K/v1jkuqenxz0WLNSShevmXBrlFAAoWIsDwdu+oKb3lj2w23mKY8WZXT71smDHpl3dktUGDfh1kihAELFWB4O3PQFN72x7IfbzFLsH5Dh3p7koMeybimc7zfj1mihAELFWB4O3PQFN72x7Ifb4xMVb0tm757Jd/1Gt2yW8kjehFujhgIIFWN5OHDTF9z0xrIfbo9O6cp1GVm7Oil/C+dJ7sjR+DOAob2aYd9C9wdQjuXhwE1fcNMby364/e34kpc7fCQuffFBD1cCS1eHgvs0076F7g+gHMvDgZu+4KY3lv1w+3z85V1/mXfyoMe7e+PLwKFdmm3fQvcHUI7l4cBNX3DTG8t+uE2lcO6CDC/tTg569PbEBz9COzTrvoXuD6Acy8OBm77gpjeW/XD7nkT5W5LZ/fbUQY/t2+JbvoRefzPvW+j+AMqxPBy46QtuemPZr9nd/E2c/c2c4/K3aIHkPzjeMAc9mnnfQvcHUI7l4cBNX3DTG8t+zermH9uWe69PUl2vJM/xXb82frxb6DWzbxRAqAKWhwM3fcFNbyz7NaNb+caYpDdtSN7163hJsvv3S1S6E3y97NuUW+j+AA3C888//7NtbW0XXb7t097e/l2XH8yaNetnHvdzlocDN33BTW8s+zWbW+HDszK8uDM56LFyqRQ/+jj4Otm3v+1Wr34BynDlb7Urgken+3uWhwM3fcFNbyz7NYtblLspY2/unDzoMfbGDoky5eBrZN8e7laPLgEKceXvO62trf9+ur9neThw0xfc9MayXzO4lQYvyciq5Un56+mQ/MnTwdfGvj3erR5dApQxZ86cf9He3l50X/6d6f6u5eHATV9w0xvLfpbdbpY/kdtHDkmq8+XkoMfGdVIeSodfF/s2rVsd6gRow5W/PS5bZ/J3/XCMjycvJkvxTrjpC256Y9nPqlv5u2lJb1iXvOvnCmDu4EG5GX0afF3s28zcat0lQBnPPvvsT7ry972Wlpb2mfx9AQCApuN737wgI4s7ks/6/ecV8v2RVOglwRNS6z4BymhtbV3Y1tb2v2b69/2LyOpvR7jpC256Y9nPkluULcvYG69NPcf3rV3y2fe/b8LN8r49zK2WXQIU0t7e3u+yYKZ/3w+HfzGF/jwDn/3ADTfdsexnxa04MCjDK5Ykt3dZ0iWFM+fMuFnet0e51bJLQBNgeThw0xfc9Mayn3Y3fwPn7L598Q2d44MemzZKOZUx4WZ536ZzC90fQDmWhwM3fcFNbyz7aXbzj25Lr381ueTbNVdyfYfiR7xZcLO8bzNxC90fQDmWhwM3fcFNbyz7aXSLoruSf/+YpLrnx+VvZM1KKV28ZsLN8r49iVvo/gDKsTwcuOkLbnpj2U+bW3m0KKPbt04d9Hhnt0SFcRNulvftSd1C9wdQjuXhwE1fcNMby36a3Ir9AzLc25Mc9FjWLYXz/WbcLO/b07iF7g+gHMvDgZu+4KY3lv00uEXF25LZu2fyXb/RLZulPJI34WZ53ypxC90fQDmWhwM3fcFNbyz7Nbpb6cp1GVm7Oil/C+dJ7sjR+DOAFtws71ulbqH7AyjH8nDgpi+46Y1lv0Z18yUvd/hIXPrigx6uBJauDplws7xv1XIL3R9AOZaHAzd9wU1vLPs1opu/vOsv804e9Hh3b3wZ2IKb5X2rplvo/gDKsTwcuOkLbnpj2a/R3ArnLsjw0u7koEdvT3zww4qb5X2rtlvo/gDKsTwcuOkLbnpj2a9R3KL8LcnsfnvqoMf2bfEtXyy4Wd63WrmF7g+gHMvDgZu+4KY3lv0awc3fxNnfzDkuf4sWSP6D4zM+6NHobpb3rZZuofsDKMfycOCmL7jpjWW/kG7+sW259/ok1fVK8hzf9Wvjx7tZcLO8b/VwC90fQDmWhwM3fcFNbyz7hXIr3xiT9KYNybt+HS9Jdv9+iUp3TLhZ3rd6uYXuD6Acy8OBm77gpjeW/UK4FT48K8OLO5ODHiuXSvGjj824Wd63erqF7g+gHMvDgZu+4KY3lv3q6RblbsrYmzsnD3qMvbFDokzZhJvlfQvhFro/gHIsDwdu+oKb3lj2q5dbcfCSjKxanpS/ng7Jnzxtxs3yvoVyC90fQDmWhwM3fcFNbyz71dotKn0i2a8fkFTny8lBj43rpDyUNuFmed9Cu4XuD6Acy8OBm77gpjeW/Wrp5oteesO65F0/VwCzBw/GJ38tuIWOdbfQ/QGUY3k4cNMX3PTGsl+t3PInTsWXeuPn+K7uleLgZTNujRDrbqH7AyjH8nDgpi+46Y1lv2q7+UMdY6+/NnXQ461d8eEPC26NFOtuofsDKMfycOCmL7jpjWW/aroVBwZleMWS5PYuS7qkcOacGbdGi3W30P0BlGN5OHDTF9z0xrJfNdz8DZyz+/bFN3SOD3ps2ijlVMaEW6PGulvo/gDKsTwcuOkLbnpj2a9SN//otvT6V5NLvl1zJdd3qK4HPdi38GuphVvo/gDKsTwcuOkLbnpj2e9p3aLoruTfPyap7vnJQY81K6V08VpwH/ZNfyiAUDGWhwM3fcFNbyz7PY1bebQoo9u3Th70yLyzW6LCeHAX9s1GKIBQMZaHAzd9wU1vLPs9qVuxf0CGe3uSgx7LuqVwvj+4A/tmKxRAqBjLw4GbvuCmN5b9ZuoWFW9LZu+eyXf9RrdslvJIPvj62bfwa6mFW+j+AMqxPBy46QtuemPZbyZupSvXZWTt6qT8LZwnuSNH488Ahl47+2bXLXR/AOVYHg7c9AU3vbHs9zg3X/Jyh4/EpS8+6OFKYOnqUPA1s2/23UL3B1CO5eHATV9w0xvLfo9y85d3/WXeyYMe7+6NLwOHXi/71hxuofsDNBY/1trauqutre1Ge3v7ZZf90/2A5eHATV9w0xvLfg9zK5y7IMNLu5ODHr098cGP0Otk35rLrR6lApTgit/rLn98//s5c+b83HQ/Y3k4cNMX3PTGst+DblH+lmR2vz110GP7tviWL6HXyL41n1ttGwWo4bnnnvsJV/7uPvPMM3//SX7O8nDgpi+46Y1lv/tupUvXZGTNiqT8LVog+Q+Oqzjo0ez7ZtWtVn0ClNHS0vIr7e3toy5bXP7clcHzc+bM+Y3pfs7ycOCmL7jpjWm/6FO5c/x/SKrrleQ5vuvXxo93C74u9q2p3erRLUABra2t/9SVvnvuz7n+e/f1r7oieMt9/8zjfs4Px/h48mKyFO+Em77gpjdW/aLUmIxu2pC869fxkmT/+365Wb4TfF3sG271aRfQ8HzpS1/6R67w/dB9+aP3/5v7/lvTvQsoAADwUP7PtwZkZGlX8lm/VcvkL797PfSSACapebEAPbS1tZ1whe+r/usXX3xxtvv+pvvzFx73M/5FZPW3I9z0BTe9seR3M39TMm/tnLq9yx/vkL/+i78w4WZ535rNrT7NAlTgS197e/s3XK648nfRlcHfnu5n/HD4F1PozzPw2Q/ccNMdK37FwUsysmp5Uv56OiR/8rQZN8v71oxu9egVYBjLw4GbvuCmN9r9otInkv36AUl1vpwc9Ni4TspDaRNulvetmd1C9wdQjuXhwE1fcNMbzX6+6KU3rEve9XMFMHvwoETlT024Wd63ZncL3R9AOZaHAzd9wU1vtPrlT5yKL/XGz/Fd3SvFwctm3CzvG24UQKgQy8OBm77gpjfa/KJMWcZef23yoMfYW7skyt004WZ533CbcgvdH0A5locDN33BTW80+RUHBmV4xZLkOb5LuqRw5pwZN8v7htvn3UL3B1CO5eHATV9w0xsNflHpjmT37Ytv6Bwf9Ni0UcqpjAk3y/uG28PdQvcHUI7l4cBNX3DTm0b3849uS69/Nbnk2zVXcn2HPnfQQ7Ob5X3D7dFuofsDKMfycOCmL7jpTaP6RdFdyb9/TFLd85ODHmtWSuniNRNulvcNt+ndQvcHUI7l4cBNX3DTm0b0K48WZXT71qkneryzW6LCuAk3y/uG28zcQvcHUI7l4cBNX3DTm0bzK/YPyHBvT3LQY1m3FM73m3GzvG+4zdwtdH8A5VgeDtz0BTe9aRS/qHhbMnv3TL7rN7pls5RH8ibcLO8bbk/uFro/gHIsDwdu+oKb3jSCX+nKdRlZuzopfwvnSe7I0fgzgBbcLO8bbk/nFro/gHIsDwdu+oKb3oT08yUvd/hIXPrigx6uBJauDplws7xvuFXmFro/gHIsDwdu+oKb3oTy85d3/WXeyYMe7+6NLwNbcLO8b7hV7ha6P4ByLA8HbvqCm96E8CucuyDDS7uTgx69PfHBDytulvcNt+q4he4PoBzLw4GbvuCmN/X0i/K3JLP77amDHtu3xbd8seBmed9wq65b6P4AyrE8HLjpC256Uy8/fxNnfzPnuPwtWiD5D45X5aBHI7hZ3jfcqu8Wuj+AciwPB276gpve1NrPP7Yt916fpLpeSZ7ju35t/Hg3C26W9w232rmF7g+gHMvDgZu+4KY3tfQr3xiT9KYNybt+HS9Jdv9+iUp3TLiFDm46QwGEirE8HLjpC256Uyu/wodnZXhxZ3LQY+VSKX70sRm3RghuOkMBhIqxPBy46QtuelNtvyh3U8be3Dl50GPsjR0SZcom3BopuOkMBRAqxvJw4KYvuOlNNf2Kg5dkZNXypPz1dEj+5Gkzbo0W3HSGAggVY3k4cNMX3PSmGn5R6RPJfv2ApDpfTg56bFwn5aG0CbdGDW46QwGEirE8HLjpC256U6mfL3rpDeuSd/1cAcwePBif/A3tZX3vcNMZCiBUjOXhwE1fcNObSvzyJ07Fl3rj5/iu7pXi4OXgPs2yd7jpDAUQKsbycOCmL7jpzdP4+UMdY6+/NnXQ461d8eGP0C7NtHe46QwFECrG8nDgpi+46c2T+hUHBmV4xZLk9i5LuqRw5lxwh2bcO9x0hgIIFWN5OHDTF9z0ZqZ+/gbO2X374hs6xwc9Nm2UcioTfP3Nune46QwFECrG8nDgpi+46c1M/Pyj29LrX00u+XbNlVzfoYY56NGse4ebzlAAoWIsDwdu+oKb3jzOL4ruSv79Y5Lqnp8c9FizUkoXrwVfM3uHm9ZQAKFiLA8HbvqCm948yq88WpTR7VsnD3pkvrZbovyt4Otl73DTHAogfI729vYxl+ttbW0XXb7d2tr6u9P9jOXhwE1fcNObh/kV+wdkuLcnOeixrFsK5/uDr5O9w81CKIDwOVz5S7e0tPzKk/yM5eHATV9w05sH/aLibcns3TP5rt/ols1SHskHXyN7h5uVUADhc7gCODp79uyvPMnPWB4O3PQFN72571e+el1G1q5Oyt/CeZI7cjT+DGDo9bF3uFkKBRA+hy+AbW1tl9yfl13+5LnnnvvidD9jeThw0xfcNOeufHL6f8alLz7o4Upg6epQA6yLvcMt/Fpq4VaPXgFKaG1tfX7iyy+4ArjVlcFj0/2MH47x8eTFZCneCTd9wU1nonReRrdunrzkm313r9ws3Q6+LvYON8tuNa4UoJVZs2b9vCuAd6f7ewIAUAH/38VBSS9flNzUecVi+YtrV0IvCaApqEeXAAU899xzP9HS0vLT979vbW1d5Qrguel+zr+IrP52hJu+4KYnNwu3JPO1t6ee4/vftslf/5/vmfGzvHe46Q/vAMIkL7744mx/65cHPgN42BXCF6b7OT8c/sUU+vMMfPYDN9z0xN/E2d/MOS5/ixZI/oPj4j8DaMXP8t7hZiPeqR7dAgxjeThw0xfcGjv+sW259/ok1fVKcsl3/dr48W5W/CzvHW62QgGEirE8HLjpC26Nm/KNMUlv2pC869fxkmT375eodMeMn+W9wy38WmrhFro/gHIsDwdu+oJbY6bw4VkZXtyZPNFj5VIpDgya8rO8d7jZdQvdH0A5locDN33BrbES5W7K2Js7pw56vLFDokzZjJ/lvcPNvlvo/gDKsTwcuOkLbo2T4uAlGVm1PCl/PR2SP3nalJ/lvcOtOdxC9wdQjuXhwE1fcAsff9Aje+CApDpfTg56bFwn5aG0GT/Le4dbc7mF7g+gHMvDgZu+4BY2vuilN6xL3vVzBTB78GBcCK34Wd473JrPLXR/AOVYHg7c9AW3cMmfOBVf6o2f47u6V4qDl035Wd473JrTLXR/AOVYHg7c9AW3+scf6hh7/bWpgx5v7YoPf1jxs7x3uDW3W+j+AMqxPBy46Qtu9Y2/ncvwiiXJ7V2WdEnhzDlTfpb3DjfcQvcHUI7l4cBNX3CrT/wNnLP79sU3dI4PemzaKOVUxoyf5b3DDbf7bqH7AyjH8nDgpi+41T7+0W3p9a8ml3y75kqu79CMD3po8LO8d7jh9qBb6P4AyrE8HLjpC261SxTdlfz7xyTVPT856LFmpZQuXjPjZ3nvcMPtYW6h+wMox/Jw4KYvuNUm5dGijG7fOnnQI/PObokK42b8LO8dbrg9yi10fwDlWB4O3PQFt+qn2D8gw709yUGPZd1SON9vys/y3uGG2+PcQvcHUI7l4cBNX3CrXqLibcns3TP5rt/ols1SHsmb8bO8d7jhNhO30P0BlGN5OHDTF9yqk9KV6zKydnVS/hbOk9yRo/FnAK34Wd473HCbqVvo/gDKsTwcuOkLbpXFl7zc4SNx6YsPergSWLo6ZMbP8t7hhtuTuoXuD6Acy8OBm77g9vTxl3f9Za265gwAACAASURBVN7Jgx7v7o0vA1vxs7x3uOH2NG6h+wMox/Jw4KYvuD1dCucuyPDS7uSgR29PfPDDkl/o4KYz1t1C9wdQjuXhwE1fcHuyRPlbktn99tRBj+3b4lu+WPFrlOCmM9bdQvcHUI7l4cBNX3CbefxNnP3NnOPyt2iB5D84XvODHuxd+LXghtt9t9D9AZRjeThw0xfcpo9/bFvuvT5Jdb2SPMd3/dr48W5W/BoxuOmMdbfQ/QGUY3k4cNMX3B6f8o0xSW/akLzr1/GSZPfvl6h0J7gbe6c3uOkMBRAqxvJw4KYvuD06hQ/PyvDizuSgx8qlUvzo4+BO7J3+4KYzFECoGMvDgZu+4Pa3E+VuytibOycPeoy9sUOiTDm4D3tnI7jpDAUQKsbycOCmL7h9PsXBSzKyanlS/no6JH/ydHAP9s5WcNMZCiBUjOXhwE1fcEsSlT6R7NcPSKrz5eSgx8Z1Uh5KB3dg78KvBTfc7ruF7g+gHMvDgZu+4Pa9uOilN6xL3vVzBTB78GB88jf0+tk73LTFulvo/gDKsTwcuOlLs7vlT5yKL/XGz/Fd3SvFwcvB183e4aY11t1C9wdQjuXhwE1fmtXNH+oYe/21qYMeb+2KD3+EXjN7h5vmWHcL3R9AOZaHAzd9aUa34sCgDK9YktzeZUmXFM6cC75W9g43C7HuFro/QAPS1tbW6XKvtbX1t6b7u5aHAzd9aSY3fwPn7L598Q2d44MemzZKOZUJvk72Djcrse5Wjz4BimhpaXmhvb39mz4UQNy0pVnc/KPb0utfTS75ds2VXN8hFQc92Lvwa8ENt/tu9egUoIcfbWtrO+2K3z9xf56lAOKmLdbd7t27J/kPjkmqe35y0GPNSildvBZ8bewdbrjpCgUQPkd7e/tqV/r+yH9NAbQ9+LjpSzRWlOLO/zZ50CPzzm6JCuPB18Xe4YabvlAAYRJX9n7Jlb4/c19+wX//JAVwfDx5MVmKd8JNX6y6Fb85IMO9PclBj2XdUjzfH3xN7B1uuOmNd6p5sQAduMK3uL29veCSdhl133/fpezS87ifEwCoGfd+8AO5dWD/5Lt+hde2yg8//ST0sgDAAPXqF6AM3gG0/Zsfbo2f8tXrMrJ2dVL+Fs6T/NGj8WcALbhZ3zvcbMS6Wz26BCikvb39G3wGEDdtseAWRXcld/hIXPrigx6uBJauDplws753uNmKdbd6dAkwjOXhwE1ftLuVR/IyumXz1EGPd/dKVLxtws363uEWfi24PZlb6P4AyrE8HLjpi2a3wrkLMry0Ozno0dsjxf4BM27W9w433LSFAggVY3k4cNMXjW5R/pZkdr89+a7f6PZtUh4tmnCzvne44aY1FECoGMvDgZu+aHPzN3EeWbMiKX+LFkj+g+PxZwAtuFnfO9xw0xwKIFSM5eHATV+0uPnHtuXe65NU1yvJc3zXr40f72bBzfre4YabhVAAoWIsDwdu+qLBrXxjTNKbNiTv+nW8JNn9+yUq3THhZn3vcMPNSiiAUDGWhwM3fWl0t8KHZ2V4cWdy0GPlUil+9LEZN+t7hxtulkIBhIqxPBy46UujukW5mzL25s7Jgx5jb+yQKFM24WZ973DDzapb6P4AyrE8HLjpSyO6FQcvyciq5Un56+mQ/MnTZtys7x1uuFl2C90fQDmWhwM3fWkkt6j0iWS/fkBSnS8nBz02rpPyUNqEm/W9ww23ZnAL3R9AOZaHAzd9aRQ3X/TSG9Yl7/q5Apg9eDA++WvBzfre4YZbs7iF7g+gHMvDgZu+NIJb/sSp+FJv/Bzf1b1SHLxsxs363uGGWzO5he4PoBzLw4GbvoR084c6xl5/beqgx1u74sMfFtys7x1uuDWjW+j+AMqxPBy46Usot+LAoAyvWJLc3mVJlxTOnDPjZn3vcMOtWd1C9wdQjuXhwE1f6u3mb+Cc3bcvvqFzfNBj00YppzIm3KzvHW64Nbtb6P4AyrE8HLjpSz3d/KPb0utfTS75ds2VXN+hig96NIqb9b3DDTfcKIBQIZaHAzd9qYdbFN2V/PvHJNU9PznosWallC5eM+Fmfe9www23KbfQ/QGUY3k4cNOXWruVR4syun3r5EGPzDu7JSqMm3ALHct+uOmMdbfQ/QGUY3k4cNOXWroV+wdkuLcnOeixrFsK5/vNuDVCLPvhpjPW3UL3B1CO5eHATV9q4RYVb0tm757Jd/1Gt2yW8kjehFsjxbIfbjpj3S10fwDlWB4O3PSl2m6lK9dlZO3qpPwtnCe5I0fjzwBacGu0WPbDTWesu4XuD6Acy8OBm75Uy82XvNzhI3Hpiw96uBJYujpkwq1RY9kPN52x7ha6P4ByLA8HbvpSDTd/eddf5p086PHu3vgysAW3Ro5lP9x0xrpb6P4AyrE8HLjpS6VuhXMXZHhpd3LQo7cnPvgR2qkZ9s26H246Y90tdH8A5VgeDtz05Wndovwtyex+e+qgx/Zt8S1fQvs0y75Z98NNZ6y7he4PoBzLw4GbvjyNm7+Js7+Zc1z+Fi2Q/AfHgx30aNZ9s+6Hm85YdwvdH0A5locDN315Ejf/2Lbce32S6noleY7v+rXx491COzTjvln3w01nrLuF7g+gHMvDgZu+zNStfGNM0ps2JO/6dbwk2f37JSrdCb7+Zt0363646Yx1t9D9AZRjeThw05eZuBU+PCvDizuTgx4rl0pxYDD4upt936z74aYz1t1C9wdQjuXhwE1fHucW5W7K2Js7Jw96jL2xQ6JMOfia2Tf7frjpjHW30P0BlGN5OHDTl0e5FQcvyciq5Un56+mQ/MnTwdfKvjWPH246Y90tdH+ABqKtre2kyyWXiy7nXX51up+xPBy46cvfdPMHPbIHDkiq8+XkoMfGdVIeSgdfJ/vWXH646Yx1t3r0ClBCa2vrT93/es6cOb/ty+B0P2N5OHDTlwfdfNFLb1iXvOvnCmD24MG4EIZeI/vWfH646Yx1t9o2ClCLK38dLt+e7u9ZHg7c9OW+W+HkqfhSb/wc39W9Uhy8HHxt7Fvz+uGmM9bd6tElQBGtra37XPHLumTc17883d+3PBy46UuULUvp7QcOery1Kz78EXpd7Ftz++GmM9bd6tEpQCGu/M13JfDYdH/PD8f4ePJishTvhJuulD4alJGVS5LbuyzpksI3zgVfE/uGH256Y92tHl0ClOIK4F++8MIL//Bxf0cAAnPvhz+U8b6D8Q2dffnLb9skP7xzO/SyAAAamnp1CWhwWlpafvrFF1/8hfvfTxwCyU73c/5FZPW3I9waP+X/nZL0+leTS75dcyV/6JDc++wzE26W963Z/HDTGetutW0VoAZXAF9whe+j9vb2yxO3gjk1e/bsr0z3c344/Isp9OcZ+OxHc7lF0V3Jv39MUt3zk4Mea1ZK6eI1E26W961Z/XDTGetu9egWYBjLw4FbY6Y8WpTR7VsnD3pkvrZbovwtE26W962Z/XDTGetuofsDKMfycODWeCn2D8hwb09y0GNZtxTO95txs7xvze6Hm85YdwvdH0A5locDt8ZJVLwtmb17Jt/1G92yWcojeRNulvcNP9w0x7pb6P4AyrE8HLg1RkpXrsvI2tVJ+Vs4T3JHjsafAbTgZnnf8MNNe6y7he4PoBzLw4Fb2PiSlzt8JC598UEPVwJLV4dMuFneN/xwsxLrbqH7AyjH8nDgFi7+8q6/zDt50OPdvfFlYAtulvcNP9wsxbpb6P4AyrE8HLiFSeHcBRle2p0c9OjtiQ9+WHGzvG/44RZ6Lbg9mVvo/gDKsTwcuNU3/lYumd1vTx302L4tvuWLBTfL+4YfbrjpCwUQKsbycOBWv/ibOPubOcflb9ECyX9w/JEHPbS5Wd43/HDDTWcogFAxlocDt9onKn8quff6JNX1Slz+0uvXSuk7KRNulvcNP9xw0x0KIFSM5eHArbYp3xiT9KYNybt+HS9Jdv9+iUp3TLhZ3jf8cMNNfyiAUDGWhwO32qXw4VkZXtyZHPRYuVSKA4Nm3CzvG3644WYjFECoGMvDgVv1E+VuytibOycPeoy9sUOiTNmEm+V9ww833GyFAggVY3k4cKtuioOXZGTV8qT89XRI/uRpM26W9w0/3HALv5ZauIXuD6Acy8OBW3XiD3pkDxyQVOfLyUGPjeukPJQ24WZ53/DDDTfbbqH7AyjH8nDgVnl80UtvWJe86+cKYPbgwbgQWnCzvG/44YabfbfQ/QGUY3k4cKss+ROn4ku98XN8V/dKcfCyGTfL+4Yfbrg1h1vo/gDKsTwcuD1d/KGOsddfmzro8dau+PCHBTfL+xY6lv1w0xnrbqH7AyjH8nDg9uTxt3MZXrEkub3Lki4pnDlnxi10LLtZ98NNZ6y7he4PoBzLw4HbzONv4Jzdty++oXN80GPTRimnMibcGiWW3az74aYz1t1C9wdQjuXhwG1m8Y9uS69/Nbnk2zVXcn2HanrQg30Lvxb8cMNNdyiAUDGWhwO3xyeK7kr+/WOS6p6fHPRYs1JKF6+ZcGvEWHaz7oebzlh3C90fQDmWhwO3R6c8WpTR7VsnD3pk3tktUWHchFujxrKbdT/cdMa6W+j+AMqxPBy4PTzF/gEZ7u1JDnos65bC+f7gTuyb/lj2w01nrLuF7g+gHMvDgdvnExVvS2bvnsl3/Ua3bJbySD64D/tmI5b9cNMZ626h+wMox/Jw4DaV0pXrMrJ2dVL+Fs6T3JGj8WcAQ7uwb3Zi2Q83nbHuFro/gHIsDwduyUGP3OEjcemLD3q4Eli6OhTcgX2zF8t+uOmMdbfQ/QGUY3k4mt3NX971l3knD3q8uze+DBx6/exb+LXghxtuukMBhIqxPBzN7FY4d0GGl3YnBz16e+KDH6HXzb7ZdbPuh5vOWHcL3R9AOZaHoxndovwtyex+e+qgx/Zt8S1fQq+ZfbPtZt0PN52x7ha6P4ByLA9Hs7n5mzj7mznH5W/RAsl/cLwhD3qwb+HXgh9uuOkOBRAmaW1t/fH29vbDLkNtbW0XXU66/zZnup+zPBzN4uYf25Z7r09SXa8kz/FdvzZ+vFvodbJvzeNm3Q83nbHuVo9uAQrwBXDOnDm/+cD3y1wJPDvdz1kejmZwK98Yk/SmDcm7fh0vSXb/folKd4KvkX1rLjfrfrjpjHW32rYKUIsrg7/W3t6enu7vWR4O626FM2dleHFnctBj5VIpfvRx8LWxb83pZt0PN52x7laPLgEKaW1t3ecK4I7p/p7l4bDqdjN/U8p7pg56jL2xQ6JMOfy62LemdbPuh5vOWHerR5cAZbji94cu35w1a9bfm+7v+uEYH09eTJbinSy6lQYvyciq5Un56+mQwsnTwdfEvuFm3Q83nbHuVo8+AYpoa2v7T678feuLX/ziP5jJ3xdQwb2//mu5feSQpDpfjstf7r/+kfzgZhR6WQAAEIha9wlQRGtr6ypX/gZbWlp+eqY/419EVn87suJW/m5a0hvWJe/6uQKY+38Pyr3PPjPhZnnfmsnNuh9uOmPdrZZ9AhThit+X2tra7rmkXL49cSuYP5vu5/xw+BdT6M8z8NmPhyd/4lR8qTd+ju/qXikOXjbjZnnfms3Nuh9uOmPdrR7dAgxjeTg0u/lDHWOvvzZ10OOtXRLlbppws7xvzepm3Q83nbHuFro/gHIsD4dWt+LAoAyvWJLc3mVJlxTOnDPjZnnfmtnNuh9uOmPdLXR/AOVYHg5tbv4Gztl9++IbOsdP9Ni0UcqpjAk3y/uGm30/3HTGulvo/gDKsTwcmtz8o9vS619NLvl2zZVc36H4EW8W3CzvG27N4Yebzlh3C90fQDmWh0ODWxTdlfz7xyTVPT856LFmpZQuXjPhZnnfcGsuP9x0xrpb6P4AyrE8HI3uVh4tyuj2rZMHPTLv7JaoMG7CzfK+4dZ8frjpjHW30P0BlGN5OBrZrdg/IMO9PclBj2XdUjjfb8bN8r7h1px+uOmMdbfQ/QGUY3k4GtEtKt6WzN49k+/6jW7ZLOWRvAk3y/uGW3P74aYz1t1C9wdQjuXhaDS30pXrMrJ2dVL+Fs6T3JGj8WcALbhZ3jfc8MNNZ6y7he4PoBzLw9Eobr7k5Q4fiUtffNDDlcDS1SETbpb3DTf8cNMd626h+wMox/JwNIKbv7zrL/NOHvR4d298GdiCm+V9ww0/3PTHulvo/gDKsTwcod0K5y7I8NLu5KBHb0988MOKm+V9ww0/3GzEulvo/gDKsTwcodyi/C3J7H576qDH9m3xLV8suFneN9zww81WrLuF7g+gHMvDEcLN38TZ38w5Ln+LFkj+g+NPddCjEd0s7xtu+OEWfi24PZlb6P4AyrE8HPV0849ty73XJ6muV5Ln+K5fGz/ezYKb5X3DDT/ccNMYCiBUjOXhqJdb+caYpDdtSN7163hJsvv3S1S6Y8LN8r7hhh9uuGkNBRAqxvJw1MOt8OFZGV7cmRz0WLlUigODZtws7xtu+OGGm+ZQAKFiLA9HLd2i3E0Ze3Pn5EGPsTd2SJQpm3CzvG+44YcbbhZCAYSKsTwctXIrDl6SkVXLk/LX0yH5k6fNuIUObnpj2Q83nbHuFro/gHIsD0e13fxBj+yBA5LqfDk56LFxnZSH0ibcGiW46Y1lP9x0xrpb6P4AyrE8HNV080UvvWFd8q6fK4DZgwfjQmjBrZGCm95Y9sNNZ6y7he4PoBzLw1Ett/yJU/Gl3vg5vqt7pTh42YxbowU3vbHsh5vOWHcL3R9AOZaHo1I3f6hj7PXXpg56vLUrPvxhwa1Rg5veWPbDTWesu4XuD6Acy8NRiZu/ncvwiiXJ7V2WdEnhzLngTtVya+TgpjeW/XDTGetuofsDKMfycDyNm7+Bc3bfvviGzvFBj00bpZzKBPephpuG4KY3lv1w0xnrbqH7AyjH8nA8qZt/dFt6/avJJd+uuZLrOxTsoEe13bQEN72x7Iebzlh3C90fQDmWh2OmblF0V/LvH5NU9/zkoMealVK6eC24QzXctAU3vbHsh5vOWHcL3R9AOZaHYyZu5dGijG7fOnnQI/O13RLlbwVffzXcNAY3vbHsh5vOWHcL3R9AOZaHYzq3Yv+ADPf2JAc9lnVL4Xx/8HVXy01rcNMby3646Yx1t9D9AZRjeTge5RYVb0tm757Jd/1Gt2yW8kg++Jqr4aY9uOmNZT/cdMa6W+j+AMqxPBwPcytduS4ja1cn5W/hPMkdORp/BjD0eqvhZiG46Y1lP9x0xrpb6P4ADUJbW9sft7e3j7o/782ePfsrM/05y8PxoJsvebnDR+LSFx/0cCWwdHUo+Dqr4WYpuOmNZT/cdMa6Wy07BSiipaXl17/85S8/50pgmgL4+cH3l3f9Zd7Jgx7v7o0vA4deYzXcQq8FN9yawQ83nbHuVstOAQrx7wJSAKcGv3j+ggwv7U4OevT2xAc/Qq+tWm6W9w03fbHsh5vOWHerZZcAhVAAJ1K4JTf37Z066LF9W3zLl+DrqtLgW9033PTGsh9uOmPdrZZdAhTyNAVwfDx5MVlJ6dI1GfnPK5Pyt2iB5I8ddwNzN/i6qhW/Xxb3DTfdseyHm85Yd6tllwCFPE0BtMK9zz6TO8f/h6S6XonLX3bjH8pflYqhlwUAAFB1atklQCHN+g5gNJyR0U0bknf9Ol6S3H/fL/d++EMTbg/7zc/KvuFmJ5b9cNMZ62617BKgiLa2tt0uOVcAf+BScl/fmMnP+eHwL6bQn2eoJIUPz8rw4s7koMfKpVIcGIydLLg96rMfuOmLZTfrfrjpjHW3WvcKMI7m4YhyN2XszZ2TBz3G3tghUabcFIOPm75YdrPuh5vOWHcL3R9AOVqHozh4SUZWLU/KX0+H5E+ebqrBx01fLLtZ98NNZ6y7he4PoBxtwxGVP5XsgQOS6nw5Ln/pjeukPJRuusHHTV8su1n3w01nrLuF7g+gHE3D4YteesO65F0/VwCzBw/GhbAZBx83fbHsZt0PN52x7ha6P4BytAxH/sSp+FJv/Bzf1b1SHLzc1IOPm75YdrPuh5vOWHcL3R9AOY0+HP5Qx9jrr00d9HhrV3z4o9kHHzd9sexm3Q83nbHuFro/gHIaeTj87VyGVyxJbu+yuDO+3QuDj5vWWHaz7oebzlh3C90fQDmNOBxR6Y5k9+2Lb+gcH/TYtFHKqQyDj5vqWHaz7oebzlh3C90fQDmNNhyl76Qkvf7V5JJv11zJ9R165EGPZh583PTFspt1P9x0xrpb6P4AymmU4Yiiu5J//5ikuucnBz3WrJTSxWsMPm5mYtnNuh9uOmPdLXR/AOU0wnCUR4syun3r5EGPzNd2S5S/xeDjZiqW3az74aYz1t1C9wdQTujhKPYPyHBvT3LQY1m3FM73M/i44aYwlv1w0xnrbqH7Aygn1HBExduS2btn8l2/0S2bpTySZ/Bxw01pLPvhpjPW3UL3B1BOiOEoXbkuI2tXJ+Vv4TzJHTkafwaQwccNN72x7Iebzlh3C90fQDn1HA5f8nKHj8SlLz7o4Upg6eoQg48bbgZi2Q83nbHuFro/gHLqNRz+8q6/zDt50OPdvfFlYAYfN9xsxLIfbjpj3S10fwDl1GM4CucuyPDS7uSgR29PfPCDwccNN1ux7Iebzlh3C90fQDm1HA5/K5fM7renDnps3xbf8oXBxw03e7Hsh5vOWHcL3R9AObUaDn8TZ38z57j8LVog+Q+OV/2gRzMPPm76YtnNuh9uOmPdLXR/AOVUezj8Y9ty7/VJquuV5Dm+69fGj3dj8HHDza6bdT/cdMa6W+j+AMqp5nCUb4xJetOG5F2/jpcku3+/RKU7DD5uuBl3s+6Hm85YdwvdH0A51RqOwodnZXhxZ3LQY+VSKQ4MBh8Oy4OPm75YdrPuh5vOWHcL3R9AOZUOR5S7KWNv7pw86DH2xg6JMuWGGA7Lg4+bvlh2s+6Hm85YdwvdH0A5lQxHcfCSjKxanpS/ng7JnzwdfCiaZfBx0xfLbtb9cNMZ626h+wMo52mGwx/0yB44IKnOl5ODHhvXSXkoHXwgmmnwcdMXy27W/XDTGetuofsDKOdJh8MXvfSGdcm7fq4AZg8ejAth6GFotsHHTV8su1n3w01nrLuF7g+gnCcZjvyJU/Gl3vg5vqt7pTh4OfgQNOvg46Yvlt2s++GmM9bdQvcHUM5MhsMf6hh7/bWpgx5v7YoPf4QegGYefNz0xbKbdT/cdMa6W+j+AMqZbjj87VyGVyxJbu+ypEsKZ84Ff+Ez+LhpjGU363646Yx1t9D9AZTzqOHwN3DO7tsX39A5PuixaaOUU5ngL3oGHzetsexm3Q83nbHuFro/gHIeNhz+0W3p9a8ml3y75kqu71BDHvRo5sHHTV8su1n3w01nrLuF7g/QQMyZM6e1vb39my7fbWtr+8jlH0/3Mw8ORxTdlfz7xyTVPT856LFmpZQuXgv+QmfwcbMQy27W/XDTGetu9egVoARX/M60trbO91+78vc77vtvTfcz94ejPFqU0e1bJw96ZN7ZLVFhPPiLnMHHzUosu1n3w01nrLvVvlWAClzxe8aVvk/dl3/n/n9zBbDk0vK4n/PDUfzmgAz39iQHPZZ1S+F8f/AXN4OPW+i14IYfbrpj3a3mxQJ04ArgP3Vl7/qD/81fBnb//V8/6mdSX/3qj986sH/yXb/RLZulPJIP/sJm8HHDTV8s++GmM9bdal4sQAcPK4D+EvBjC+CC3zsRl7+F8yR/5Kh7Ud2NX1QWMj6eDL7/M/RacMPNupt1P9x0xrpbzYsF6OBpLgHfWPB7fS4XUnN/95fqskgAAAAAqC6u7H3D5Q/8164Q/oeZHAIBAAAAAMW0tLS0t7W1/am/DczE5d9fDr0mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYKXPmzGltb2//pj8x7J8Y4vKPQ6+pWjiXP3Zeo+7Pe7Nnz/5K6PVUk9bW1h93boddhpzfRZeT7r/NCb2uauF9XC5NuJ13+dXQa6omzqfTvy7dnv1W6LVUE/d6HPM3op/Yt287v98NvaYq8mPOZ5fzuuEcL7vsD72gavD888//7P398pm4e8QPZs2a9TOh11YNnMu/dV4fe0f39RWXBaHXVC3cv9+/6Xz+fOL/lX9q7d85qDHuxXPG/U9tvv/avYB+x9I9A1taWn79y1/+8nPOKW1tMHwB9MP/wPfL3P6dDbmmauJ8fur+187zt/3/4EKup5q41+ULE790fdNgAUw7v18JvY5a4F6Dr/tfKu9/716XPxdyPbXC7eFq53k09DqqhfO5ff9WaO7fgRed2/efffbZnwy9rkrxBd25jbs/f9F/7/+9c25XQ68LlPA0Tw3RiH8X0FoB/Ju4f4x+zf/jG3odtcC9Rjv8OxOh11ElftS5nHaz9098YTdYAE3O2nPPPfcTbr/uPvPMM38/9FpqjfP8jntd/vvQ66gW7jV5y5cj/7V/bTq/nPvy7wZeVsVM/D9/6MH/5l+j1q6WQI142HOD/WXgxz03WCNW/1F6ELdn+5znjtDrqCbeyb0esy4ZKzcz9++uOJc/8l9bLYD+3dqJS6R/4orTF0OvqRr4dzW9m8uWiUtu590/wL8Rel3Vxjn9C+dX/JEH3hTQjtu7f+NLoP94gn/Dw8q++ask3sv9+c8nvv8t5/eZv2ISem2ggIcVwIknh/zrQEuqCdYLoPP7Q385cdasWX8v9Fpqgf+Igvsf27HQ66gU5/FLzuPP3Jdf8N9bLIDO5/mJL7/gXpNbLeybx/+/cuIzm3P99/5dlol/fJ8JvbZq4pz2+H0LvY4q8gU/Z64U/Uv/jSuD/8wXXP+5x9ALqwbu9fevnN+5iV9KdvpLwC7/LvS6QAFcAtaP27//5Ev7F7/4xX8Qei21xHn+5QsvvPAPQ6+jEpzDYrdXBX+pfuKdsu+7lF16Qq+tFrhfSH7eX5IKvY5q6oLzUgAAAdhJREFU8KUvfekfuT37ofvyR+//Nz93Vt5N8vjPxTmn7/lHiYZeS7V42GVSv2/+XcFQa6ohP+bc7lj79xtqiHuxfMPlD/zXrhD+B0uHQO5jtQC6/Vrl3Abd/8x+OvRaqon3efHFF3/h/vcTh0CyIddUC6y9A+g/J/fga9G/Pv27EwGXVFWcywn3Wvyq/9q9Pme7728++DrVjtuvhc7pf4VeRzXxB3X8LyH3D0pM3PVi/IF3qlXjf8m6/7Xz3OzSF3I9oAz/254/Pj5x9P9bVj5r5XFeu/0Hfv0tDfw7m/72DaHXVC2cz5f8JSmX1MTtGy5OXF5Ujz8l6z+L6j9HNnF7g1MWC7z/5ctSAZwoRd9+4DOAh/1ehl5XtfB+E78wX/HzZu2zVs6r39ItUu7j9un37++Zf13670OvqVr4z9lO3Hbphv/M9IN3TwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwzP8FVjTrS4OF/wQAAAAASUVORK5CYII=\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x, x)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x, x, label=\"x\")\n",
" figure.xlabel = \"some x label\"\n",
" figure.ylabel = \"some y label\"\n",
" figure.title = \"A title for the figure\""
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9B5hcx3UmSklOz2uv7ffElU1LIgjOjC15rbdrr+33vreWvX6Ou9Lb3U8mJSaACETOOeecQWCQMwgi55wziJzz9HSOIECK1FqybJL96lTde7sx6J653Tecqrrn/77/m56Znr7n3jNV9VfVqXOee45AIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUBwGXV1dT+pra39bgvvidTU1LR3ch12jdmMOfZZn7LP+gMnn9US2Of/BbvWF+zll938XPaZf8Psv8++fsK+TmZfX2df77l5DQKBQCAQCIRmwQRIOxA6TPBMaum9TKi0Ze9NNPeecsLJqQBkf/t/sc/951atWv12tZ9RDuxzVzL71jS5HtzH58+5LABB/LHP7ufmZxIIBAKBQCBUBCZILjKh84gxy779xebey97zNmO8ufcwcfOXhnD6SpPrOBWAb7Z0bRsoeX8+C8B/ffnll//Kzc+0gWb9SiAQCAQCIUBo3br1fwKRw8TO38LqGmxHNvPe/8x+/zPGz2DLF7Zh2evX4Hew4geihvEb7PVP4TPN97DPHgLvaSoAW7Vq9fvsfbtBeMKqIvt9/QsvvPCrpa7Nfjem+Nrs6y3Dpt9gn7kE/t4QsXvZz+rMv2O/G83ef5r9fBz7mmJfb5f47KGM/8L48yKbv24KQMYfsJ89gC1bxkMvvvji7xR9/i/Dyin7eYi95wn7eoLxP5R5frWG7fCZP4XrsOf1/zRdVX3++ed/jX2/iv38MQhexl7G82ljXPOZFdamn2EI2o3s6wLzucDPv/GNb7zAXq9jTBrPfR175l8t53MCgUAgEAgaAoQC4xXj9XomGs40935DaDyzCmcKQHhdtHL2pSZ/awnA3/3d3/0/DGHSi337C1//+tf/dxBXjIsruTYISPbzo+xzn2eC8leMGMG4KSQNAfgv7GfD2be/BO8p9xzKrAB+wX6+FkTZV7/61V+H5wPvLfq7VUWi8Mvsb7pBjCII03L3YTyr/1LuvtjrFYznX3rppa+Bvez3Sw1xWiwAn1qZLPEZK42/acu+/Ypx378EsYbsd1Phe3hG7LNWg/3lbCUQCAQCgaAZmAj4TTb4/xMTBZ3gexAlICyYePnDcn9ToQAsGwPIvvZtKjZhNQxWIZ9rIhzLXRtiAY3r/vuit/0Ce9+H7PNfNa4zuqWYRcP+slvA7Oe/W/QzEHh34LUhYuH6NU0+62FzK6nFz6rEfX0JngG7zt+Zvwfhaax8VioAzxZfl33/P5s+C7g3sAdWBpt7PgQCgUAgEDQBHESALUlY3TJ+9CVDvCws9zduCUDYmjRWqD4yyX72YxCkxVuszV2bCdU/ges03TZm77vMfj7AsGV0S6uahj22YgCLbWCv/9RYISy+h4/Z1//Fvg5q5lplBSD7+b+D3zN+q8k9fVipAGR8r8l1B0H8YVN74ZnDAZuWnhGBQCAQCAQNAHFthghLM2aAxorgp0Wi8CkwofBWSwKQ/f2f21gBHMW+P1KhvaVWAJuuWH4FtpbZ579iXAdWAE+19NnsPcsrFYDsut+sFfGTX6/kPuysALLf/32RHf+2yQrgH8F1YWWw6DOGlVgBfOp+4O/ZzxsqsZVAIBAIBIJGMA59wGGE78KqUxFrYFWQ/b57qb9j7/8bOMAAMXtNfm6JGjjsYAijbxe/p1gAwmERODQBW6rss/4382fs+/9ezuZyMYAQwwa2w+ew98yEbc6vfe1r/8a4T1sCkL1vorFl+uWin9lZadvKuBPEIHwPogzEG8TvlbtWCwLQjAE8BwIXVjfZ60XFMYDGIZEfG6ucIBj/AzzblgQg/B37WZT9bhyISvgZPDdzu5xAIBAIBILmYCJgG+OBMr+DgxTPnJY1ACtscFjksbGN+CPjbz4vFjW1hYTNH5nboex1uPgUMJzWBTtgBdLYirxtHNYoiVICEOIYjVPASWObdB8TX79n/t6uAGR/8yIIQHNrtPgU8HPNCEDjFPCoolPCcLp2S3O5Cps+q6afWXQKGE4Vw+nmnozZYqEGQhlW84yT2HvhpHVLAhAA2+u14uBKzBCRD9nfzmvp+RAIBAKBQCAQfIRxWAdWa/8M2xYCgUCQBqxTnGtsf3zBZvHfKfc+NsvtYAS4N9SKVBNfKfdeAoFAwIKRSxHK6n3ZOGkMK65QKs7VhNQEAoGgNCA5LaQwgO2lcgKQzaBbQRJYyBUG30PMDnvd1V9LCQQCoWWwvull1l/dqBW1giEZNCS3rsW2i0AgEKQErAKWE4AQLA1pJ8zv2Qz7H+zEBREIBAKBQCAQJEYLAvBdNqseXPT9t+A0nG/GEQgEAoFAIBDcRyUCENJTkAAk2MHdt3747x+2+eG6hravZhra/PCjh21ePXy/7Sv/33NlqlUQCE5w/61X/uph21f3sP+zx+zrI/a/t/VBm1f+FNsugpb4UsObP3yD/a+dZv3bxw1tfxh/0PaHy+6+/gMKNyCoBa+2gL/44os8IZj4+PD+fEO71/KsY3yG2UXz8p///OfYJhI0wReffZZ/9N7Kkv9rwCc7tuSpLyK4hc9/+tN8auaUkv9roXfa5D89dxrbRFfglr4gSI7mBOCLL774EuTngqSnz4nEqXAIpJudz4V/osePP81/+CFRd4KfTX8ntmwRHeLbP8rHV6/K5xoT+UfJD/PJffvzoa7t+e8i0yblH2U/Rreb6NzfmHY8evRJPjb/XfH/xgbf5PYd+UfxbD4XTecTGzfmG9q/wX8XX7US/ZmpTFn8jc1H6cf58OhhQuz16pxPHTnGfvYkn3sYyccWL7T6vdSBg+i2OvW3qyKDIB8gSz4kS2UC8F+MUlYP4efs9VL2+nvm+4w0MCFIAwOJY5+zmQYGOgzeaB4RdSf4GZA+dZZ3gLD6lzp28pn3Ze6G8qGenXlHGVuxAt1uojN/Y7fvxGZjstGlXT5z7fYzv09/cCnf0OFN/p7kvgPoz01VyuJvbEbfncP/lxoH9s5nG+LP/D65e6/4f2QTj/SVG+j2OvG3R7KDEBRQhxEcgp8/++STfKh7R94BJnbsLPvezPU7bFAWKzPpcxfQbSdW52/s9p25dV/8H7EJR/rcxbLvSx05LgblTm3y2fuN6M9ORcrgb2ymjp4QK39sspG9V/7/KL52rRCJ/Xrkc6nH6HZX629s/UBQHEHvMIJE8HNu5VKxvTt1Uj6X+6TZ9ye2bTdm0n3yucxH6PYTK/c3ZvvOZX+cD48YYqwkL2/x/dH6+eJ/c/pU9GenIrH9jc1cPMe3fPlK8oFDzb8X/jdHiW1iCIHBtr1af2PrB4LiCHKHETRmb94VW78d3sxnH0ZbfD90ko1D+ovVQiYGse0nVkZsQZA8dFRMIPr3zOdST1p8fzaa4Ss3fNX5g0voz081Yvsbm7GVK8QEYsLYFie3wMzNe+IQXIc3bPWHspEEIMExgtxhBI2RyePFjHftGtt/w+OzYEula3s2w36Efg9E+8QUBLBiDMIP/ndSh4/Z/jtz1Tk8fJCtQZwoh7+xmQ0n8w0d3+IT3Mzth7b/LrpArDrHFtaj30M1/sbWDwTFEdQOI2iE4Hu+GtO9Y/5RsjIhF5k8QawCbt6Cfh9E+8QUBMm9+wtCLvtj23/HhWPfHkI4njmP/gxVYpAFIBxWg/+Z6NzZFf0drPzxU+jtXm82ZlBGkgAkOEZQO4ygMTpnpsi3tn1zxf5On79spVTIpSkWUBViCQJYuWsc3E+IuBOnK/57OJwktvLGoD9DlRhUAZiLZgqrf3fsr/6ZjC1ZLFYBly1Fv5dK/Y2tHwiKI4gdRtCYfRARsS6sk/zs008q9jcM6GbANKXpUIdYggBOjVuxfxWs/pnMJT/Mh7p14J9RKm0MUS5/YzOxdZuYMMycVtXfQ9orHhvd+W2lwlxIABIcQ+UO49SpC/muXXug2yE742tWixnuogVVDxBmmg4Qgtj3Q7RHLEEAJ8ydHhyKv/ee+J9doF5sVtD8jUl+UM2INXVycCgyZaL4n91ePjWWbCQBSHCMoHUYQSN0kGZqhMz121UPEBCbZeYPhNxu2PdFbJkYgiDbEBOrKZ3a8LQcVX8OxGbxz2nLVwSxn6UKDKIAhDhRvto8qI+jQ0OFz+mrzOEjEoAEx1Clw0gkPsx37do9/3d/9/f5//bfvpd/8822+YMHj/PX8PubNx/k/+iP/jg/efL0/Pe//9/zf/VXf53ftYu2K1Mnz1rB+E4HCDPNQmz5MvT7IrZMDEHAS7tBMP78dx1/lnlqHQ6UYD9LFRhEARidNcOVNFV8otynm5jgXr2Ffl92/Y2tHwiKw06HEZkxVZyU8oDw2Xb+2bds2ZV/6623re8bG1NcAH7ve9/n34MA/L3f+z3+Pvh+9+6D+b/+679Bb6TY5L7jVT92OR4gIMCaHwbp1oESQytAvwUBP/wxsI/Yjjt/2fHnWWEHY4ajP0sVGDQBCPF6/PAHnOCNpBx/XnzNGjHBXboE/d7s+htbPxAUhyoC8Pr1e/nvfvcv8kOGDM+vX781H41mnxGA3/nOdwo2R9L5b3/72+iNFJOwBWc+51ws68oAER45VJzuPHUO/f6IzdNvQQB1VfkEoW/3qg5/NCWcOIf8k/CZKibq1d3f2IQDafzwx5SJrnxe5k6DMcHtqMQElwQgwTFU6jDibMa3ffve/LBho7gYhNW+YgH4x3/8n6z3xmK5/O///u+j24zJ5P5DVtk3s8Nw6m/zxF103lz0+yM2T78FQWz5ciPR+FrXPtMsD0c5KOXzNzah4gcPETh0xLXPNLMdQOgM9v3Z8Te2fiAoDlU6jDt3QlwAwut0+iMuABcuXPqUAIQYQPP9IABhSxjbbkyapzHNuphuDBBWkD+kTEi3XN6LiEc/BQFs/8LKnzhsdNe1zzWD88Mjh6A/T9kZJAGYDacKh41cPCRkTXDr56Hfox1/Y+sHguJQpcOAAx3/9b9+j/Pv//4f8pMmTXtmC5hWAAuELV++/dvhDes0plsDRHjMiKqT/BL9o5+CIHP9jjhF2a+Hq6coc5mP86GuIidg9n4Y/ZnKzCAJQLPSTLTK3H/lyHOmWnHOH6PfZ0v+xtYPBMURlA4jaIRVP779O23yUx2GG/4267W6cdKT6B39FARW3r4Vy13/bMgFyLeBt25Df6YyM0gCEPq14t0NNwkZE5zmFfTL39j6gaA4gtJhBI3R2TOeSaHh1gBhzZK7d3Ql2J/oDf0UBGbpt/TFq65/Nqw0U2k4ufyNyVzqsXH697V8Nppx/fPjGzaIycySRej32pK/sfUDQXEEocMIGvm2WZd2YtsslHiqw3DL39aAf/k6+v0SS9MvQcBLacGEoEcnTyYEEOPV0OHNfEP715Uq1aWrv7FpTgjC40Z58vmZ2w/E/3OfblInhSYBSHCMIHQYQWP6whUr+XPTDsMtf8dXi/JyUGYO+36JpemXIEhs2SpWTBYu8OwaZlLo1NET6M9VVgZFAEYXzPc0JOCpA023H6Lfb3P+xtYPBMURhA4jaIyvWiXE2XvvPdNhuOXv9KVrIuh/SH/0+yWWpl+CIDJpvOeHgqBGqyqnM3X3NyZ5xY4enYxDQY2eXSe2aKH0cackAAmOoXuHEURa27NXbjzTYbjlb94RdzNOZ4bi6PdMfJZ+CIJc6olVjcHL7Vk4Acy35Xp2knpbTnd/Y9M6bT6oj6fXSR0/JeJO2eQG+56b8ze2fiAoDt07jKCxcEDjnWfisdweIMw6nJBwGvu+ic/SD0GQNvP0jR3p+f3AoK9SrVYd/Y1NSAjuR7k2Xmau/es89hQOnWDfdzl/Y+sHguLQvcMIGpN79oqtsnfnlOww3PR3c9ci4tMPQRBbsUKEG6xf7/n9QIoZfq0NG9GfrYwMggCMTBznWw5SOGTCr3VazrKXJAAJjqF7hxE0RufMNFblDpbsMNz0t7Xa2KszbctJSD8EAcSAlgo38IKpU2fFttzEsejPVkbqLgCh8pAf4QYmExs3idXGZUvR772cv7H1A0Fx6NxhBI389FpPI0D6YbRkh+G2vxv79zROyz1Av3+i9/4uJqQY4hOArh18yQfJt+XY4A8iIJf+CP35ykbdBWD63EURbjBmuC/XK8Qb9kW/93L+xtYPBMWhc4cRNJr5q0CUlesw3PY3pP7gp+W2bUe/f6L3/i6mWW0GYkH9uqfwqGFixfH8ZfTnKxt1F4BW6qkm2Q28Ij/o1rW9mFBHUuj3X8rf2PqBoDh07jCCxsSOXWLLYkF92Q7DbX+njhwX23JTJ6HfP9F7fxfTyse2c7dv9xRfs8ZXEaASdReA4RFDPKs2U45myTkZ80+SACQ4hs4dRtAYmTlNxP8dOlq2w3Db31CKqeHtH+UbOr9NZeEko9eCoHFAL9+3/9PnLvh26lg16iwAc/Gc6Gc6tcnnMv5t/0MeQFEWbjH6Myjlb2z9QFAcunYYQeNTefkak2U7DC/8bR4EyFy7jf4ciN77G2jF/3Xr6OsBIF4HtsMb+Yb2b/AScdjPWCbqLABTp84ZB4DG+Xpd6NN4WM3gfujPoJS/sfUDQXHo2mEEjZnrd1sMWPZqgICi6RQHKB+9FASpw8fEgDxjqu/3ZabngByE2M9YJuosAKHkJN/6f/99X6/LJ9ZmXfVIGv05NPU3tn4gKA5dO4yg0SyVBSWMmuswvPA3bDnzwwAzp6E/B6L3/gZiin6I/6M4QH/9jU3Y8uei/4NLvl8b4ptljAMkAUhwDF07jKAxOtvI/3fwcLMdhhf+zjbEqEyXhPRSEFjb/tfv+H5fZvWRyIQx6M9YJuoqAHn+P77t/zpKVY7Elq2+VB+pxt/Y+oGgOHTsMILIUJ9uYpviQaTZDsMrf4f6dheC4G4I/VkQvfW3dfCnSzuUgz88H6B1IOBj9OcsC3UVgHDqlx/8GTUM5fpQepCH1wwbiP4smvobWz8QFIeOHUbQWFiBa74ih5cDBJSD4yuQ+w6gPw+it/6GMlx8BW7KRLR7axw6gA4e+eRvbCY2bhQrcCtXoFwfJhmiAslrUh08IgFIcAwdO4ygMXnYXgyelwNEcvceYUP9PPTnQfTW3/HVq9Br8sYWGzGI23eiP2dZqKsAhImGX/V/yxEzBrE5f2PrB4Li0LHDCBohNoUPhlu3tdhheOVvqwrJgF7oz4Porb+tU7iIgyHEuvIJx+yZ6M9ZFuooAJ86hRvNoNkRX2VOejagP5Nif2PrB4Li0K3DCCLDwweJAfnKjRY7DK/8zesQm2WTEDtqorf+hgEZYu8gBi+XeIR2bxDrysMe+nRDf86yUEcBmLn9UEwsB/ZGtSN1/JR0FY9IABIcQ7cOI2iEmBSITYEYlZYy5Hs9QEQmjRdbNafOoT8Xojf+ztww8k0O6Y96b3zC0auzmHA0xNCftQzUUQAm9x8UK73vzkG1IxtOGYnPO0iT6YAEIMExdOswgkbYhrNbGsvrAYLys8lFL/yd3L1XDMgL5qPfX3TWdDHhOHwM3RYZqKMAtPJN7tiFbktj/55SZTogAUhwDN06jKAxsWmzEF2rVtrqMLz0d+rUWbFNMnkC+nMheuPvaP18cdp7zz70+0ts3iJOh67AOR0qG3UUgOERg4XounoL3Zbo3Nnif3//QXRbTH9j6weC4tCtwwga4eQvXwU5ctxWh+Glv6FUEt8m6SrPNkmQ6YW/oSYqH5Bv3kO/v/T5y2L1e9wodFtkoG4CkCeAbv86TwKdSzcf3uIHYRWypWpLfvsbWz8QFIdOHUYQaScBdHGH4bW/ZdsmCTLd9reVgLnz2ygJoJ+xJ2EmhG4rhT3Y1E0Api/fEAJ/5FB0W4CQc5LbM3wQui2mv7H1A0Fx6NRhBI2FwOSOtlbc/BggonNaLklH9Idu+zt97oIYAMfLU4KtcVBfMeG49QDdFmzqJgChzrRMJdjgkJ1Vki79BN0eEoAEx9Cpwwga4bRtJTF3fgwQsnXaQabb/oYcaDzedM1q9HszGZ03V6q4LJ38jU0r5k6iyWR4xBBpYhJJABIcQ6cOI2iMr3u/olO3fgwQ6cvXpdq2CTLd9ndk2mT0igxNmdixU0w4lixGtwWbuglASCovWzgJxP/xU8k7d6PbQgKQ4Bg6dRhBIyQl5QPyyTO2Owyv/f1U4HYLeQmJ3tJtf4d6dhLxpo1J9HszCcnPacLhjb8xmYtmjANl7aU6UAan32VJg0QCkOAYunQYQWSlA7JfA0TjsIFi5n7jLvozCjLd9Hc2FBcDcq8u6PdVzMKE483ATzh0EoCp0x+I8JZJ49FtKWbmupEInfVx2LaQACQ4hi4dRtAI1Q/4gNy7a0Udhh/+jtbPE7E7+w6gP6cg001/p06ela4UlkmzFCKc0sS2RRd/YzO+fr0Ib1m7Ft2WYuYyH/PJRkO71/O5FO5BEBKABMfQpcMIGlPHTooBefrUijoMP/xtxWXRQRBUuunv+PuVxZv6ydjCBWLCsWsPui26+Bub0K/x8JZjp9BtaUoIN7BTe90Pf2PrB4Li0KXDCBrjq1eLAXnDxoo6DD/8nb54TcRljRmO/pyCTDf9bQ3Ix+UbkK24rHr8uCxd/I3NUN/utvOb+k1ZytORACQ4hi4dRtAYmThWzELPXqiow/DD37nkhyJB7zttKEEvIt30t5Vw/GEU/b6aEmJNeVzW0AHotujib0zmYlkpD4CYTO7db0w45qH7G1s/EBSHDh1G0AidIiR/5gNyNFNRh+GXvxsH9RFxWbcfoj+voNItf2fNE5k2E477TRGXZSboDe5BEF0EYPqDS9IlHC8mlEHkE44h/dH9ja0fCIpDhw4jaLROZFZwAMTsMPzyt5XE9dAR9OcVVLrlb1hl5vGmE8eh31M5WgdBrt9Bt0V1f2MzsWWriCFesRzdllLkE46Ob+Ub2r2Wz6Ueo/obWz8QFIcOHUbQmDpV3YlMPweIQie+Av15BZVu+TuxabOIN129Cv2eypFOnusjAGWsANKU4VHDRAjO5euo/sbWDwTFoUOHETRaJbkqTJHg5wAh+zZOEOiWv6OzZ4gDIIePod9TOSa27xATjmVL0W1R3d/YbBzcT/r6zmZFEMyT5yQACY6hQ4cRNEZnTRcD8tETFXcYfvnbCuTu0k7KuLEg0C1/y1iSqynTF66ICce4Uei2qO5vTMKWKmytwharzAfIQPjxCQcTgpj+xtYPBMWheocRRJoDcvZeY8Udhp/+buzfU9h5P4z+zIJIN/ydiz/iPmzo/LbUQj4XzwV+wqGDAFSltJ9V83w0XqorEoAEx1C9wwgarRQrMCBXOEP2e4CodqWS6A7d8LdKK2uN/XpImztOFX9jU4aVNTu0+uFObdFWKkkAEhxD9Q4jaExfMpMsj6iqw/DT39XGKhLdoRv+Vim2LjJD3mTVqvgbm1ZVl9170W1pidXuxLjpb2z9QFAcqncYQWNi5y4xIC9ZXFWH4ae/UyfPiNPK0yajP7cg0g1/RxfMFwPy3v3o99MSrXJ169ah26Kqv7EZHjlExJtevYVuS0uMzpyGusNBApDgGKp3GEFjbGG9GJD37Kuqw/DT31A1gidM7dcD/bkFkW74u1D39Cb6/bTE1InTRn3sKei2qOpvTMJWaiG/3hN0e1pifP161PrYJAAJjqFyhxFEOpkh+z1AQDB+Q5d23N5c4hH6swsanfqbD8id2vBYJ4h5wr6flmhOOKCOLLYtKvobm5k7DWLCOKgPui12aE04kHY4SAASHEPlDiNodDpDxhggIFaRryBduob+/IJGp/6G2CY+IA/ohX4vdshLJHbtICYcsSy6Par5G5uwlcpr7M6agW6LHWJPOEgAEhxD5Q4jaMzcfiAG5MH9qu4w/PZ3bPEi9ISpQaVTf6eOnRIrHDOmot+LXULicT7h+OASui2q+RubELvJt1TXr0e3xQ75hMPc4YjnUPyNrR8IikPlDiNohEoMfIY8Z2bVHYbf/rbSOixZhP78gkan/lbxUAWcVgabE9t3otuimr+xGTEPVRxT5xQ3pEfiE44LV1D8ja0fCIpD5Q4jaIR0KnxA3rCx6g7Db39baWvGjkR/fkGjU39jn3KshnA4ik84Fi5At0U1f2OzcUBv1LQq1TC2dAnahIMEIMExVO4wgsbIdCPP2YnTVXcYfvvbqiQR4AoNWHTq78aBvaUvAdeU6ctGJYkxeBUaVPU3JnkJOEis/E4bqUvANSWkR+K7Mgvmo/gbWz8QFIeqHUYQaSUerbK0GtYA0djXqNDwMIr+DINEJ/6GQ0Z8QJa8JuszdieCO+FQWQBCVgNRAm4Iui3V2e1/6ToSgATHULXDCBqtGXKn6mfIWAMEpEngK5cnz6I/xyDRib+tgW2EWgMyEE5l8glHQwzdFlX8jc3kvgNiJa3e/5U0J3yqNKfPEw4SgATHULXDCBoz1247niFjDRBOYxeJ/vtb1QEZGJk6SUw4Tp9Dt0UVf2MztmK5iKXbug3dlkpp1aD2eYeDBCDBMVTtMILG5P6DxoA8z1GHgeHv1JHjwvbZ1Z1eJvrv79hyY0Deth39PiplfPUqYfvmLei2qOJvbEYmjhOnac9dQLelYtvNCccpf3c4SAASHEPVDiNojK1c4XiGjDVAZO48NDL890V/jkGiE39HJow1BuSL6PdRKZMHD4sJx7y56Lao4m9shnp2Fqto4RS6LVG8QzoAACAASURBVJUyvnq16Js3bfbd39j6gaA4VO0wgsbI5AliQD5z3lGHgeFvXsGkw5v5hvav53OZj9CfZVDoxN+hHp3EgBxRb0DOXL8rwiWGD0K3RRV/YzIbzYiKGt3fQbelGmJNOEgAEhxDxQ4jiAz17ioG5FDCUYeB5e/GoQNESpFbD9CfZVBYrb9hFYYPyD07od9DNcyln/ByiaqdYMbyNzahaguvODNhDLot1TBz/Q7KhIMEIMExVOwwgkYoM8QH5K4dHJ00wxwgoHoJj5M5chz9eQaF1fob4rD4gDxxLPo9VMvGgX2Uy2GI5W9sQhJlnrx72VJ0W6ohT5mEMOEgAUhwDBU7jKAxfdGdahqYAwTU91StrJjqrNbfie07xIC8fBn6PVTLqIJlxbD8jc3YwnpRL3zPPnRbqqVVxeS+f1VMSAASHOFBm1f6fXxwr3IdRtCY3G3U013srJ4u5gCROnZSxMnMmoH+PIPCav0dW7TQGJD3ot9DtYSJBp9wsIkHti2y+xub4VHDRHzzlRvotlRLp1WaqvU3toYgKIyHbV99BEksH6UfozcgYnla9SZ37nLcYWANENZJ4MH90J9nUFitv2GlmQ/IF6+h30O1hPrFIvVQcCYcKgpACGmBJMowDkFSZWx7qiVGrlMSgARHeNjm1Qs8Tub6bfQGRCzP8PjRYkC+cMVxh4E1QOQyH+cbOrxhnAT+GP2ZBoHV+jvUvSP/f8vFsuj3UC2DOOFQUQBCtRYe39y3O7otTpg8fFRMOObO9tXf2BqCoDCYAFzFl60PHUZvQMTytAbkaMZxh4E5QDQO6S8C82/TSWA/WI2/Ie2LyieATYrUQ2zC0Y5NONLBSD2E3b6rIaS14geOJk9At8UJMzfviQnHsIG++htbQxA8xssvv1xTV1d3lvFBbW3tBcZvNX1PTU3NX7Cf/5TxKuM1+Mp+9sstffbDt14dxJet165Bb0DE0syGk8aA3NmVDgNzgIDtOD7hOHoC/bkGgdX4O33+sjhwNF7NlBzFhMGYTzjY4Ixti6z+xiZUmuHxzSuWo9vihDDJgN0NyHfq10lgEoABABN+R5mYewteM2H3A/b9xabvMQTg1Uo/u+GtV7/Pl61nTEVvQMTShEoMIkeW85Qc2ANE/P33jZPA76M/1yCwGn8ndxkHjpY4O3AkA2E7jk84Dh9Dt0VWf2MztnCB8ieATUKlIz7huNPgm7/d0BgEScGE3fNM2P2Yvfyy+TMmADOMrZu8DwTgtUo/v6Ht/3iZL1sP7IPeeIilmdixSwzIS5e40mFgDhBBDMzHZDX+tg4csf87bPudMmiph7DbdzXU4cCRyeis6UbqoZO++dsFmUGQFUzY/RETe/eKfwbbwOznf9nkfSAAP2HvvWz8vqudz9/0yitfCUGJrnZUoktWxpYsNk4A73alw8AcIDK3gxeYj8lq/A3Jn/mA/MEldPudMmgTDuz2XQ1D3dQ/cGTSSj30vj87HCQANUcpAQhbwE0F4PPPP/9rX/3qV3/d+P3vMt5g7/lHO9eIjRgkEljeecD/oYhyEcoj8W2F85ccf9bjx2KAgK8Y9/Io+7GIk2n/Bn+N/Wx1ZzX+DvXqIgbkcBLdfqfM3n4gJhxD+6PbIqu/MZmLFg4cYdviBlPHChMOv/ztmtggyAe7W8Al/m4I+7u5dq6RWTCX/9P+5NKFPEE+RPqKGsD/+smPsU1xBbHhoibwzzMpbFMITfD5T/9JCKbuHfNffPEFtjmO8cW//iufcIQ6vpn/4vPPsc0hNMFP798V8X9Tx2Ob4gp+nhIH9mIjB/t2TYcSgyA7mNg7xtgWXsOqXqlDIK1atfpt9uVL8BpWAtl7zjAB+Ladz3+yY4vYYly/Hn0GRXyajxKPjBrA7fOPHn3iyowRgLlCYJ0EZrNl7OerOyv1d+bKDXECeMxwdNvdYuPAQokubFtk8zc2rQpHSxah2+IGH2U+smoCP8r92Bd/u6k1CBKidevWdUzMnYM0MMb277fh5+z1Uvbz78Fr9rPu7PVtIwXMLcaRdj//Jxc/EMvWc2aix1AQn2baHJBHDXMtZgTAOyukewpiiS4sVurv5N79YkBeUI9uu1uMTJ8iJhwnz6DbIpu/sanTgSOTVk3gBxFf/O2V7iAEBD9PJnxPYEm0x+T+g0Kc189zrcPAHiBSR44bcTI04fCalfo7tnKFGJC3bkO33S3GV68W97RpM7otsvkbmzodOLLuadpkMeE4dc4Xf2PrB4Li4HEyxrK1XwksifYYX71KDF6bt7jWYWAPEJlbRmD+kP7oz1d3VurvyJSJYvA6/QG67W4xuf+QmHDMfxfdFtn8jc1QbxHfnG1MotviFuOrVvo2iSIBSHAM6DCK42SwGxCxQLe3r2QYIHI8TsbfjPlBZaX+buzbQ/QDD6PotrvFzNVbroZRyEwZ2rdd5uKF+OZc7hN0e9yiFUax0PswChKABMeADiMaoDgZlWgJ83vuCHNZBojGAb2MCUcY/RnrzEr8nUs9zje8/aN8Q6e2Wg3IueSHQmh0aafVfTn1Nzat+ObRw9FtcfW+Ll0T9zV2pC/+xtYPBMUBHUZ8TXDiZFShFytlsgwQkamTfIuTCTIr8Xfm2m0xcI0Ygm6329Rxq9Gpv7GZ3HdAbM0vmI9ui5uEhNZ8wtH9HV/8ja0fCIoDOozUweDEyajCzG33Y+VkGSBiK/Q7bCAjK/F38uBh0Qe8OwfdbrcZmThOu8MGTv2NTStWbstWdFvcZqhHJ5FMPZrx3N/Y+oGgOKDDyFw3Zv8jh6I3HqKgVcZqlntlrGQZIKDwu4iTWYD+nHVmJf6Or1kjBuSNm9DtdpuxZUu1Szfi1N/YtHYBTuu3CxAeN8qX+sYkAAmOAR3Go9SHIv6n89vax8moQquQ/XvvudphyDBApC9eFRMO1lFiP2edWYm/I9OnigH5xGl0u91mcpeZcHgxui2y+Bubjf17+pYvz2/CxJZXONm733N/Y+sHguIwO4xQn26BiJNRhdG5s0Uncuioqx2GDANENpK2aoBiP2edWYm/Gwf2ETWn74bQ7Xab6fOX+b1BXW1sW2TxNyZz6SdiwUHT1GMQ2sInHCtXeO5vbP1AUBxmh2El5WSdJXYDIn6aDw8fJAbk63dd7TBkGSBC3TqIOJl4Dt0WXWnX3zAIQ83chvZvaDkgZ8MpMeHo1RndFhn8jU0rF+jQAei2eEHIo8knHFMnee5vbP1AUBxmhwHbI3zFafce9AYUdMI2fEOnNnyWnEs9cbXDkGWAgPQPfMJx5Qa6LbrSrr9h1Y8PyIP6oNvsFUNd9Z9wyNS+m2Pq2EnX45tlImxr8/bUv6fn/sbWDwTFYXYYie07xbL18uXoDSjohES8vAPp28P1DkOWAQLK2/EJx/6D6LboSrv+Tp08K1Yspk1Gt9krhscYE47L+k44ZGrfzTGxcaOIb167Ft0WL8hX1Du+xStswXa3l/7G1g8ExWF2GKkz58UgMGUiegMKOgu+mOB6hyHLAAE5J/kgsGY1ui260q6/IRUH98Wqleg2e8Vo/XxjwnEI3RZsf2MT0o1xXxzQ1xeNwwaKEJ5b9z31N7Z+ICgOs8Pwa9ma2DIT27aL1dgV7q7GyjRAwGlTLnJnTEW3RVfa9bdfpxYxaU04NF11qsTf2CyEf9xEt8UrRmfPFKfqj57w1N/Y+oGgOMwO4+ll64/QG1CQGVu0UAzIe/a53mHIMkBk7jwUE47B/dBt0ZV2/V3IW3YV3WavmDp+yog7m45uC7a/sRmEA2Dxde+LCcf69Z76G1s/EBRHcYcBVSf4svXtB+gNKMgMjx8tBuQL7g7IMg0QvNQdnDztoOfJUxlo19+hnp1FCqhICt1mr2hV1tH05Gkl/sZkNpoJRAqo1OFjYsIxd7an/sbWDwTFUdxhwOyYL1sfO4XegIJMq3Zp2N0BWbYBwsw9l73XiG6LjrTj71zikRiQu7ZHt9dLwq4G7G7omnvOrr+xCdUxeBL4sSPRbfGSmRt3xX0OH+Spv7H1A0FxFHcYEB+jazkoVZhLPeY+8KIqi2wDBJw65ROOk2fRbdGRdvyduXpLDFSjhqHb6zWt6hMPo+i2YPkbmxBnyuObF9Sj2+IlIX0XT3bdqY1n1bVIABIco7jDgFNZfNl6/rvoDSiozNy859nMUbYBIr5qlZhwbN6CbouOtOPv5MHDos3Pm4tur9eEU/U8tOLsBXRbsPyNzfjq4LR5SOPl5YSDBCDBMYo7DDiVxcXH6OHojSeohFNjfECe7X6SVNkGiKCsBmDRjr+h1jQPVt+wAd1erxlbtlSIjx270G3B8jc2rZrTJ8+g2+L5vU4eLyYc5y565m9s/UBQHMUdBpzK4vFA3TqgN56gErbfvUpXIdsAkb4UjHggLNrxtx/pKmRhYucuMeFYugTdFix/Y7NxUF9x0PBOA7otXhP+z/iEY+duz/yNrR8IiqNphwGns/iydTSD3oCCyOgCM2Gt+xUyZBsgcuaJwO7voNuiI+3420pYe/Meur1eE1ZieO7JyePRbcHyNyZ5qrEOb/DT/7nMx+j2eM3EDrO61jLP/I2tHwiKo2mHUcgJdg29AQWR1vO/5P7zl3GACHXvKHKCxbLotujGlvz9VM1pD0tWycJsQ8yTEouyUMb2/dTzv98onv/A3ui2+MG0x9W1SAASHKNphxFbWK99VQCZGerlXU42GQeI8JgRRo3W6+i26MaW/G0KolDf7ui2+kEueN/RV/DK2L6LmTp1Tvua08W0qmsN6OWZv7H1A0FxNO0wCnVBV6E3oKAxl/xQpIDp0s6T1AEyDhDWlve+A+i26MaW/G1tiU7Sc0u0FAs1WvVLdi9j+y5mYus2o8TlCnRb/KDY8n4z39DudZ743gt/Y+sHguJo2mFATjY+KEyfgt6AgsbMdSN56IjBnny+jAOEVaN1zWp0W3RjS/7W/VBEKUZnzTCS3Z9Et8Vvf2OzUOJyL7otfhFKXXp16IUEIMExmnYYmbshsWw9qA964wkaU0eOixQwc2Z68vkyDhBQdUb3Gq1YbMnfuqdFKUWdk93L2L6LWShxeQXdFr9YSHvjfrJ7EoAEx2jaYfBla6jR2p5qtPrNxMaNYjXsvfc8+XwZB4jMrfva12jFYkv+LuQp0zMxcinqnOxexvZdzFCvLp6UuJSZVrL7rds88Te2fiAojlIdhlmjFVYDsRtQkBitnye2SNgg5cXnyzhAQDA+L5n0jnclk4LKlvzd2M/bSgUy0kp2P0a/ZPcytm+TZnxzyKP4ZllpJbtftNATf2PrB4LiKNVhUI1WHEJCZC9PxMo6QIT6dBNCJBRHt0UnNufvoApvSDckkt13RLfFT39jM3PtthDeI4eg2+In0xeuivseP8YTf2PrB4LiKNVhxFetFMvWW7aiN6Ag0esk3LIOEJEJY4Xw/eASui06sTl/W1vvwwai2+k3IfE4zz2pWbJ7Wds3MHnoiNh6f3cOui1+Era7+YSjd1dP/I2tHwiKo1SHkdyzz7Nla2Jp5hKPREfRtb1n15B1gIgtXiS2vncH53SgH2zO33AK1qua07LT65V2Gf2Nzfi6dSK+ef16dFv8JM892aWdmHAkP3Td39j6gaA4SnUY6fOXRSqYCe4vWxNL048tElkHCCs/2Mpg5Afzi8352zpw5EHNadkZrfeu3KKs/sYmZDbgYUVHjqPb4jfDI4aImPrrd133N7Z+ICiOUh0GxGLx1ag+3dAbT1BopYCZO9uza8g6QKROnQ1UhQC/2Jy/4RQsF0EHD6Pb6Td1zT0pa/sGhocPEiLohrsiSAVCn+6F+CUBSHCMUh3GUzVCU/qVTJKR8Q0bxKC0bp1n15B1gCjknuyLbotObM7f4dHDxTbolZvodvrN1HEj9+TMaei2+OVvTIrxpK3YBk09RrfHb1rb36yPd9vf2PqBoDjKdRiQl02UTLqP3oCCQD9WZKQdIDIf83JJDR0o96Rf/g517ygG5HgO3U6/mbn9QEw4hvRHt8Uvf2MyG056dhBCBVoHYObNdd3f2PqBoDjKbhGx2bEomXQKvQEFgZCXTKzI3PDsGrIOEEAomM5PQD+IoNuiC8v5G0QfH5C765cKxQ5z6Y/YhOO1fEPHt7SacMjavgupUEaj24LBzNVb4v5HDXPd39j6gaA4ynUY8dWrRSqYTZvRG1AQaKWmiGU9u4asAwQwMmWCEMBnzqPbogvL+durAUklNvbvqV0SbFnbt5UMeWE9ui0YzMWNDA/dOrjub2z9QFAc5ToMq9EuCGaj9beDyHnSQZTqMGQcIICFurQ70W3RheX8nTx0NJA52YoZmazfhEPW9g2HbYK+mOBFjlcSgATHKNdhWMv240ahNx7daaWA8XhFRtYBApjYsUtMOJgQxLZFF5bzN+Ri40Hp77+PbiMWY0uXCFGycxe6LV77G5vRWdMDH07kRe5JEoAExyjXYViBu726oDce3Zk87M+KjKwDBBBWYngqmMkT0G3RheX8Df9n/MDRoaPoNmIxsX2nmHAsX45ui9f+xiZUmwn6gcLoAjP3pHt13kkAEhyjbK1QOLrf+W1PMpgTn6a1IrPO2xUZWQcIIBz+4Ccz+/dEt0UXlvO3mQIGYgGxbcRi6vQ5MeGYOgndFq/9jUkrBUzAU4pZuSddTLxOApDgGM11GEFO3uknCysyRzy9jowDhEk4jdnQ4U2eDiaX+QjdHh1Yzt9WChgPDxzJzuy9RjHhGNgH3Rav/Y36nBuDnQLGJGx/812eWe6VXiQBSHCM5joMqBPKYzeOnkBvQDoTYv/8WJGRcYAoZuPgfuI53GlAt0UHlvJ34cBRMFPAWM/BzD3ZXp/ckzK270IKmGCXFc3cMnJPDhvoqr+x9QNBcTTXYcByNQ+U3rgRvQHpTBiM/UjKK+MAUczI9CliwnHyLLotOrCUvykFTIG65Z6UsX0HPQWMyVz6Cd8Gb3inDd8Wd8vf2PqBoDia6zCgWDpftq6fh96AdCVsw/mVlFfGAaKYsZUrxIRj6zZ0W3RgKX/7deBIBVq5J89eQLfFK39j08onu3kLui3YbOzbQ0w4GuKu+RtbPxAUR3MdRvrSNbFaMHYkeuPRldaKzOjhnl9LxgGimMk9e8VqwaKF6LbowFL+phQwBeqWCkbG9m2lgDke3BQwJiMTx4kJx/nLrvkbWz8QFEdzHUY2kharUz07oTceXWnVifRhRUbGAaKY0DHyk5kTxqLbogNL+Rvqkfpx4EgFFlLBLEO3xSt/Y5NSwBQYW7xItD020XXL39j6ITCoq6vLMKZbIradlaKlDiPUpZ2IT0s8Qm9AOhJSv/AVmfXrPb+WjANEMbOhhJhw9OmGbosOLOVvSgFToG6pYGRr3yIFTJvAp4AxCaEtvK9ftco1f2Prh8CgpqbmL+wQ285K0VKHER4xRAwY126jNyAdGZ07W8wKD3uflFe2AaIpacDw3t9+1JxWhbqlgpGtfVspYGhCx5k6eUZMOGZOc83f2PqBoDha6jCic2aJGI7Dx9AbkI4Mjxzqm8CWbYAoRWvL6OY9dFtUZ1N/UwqYp8lTwbTXJxWMbO07feEKpYApYub2QzHhGNLfNX9j64eg4pdqa2vHMzYyfgI/qKmp+bu6uroe2IZVipY6jPh77/m2RRlEhrp1MFLAeL/FLtsAUYqQKFXUDT2JbovqbOpvv2pOq0SdUsHI1r4LKWAWoNsiA3Ppj1xNBUMCEAlM7M1jYm8/458zAfhj+NnLL7/8Dfb6NrZtlaKlDiN58LA4pDBvLnoD0o2FFDDv+HI92QaIUoyvWSNOZm7ajG6L6mzqb0oB8yytVDBnzqPb4ra/sUkpYJ5lqG93MeEIJVzxN7Z+CCTgsAcTgf/WeP2R+XNTDKqEljqM9JUbvqUpCRqtZzvGn2cr2wBRioXck/PRbVGdTf3tV81plahTKhjZ2nd05jSxmn/iNLotshAyHLiVCoYEIBKY0Et87Wtf+zfw2hSArVq1+k32OopqWBVoqcPwM1Fx0Gitrs5/15fryTZAlCLlnvTO35QC5lnqlApGtvbdOHSAkQLmAbotshBynPI2uHe/K/7G1g+BBBOAixiXgwg0BOBX2PcLGOdi21Yp7HQYhTg1b0uVBY1WfOWGDb5cT7YBohQLuSc7o9uiOpv6G1aa+erDlZvotsnC1OkPtEkFI1P7fupEf5pO9JtMbNkq+vzVq13xN7Z+CCS++tWv/joTe1uZ+PsX9vVzxn+G759//vlfw7atUtjpMCBonHKHuU/rhPWR475cT6YBojlauSeTH6LbojKb+ptSwDxLnVLByNS+KadnacJ2ON/1cSEVDAlAZNTU1DzfunXrP3nppZe+hm1LtbDTYUDQuNg68j5XXZAYHmnkWLx+x5fryTRANPtcRvj7XHRlsb/hlLlIAdMB3S6ZqFMqGJnad6GqD6WAKSZsh/MJx7CBrvgbWz8EFkz4/UZtbe3rjAPhK8QAYttUDex0GFA3lOqHus9Q1/a+VlmRaYBojtE5M31dGdWVxf6mFDDlqUsqGJnat5UChup6P0XYDuepYDq1dZwKhgQgEpjg+y7jx4xX6+rqtrOvV+B7HSuB8MZ8iNJHuM1sNON7nWWZBojmWIiN3Ihui8os9jckcudteO5sdLtkoy6pYGRq3/HVq8Tp6i1b0W2RjbAtziccjUnH/sbWD4EEE3u3mPBrU/wzJv7e0jEPIBBi/2j1wF2mL1/3/bSrTANEc0weOOTr6WhdWexvSgFTnrFlS7VIBSNT+45QCpiyhMoofMJx4apjf2Prh0CCib9P2ZcvN/nxV4yfKwU7HQbFD7nP5H5D5NTP8+2aMg0QzTF92cyPOALdFpVZ7G8Q0zyO9+BhdLtkoy6pYGRq31YKmNuUAqYpoTIKb4v7Djj2N7Z+CCSY0FsLcX9NfvYjxjVYNlULux0GnSB0l/G1a8Wqw0b/tjllGiCaI8b2uI4s9jelgClPXVLByNK+eQqYdygFTDlCZRS+Gr/GWSoYEoA+ggm+9YzvG+QpYBgvGa8vGSlhtmDbWSnsdhiFAeQGegPSgdZBh6MnfLumLAOEHfp9QEZHFvs71KMTTeDKUJdUMLK072woTilgmmHq2Cmx+zNrhmN/Y+uHwKCmpma0HWLbWSnsdhi0heQuwyMGG6lO7vp2TVkGCFvPx0yRc+02ui2q0vT3owSFcDRHXVLByNK+CylgxqI/ExmZuXXflVQwJAAJjmG3w4BqFXzZ+r330BuQ6uRbJAjJjmUZIOwQTqvyFdLDx9BtUZWmvzPXjRQwI4ei2yQrGwf0Vj4VjCztO7lnH6WAaYa5lJEKpvPbjlLBkABERKtWrX6lpqbmP9bW1v4N+/q3JrHtqhR2OwzIyUZpJNxhNpISKzK9/C13JssAYYdWKpj169FtUZWmv1NHKAVMS9QhFYws7Tu+ilLAtMRQ765iwhFOOfI3tn4IJIw8gDmoA8y+fgZfGf+VMYxtW6Ww22FYiWRHDkFvPKozffGaeJbjRvl6XVkGCDuEUANKBeOOvxPm6v26deg2yUorFcyOXei2OPU3dvumFDAtMzx+tJhwXKw+FQwJQCQwoXeZCb9e8BoSQBtfhzMOwLWsctjtMHJmHFFXiiNySjj+z8XNgvm+XleWAcIO4bCRSAUzHN0WVWn6O0bxuy1Sh1QwsrTvxiH9jRQwD9GfiayMLah3nAqGBCASivMAmgKQ4ZfYz1N4VlWHSjoM6yRhNIPegFSmlQJm02ZfryvLAGGHcFqVTzi6v4Nui6o0/Q35FOkEf/PUIRWMDO376RQwH6E/E1kJfT9flWdjgRN/Y+uHQIKJvtg3v/nN3zJe362pqfmDF1988XfY60+wbasUlXQY1kBymQYSJ4zOnuF7Chizw8AeICohnFrlE454Dt0WFWn6myZuLTN7X/1UMDK0bysFTN/u6M9DZqaOnRS7QLOrTwVDAhAJdXV1M5nYe8143Z/xMWOGcSm2bZWikg6DUsG4w/DwQWKL5OY9X68rwwBR0XMaOZRSwTj09+c/+xmFbtigDqlgZGjfVgqYiZQCpjlC389DXNhY4MTf2PqB8BwXgX/+8ssv/8Nzz5aHkx6VdBiUCsY5+RZJ57fFikzqsa/XlmGAqIRmKpjk4aPotqhI8PM/RyOUAsYmrVQw98PotlTrb+z2TSlg7BHSf8FzcpIKhgQgwTEq6TAoFYxzZsNJsSLTu6vv15ZhgKiE8XXvUyoYh/7+ycUPqM3aZGTKRKVTwcjQvq0UMFu3oT8P2Rnq1UVMOCLVpYIhAegjamtrP2A81xKx7awUlXQYlArGOdMXropnOH6079eWYYCohMlDR4R4eXcOui0qEvz8ZPd2SgFjk6qngpGhfUdmTBXxzSfPoD8P2QlpwPiE49K1qv2NrR8Cg7q6urZ2iG1npaikw6BUMM5ppoCJLaz3/doyDBCVMH3lphDLoykVTLX+zi5bSHG7NpnYoXYqGBnaN6WAsc9o/XzRNvcfqtrf2PqBoDgq7TDoRKEzxtesRkkBY3YY2ANEJSykgumIbouKBD8nJo6mFDA2qXoqGOz2TSlgKmNi4yZHqWBIABIco9IOg1LBOGN01nSxRXLslO/Xxh4gqmGoW0dKBePA3+HeXWjCZpOFVDC90W2p1t+Y7TvbIFLANPbtgf4sVCCkAeMhLnNmVu1vbP1AUByVdhiUCsYZG4cNFFskt+77fm3sAaIahkcNE8/r6i10W5RjkkI2KqHqqWCw23chBcw49GehAjPX74oQlxGDq/Y3tn4gKI5KOwxKBVM9+RZJJ2OLJPXE9+tjDxDVEA6A8AnHIUoFUymzN+7Qoa0KqXIqGOz2ndyzV8RQLl6E/ixUoJkKJtSlXdX+xtYPgURNTc3zfl3r5ZdfrqmrqzvL+KC2tvYC47fK2NSB/e4hYwPjYvajr9j5/Eo7DEoFUz2zoYRo8H26oVwfJlXADAAAIABJREFUe4CohvH3jVQw7Cu2LaqR2mrljEyZoGwqGOz2TSlgKmeoZ2cx4agiRIMEIBKYwPpnxl2MP2Df/qKX12LC7ygTd28Z1/0B+/5i0/e0YoA6xKYwZe/byV53tfP5lXYYlAqmeqYvXDFSwIxBuT72AFENYeWPUsFUx8TGjWJAXker9XapcioY7PYdmTmNUsBUyPDYkUZM/fWq/O2u2iDYAtNbv81E1gAmum4YZeDqW7du/SduXwcEHbvOj58rqjBilJxrXfw+sIVxgfk9VCVh35+yc41KOwxKBVM9k3v3GylgFqBcH3uAqIYQ+8dF86hh6Laoxli9iNdNUbyubSa2q5sKBrt9UwqYyhmtnydCXA5UngqGBKAEYCLtPzJBNosxzUTXXfb9YLe2iNnn/BH73HvFP4NtYPbzv2zys3fhukXff4v9XdTONarpMCgVTHWMrza2SDZvQbk+9gBRDeH0L59wdKNUMJXSPLGfoRQwtqlyKhjM9k0pYKpjfMPGqmPqSQBKgJdeeuk7TGzNNFbmLjPxtZXxEybIujn97FICELaAWxKA7PW3KxGAjx+Lfya7LB5YKvm7oDNqbJGkT5xGuT74uRp/YxPyAMJzexTPotuiEkM9OxnPLYNuiyospILpg25LpcRs37lGMwVMd/TnoBILcbqzqvK3U41BqAJM9H2Niax+sAXMxFcWBGDr1q3/0Pw9rMAZW7eO4NcWcKUwqwt8eu50NX8eWMRGDOLP7eepJLYpSiExQZRM+lk4hG2KMvj8Zz8TA3K3DtimKIUvPvtMpILp8Eb+i88/xzZHGfz0vkhpkpw2AdsUpfDPsahYARw7vKq/d6oxCFWAiaufMRG2gwmt/8G+/YVS72G/X+bGtdjnHDNLzDFB+I+lDoG8+OKLLzGbksyef8e+/ZJxCMTWCiT8E1U6Y0wYqWAguBx7BqUKHz0qbJE8yjxBsUHVFcDYvLkilu3QYXRbVKGZAgYGFtX8jU0zFUzuQQTdlkqI2b6t+ObFC9Gfg0osztVZjb/d0BiECgErgH5dq3Xr1nVM0J2DNDDG9u+34efs9VL28++Z7zPSwIQgDQx7veQ5j9LAAFOHj1F6iQqZDcVRU8CYMSPV+Bub8fXrhZhZR6lg7NLcWsosmqecv7GpaioYzPZtxTdv2Yr+HFRjtTH14GePZAchKKimw6BUMJXTypI/YSyaDaoKwOThozThqJBmcPmT7ZuV8zc2rVQwO3eh21IJMdu3Gd+cOnEa/TmoRqu8aoWHtUgAEhyjmg6DUsFUTitL/qKFaDaoKgALE46h6LaoQrNk46dnTyvnb2yqmgoGs31bJS5vP0B/Dqqx2vKqJAAJjlFth0GpYCpjfNVK9Cz5qgrAXJwmHJXSTDD7s8YG5fyNTVVTwWC176dKXKb9L3GpOq3yquvWVexvbP1AUBzVdhjWsvVlyjFmh5HpU9Gz5KsqAIE04ajweRkpYD77yU+U9Dcms/cKqWCwbamEWO0725hEj29WmdXG1JMARAQcuoAybYw34fva2trvsp+9im1Xpai2w6h22TqobBzcT2yR3MHLkq+yAAyPGV5VnEwQaRWZ79peWX+jPr/MxyIVTPs38rnsj9HtsUus9p2+cNWIb8Ypcak6qw1xIQGIBCb0RjPBd4V9fdPM9/fyyy/XwM+wbasU1XYY1rJ1FRnMg0YYRBo6voWeJV9lAUgTDvvMXBcpYMIjhijrb2w2DujFn2H2QQTdFrvEat/YJS5VZ7UhLiQAkcCEXgzqARuvPzZ+/KWi18qg2g6DUsHYZ7YhZmTJ74Fqh8oCkCYc9llcXUBVf2PTSgVz9gK6LXaJ1b7ja1ajlrjUgdWEuJAARAJU/2BffhFe19XVfQRfX3jhhV9lr1OohlWBajsMSgVjn+kPLoktkonjUO1QWQBaombOLHRbZGdxfVFV/Y3N2NIlyqWCwWrf0VkzRHzz8VPoz0BVVhPiQgIQCUzobWAicJzxmgtA9v2Impqa1biWVY5qOwxKBWOfyd17xBbJkkWodqgsAGnCYZ/mdnnq4CFl/Y3NQiqY5ei22CVW+7ZSwNy6j/4MVGU1IS4kAJEAlUCY4LsAK36M/8oYhu+NUmxKwUmHQScz7TG2YoVYTdi2HdUOlQVgYcLRHt0W2WmmgMlcuaGsv7GZOn1OuVQwGO2bp4Dp/LaIb05RCphqWU0qGBKAuPgSE35/WlNT8woTf3/Gvv8ytkHVwEmHQalg7DEybbJYkTl1FtUOlQUg0ExtkqUJh63nlItllPY3Jq1UMIPUSQWD0b6zYSMFTO+u6PevMquJqScBSHAMJx0Gncy0x8ZBfY0UMA2odqguAM2VrfTl6+i2yMriFDCq+xv1OUIqmHav5xs6qJMKBsPf6YsiBUx4/Gj0+1eZ1YS4kABEQk1Nzbdra2sPMj5i/KnBn8FXbNsqhZMOg05mtkyeAqbDm2wweY0NKngpYMwOQ2VBEK2fJyYcBw6h2yIri1PAqO5vbKqWCgbD38l9B0Ss5IJ69PtXmdXE1JMAREJdXd0NJvbmMiH4f7PX/2cxsW2rFE46DEoF0zKzD6NiK6l/T3RbVBcExadbsW2RlcWnpVX3NzYjk9VKBYPh7/iaNSK+edNm9PtXnZXG1JMARAITf5+wL1/CtsMNOOkw6GRmy0yfuyCCySePR7dFdUFQEDcz0W2RlcUiWXV/Y7OQCmY3ui12iOHv6GwjBcyxk+j3rzorjaknAYgESPfCRODfYNvhBpx0GJQKpmXC4MG3SNhggm2L6oIgc/2usb05GN0WWWnF5R44pLy/sZnYvkOpVDAY/g4PHyTim2/eQ79/1VlpTD0JQCS0atXqN+vq6u4z7mNCcEUxsW2rFE47DEoF0zxh8OCrCGwwwbZFdUFgHXDo0g7dFllZOChzQ3l/Y9NKBTNtMrotdui3v60UMND/px6j37/qrDSmngQgEpjQ28LE3wOIA2RfJxcT27ZK4bTDsJatK8hgHiRCHjGRAuYcui06CIJQz84iMD+SRrdFRlopYNiETAd/YzJzN6RUKhi//Z2NpMSErFcX9HvXgZVWOyIBiAQm9P7XN7/5zd/CtsMNOO0wKBVM84TBg2+RsMEE2xYdBIG1wnXpGrotsrFpsmwd/I36PBVLBeO3v6EN8pCMcaPQ710HWif4bcbUkwBEQm1t7ZVWrVr9NrYdbsBph0GpYMpTpIB5gw8iMJhg26ODIIjWzxcTjv0H0W2RjU0HEB38jU04va9KKhi//Q1tkK9YLZiPfu86sNJqRyQAkcAE4IC6urpLjG1qamr+tpjYtlUKpx0GpYIpTxg0+BbSgF7otpgdhuqCILFxk5hwrF2LbotsbLqFpIO/sWmlgjknfyoYv/0NbZDHN7M2iX3vurCSakckAJHAhF+kDMPYtlUKpx0GpYIpz/SZ8yKIfMoEdFvMDkN1QZA6ekKInNmUCqYpm67G6+BvbKqUCsZvf0Mb5PHNrE1i37suLD7EZcff2PqBoDicdhi5OKWCKcfEjl0ijcSypei2mB2G6oIgc8NIBTN8ELotsrFpPK4O/samlQpmhfypYPz2N6Rj4vHNrE1i37suLE7jZMff2Poh0HjxxRdfat269X9uxYBtS7Vwo8OgVDClCcJPpIDZiW6L2WGoLgjMVDCQfgLSUGDbIxObJpLVwd/YVCkVjN/+hnRMvN9nbRL73nVhJdWOSAAigQm/36mrqzvN+C+MGePrmW984xsvYNtWKdzoMCgVTGlaKWBOf4Bui9lh6CAIIO2ESAWTQrdFJhangNHJ35gspILpi25LS/TT35CGie/89OyMft86sZJUMCQAkVBbW7uNccHzzz//a/A9fGUCsJ5xB7ZtlcKNDoNSwZRm48DeQqjcb0S3xewwdBAEkHaCTzguUioYk6Wq8ujib9TnaqWCeVP6VDB++jt9+boIxRg7Ev2+daJ1kn9EyzH1JACRwITehzU1Nb9c/LNWrVr9Cvv5YyybqoUbHQalgnmWPAVM+zc4ZRk4dBEEkHaCTzj2HUC3RRaWOoyli7+xaaWCeRhFt6U5+ulviFHjK1X189DvWydWUu2IBCASamtrG1u3bl1b/DP4PoingIGUCuZZwqof3zoa2BvdluIOQwdBkNi0WUw41qxBt0UWWltHRW1QF39jU5VUMH76Gyb7vA1u2Ih+37rRqnbUQkw9CUAkMAE4CMQe+9qzpqbm+/AVRCF7PRjbtkrhRodBqWCeJcT98eDxqZPQbSnuMHQQBKljJ41UMDPQbZGF1ir8unXa+RubZiqY5K496LY0Rz/9DTFqPL6ZTTyw71s3FlLBXG/R39j6IbBggu9txsOMd42vb7MffwnbrkrhRodBqWCepZU+Yrk86SN0EQSZm/coFUwTlorD1cXf2FQlFYyf/obJPk8Bc/0O+n3rRthWF9WOmk8FQwKQ4BhudRiUCuZpyphAVhdBkEs9plQwTVjqJL4u/sZm6pQaqWD89DeUK6MUMN4wsdFeKhgSgEioqal5tVWrVr8Pr1u3bl1XW1t7sq6u7hi8xratUrjVYVAqmKcZmTTeiBu6iG5LcYehiyAI9e4q4mTCSXRbZGCpCZhO/sakKqlg/PI3xKaJFDCd0O9ZRxZSwTRf7YgEIBKY4Au99NJLXzNe72acy0ThRCYCj2DbVinc6jAoFczTbOzXQ7qTgzoJgvD40UYqmKvotmCzVAoY3fyN+nwVSQXjl78h0TgPwWCTfux71pGZ60a1oxGDW/Q3tn4IJJjQ+xS+QuoXJv4+ga/s26+wn3+EbFrFcKvDoFQwBebSH7EB47V8Q8e3pBowdBIEsYX1lArGYOEQ1lBt/Y1NFVLB+OVvmOTzFSo26ce+Zx1pNxUMCUAkMNEXf/nll2uY4Puf7PUJ+BnkBQQxiGxaxXCrw6BUMAVmbj8UW0ZD+qPb0rTD0EUQFFLBrEa3BZvl2p5O/sZmZLJ8IR1N6Ze/4aS5SAGzAf2edaWVCiaSbtbf2PohkGBCbwDjPwGZ8PtH+Fnr1q3/X/b9eWzbKoVbHQalgikwdeK0CBqfMRXdlqYdhi6CIHXslBA9s6aj24LNUilgdPM3NlVIBeOXv2GiwVPAsIkH9j3rSisVzKXy1Y5IACICDnwwtC7+nvEPMW2qBm51GJQKpsDE5i1iQF69Ct2Wph2GLoIgc+u+WGUdNhDdFmyWi7/Vyd/YTGzbbqSCWYFuSzn65W8INeApYNikH/uedWW0fn6LqWBIABIcw80Og1LBCMYWLhCNd+9+dFuadhi6CIJc6km+4e0f5Rs6tQ18KphyJ/B18jc2VUgF45e/rRQwiUfo96wrrVQwa9c2629s/UBQHG52GOExwykVDDyH8WPEc7gg1wlV3QSBlQqmMdipYMpNvHTzNyatVDCD+6HbUo5++Bti0kQKmM7o96szU0dPGNWOyqeCIQFIcAw3OwxKBSMoa4463QRBQWhfQbcFi82FXujmb9TnrEAqGD/8DTFpPNZ73Cj0+9WZmRstp4IhAUhwDDc7DEoFI3eVCt0Egaxb7X6yXAoYHf2NTdlTwfjhb0i7xGMhF9Sj36/ONFPBNHRpV3YcIQFIcAw3OwxKBVM0c5OwTq1ugqBw2Ca4qWCaa3O6+RubsqeC8cPfkHaJl7hkbQ/7fnVnqJeZCiZV1t/Y+oGgONzsMCgVjL3YDSzqJgjMdDvRmdPQbcFiuRQwOvobm7Eli8WK8245U8H44W9oazwFDGt72PerO2GbvblUMCQACY7hZodBqWBgQLZXyBuDugmCzK0HIjB/6AB0W7DYXNytbv7GpuypYPzwNyS35ylgbj9Av1/dWUgFc7Csv7H1A0FxuN1hBD0VjDUgHyifvwmLugmCXNpIBfNOG+niLf1ieLR58v6m9v7GZurUWZEKZvoUdFtK0Wt/w+EXKG8JbQ7KXWLfr+5MbNzUbCoYEoAEx3C7wwh6KphyOdlkoI6CINSnm4iTCSXQbUG5/24dxYQrnguEvzEpeyoYr/0Nh1/4/ffrgX6vQWBL4UQkAAmO4XaHEfRUMKHu74gBOZZFt6VUh6GbIIhMGCsE9/nL6Lb4TVhl5yEXPToFxt+ozzvzUb6h3Wt8FUzGVDBe+zt97oJYAZ08Hv1eg8CWDhSSACQ4htsdRpBTwcAqDB+Qu3VEt6Vch6GbIIgtWigmHHv2odviN9OXr4sBYuzIwPgbmzKngvHa34mdu0UM5NIl6PcaBFqpYMqkFCMBSHAMtzuMIKeCyVy9JQbkUcPQbSlFHQVBYstWMeFYJVfdZT9o5mSLLpgfGH9jMzJ5glhxPnsB3Ra//R1bvkykgNmxE/1eg8JQry5liwqQACQ4htsdRpBTwSQPHRED8rtz0G0pRR0FgZkKJhLAVDAt5WTT0d/YjC1bKq0I8trfkSkThfg9cx79XoPC5qodkQAkOIbbHUaQU8HE170vVqPWr0e3pRR1FASZ2w9FYPqQ/ui2+M1ICznZdPQ3NhM7d0m7Deq1vxsH9BKrUQ8i6PcaFBZCXPaW9De2fiAoDi86jKCmgoFtbz4gHz6Gbksp6igIIB1FUFPBWDnZ7jwMjL+xCVVA+IrzJPkOQnjpb3EARu5ayDoysXVb2dyTJAAJjuFFhxHUVDCw7c0H5Ot30G0pRV0FQahvd7Ey0RBHt8UvWjnZ2r3GB+cg+RuT8D/GdzjY/xy2LX76O3OnQeoUOLoydeqcmHBMnVTS39j6gaA4vOgwZE6G7CVDXdqJlc/kh+i2lKKugiAyMXipYGAbjg/I/XsGzt+YhFXmhk5tRDLk1BN0e/zyd+rkGSMJ9lT0+wwSs/cbRTsf2Lukv7H1A0FxeNFhJDZubDaDuY7MRtJiZaBXZ3RbylFXQRBbvKhsnIyuhEB8PiBPmRg4f2MT8rLxlf6b99Bt8cvf5lZkEE/bY5Kv9Hd4I9/Q/vV8LvPxM/7G1g8ExeFFh5E6dkqchp01Hb0B+cX0xWvi9PO4Uei2lKOugqAwOK1Et8W3e96+U8QGLV8WOH9jEyoz8FjfoyfQbfHL39ZhhL370e8zaGwc1NeI9W14xt/Y+oGgOLzoMKBQeNBOZpo52WIL6tFtKUddBUEQt6fgFCofkHftCZy/sQlJ7vmEY8MGdFv88nchHclV9PsMGqFfK3XanwQgwTG86DD4yUyJSyZ5wfiaNSI/2KbN6LaUo66CAE7BBm3CEZk4TgzIH1wKnL+xKWu+Ty/9Herd1UhInEK/z6AxvnpVyXyfJAAJjuFVhxG0nFFRMyfb8VPotpSjroLgqRqtAUkFY518DpU/+ayrv7FZSHY/FN0WP/xtlSTr0i4w7UsmlttdIgFIcAyvBgg4ts4F0elz6A3ID0J6hOZysslAnQVBY78eRiqYGLotXhNOn/Lch52az32os79Rn3/CTHbfHt0WP/yduX5XCN4Rg9HvMYhMX7pWsuY3CUCCY3gWNLxiuVi23rYdvQF5TXFS603jpFbpnGwyUGdBYGdLVBfC6VM+IAwfFFh/YxNO+/MJR0SeLVGv/J06clxsec+ZhX6PQWQ2mhETjh6dnvE3tn4gKA6vBghIycGXrRctRG9AnjfQZnI1yUSdBUFsiZEKZrf+qWDg9CkfkGfPDKy/sRkeP1q6QxFe+RsOu/BDL+vWod9jUBnq1kHkmI3nnvI3tn4gKA6vBggoXs1XKcaPQW88XjN16qw4hTptMrotzVFnQQArzXzCsfLZkkm6Mb7ByLP53nuB9Tc2CzVa96Hb4rW/o/Pmins9dAT9HoPK8Ohnq2uRACQ4hlcDBJwWkz0xsltUJQ+dzoJAFRHuBq0B+eDhwPobm1aNVokmHF75OzxqmIhvvnoL/R6DylLVtUgAEhzDqwECgtMhSJovWyceoTcgLxlbWK9EklSdBUH2nrkN3wfdFq9pd0DW2d/YlHHC4YW/eT9ulrjUvB+XmYmNm56prkUCkOAYXg4QQZk5QvUPvjx/6Rq6Lc1RZ0HwdMkkeQ/iuMFQVzMeqPkBWWd/Y1PGCYcX/s6Gk2Inp3dX9PsLMlPHTj5TXYsEIMExvBwg7G5VqU44ncUH5GgG3ZbmqLsgUCEVj1NaNad7dmrxvbr7G5N8wtG+dI1WLHrh7/T5y2Klc8JY9PsLMjO3nq2uRQKQ4BheDhCJjRufWbbWjblYVgzI3Tui29ISdRcEMDvmuSePyZuM2ymtnGA2ak7r7m9sNg7qIyYcd0Potnjl78TO3SLWcekS9PsLMktV1yIBSHAMLweIwrL1DPQG5BXTl2+IAXnMCHRbWqLuggAmGjz3JJt4YNviFSupOa27v7EZmT5FTDhOnkW3xSt/x5YtFW1qxy70+ws6G/v3FLknH0Ytf2PrB4Li8HKAsJathw5Abzxe0RyQowvmo9vSEnUXBBBqwH0xby66LV4xvnp1ybqgQfQ3NuOrjBqtW7ai2+KVvyOTxov45nMX0e8v6IxMmSB8cea85W9s/UBQHF4OEKWWrXVjJQMyNnUXBIUarUPQbfGKkelTxarTidOB9zc24dQ/X41d2PJqrB/0wt+hPt1arDlN9IfWauz2nZa/sfUDQXF4PUBYy9YPIugNyAtaA/LJM+i2tETdBYFVtL7z29oWra8k7kx3f2MzffGq7XhMP+i2v3l7gprTGrcnlWjFYy5ZbPkbWz8QFIfXA0RkykQhkIxla90oWyB4cwyCICisWCTQbXGbcNoUTp1Cuhs7K+pB8DcmKzmR7Qfd9ncQVtRVItQ55yeyJ461/I2tHwiKw+sBIrZiuVi23rYdvQG5TTEgv8GpwhZ3EARBZOI4ESfDOktsW9xm5vZDEVM7uB/5WxIWcjLm0G1x299Q+o3H1L47B/3eiJ/ybXg+4WCTXNPf2PqBoDi8HiCSu/eKZevFi9AbkNuEVT8+IA/qi26LHQZBEEC6Cl1PLZZKBht0f2OzVI1WLLrtb6g1zdN4bdD3VL1KhG142I6HbXnYnicBSHAMrweIQiLRMegNyG1C3B+/txlT0W2xwyAIAp3zlsU3bBADMhuYyd9yMFo/XyS733cA3Ra3/Q3pu0RezZPo90YUDI8YIkKOrt0mAUhwDq8HiGw4pW0pITj5ywfk1avRbbHDIAiCpnEyOjE6d7YQG4eOkr8lIaSA4X3AqpXotrjtb6g6wcXGbX0r66jG4upaJAAJjuH1APFUMfHkh+gNyNXGuMCY/e8/iG6LHQZBEGQb9a1dGh4+SAzI1++SvyVh6tQ5MeGYOgndFjf9LWprv5lvaKd/bW2VmNi4SUw41qwhAUhwDj8GiPDIodayNXYDcvW+xowQ8T+X8eN/7DAIgoDHyZgTjsQjdHtcva9ObUT8T+oJ+VsSQnorHgfcvye6LW76O3u/UdzXwN7o90UsEPJ/8gnH9KkkAAnO4ccAUbxsjd2A3GSoW0chNGJZdFvsMCiCIDxqmJhwXL2FbotbhPJPfEDu14P8LRG5MH+nMmHuFd30d+rUWSE0pk1Gf8bEAq2DhwP7kADUHF+qqamZV1tbG2J8yF53L/fGurq6KOM99r5rjFfZe1+xexE/BojEps3GsrUasXJ2mI1mxFZjDzlygNlhUARBdP67YsJx4BC6LW4xdfoDMSBPmUj+lozW1vwNe1vzXtFNf1uxjatXoT9fYoHFW/OPsh+RANQVTNC1YWLuMLz+5je/+Vsg8tj33yrz3nDr1q3/sJrr+DFAQLF0sWw9Bb0BucX0hSsiSep4dU43B0UQFMfJYNvi2j1t3SZON69YQf6WjJUezvGKbvrbim+W4HQz8Wmah3Oytx+QANQVTOztqampebXo+6mM40q9lwnAyEsvvfSdaq7jxwCRvR8Wy9YD9IknaVqWRwUGRRCkjp8SE46Z09BtcYuxhQvEgLx3P/lbMlaanscruulv1eKbg8To7JkiPc/R4yQAdQUTdTeZ4Psz83smBruy71eVeW+E/e46+3qDcekLL7zwVbvX8WOA4MvWHd/KN7R7LZ9L48bJuEUr4TATgti22GVQBEHmTkNFFTNUYHjsSDEgX7xG/paMqWNiwhFFnnC46W/V4puDxPi698XYs/59EoCqggm2c4yPisnE24fwlYm9r5cQgN3KCUB4v/HyK+zvprD37bVrB3QYjx+LzsNLmnEy2Zt3Pb+WH4TE1jzu58JldFvsEvzsl78x+Shr1Mxt/wZ/jW2PGwx1NwbkeJb8LRmzdwsl+jDtcMvfuahZ47gz+rMlPktY+eMTjjkzSQDqikq2gIvRqlWr32bv+8TudfI+Ibuknv/Tfnr+rF+X9BTh3l34/Xz2k0+xTSGUQGyoiJP5eSaNbYpjfPaTn4h4016dsU0hlMAXn32Wb+jwBie8Vh0/fXhfhBtMGYdtCqEEfp5MiPCjkYNJAOqKurq6tsYhkC+bh0CYIPyDpu974YUXfrV169a/YX7P3tOP/d0Ju9eBfyg/VggSGzcacTJr0WdQTpmLmSeA30G3pRIGaUUItuP4lunxU+i2OGXm4lUR0zhuFPlbUsLqH9/huPsQzQa3/J3cvceIb16E/lyJz/JR5iN+ChhOA2965ZWvuKM4CLLhy0YamEbGBiYAe5i/YD//PuMSeP3iiy++BKlfimIAtzNB+E27F4EOg/9TeRy3YCWw1CAwP33hqnECeDS6LZUQ/OyXv7FpFbJfvx7dFqdM7t4rBuRFC8nfktKccEA8IJYNbvkbDrapFt8cNEKCbvDRw9d/0NoL8UEICPwaIIoTWGI3HqcsniFj21IJgyQIUkeMOJnZM9FtccrY8mViQN6+g/wtKa0Jx4YNaDa45W+Y2PLV8wtX0J8rsTShEggXgG3+8XvYGoKgMPwaIAongV/P59Jq15a0TgDv2IVuSyUMkiDI3HogJhxD+qPb4pSRSePFgHz2AvlbUkIOQD7hmDsbzQa3/G0dOIpm0J8rsTShqIIQgK8MxNYQBIXh5wDROGygODl76z56A3LCyISxYkA+fxmDXl/AAAAgAElEQVTdlkoYJEEABezhFDAwl/kY3R4nDPUSB46y4ST5W1JCFRAeFjJ8EJoNbvg7G05ZJ4CxnymxPKGsKheAbX+4EltDEBSGnwNEdM4sESdz5Dh6A3JC6Bz5gBxJodtSCYMmCMzA/MztB+i2VEvIw8YH5G4dyd8SE/KbQj1gqAsMux0YNrjh7/QHl0SsNpvkYj9TYnlmrt02VgB/eB5bQxAUhp8DBATk8ziZdevQG1C1tAbk7pUPyNgMmiCwMuYrPOGwDhyNG0X+lpyN/XuKieH9MMr13fB3YvtOEd+8bCn68ySWZy75IZ9wPGz76iNsDUFQGH4OEKljJ0WczKzp6A2oWqYvVj8gYzNogsCacCCX6HJCJyUHg+ZvbEKtcz7hOHEa5fpu+BtOmvMcgHv2oj9PYvNMbtuWf9DmlX7YGoKgMPwcIHQo0WWl5Fis1glgYNAEgSwlupwQTprzAXnXHvK35IyvXYt6EtgNf1s1gC/ZLzlIxCH4GVs/EBSHnwMEBOPzjPntX1c2MB+2RsQJ4J3otlTTYQRJEOiQeghWmkUN4Kvkb8mJnXrIqb9zuU/yoa7tjZKDOfTnSWzZ39j6gaA4/B4gIC2HCMx/iN6AqmFkonEC+INL6LZU02EESRA8nXroCbo9FdvPB+QOYkCOZcnfkhMOG2HucDj1dzYUF/HNvbuiP0uiPX9j6weC4vB7gFA9ML+QkkOtE8BmhxE0QWClHrpxF92WSpkNJRwNyEH0Nyaf3uHwP9epU3+nz5wXJ4Anj0d/lkR7/sbWDwTF4fcAEd9g1AReuxa9AVXKQkqODui2VNthBE0QRN+dI2LoDh1Bt6VSFgbkCeRvRWhNOG7e8/3aTv2d2LpNxDevWI7+HIn2/I2tHwiKw+8BInXyrBjUpk1Gb0CVEkojqVgDuLjDCJogSGzcJCYca9ag21Kx7eaAvHIF+VsRWhOOg4d9v7ZTf0fr5wvb9x1Af45Ee/7G1g8ExeH3AJF9GBVxMn17oDegSgkHP1TOkRVEQZA6eUbZCUe0fp4YkPcfJH8rwsSmzWLCsXq179d26u/wqGEivvnKTfTnSLTnb2z9QFAcfg8QENje0KWdcdLsEXojqoSxhfViQN67H92WajuMoAmC7IOImHD074luS6UMjxwithOv3SZ/K8LUqXNiwjF1ku/XduJv3i93flv0y8kP0Z8j0Z6/sfUDQXFgDBDhsSON1BZq5ZoyZ8iZq7fQbam2wwiaIOADW6c2PGt+LvUY3R7bdsMJZod2B9Hf2Mw2xESccJ9uvl/bib9V3pkJKkkAEhwDY4BwktwWi24MyNgMqiCwVtIUEu5QTowPyAN6kb8VIuYOhxN/W7HZCCuXxOr9ja0fCIoDY4BI7t6jXDWN7L1GY0DujW6Lkw4jiIIgtkC9rXsoJ8YH5OlTyd+KEauahhN/W2UTFczOEFSSACQ4BsYAkb58XZymZR0ldiOySx3KigVVEFiHd5YuQbfFLt1IlxRUf2PTqqe7298dDif+hvrsKudnDSJJABIcA2OAyCUe8a1UCDqGLRPshmSH8XXviwH5/ffRbXHSYQRREKQvXBUTjrEj0W2xy+gcI2H64WPkb8WY2LlLTDiWLPb1uk78DTsbPEzibgj9+RHt+xtbPxAUB9YAAacyeUWNBxH0hmSHkZnTxIB8/BS6LU46jCAKAojFAt9BbJYqE47GQX3EgHyngfytGK18oeNG+Xrdav0Np375hLxTGx7rjP38iPb9ja0fCIoDa4CITJ8iBNWJ0+gNyQ4hGJ8L1vuN6LY46TCCKgjgdKMqEw44ZMQH5HecDchB9jeq/8yKQV07+DrhqNbf6cs3hGAdNQz92REr8ze2fiAoDqwBIv7ee2JLdf169IbUEgsz5LZKz5CDLAhUmnCkr7gzIAfZ39iE+s18wtEQ9+2a1frbOpS3aCH6cyNW5m9s/UBQHFgDROroCXGoYtYM9IbUEt0akLEZZEFgTTgUiOF0a0AOsr+xCelU+ITj5BnfrlmtvyEbA9ia2Lkb/bkRK/M3tn4gKA6sAQKCjXlalYF90BtSS0zu2ScG5IUL0G1x2mEEVRCkjp0UaVVmVJ9WxS+6dYo0yP7GJsaEo1p/h8cMR0lbQ3Tub2z9QFAcWAMET6zc8a18Q7vX8rnUE/TG1BzhNB+fIe/YhW6L0w4jqILASqysQEm4Qk3WG+RvRWmmjXKSx9EPf1sl4CDBPZWAU4okAAmOgTlAqFKhITzamCFfvo5ui9MOI6iC4KmBLiFvDWo+MXrHnYozQfY3Ns0a1KG+3X27ZjX+hkNtqkyMiM/6G1s/EBQH5gARW2hUaNi9F70xlaM1IPOVSjVLwBV3GEEWBFaFBolrUGfuPBQD8iDnoRFB9zcmYcIR6tpelISLZX25ZjX+tkIjFE5wH1SSACQ4BuYAAbWAZT99lrn9QAzIg/uh2+JGhxFkQWDWoIZEvdi2lGPy8FFxOGrOTPK34gyPHyMmHB9c8uV61fhbpWwMxGf9ja0fCIoDc4CArV9+unbEEPTGVI7Jg4fFgPzuHHRb3OgwgiwIYKVZHOapR7elHOOrVwmRumkz+VtxxlYsF77cstWX61Xjb5XSIxGf9Te2fiAoDswBIpd+km9o/3q+ocMb+VzmI/QGVYqx5UYnvnUbui1udBhBFgSFCcdgdFvKMTJ5vBiQz5wnfytOa/I4d7Yv16vG3xj5Conu+RtbPxAUB/YA0ThsoDgIcv0ueoMqRSjnxLdxzl9Gt8WNDgPb35jMpT9iE443OOE1tj2lGOrZSQzI4ST5W3FmbvkbPlKpv+F/jB9UYf9z2M+KWJ2/sfUDQXFgDxDR+vniIMje/egNqimtk6MQyB2X9+RoJR0Gtr+xGR4+SEw4rt1Gt6Ups43uDsjkb1w+nerK+wNklfo7deqsOAAyZSL6syJW529s/UBQHNgDBOTW43FZSxahN6imzN4zUiQM6IVui1sdBra/sQnJvN1IsuwFIQ6LD8hTJ5G/NWF45FBXcjp64W9IUs0PgLz3HvpzIlbnb2z9QFAc2AOEzIXIU0eOK1Ouzm6Hge1vbFoHQRbIdxDEOpG5zp3qEeRvfFpVXXZ5P+Go1N+RaZN9L1dHdNff2PqBoDiwBwioAgJbJLBVAlsm2I2qmNaJzI2b0G1xq8PA9jc2YeuXr+oOG4huS1NGJk8QA/Kpc+RvTejnhKNSf4d6dRbxpqEE+nMiVudvbP1AUBwyDBCNQ/qLuKyb99AbVTEjE8eJ7RsXTmTKQBIEn/LT5nDqHE6fwyl0bHssuyBxcLeOYkCOpMjfmjBz/Y5vE45K/A2ij8ebMhGI/YyI1fsbWz8QFIcMA0R0/rtim2TfAfRGZfLpATmNbo9bHYYM/samWYIwfeUmui0mvSgdRv7GZy7zceEgiMe1divxN2z7uhlvSvSfJAAJjiHDAJHYvkNskyxdgt6oTGbvh32v5elHhyGDv7FpxmXJVBGkEG86nfytGa0ShBeuenqdSvztdrwp0X+SACQ4hgwDRPrSNekOgiQPGSW5ZutxAMTsMGTwNzYh5RD3bf18dFtMxlaucK0CCPlbLlrJ5D2uCFKJvyH1i4g3PYv+fIjV+xtbPxAUhwwDBD8IYlYEkSRBb2zZUm0qgBR3GDL4G5uZG3dFXNbQAei2mLQSjrtYN5b8LQet+s4eTyYr8bebCceJOCQBSHAMWQYIqAfsV74sW/aMGibsuXgN3RY3OwxZ/I3JQlzW674k6G3RHkgYDAnH3/6RqwnHyd9y0Awnaezbw9Pr2PU3lH3j4S29u6I/G6Izf2PrB4LikGWAgPg/vuK2bTu6LeKk6JvipGhKnpOibnQYsvgbmwWB721clh1mbhslwwb1IX9rSC9OeDvxd+roCXEAZPpU9GdDdOZvbP1AUByyDBDJQ0eMbZKZ6LZkrt4SMYnDB6Hb4naHIYu/sWnFZW3egm5Lcv9B8b//7hzyt6a0Yu5OehdzZ9ffsRXy/O8TnfkbWz8QFIcsA4RMp26t8nSL5StP57TDkMXf2LRWQWbgr4LEliwWA/L2neRvTQmnbb0uu2bX3+HRw6VZ/SY68ze2fiAoDlkGCL5N0v0dsU3SiBuYDCsxPC/h/oPoz8XtDkMWf2MzGzLioHp24v97mLZAkmCeCP3qLfK3pkydPicmHJPHe3YNO/6GQ3ZWInSNwluCSBKABMeQaYCwalMeO4VqR+PA3mJAvvMQ/Zm43WHI5G9shvp0ExOOBxE0G3KJR6IU4jtt+OEU8reezEYzYsLRtYNnEw47/k5fvi7CW0YOQX8mROf+xtYPBMUh0wCR2LhRbJOsWoVmA1T94B11l3boK0NedBgy+RubEG/KV3oPHUGzIX32ghiQx48mf2vOxgG9xMTytjcTSzv+hrRWPLxl2VL050F07m9s/UBQHDINEJADjQ+GY0ei2ZA6cVrbEkkkCJ4mnDjHrkBjxYatXUv+1pxWycvdez35fDv+hkozfJfl8DH050F07m9s/UBQHDINEFArk2+HdXzL9e0wu4ytMCoybNyE/jy86DBk8jc2oRYw9mnvyMRxYkA+fY78rTmtCjQun/auxN+Q+4+HPTyMoj8PonN/Y+sHguKQbYDwKiDeLsMjh2qXALq4w5DN35jk+R7NhNBs8uH79YsTQMey5G/Nmbkb8jQhdEv+BtHHw1t6dUF/FkR3/I2tHwiKQ7YBwkoIjVCCja9A8pJ0b0pTks7tDkM2f2PTKsF27qLv185cN0rSDelP/g4AeaaDHkYJtoa47/5OHjysXX3zIJMEIMExZBsgrPxs0yb7fm0ZYhC97jBk8zc2IS+bVzF4LdHKN7loIfk7IIzMnCbiAA8f9d3f0QXzxeR6527050B0x9/Y+oGgOGQbIKBUknUKN/tjX69tBeSvWYP+HLzqMGTzNzYxRT+sxHAxcOAQ+TsgtA4eLVnsu78Lp5AfoD8Hojv+xtYPBMUh4wDROLif6Kiu3/H1upGJYz0LyJeBJAieJSTDFYlx32CvH/t3XZ74vKNn24HkbzlplplsHDrAV39bic+7v6NdequgkgQgwTFkHCBiSxaJrQo2W/brmvxAQKc2IiA/nkN/Bl51GDL6G5uw+ud3HGDm5j0hBAb2Jn8HiPzgT6e2op+JZnzzt1VrfRbF/+lCEoAEx5BxgEgdOS7iAKdP8e2a6QtXtc+QT4KgNDHiABPbd3ga/0f+lpeQY5TvNBw94Zu/YwvrxaR6xy70+ye6529s/UBQHDIOENlwqlA2yac4QEsErFmNfv9edhgy+hubsPLndxwgTG64CGCTHfJ3sGjFAbos/pvzd+MAo7zlLYr/04UkAAmOIesA0Tior69xgOHRw8U24AeX0O/dyw5DVn9jEmL/IAbQrzhAmNTAISce/xdJkb8DRhBhfPu/f09f/F2I/+tI8X8akQQgwTFkHSCsfICbNnt+LYj5syqQpJ+g37uXHYas/sammQ/QjwNA1kEAj/L/kb/lJj8A1LOzmAA8iHju7+S+A5T/T0OSACQ4hqwDROrUObEtN36099cy6/9OGo9+3153GLL6G5uJjRvFttyypd5fi01q/LgW+VteQjk4ngJozz7P/W2lG2JCEPu+ie6RBCDBMWQdIPi2XIc3eWWOXOKRp9eyVhs3b0G/b687DFn9jU2rKscA707lmrRWG0+eJX8HlMn9B41VuZme+puHG3RtL1YbQwn0+ya6RxKABMeQeYCITBwnBsoTpz29TuPAPka84V30e/a6w5DZ35h8alvufqN314llee1hHm7gcbwh+VteQu5HHpfXraNrB91K+Tt96ZqY2AwbiH7PRHdJApDgGDIPEFAP2OtUGTDY8464RyffK49gdBgy+xub0fnvGqWydnl2DSvF0ZSJ5O+AE2JA+cGzy9c987eV3WD1KvT7JbpLEoAEx5B5gICSRVyc9e3u2ek1MyVDtH4++v360WHI7G9sWuJs6iTPrmHGfnkpMsnfahBKTropzkr5G/KacpF5/jL6/RLdJQlAgmPIPEDwbbk+3Yz6lQ89uUZkwhixzXz8FPr9+tFhyOxvbIrt2dfyDe+08eQ0OI/HMsu/uXj6k/ytJtNXbort2UF9PfE3r6v+9o/yDZ3f5pWOsO+X6C5JABIcQ/YBwiwLF9+w0fXP5ulf2r/OD5vkkh+i36sfHYbs/samWRbOiwMa6cs3xIA/uB/5mygmBEbcaeZuyHV/wwljvrsxcxr6vRLdJwlAgmPIPkBYVRpGDHb9s5OHj/oWjyUDSRC0TDPuNFo/z/XPdnvLj/ytPq0SbVu2uu7vyJQJIv3LoaPo90l0nyQACY4h+wCRy3zMS8J5sW0WYTNj3kHu3ot+n351GLL7G5vZh9FCGUL2v+fW50I4Q+OAXkbQ/w3yN5Ezdeqsa2UIi/0tdjfeyDd0eIO99jaNFhGHJAAJjqHCAGGdzty23bXPhNyCkIoDUnJkoxn0e/Srw1DB39iE1WYu1M5dcO0zoaSh1weayN/qMZd6km/o1IbH6jnN01fs7+TBw54faCLikgQgwTFUGCBSJ8+IWfKoYa59ptVBTta7+kfTDkMFf2PTqgqysN61z4yvXi22f1etJH8Tn2J07mwxwd26zTV/R6ZNFrsbe/ej3x/RG5IAJDiGCgMEnGALdevgWrA0EGbGQSuPRILAHrP3w/x/o6FLO75C4/Tz+Pbv/9/emcDYVZVxPJ3GanBBYktx6mxvlohYjSZCNKiIWyQQQtoOUuiMliJQaEVLK9oqlUpAg8AAIosQaMWyFNtoldJNCGtbOthFusy0nX1rgWJcGlzG/3ffucNlfDPz1rlz3/v9ki93Oefcd+47d/nfs30L5sWv35d3U97Y22zA7eWSa7JS3r0tnW8NbmvtCf38sNwYAhAyJiovCN9dW9uKFRkfq+eg/4C8sKAekAiC5G3AXduGzRkfq2tLo3MzN3/Umn8p7+iY18/ZTQ/U/ZemjMu7Y/Ua52buptDPDcudIQAhY6Lyguhu3BXvQ3XV3Iw9dpjPX+8BeWv2/HBGwRAEyZs1nWVrhHjL7Q3xJr5HHqW8sYTWes/d8Q/c5Q9mXN5+H1arWQz7vLDcGQIQMiYqLwivGW1R3Gdv57MvZnachd92nfy3hn5eo/3AiEp5h202cjI+SOiC/p6m1vSPY5NL+4ONMuzkT3nnrw0MErrikv7ervQmbbZyPtbW8pZryyyOYsfGniEAIWOi9IJod00bmYxs69qyPd4ct2DeqDbHjQVDEKRm5h4w01qZ9jW/i1+zP7uB8saGNRvklsm8fd70L/e5ifOXLw/9fLDcGgIQMiZKLwivVuZb9d6UCekOBvFHx7U/+ljo5xPGAyNK5R22de94JV6bMvfitAaDWFcFf/BH5zOj3xxHeUfLOtatjw8GWbokrfQ2+KN5zkXx2uamttDPB8utIQAhY6L2gvAHg1ifmVTTdu/aFx/dab4xC2jwR/CBEbXyDtsOLrs2XiuzNvXJwjs3/ile23zNglBqmynvaJn5n7YmYK97ytbGlNO3r1xZkH2bC9UQgJAxUXtB9Ow54PXLshG85rUhlbT+hNKjORfbWDIEQermz0HpDT5KoW+WCb6DixfFxeO69ZQ3lpRZy4TXZeD6H6eUzj5omy/7ZnwkcePO0M8Dy70hACFjoviCaLnzjpQn6u3euect4dhcmM0jCILUzRNyP/x+vNvA6jVJp/P9THvCsTu9Tv2Ud+FZb8fh/ua5c1KuBfT9THc13ER5F4ghACFjoviC8Py1SshZXxcTdiPF917iy5Zm3KE/6oYgSM9stHh8hOac/t4k3AZaf0ETfl7t34b0OvRT3oVrfi3ggR8sTGokr/c8vCTuTu5YexvlXSCGAMxjampqzpJtq66uPqblzcPFraysrFKc52T7FH+L7ORkfyeqL4i2Bx+Id5hevGjEh6SNqvNe4PMu9XwAh533MB8YUS3vsM3mA/T6VzXcMmJc+8jwrs1rF4c60pzyjqZZVwN/yquR3MPZ9eV7NWq94zbKu4AMAZjHmKiLxWJTJeauG0kAKnxTVVXVLFtX/Gna3prs70T1gWG1LAcWXjWid5CevQc8l16ZTK+QL4YgSN9sLkAbPDSSd5CuF7Z5NTHmaWY03b5R3vll/nRV5s5tuOvInxrLmo17W7oo7wIyBGABIGF37XACUOGTJPqOarXI36f43bJYMseP8gOj66UdcZduQ4zStL5+5n7Lq7m57dbQ8xu2IQgys44n1g+8lE3oDQ63F7X/sTEWphmivKNtrfffFxd38y9LOO1V56anvG4w9sFh0wxR3oVlCMACIAkB+EmF7wnus2Zg7T8jmeNH/YEx8FK2JpC7ftnfs++Q15Ha+l41z790YF6t3s4joec1bOMFkbnZCHLvept9YX/bw4/09xzq8kZgejUx1g/LPjbuuG1MTDJOeUfbrGuL3/Wg+fLZnntCe7aZRxnvOrSaZvvYeGwV5V2AhgCMMBJpz8v6giYhd9gtp/jx0hGA1gScigA8ciR+MUXVOp/cEB8U4oRg0A7d+JP+vvbe0PM4FszKOR/KO0zr63ujv/2hhxJea95HyL339Pf1vB56Pinv/LC+7lf7WxpuTny9zZ7Z36EPD8q7MM3KOW0BAtEg103A+cL+mdNi++rP/9X+utr2pvra17V8en/djJlLA/8LQLbYVzfj1P31taua6mp7da0d0fravXW1Xwg7X5Cf7K2bfu7++vM36jp7VctOLX+9t27ax8LOFwDkEBOAEni3DBdHYm+zrN7Fn57KIBAAAAAAGCNUVlaeKeHXbrV7sjdkbbKzLUwi7xzZPX7cWCxWY03KNg2Ma/49JbycAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA6tTU1Jwl21ZdXX0swRyD46qqqm5XWLNsv9avCCWTkDPc1EI2+Xij7GVdAyvCzhNkF/MlrnJ9zmYGMM9AspPDzhPkDpVzizkEsPvZ7mvd4zPCzhNkD5Vpg8r3kJb/raioGJj/kfscUsYumlgsNlUXy3WDBaC267R/g62XlpaeYA8WLqr8YqTJxSH6qHw3qZxn2bru32nMDZrfqHwP2jM97HxAblDZnl5SUlJs5RwUgNznkDaJhIAuorXaXxvY/qkJxdHPHeSKZCYXh+iCd6DCw2qHgsIA8pNgOXOfQ0YkEoDa3qmL6rRAnMu1/cBo5w1yhxOA7a75d2OyfqMhGiTyD27NQ5Rz/uKaB/+s5Q7ZvcXFxRPDzhNkn0ECkPsc/h/zCuL6eA2YLpTDbjnFj5ekAJyLAIwWI5V/ZWXliYo23uJq/TPa36tlScjZhiyR6MXgPASdEVKWIMeobD/kVserrG/UPf2HUDMEOWEkAch9DklDEzAYKt91ug7OCzsfkB1oGipsysvLTzL3oWHnA7IPTcCQNRL1BdPFU+8GgRT5g0DwLZxfBGuBY7FYtT00bGBQmHmC7KIy3Wz3sq3r/p1O5/D8pbi4+Djdx8f72yrv7+oZ/lSIWYIcMbivJ/c5pIxe9me6PmBH7UtR1iY72wUXuWlgDsiadEFdGWpmIetYk75r6rc+gNuo/cs/JAhqrCuATQ/hmoX4iMtTysrKKtyUTn4fwNUq/9Kw8wXZQ2V7l72zVbZv2ge7TdFm+7nPAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKLmwD+hWTiugnkV6bzO0r7eZvHLJ20AAAAAJBFnAB8Ppm4TgD+Jp3fcQKwK520AAAAAJBFEIAAAAAAKSJBdLW5VJS4+auWzRI6tYGwReZaUWGHtfxtWVnZB/0w8+3p0m7X+t+0XFVeXv5+pX/Q3DSaay+tf8SPX1FRMVn7HlZYj6zVxNhQeVK8NYpzdyAft8ieHCLu2wSgtn9ux7fzkb2k9c/5YU4APq79K9z57gqGT5w48b0B11Vd5lpSuye4tAhAAAAAiD7OH+ffKysrq2zbRJpE3IdtXfu/IcFzUHGqJX7eqe07tf2Mn9YEoPljVvyTSktLT3A+Pfcq3pcVPE7LhoBos+0tsuu0/g5LY8JRx704Ub6mTJnyAYV3KPxcHfNLJhotb4niDhaAWr/A8qPVIq3Pl/Xq995lYSYAzSep9s20cK3Xaf11nePxLu3jsvsmT578bsV9n8Kf0PYylxYBCAAAANFHgiZmAlDL83yR5KP9G2Tz/O1Jkya9x8RTWVlZhUtrArAuEL9B23/0tyWYPq19fS7uqbLO4PEVfpH2bRoqbyYkLb3VxinuOcOcw7BNwAp/Tek/4X7TBOC2Qb/TaIJQYZPs/Ez8BdJ+1mpAXVoEIAAAAOQHEjbTJXKesmZb2e+tVtD2a/2VwcLLRsEq/HS3fkjhXwmE3aA09we2P67tf7jfmKHtf5kYM7NaN9lRre8cJmtFrlZxz3D5T9AEvMDy7n7D7N+uVnKgCXhQ+tXat1Dn9Skt/+Pn0eXzqP0vLi0CEAAAAPILqwF0zbZP2/ZQNYCKV27bqQhALU+z5uRU8qNj/8imd7EaOq1/Z6h4QQFoNXayI4p/SiD8NT+fQ9QAbrcaQGti1vKYdo0fIj8IQAAAAIg+Vtsn+6L18dPmeC2vl8jZbGHWB9CaP60PoIlD7f+F7Fk/bZIC8J9us8j1AVxSXFx8nLbHWb/D4ACMIE4wvmrNzTaQxGryFP+jieIGBaDifM1qKd1glQnav9hqHgcJwDdlX3fnO8uObYNX3O9aH8A7/W0dr0RxvurSIgABAAAg+kjcTZXgedGN2rVmz41+E7AYJ9HzPau5s1o1G5lbUlJS7Ke1/cnWABoSUyfaCGHrC+iaZrcHRxz7WB88hTWZsPP3WU2kay6eMDj+oCZgaza+152P/c7VwXy6JuBV2rfcjQLebcLOP5bVcrq+jC2u+Xe31q90aRGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+pNm0AAAAdSURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh8D9DhEvBblylkQAAAABJRU5ErkJggg==\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\") as figure:\n",
" figure.plot(np.sin, label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9B5hcx3UmSklOz2uv7ffElU1LIgjOjC15rbdrr+33vreWvX6Ou9Lb3U8mJSaACETOOeecQWCQMwgi55wziJzz9HSOIECK1FqybJL96lTde7sx6J653Tecqrrn/77/m56Znr7n3jNV9VfVqXOee45AIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUBwGXV1dT+pra39bgvvidTU1LR3ch12jdmMOfZZn7LP+gMnn9US2Of/BbvWF+zll938XPaZf8Psv8++fsK+TmZfX2df77l5DQKBQCAQCIRmwQRIOxA6TPBMaum9TKi0Ze9NNPeecsLJqQBkf/t/sc/951atWv12tZ9RDuxzVzL71jS5HtzH58+5LABB/LHP7ufmZxIIBAKBQCBUBCZILjKh84gxy779xebey97zNmO8ufcwcfOXhnD6SpPrOBWAb7Z0bRsoeX8+C8B/ffnll//Kzc+0gWb9SiAQCAQCIUBo3br1fwKRw8TO38LqGmxHNvPe/8x+/zPGz2DLF7Zh2evX4Hew4geihvEb7PVP4TPN97DPHgLvaSoAW7Vq9fvsfbtBeMKqIvt9/QsvvPCrpa7Nfjem+Nrs6y3Dpt9gn7kE/t4QsXvZz+rMv2O/G83ef5r9fBz7mmJfb5f47KGM/8L48yKbv24KQMYfsJ89gC1bxkMvvvji7xR9/i/Dyin7eYi95wn7eoLxP5R5frWG7fCZP4XrsOf1/zRdVX3++ed/jX2/iv38MQhexl7G82ljXPOZFdamn2EI2o3s6wLzucDPv/GNb7zAXq9jTBrPfR175l8t53MCgUAgEAgaAoQC4xXj9XomGs40935DaDyzCmcKQHhdtHL2pSZ/awnA3/3d3/0/DGHSi337C1//+tf/dxBXjIsruTYISPbzo+xzn2eC8leMGMG4KSQNAfgv7GfD2be/BO8p9xzKrAB+wX6+FkTZV7/61V+H5wPvLfq7VUWi8Mvsb7pBjCII03L3YTyr/1LuvtjrFYznX3rppa+Bvez3Sw1xWiwAn1qZLPEZK42/acu+/Ypx378EsYbsd1Phe3hG7LNWg/3lbCUQCAQCgaAZmAj4TTb4/xMTBZ3gexAlICyYePnDcn9ToQAsGwPIvvZtKjZhNQxWIZ9rIhzLXRtiAY3r/vuit/0Ce9+H7PNfNa4zuqWYRcP+slvA7Oe/W/QzEHh34LUhYuH6NU0+62FzK6nFz6rEfX0JngG7zt+Zvwfhaax8VioAzxZfl33/P5s+C7g3sAdWBpt7PgQCgUAgEDQBHESALUlY3TJ+9CVDvCws9zduCUDYmjRWqD4yyX72YxCkxVuszV2bCdU/ges03TZm77vMfj7AsGV0S6uahj22YgCLbWCv/9RYISy+h4/Z1//Fvg5q5lplBSD7+b+D3zN+q8k9fVipAGR8r8l1B0H8YVN74ZnDAZuWnhGBQCAQCAQNAHFthghLM2aAxorgp0Wi8CkwofBWSwKQ/f2f21gBHMW+P1KhvaVWAJuuWH4FtpbZ579iXAdWAE+19NnsPcsrFYDsut+sFfGTX6/kPuysALLf/32RHf+2yQrgH8F1YWWw6DOGlVgBfOp+4O/ZzxsqsZVAIBAIBIJGMA59wGGE78KqUxFrYFWQ/b57qb9j7/8bOMAAMXtNfm6JGjjsYAijbxe/p1gAwmERODQBW6rss/4382fs+/9ezuZyMYAQwwa2w+ew98yEbc6vfe1r/8a4T1sCkL1vorFl+uWin9lZadvKuBPEIHwPogzEG8TvlbtWCwLQjAE8BwIXVjfZ60XFMYDGIZEfG6ucIBj/AzzblgQg/B37WZT9bhyISvgZPDdzu5xAIBAIBILmYCJgG+OBMr+DgxTPnJY1ACtscFjksbGN+CPjbz4vFjW1hYTNH5nboex1uPgUMJzWBTtgBdLYirxtHNYoiVICEOIYjVPASWObdB8TX79n/t6uAGR/8yIIQHNrtPgU8HPNCEDjFPCoolPCcLp2S3O5Cps+q6afWXQKGE4Vw+nmnozZYqEGQhlW84yT2HvhpHVLAhAA2+u14uBKzBCRD9nfzmvp+RAIBAKBQCAQfIRxWAdWa/8M2xYCgUCQBqxTnGtsf3zBZvHfKfc+NsvtYAS4N9SKVBNfKfdeAoFAwIKRSxHK6n3ZOGkMK65QKs7VhNQEAoGgNCA5LaQwgO2lcgKQzaBbQRJYyBUG30PMDnvd1V9LCQQCoWWwvull1l/dqBW1giEZNCS3rsW2i0AgEKQErAKWE4AQLA1pJ8zv2Qz7H+zEBREIBAKBQCAQJEYLAvBdNqseXPT9t+A0nG/GEQgEAoFAIBDcRyUCENJTkAAk2MHdt3747x+2+eG6hravZhra/PCjh21ePXy/7Sv/33NlqlUQCE5w/61X/uph21f3sP+zx+zrI/a/t/VBm1f+FNsugpb4UsObP3yD/a+dZv3bxw1tfxh/0PaHy+6+/gMKNyCoBa+2gL/44os8IZj4+PD+fEO71/KsY3yG2UXz8p///OfYJhI0wReffZZ/9N7Kkv9rwCc7tuSpLyK4hc9/+tN8auaUkv9roXfa5D89dxrbRFfglr4gSI7mBOCLL774EuTngqSnz4nEqXAIpJudz4V/osePP81/+CFRd4KfTX8ntmwRHeLbP8rHV6/K5xoT+UfJD/PJffvzoa7t+e8i0yblH2U/Rreb6NzfmHY8evRJPjb/XfH/xgbf5PYd+UfxbD4XTecTGzfmG9q/wX8XX7US/ZmpTFn8jc1H6cf58OhhQuz16pxPHTnGfvYkn3sYyccWL7T6vdSBg+i2OvW3qyKDIB8gSz4kS2UC8F+MUlYP4efs9VL2+nvm+4w0MCFIAwOJY5+zmQYGOgzeaB4RdSf4GZA+dZZ3gLD6lzp28pn3Ze6G8qGenXlHGVuxAt1uojN/Y7fvxGZjstGlXT5z7fYzv09/cCnf0OFN/p7kvgPoz01VyuJvbEbfncP/lxoH9s5nG+LP/D65e6/4f2QTj/SVG+j2OvG3R7KDEBRQhxEcgp8/++STfKh7R94BJnbsLPvezPU7bFAWKzPpcxfQbSdW52/s9p25dV/8H7EJR/rcxbLvSx05LgblTm3y2fuN6M9ORcrgb2ymjp4QK39sspG9V/7/KL52rRCJ/Xrkc6nH6HZX629s/UBQHEHvMIJE8HNu5VKxvTt1Uj6X+6TZ9ye2bTdm0n3yucxH6PYTK/c3ZvvOZX+cD48YYqwkL2/x/dH6+eJ/c/pU9GenIrH9jc1cPMe3fPlK8oFDzb8X/jdHiW1iCIHBtr1af2PrB4LiCHKHETRmb94VW78d3sxnH0ZbfD90ko1D+ovVQiYGse0nVkZsQZA8dFRMIPr3zOdST1p8fzaa4Ss3fNX5g0voz081Yvsbm7GVK8QEYsLYFie3wMzNe+IQXIc3bPWHspEEIMExgtxhBI2RyePFjHftGtt/w+OzYEula3s2w36Efg9E+8QUBLBiDMIP/ndSh4/Z/jtz1Tk8fJCtQZwoh7+xmQ0n8w0d3+IT3Mzth7b/LrpArDrHFtaj30M1/sbWDwTFEdQOI2iE4Hu+GtO9Y/5RsjIhF5k8QawCbt6Cfh9E+8QUBMm9+wtCLvtj23/HhWPfHkI4njmP/gxVYpAFIBxWg/+Z6NzZFf0drPzxU+jtXm82ZlBGkgAkOEZQO4ygMTpnpsi3tn1zxf5On79spVTIpSkWUBViCQJYuWsc3E+IuBOnK/57OJwktvLGoD9DlRhUAZiLZgqrf3fsr/6ZjC1ZLFYBly1Fv5dK/Y2tHwiKI4gdRtCYfRARsS6sk/zs008q9jcM6GbANKXpUIdYggBOjVuxfxWs/pnMJT/Mh7p14J9RKm0MUS5/YzOxdZuYMMycVtXfQ9orHhvd+W2lwlxIABIcQ+UO49SpC/muXXug2yE742tWixnuogVVDxBmmg4Qgtj3Q7RHLEEAJ8ydHhyKv/ee+J9doF5sVtD8jUl+UM2INXVycCgyZaL4n91ePjWWbCQBSHCMoHUYQSN0kGZqhMz121UPEBCbZeYPhNxu2PdFbJkYgiDbEBOrKZ3a8LQcVX8OxGbxz2nLVwSxn6UKDKIAhDhRvto8qI+jQ0OFz+mrzOEjEoAEx1Clw0gkPsx37do9/3d/9/f5//bfvpd/8822+YMHj/PX8PubNx/k/+iP/jg/efL0/Pe//9/zf/VXf53ftYu2K1Mnz1rB+E4HCDPNQmz5MvT7IrZMDEHAS7tBMP78dx1/lnlqHQ6UYD9LFRhEARidNcOVNFV8otynm5jgXr2Ffl92/Y2tHwiKw06HEZkxVZyU8oDw2Xb+2bds2ZV/6623re8bG1NcAH7ve9/n34MA/L3f+z3+Pvh+9+6D+b/+679Bb6TY5L7jVT92OR4gIMCaHwbp1oESQytAvwUBP/wxsI/Yjjt/2fHnWWEHY4ajP0sVGDQBCPF6/PAHnOCNpBx/XnzNGjHBXboE/d7s+htbPxAUhyoC8Pr1e/nvfvcv8kOGDM+vX781H41mnxGA3/nOdwo2R9L5b3/72+iNFJOwBWc+51ws68oAER45VJzuPHUO/f6IzdNvQQB1VfkEoW/3qg5/NCWcOIf8k/CZKibq1d3f2IQDafzwx5SJrnxe5k6DMcHtqMQElwQgwTFU6jDibMa3ffve/LBho7gYhNW+YgH4x3/8n6z3xmK5/O///u+j24zJ5P5DVtk3s8Nw6m/zxF103lz0+yM2T78FQWz5ciPR+FrXPtMsD0c5KOXzNzah4gcPETh0xLXPNLMdQOgM9v3Z8Te2fiAoDlU6jDt3QlwAwut0+iMuABcuXPqUAIQYQPP9IABhSxjbbkyapzHNuphuDBBWkD+kTEi3XN6LiEc/BQFs/8LKnzhsdNe1zzWD88Mjh6A/T9kZJAGYDacKh41cPCRkTXDr56Hfox1/Y+sHguJQpcOAAx3/9b9+j/Pv//4f8pMmTXtmC5hWAAuELV++/dvhDes0plsDRHjMiKqT/BL9o5+CIHP9jjhF2a+Hq6coc5mP86GuIidg9n4Y/ZnKzCAJQLPSTLTK3H/lyHOmWnHOH6PfZ0v+xtYPBMURlA4jaIRVP779O23yUx2GG/4267W6cdKT6B39FARW3r4Vy13/bMgFyLeBt25Df6YyM0gCEPq14t0NNwkZE5zmFfTL39j6gaA4gtJhBI3R2TOeSaHh1gBhzZK7d3Ql2J/oDf0UBGbpt/TFq65/Nqw0U2k4ufyNyVzqsXH697V8Nppx/fPjGzaIycySRej32pK/sfUDQXEEocMIGvm2WZd2YtsslHiqw3DL39aAf/k6+v0SS9MvQcBLacGEoEcnTyYEEOPV0OHNfEP715Uq1aWrv7FpTgjC40Z58vmZ2w/E/3OfblInhSYBSHCMIHQYQWP6whUr+XPTDsMtf8dXi/JyUGYO+36JpemXIEhs2SpWTBYu8OwaZlLo1NET6M9VVgZFAEYXzPc0JOCpA023H6Lfb3P+xtYPBMURhA4jaIyvWiXE2XvvPdNhuOXv9KVrIuh/SH/0+yWWpl+CIDJpvOeHgqBGqyqnM3X3NyZ5xY4enYxDQY2eXSe2aKH0cackAAmOoXuHEURa27NXbjzTYbjlb94RdzNOZ4bi6PdMfJZ+CIJc6olVjcHL7Vk4Acy35Xp2knpbTnd/Y9M6bT6oj6fXSR0/JeJO2eQG+56b8ze2fiAoDt07jKCxcEDjnWfisdweIMw6nJBwGvu+ic/SD0GQNvP0jR3p+f3AoK9SrVYd/Y1NSAjuR7k2Xmau/es89hQOnWDfdzl/Y+sHguLQvcMIGpN79oqtsnfnlOww3PR3c9ci4tMPQRBbsUKEG6xf7/n9QIoZfq0NG9GfrYwMggCMTBznWw5SOGTCr3VazrKXJAAJjqF7hxE0RufMNFblDpbsMNz0t7Xa2KszbctJSD8EAcSAlgo38IKpU2fFttzEsejPVkbqLgCh8pAf4QYmExs3idXGZUvR772cv7H1A0Fx6NxhBI389FpPI0D6YbRkh+G2vxv79zROyz1Av3+i9/4uJqQY4hOArh18yQfJt+XY4A8iIJf+CP35ykbdBWD63EURbjBmuC/XK8Qb9kW/93L+xtYPBMWhc4cRNJr5q0CUlesw3PY3pP7gp+W2bUe/f6L3/i6mWW0GYkH9uqfwqGFixfH8ZfTnKxt1F4BW6qkm2Q28Ij/o1rW9mFBHUuj3X8rf2PqBoDh07jCCxsSOXWLLYkF92Q7DbX+njhwX23JTJ6HfP9F7fxfTyse2c7dv9xRfs8ZXEaASdReA4RFDPKs2U45myTkZ80+SACQ4hs4dRtAYmTlNxP8dOlq2w3Db31CKqeHtH+UbOr9NZeEko9eCoHFAL9+3/9PnLvh26lg16iwAc/Gc6Gc6tcnnMv5t/0MeQFEWbjH6Myjlb2z9QFAcunYYQeNTefkak2U7DC/8bR4EyFy7jf4ciN77G2jF/3Xr6OsBIF4HtsMb+Yb2b/AScdjPWCbqLABTp84ZB4DG+Xpd6NN4WM3gfujPoJS/sfUDQXHo2mEEjZnrd1sMWPZqgICi6RQHKB+9FASpw8fEgDxjqu/3ZabngByE2M9YJuosAKHkJN/6f/99X6/LJ9ZmXfVIGv05NPU3tn4gKA5dO4yg0SyVBSWMmuswvPA3bDnzwwAzp6E/B6L3/gZiin6I/6M4QH/9jU3Y8uei/4NLvl8b4ptljAMkAUhwDF07jKAxOtvI/3fwcLMdhhf+zjbEqEyXhPRSEFjb/tfv+H5fZvWRyIQx6M9YJuoqAHn+P77t/zpKVY7Elq2+VB+pxt/Y+oGgOHTsMILIUJ9uYpviQaTZDsMrf4f6dheC4G4I/VkQvfW3dfCnSzuUgz88H6B1IOBj9OcsC3UVgHDqlx/8GTUM5fpQepCH1wwbiP4smvobWz8QFIeOHUbQWFiBa74ih5cDBJSD4yuQ+w6gPw+it/6GMlx8BW7KRLR7axw6gA4e+eRvbCY2bhQrcCtXoFwfJhmiAslrUh08IgFIcAwdO4ygMXnYXgyelwNEcvceYUP9PPTnQfTW3/HVq9Br8sYWGzGI23eiP2dZqKsAhImGX/V/yxEzBrE5f2PrB4Li0LHDCBohNoUPhlu3tdhheOVvqwrJgF7oz4Porb+tU7iIgyHEuvIJx+yZ6M9ZFuooAJ86hRvNoNkRX2VOejagP5Nif2PrB4Li0K3DCCLDwweJAfnKjRY7DK/8zesQm2WTEDtqorf+hgEZYu8gBi+XeIR2bxDrysMe+nRDf86yUEcBmLn9UEwsB/ZGtSN1/JR0FY9IABIcQ7cOI2iEmBSITYEYlZYy5Hs9QEQmjRdbNafOoT8Xojf+ztww8k0O6Y96b3zC0auzmHA0xNCftQzUUQAm9x8UK73vzkG1IxtOGYnPO0iT6YAEIMExdOswgkbYhrNbGsvrAYLys8lFL/yd3L1XDMgL5qPfX3TWdDHhOHwM3RYZqKMAtPJN7tiFbktj/55SZTogAUhwDN06jKAxsWmzEF2rVtrqMLz0d+rUWbFNMnkC+nMheuPvaP18cdp7zz70+0ts3iJOh67AOR0qG3UUgOERg4XounoL3Zbo3Nnif3//QXRbTH9j6weC4tCtwwga4eQvXwU5ctxWh+Glv6FUEt8m6SrPNkmQ6YW/oSYqH5Bv3kO/v/T5y2L1e9wodFtkoG4CkCeAbv86TwKdSzcf3uIHYRWypWpLfvsbWz8QFIdOHUYQaScBdHGH4bW/ZdsmCTLd9reVgLnz2ygJoJ+xJ2EmhG4rhT3Y1E0Api/fEAJ/5FB0W4CQc5LbM3wQui2mv7H1A0Fx6NRhBI2FwOSOtlbc/BggonNaLklH9Idu+zt97oIYAMfLU4KtcVBfMeG49QDdFmzqJgChzrRMJdjgkJ1Vki79BN0eEoAEx9Cpwwga4bRtJTF3fgwQsnXaQabb/oYcaDzedM1q9HszGZ03V6q4LJ38jU0r5k6iyWR4xBBpYhJJABIcQ6cOI2iMr3u/olO3fgwQ6cvXpdq2CTLd9ndk2mT0igxNmdixU0w4lixGtwWbuglASCovWzgJxP/xU8k7d6PbQgKQ4Bg6dRhBIyQl5QPyyTO2Owyv/f1U4HYLeQmJ3tJtf4d6dhLxpo1J9HszCcnPacLhjb8xmYtmjANl7aU6UAan32VJg0QCkOAYunQYQWSlA7JfA0TjsIFi5n7jLvozCjLd9Hc2FBcDcq8u6PdVzMKE483ATzh0EoCp0x+I8JZJ49FtKWbmupEInfVx2LaQACQ4hi4dRtAI1Q/4gNy7a0Udhh/+jtbPE7E7+w6gP6cg001/p06ela4UlkmzFCKc0sS2RRd/YzO+fr0Ib1m7Ft2WYuYyH/PJRkO71/O5FO5BEBKABMfQpcMIGlPHTooBefrUijoMP/xtxWXRQRBUuunv+PuVxZv6ydjCBWLCsWsPui26+Bub0K/x8JZjp9BtaUoIN7BTe90Pf2PrB4Li0KXDCBrjq1eLAXnDxoo6DD/8nb54TcRljRmO/pyCTDf9bQ3Ix+UbkK24rHr8uCxd/I3NUN/utvOb+k1ZytORACQ4hi4dRtAYmThWzELPXqiow/DD37nkhyJB7zttKEEvIt30t5Vw/GEU/b6aEmJNeVzW0AHotujib0zmYlkpD4CYTO7db0w45qH7G1s/EBSHDh1G0AidIiR/5gNyNFNRh+GXvxsH9RFxWbcfoj+voNItf2fNE5k2E477TRGXZSboDe5BEF0EYPqDS9IlHC8mlEHkE44h/dH9ja0fCIpDhw4jaLROZFZwAMTsMPzyt5XE9dAR9OcVVLrlb1hl5vGmE8eh31M5WgdBrt9Bt0V1f2MzsWWriCFesRzdllLkE46Ob+Ub2r2Wz6Ueo/obWz8QFIcOHUbQmDpV3YlMPweIQie+Av15BZVu+TuxabOIN129Cv2eypFOnusjAGWsANKU4VHDRAjO5euo/sbWDwTFoUOHETRaJbkqTJHg5wAh+zZOEOiWv6OzZ4gDIIePod9TOSa27xATjmVL0W1R3d/YbBzcT/r6zmZFEMyT5yQACY6hQ4cRNEZnTRcD8tETFXcYfvnbCuTu0k7KuLEg0C1/y1iSqynTF66ICce4Uei2qO5vTMKWKmytwharzAfIQPjxCQcTgpj+xtYPBMWheocRRJoDcvZeY8Udhp/+buzfU9h5P4z+zIJIN/ydiz/iPmzo/LbUQj4XzwV+wqGDAFSltJ9V83w0XqorEoAEx1C9wwgarRQrMCBXOEP2e4CodqWS6A7d8LdKK2uN/XpImztOFX9jU4aVNTu0+uFObdFWKkkAEhxD9Q4jaExfMpMsj6iqw/DT39XGKhLdoRv+Vim2LjJD3mTVqvgbm1ZVl9170W1pidXuxLjpb2z9QFAcqncYQWNi5y4xIC9ZXFWH4ae/UyfPiNPK0yajP7cg0g1/RxfMFwPy3v3o99MSrXJ169ah26Kqv7EZHjlExJtevYVuS0uMzpyGusNBApDgGKp3GEFjbGG9GJD37Kuqw/DT31A1gidM7dcD/bkFkW74u1D39Cb6/bTE1InTRn3sKei2qOpvTMJWaiG/3hN0e1pifP161PrYJAAJjqFyhxFEOpkh+z1AQDB+Q5d23N5c4hH6swsanfqbD8id2vBYJ4h5wr6flmhOOKCOLLYtKvobm5k7DWLCOKgPui12aE04kHY4SAASHEPlDiNodDpDxhggIFaRryBduob+/IJGp/6G2CY+IA/ohX4vdshLJHbtICYcsSy6Par5G5uwlcpr7M6agW6LHWJPOEgAEhxD5Q4jaMzcfiAG5MH9qu4w/PZ3bPEi9ISpQaVTf6eOnRIrHDOmot+LXULicT7h+OASui2q+RubELvJt1TXr0e3xQ75hMPc4YjnUPyNrR8IikPlDiNohEoMfIY8Z2bVHYbf/rbSOixZhP78gkan/lbxUAWcVgabE9t3otuimr+xGTEPVRxT5xQ3pEfiE44LV1D8ja0fCIpD5Q4jaIR0KnxA3rCx6g7Db39baWvGjkR/fkGjU39jn3KshnA4ik84Fi5At0U1f2OzcUBv1LQq1TC2dAnahIMEIMExVO4wgsbIdCPP2YnTVXcYfvvbqiQR4AoNWHTq78aBvaUvAdeU6ctGJYkxeBUaVPU3JnkJOEis/E4bqUvANSWkR+K7Mgvmo/gbWz8QFIeqHUYQaSUerbK0GtYA0djXqNDwMIr+DINEJ/6GQ0Z8QJa8JuszdieCO+FQWQBCVgNRAm4Iui3V2e1/6ToSgATHULXDCBqtGXKn6mfIWAMEpEngK5cnz6I/xyDRib+tgW2EWgMyEE5l8glHQwzdFlX8jc3kvgNiJa3e/5U0J3yqNKfPEw4SgATHULXDCBoz1247niFjDRBOYxeJ/vtb1QEZGJk6SUw4Tp9Dt0UVf2MztmK5iKXbug3dlkpp1aD2eYeDBCDBMVTtMILG5P6DxoA8z1GHgeHv1JHjwvbZ1Z1eJvrv79hyY0Deth39PiplfPUqYfvmLei2qOJvbEYmjhOnac9dQLelYtvNCccpf3c4SAASHEPVDiNojK1c4XiGjDVAZO48NDL890V/jkGiE39HJow1BuSL6PdRKZMHD4sJx7y56Lao4m9shnp2Fqto4RS6LVG8QzoAACAASURBVJUyvnq16Js3bfbd39j6gaA4VO0wgsbI5AliQD5z3lGHgeFvXsGkw5v5hvav53OZj9CfZVDoxN+hHp3EgBxRb0DOXL8rwiWGD0K3RRV/YzIbzYiKGt3fQbelGmJNOEgAEhxDxQ4jiAz17ioG5FDCUYeB5e/GoQNESpFbD9CfZVBYrb9hFYYPyD07od9DNcyln/ByiaqdYMbyNzahaguvODNhDLot1TBz/Q7KhIMEIMExVOwwgkYoM8QH5K4dHJ00wxwgoHoJj5M5chz9eQaF1fob4rD4gDxxLPo9VMvGgX2Uy2GI5W9sQhJlnrx72VJ0W6ohT5mEMOEgAUhwDBU7jKAxfdGdahqYAwTU91StrJjqrNbfie07xIC8fBn6PVTLqIJlxbD8jc3YwnpRL3zPPnRbqqVVxeS+f1VMSAASHOFBm1f6fXxwr3IdRtCY3G3U013srJ4u5gCROnZSxMnMmoH+PIPCav0dW7TQGJD3ot9DtYSJBp9wsIkHti2y+xub4VHDRHzzlRvotlRLp1WaqvU3toYgKIyHbV99BEksH6UfozcgYnla9SZ37nLcYWANENZJ4MH90J9nUFitv2GlmQ/IF6+h30O1hPrFIvVQcCYcKgpACGmBJMowDkFSZWx7qiVGrlMSgARHeNjm1Qs8Tub6bfQGRCzP8PjRYkC+cMVxh4E1QOQyH+cbOrxhnAT+GP2ZBoHV+jvUvSP/f8vFsuj3UC2DOOFQUQBCtRYe39y3O7otTpg8fFRMOObO9tXf2BqCoDCYAFzFl60PHUZvQMTytAbkaMZxh4E5QDQO6S8C82/TSWA/WI2/Ie2LyieATYrUQ2zC0Y5NONLBSD2E3b6rIaS14geOJk9At8UJMzfviQnHsIG++htbQxA8xssvv1xTV1d3lvFBbW3tBcZvNX1PTU3NX7Cf/5TxKuM1+Mp+9sstffbDt14dxJet165Bb0DE0syGk8aA3NmVDgNzgIDtOD7hOHoC/bkGgdX4O33+sjhwNF7NlBzFhMGYTzjY4Ixti6z+xiZUmuHxzSuWo9vihDDJgN0NyHfq10lgEoABABN+R5mYewteM2H3A/b9xabvMQTg1Uo/u+GtV7/Pl61nTEVvQMTShEoMIkeW85Qc2ANE/P33jZPA76M/1yCwGn8ndxkHjpY4O3AkA2E7jk84Dh9Dt0VWf2MztnCB8ieATUKlIz7huNPgm7/d0BgEScGE3fNM2P2Yvfyy+TMmADOMrZu8DwTgtUo/v6Ht/3iZL1sP7IPeeIilmdixSwzIS5e40mFgDhBBDMzHZDX+tg4csf87bPudMmiph7DbdzXU4cCRyeis6UbqoZO++dsFmUGQFUzY/RETe/eKfwbbwOznf9nkfSAAP2HvvWz8vqudz9/0yitfCUGJrnZUoktWxpYsNk4A73alw8AcIDK3gxeYj8lq/A3Jn/mA/MEldPudMmgTDuz2XQ1D3dQ/cGTSSj30vj87HCQANUcpAQhbwE0F4PPPP/9rX/3qV3/d+P3vMt5g7/lHO9eIjRgkEljeecD/oYhyEcoj8W2F85ccf9bjx2KAgK8Y9/Io+7GIk2n/Bn+N/Wx1ZzX+DvXqIgbkcBLdfqfM3n4gJhxD+6PbIqu/MZmLFg4cYdviBlPHChMOv/ztmtggyAe7W8Al/m4I+7u5dq6RWTCX/9P+5NKFPEE+RPqKGsD/+smPsU1xBbHhoibwzzMpbFMITfD5T/9JCKbuHfNffPEFtjmO8cW//iufcIQ6vpn/4vPPsc0hNMFP798V8X9Tx2Ob4gp+nhIH9mIjB/t2TYcSgyA7mNg7xtgWXsOqXqlDIK1atfpt9uVL8BpWAtl7zjAB+Ladz3+yY4vYYly/Hn0GRXyajxKPjBrA7fOPHn3iyowRgLlCYJ0EZrNl7OerOyv1d+bKDXECeMxwdNvdYuPAQokubFtk8zc2rQpHSxah2+IGH2U+smoCP8r92Bd/u6k1CBKidevWdUzMnYM0MMb277fh5+z1Uvbz78Fr9rPu7PVtIwXMLcaRdj//Jxc/EMvWc2aix1AQn2baHJBHDXMtZgTAOyukewpiiS4sVurv5N79YkBeUI9uu1uMTJ8iJhwnz6DbIpu/sanTgSOTVk3gBxFf/O2V7iAEBD9PJnxPYEm0x+T+g0Kc189zrcPAHiBSR44bcTI04fCalfo7tnKFGJC3bkO33S3GV68W97RpM7otsvkbmzodOLLuadpkMeE4dc4Xf2PrB4Li4HEyxrK1XwksifYYX71KDF6bt7jWYWAPEJlbRmD+kP7oz1d3VurvyJSJYvA6/QG67W4xuf+QmHDMfxfdFtn8jc1QbxHfnG1MotviFuOrVvo2iSIBSHAM6DCK42SwGxCxQLe3r2QYIHI8TsbfjPlBZaX+buzbQ/QDD6PotrvFzNVbroZRyEwZ2rdd5uKF+OZc7hN0e9yiFUax0PswChKABMeADiMaoDgZlWgJ83vuCHNZBojGAb2MCUcY/RnrzEr8nUs9zje8/aN8Q6e2Wg3IueSHQmh0aafVfTn1Nzat+ObRw9FtcfW+Ll0T9zV2pC/+xtYPBMUBHUZ8TXDiZFShFytlsgwQkamTfIuTCTIr8Xfm2m0xcI0Ygm6329Rxq9Gpv7GZ3HdAbM0vmI9ui5uEhNZ8wtH9HV/8ja0fCIoDOozUweDEyajCzG33Y+VkGSBiK/Q7bCAjK/F38uBh0Qe8OwfdbrcZmThOu8MGTv2NTStWbstWdFvcZqhHJ5FMPZrx3N/Y+oGgOKDDyFw3Zv8jh6I3HqKgVcZqlntlrGQZIKDwu4iTWYD+nHVmJf6Or1kjBuSNm9DtdpuxZUu1Szfi1N/YtHYBTuu3CxAeN8qX+sYkAAmOAR3Go9SHIv6n89vax8moQquQ/XvvudphyDBApC9eFRMO1lFiP2edWYm/I9OnigH5xGl0u91mcpeZcHgxui2y+Bubjf17+pYvz2/CxJZXONm733N/Y+sHguIwO4xQn26BiJNRhdG5s0Uncuioqx2GDANENpK2aoBiP2edWYm/Gwf2ETWn74bQ7Xab6fOX+b1BXW1sW2TxNyZz6SdiwUHT1GMQ2sInHCtXeO5vbP1AUBxmh2El5WSdJXYDIn6aDw8fJAbk63dd7TBkGSBC3TqIOJl4Dt0WXWnX3zAIQ83chvZvaDkgZ8MpMeHo1RndFhn8jU0rF+jQAei2eEHIo8knHFMnee5vbP1AUBxmhwHbI3zFafce9AYUdMI2fEOnNnyWnEs9cbXDkGWAgPQPfMJx5Qa6LbrSrr9h1Y8PyIP6oNvsFUNd9Z9wyNS+m2Pq2EnX45tlImxr8/bUv6fn/sbWDwTFYXYYie07xbL18uXoDSjohES8vAPp28P1DkOWAQLK2/EJx/6D6LboSrv+Tp08K1Yspk1Gt9krhscYE47L+k44ZGrfzTGxcaOIb167Ft0WL8hX1Du+xStswXa3l/7G1g8ExWF2GKkz58UgMGUiegMKOgu+mOB6hyHLAAE5J/kgsGY1ui260q6/IRUH98Wqleg2e8Vo/XxjwnEI3RZsf2MT0o1xXxzQ1xeNwwaKEJ5b9z31N7Z+ICgOs8Pwa9ma2DIT27aL1dgV7q7GyjRAwGlTLnJnTEW3RVfa9bdfpxYxaU04NF11qsTf2CyEf9xEt8UrRmfPFKfqj57w1N/Y+oGgOMwO4+ll64/QG1CQGVu0UAzIe/a53mHIMkBk7jwUE47B/dBt0ZV2/V3IW3YV3WavmDp+yog7m45uC7a/sRmEA2Dxde+LCcf69Z76G1s/EBRHcYcBVSf4svXtB+gNKMgMjx8tBuQL7g7IMg0QvNQdnDztoOfJUxlo19+hnp1FCqhICt1mr2hV1tH05Gkl/sZkNpoJRAqo1OFjYsIxd7an/sbWDwTFUdxhwOyYL1sfO4XegIJMq3Zp2N0BWbYBwsw9l73XiG6LjrTj71zikRiQu7ZHt9dLwq4G7G7omnvOrr+xCdUxeBL4sSPRbfGSmRt3xX0OH+Spv7H1A0FxFHcYEB+jazkoVZhLPeY+8KIqi2wDBJw65ROOk2fRbdGRdvyduXpLDFSjhqHb6zWt6hMPo+i2YPkbmxBnyuObF9Sj2+IlIX0XT3bdqY1n1bVIABIco7jDgFNZfNl6/rvoDSiozNy859nMUbYBIr5qlZhwbN6CbouOtOPv5MHDos3Pm4tur9eEU/U8tOLsBXRbsPyNzfjq4LR5SOPl5YSDBCDBMYo7DDiVxcXH6OHojSeohFNjfECe7X6SVNkGiKCsBmDRjr+h1jQPVt+wAd1erxlbtlSIjx270G3B8jc2rZrTJ8+g2+L5vU4eLyYc5y565m9s/UBQHMUdBpzK4vFA3TqgN56gErbfvUpXIdsAkb4UjHggLNrxtx/pKmRhYucuMeFYugTdFix/Y7NxUF9x0PBOA7otXhP+z/iEY+duz/yNrR8IiqNphwGns/iydTSD3oCCyOgCM2Gt+xUyZBsgcuaJwO7voNuiI+3420pYe/Meur1eE1ZieO7JyePRbcHyNyZ5qrEOb/DT/7nMx+j2eM3EDrO61jLP/I2tHwiKo2mHUcgJdg29AQWR1vO/5P7zl3GACHXvKHKCxbLotujGlvz9VM1pD0tWycJsQ8yTEouyUMb2/dTzv98onv/A3ui2+MG0x9W1SAASHKNphxFbWK99VQCZGerlXU42GQeI8JgRRo3W6+i26MaW/G0KolDf7ui2+kEueN/RV/DK2L6LmTp1Tvua08W0qmsN6OWZv7H1A0FxNO0wCnVBV6E3oKAxl/xQpIDp0s6T1AEyDhDWlve+A+i26MaW/G1tiU7Sc0u0FAs1WvVLdi9j+y5mYus2o8TlCnRb/KDY8n4z39DudZ743gt/Y+sHguJo2mFATjY+KEyfgt6AgsbMdSN56IjBnny+jAOEVaN1zWp0W3RjS/7W/VBEKUZnzTCS3Z9Et8Vvf2OzUOJyL7otfhFKXXp16IUEIMExmnYYmbshsWw9qA964wkaU0eOixQwc2Z68vkyDhBQdUb3Gq1YbMnfuqdFKUWdk93L2L6LWShxeQXdFr9YSHvjfrJ7EoAEx2jaYfBla6jR2p5qtPrNxMaNYjXsvfc8+XwZB4jMrfva12jFYkv+LuQp0zMxcinqnOxexvZdzFCvLp6UuJSZVrL7rds88Te2fiAojlIdhlmjFVYDsRtQkBitnye2SNgg5cXnyzhAQDA+L5n0jnclk4LKlvzd2M/bSgUy0kp2P0a/ZPcytm+TZnxzyKP4ZllpJbtftNATf2PrB4LiKNVhUI1WHEJCZC9PxMo6QIT6dBNCJBRHt0UnNufvoApvSDckkt13RLfFT39jM3PtthDeI4eg2+In0xeuivseP8YTf2PrB4LiKNVhxFetFMvWW7aiN6Ag0esk3LIOEJEJY4Xw/eASui06sTl/W1vvwwai2+k3IfE4zz2pWbJ7Wds3MHnoiNh6f3cOui1+Era7+YSjd1dP/I2tHwiKo1SHkdyzz7Nla2Jp5hKPREfRtb1n15B1gIgtXiS2vncH53SgH2zO33AK1qua07LT65V2Gf2Nzfi6dSK+ef16dFv8JM892aWdmHAkP3Td39j6gaA4SnUY6fOXRSqYCe4vWxNL048tElkHCCs/2Mpg5Afzi8352zpw5EHNadkZrfeu3KKs/sYmZDbgYUVHjqPb4jfDI4aImPrrd133N7Z+ICiOUh0GxGLx1ag+3dAbT1BopYCZO9uza8g6QKROnQ1UhQC/2Jy/4RQsF0EHD6Pb6Td1zT0pa/sGhocPEiLohrsiSAVCn+6F+CUBSHCMUh3GUzVCU/qVTJKR8Q0bxKC0bp1n15B1gCjknuyLbotObM7f4dHDxTbolZvodvrN1HEj9+TMaei2+OVvTIrxpK3YBk09RrfHb1rb36yPd9vf2PqBoDjKdRiQl02UTLqP3oCCQD9WZKQdIDIf83JJDR0o96Rf/g517ygG5HgO3U6/mbn9QEw4hvRHt8Uvf2MyG056dhBCBVoHYObNdd3f2PqBoDjKbhGx2bEomXQKvQEFgZCXTKzI3PDsGrIOEEAomM5PQD+IoNuiC8v5G0QfH5C765cKxQ5z6Y/YhOO1fEPHt7SacMjavgupUEaj24LBzNVb4v5HDXPd39j6gaA4ynUY8dWrRSqYTZvRG1AQaKWmiGU9u4asAwQwMmWCEMBnzqPbogvL+durAUklNvbvqV0SbFnbt5UMeWE9ui0YzMWNDA/dOrjub2z9QFAc5ToMq9EuCGaj9beDyHnSQZTqMGQcIICFurQ70W3RheX8nTx0NJA52YoZmazfhEPW9g2HbYK+mOBFjlcSgATHKNdhWMv240ahNx7daaWA8XhFRtYBApjYsUtMOJgQxLZFF5bzN+Ri40Hp77+PbiMWY0uXCFGycxe6LV77G5vRWdMDH07kRe5JEoAExyjXYViBu726oDce3Zk87M+KjKwDBBBWYngqmMkT0G3RheX8Df9n/MDRoaPoNmIxsX2nmHAsX45ui9f+xiZUmwn6gcLoAjP3pHt13kkAEhyjbK1QOLrf+W1PMpgTn6a1IrPO2xUZWQcIIBz+4Ccz+/dEt0UXlvO3mQIGYgGxbcRi6vQ5MeGYOgndFq/9jUkrBUzAU4pZuSddTLxOApDgGM11GEFO3uknCysyRzy9jowDhEk4jdnQ4U2eDiaX+QjdHh1Yzt9WChgPDxzJzuy9RjHhGNgH3Rav/Y36nBuDnQLGJGx/812eWe6VXiQBSHCM5joMqBPKYzeOnkBvQDoTYv/8WJGRcYAoZuPgfuI53GlAt0UHlvJ34cBRMFPAWM/BzD3ZXp/ckzK270IKmGCXFc3cMnJPDhvoqr+x9QNBcTTXYcByNQ+U3rgRvQHpTBiM/UjKK+MAUczI9CliwnHyLLotOrCUvykFTIG65Z6UsX0HPQWMyVz6Cd8Gb3inDd8Wd8vf2PqBoDia6zCgWDpftq6fh96AdCVsw/mVlFfGAaKYsZUrxIRj6zZ0W3RgKX/7deBIBVq5J89eQLfFK39j08onu3kLui3YbOzbQ0w4GuKu+RtbPxAUR3MdRvrSNbFaMHYkeuPRldaKzOjhnl9LxgGimMk9e8VqwaKF6LbowFL+phQwBeqWCkbG9m2lgDke3BQwJiMTx4kJx/nLrvkbWz8QFEdzHUY2kharUz07oTceXWnVifRhRUbGAaKY0DHyk5kTxqLbogNL+Rvqkfpx4EgFFlLBLEO3xSt/Y5NSwBQYW7xItD020XXL39j6ITCoq6vLMKZbIradlaKlDiPUpZ2IT0s8Qm9AOhJSv/AVmfXrPb+WjANEMbOhhJhw9OmGbosOLOVvSgFToG6pYGRr3yIFTJvAp4AxCaEtvK9ftco1f2Prh8CgpqbmL+wQ285K0VKHER4xRAwY126jNyAdGZ07W8wKD3uflFe2AaIpacDw3t9+1JxWhbqlgpGtfVspYGhCx5k6eUZMOGZOc83f2PqBoDha6jCic2aJGI7Dx9AbkI4Mjxzqm8CWbYAoRWvL6OY9dFtUZ1N/UwqYp8lTwbTXJxWMbO07feEKpYApYub2QzHhGNLfNX9j64eg4pdqa2vHMzYyfgI/qKmp+bu6uroe2IZVipY6jPh77/m2RRlEhrp1MFLAeL/FLtsAUYqQKFXUDT2JbovqbOpvv2pOq0SdUsHI1r4LKWAWoNsiA3Ppj1xNBUMCEAlM7M1jYm8/458zAfhj+NnLL7/8Dfb6NrZtlaKlDiN58LA4pDBvLnoD0o2FFDDv+HI92QaIUoyvWSNOZm7ajG6L6mzqb0oB8yytVDBnzqPb4ra/sUkpYJ5lqG93MeEIJVzxN7Z+CCTgsAcTgf/WeP2R+XNTDKqEljqM9JUbvqUpCRqtZzvGn2cr2wBRioXck/PRbVGdTf3tV81plahTKhjZ2nd05jSxmn/iNLotshAyHLiVCoYEIBKY0Et87Wtf+zfw2hSArVq1+k32OopqWBVoqcPwM1Fx0Gitrs5/15fryTZAlCLlnvTO35QC5lnqlApGtvbdOHSAkQLmAbotshBynPI2uHe/K/7G1g+BBBOAixiXgwg0BOBX2PcLGOdi21Yp7HQYhTg1b0uVBY1WfOWGDb5cT7YBohQLuSc7o9uiOpv6G1aa+erDlZvotsnC1OkPtEkFI1P7fupEf5pO9JtMbNkq+vzVq13xN7Z+CCS++tWv/joTe1uZ+PsX9vVzxn+G759//vlfw7atUtjpMCBonHKHuU/rhPWR475cT6YBojlauSeTH6LbojKb+ptSwDxLnVLByNS+KadnacJ2ON/1cSEVDAlAZNTU1DzfunXrP3nppZe+hm1LtbDTYUDQuNg68j5XXZAYHmnkWLx+x5fryTRANPtcRvj7XHRlsb/hlLlIAdMB3S6ZqFMqGJnad6GqD6WAKSZsh/MJx7CBrvgbWz8EFkz4/UZtbe3rjAPhK8QAYttUDex0GFA3lOqHus9Q1/a+VlmRaYBojtE5M31dGdWVxf6mFDDlqUsqGJnat5UChup6P0XYDuepYDq1dZwKhgQgEpjg+y7jx4xX6+rqtrOvV+B7HSuB8MZ8iNJHuM1sNON7nWWZBojmWIiN3Ihui8os9jckcudteO5sdLtkoy6pYGRq3/HVq8Tp6i1b0W2RjbAtziccjUnH/sbWD4EEE3u3mPBrU/wzJv7e0jEPIBBi/2j1wF2mL1/3/bSrTANEc0weOOTr6WhdWexvSgFTnrFlS7VIBSNT+45QCpiyhMoofMJx4apjf2Prh0CCib9P2ZcvN/nxV4yfKwU7HQbFD7nP5H5D5NTP8+2aMg0QzTF92cyPOALdFpVZ7G8Q0zyO9+BhdLtkoy6pYGRq31YKmNuUAqYpoTIKb4v7Djj2N7Z+CCSY0FsLcX9NfvYjxjVYNlULux0GnSB0l/G1a8Wqw0b/tjllGiCaI8b2uI4s9jelgClPXVLByNK+eQqYdygFTDlCZRS+Gr/GWSoYEoA+ggm+9YzvG+QpYBgvGa8vGSlhtmDbWSnsdhiFAeQGegPSgdZBh6MnfLumLAOEHfp9QEZHFvs71KMTTeDKUJdUMLK072woTilgmmHq2Cmx+zNrhmN/Y+uHwKCmpma0HWLbWSnsdhi0heQuwyMGG6lO7vp2TVkGCFvPx0yRc+02ui2q0vT3owSFcDRHXVLByNK+CylgxqI/ExmZuXXflVQwJAAJjmG3w4BqFXzZ+r330BuQ6uRbJAjJjmUZIOwQTqvyFdLDx9BtUZWmvzPXjRQwI4ei2yQrGwf0Vj4VjCztO7lnH6WAaYa5lJEKpvPbjlLBkABERKtWrX6lpqbmP9bW1v4N+/q3JrHtqhR2OwzIyUZpJNxhNpISKzK9/C13JssAYYdWKpj169FtUZWmv1NHKAVMS9QhFYws7Tu+ilLAtMRQ765iwhFOOfI3tn4IJIw8gDmoA8y+fgZfGf+VMYxtW6Ww22FYiWRHDkFvPKozffGaeJbjRvl6XVkGCDuEUANKBeOOvxPm6v26deg2yUorFcyOXei2OPU3dvumFDAtMzx+tJhwXKw+FQwJQCQwoXeZCb9e8BoSQBtfhzMOwLWsctjtMHJmHFFXiiNySjj+z8XNgvm+XleWAcIO4bCRSAUzHN0WVWn6O0bxuy1Sh1QwsrTvxiH9jRQwD9GfiayMLah3nAqGBCASivMAmgKQ4ZfYz1N4VlWHSjoM6yRhNIPegFSmlQJm02ZfryvLAGGHcFqVTzi6v4Nui6o0/Q35FOkEf/PUIRWMDO376RQwH6E/E1kJfT9flWdjgRN/Y+uHQIKJvtg3v/nN3zJe362pqfmDF1988XfY60+wbasUlXQY1kBymQYSJ4zOnuF7Chizw8AeICohnFrlE454Dt0WFWn6myZuLTN7X/1UMDK0bysFTN/u6M9DZqaOnRS7QLOrTwVDAhAJdXV1M5nYe8143Z/xMWOGcSm2bZWikg6DUsG4w/DwQWKL5OY9X68rwwBR0XMaOZRSwTj09+c/+xmFbtigDqlgZGjfVgqYiZQCpjlC389DXNhY4MTf2PqB8BwXgX/+8ssv/8Nzz5aHkx6VdBiUCsY5+RZJ57fFikzqsa/XlmGAqIRmKpjk4aPotqhI8PM/RyOUAsYmrVQw98PotlTrb+z2TSlg7BHSf8FzcpIKhgQgwTEq6TAoFYxzZsNJsSLTu6vv15ZhgKiE8XXvUyoYh/7+ycUPqM3aZGTKRKVTwcjQvq0UMFu3oT8P2Rnq1UVMOCLVpYIhAegjamtrP2A81xKx7awUlXQYlArGOdMXropnOH6079eWYYCohMlDR4R4eXcOui0qEvz8ZPd2SgFjk6qngpGhfUdmTBXxzSfPoD8P2QlpwPiE49K1qv2NrR8Cg7q6urZ2iG1npaikw6BUMM5ppoCJLaz3/doyDBCVMH3lphDLoykVTLX+zi5bSHG7NpnYoXYqGBnaN6WAsc9o/XzRNvcfqtrf2PqBoDgq7TDoRKEzxtesRkkBY3YY2ANEJSykgumIbouKBD8nJo6mFDA2qXoqGOz2TSlgKmNi4yZHqWBIABIco9IOg1LBOGN01nSxRXLslO/Xxh4gqmGoW0dKBePA3+HeXWjCZpOFVDC90W2p1t+Y7TvbIFLANPbtgf4sVCCkAeMhLnNmVu1vbP1AUByVdhiUCsYZG4cNFFskt+77fm3sAaIahkcNE8/r6i10W5RjkkI2KqHqqWCw23chBcw49GehAjPX74oQlxGDq/Y3tn4gKI5KOwxKBVM9+RZJJ2OLJPXE9+tjDxDVEA6A8AnHIUoFUymzN+7Qoa0KqXIqGOz2ndyzV8RQLl6E/ixUoJkKJtSlXdX+xtYPgURNTc3zfl3r5ZdfrqmrqzvL+KC2tvYC47fK2NSB/e4hYwPjYvajr9j5/Eo7DEoFUz2zoYRo8H26oVwfJlXADAAAIABJREFUe4CohvH3jVQw7Cu2LaqR2mrljEyZoGwqGOz2TSlgKmeoZ2cx4agiRIMEIBKYwPpnxl2MP2Df/qKX12LC7ygTd28Z1/0B+/5i0/e0YoA6xKYwZe/byV53tfP5lXYYlAqmeqYvXDFSwIxBuT72AFENYeWPUsFUx8TGjWJAXker9XapcioY7PYdmTmNUsBUyPDYkUZM/fWq/O2u2iDYAtNbv81E1gAmum4YZeDqW7du/SduXwcEHbvOj58rqjBilJxrXfw+sIVxgfk9VCVh35+yc41KOwxKBVM9k3v3GylgFqBcH3uAqIYQ+8dF86hh6Laoxli9iNdNUbyubSa2q5sKBrt9UwqYyhmtnydCXA5UngqGBKAEYCLtPzJBNosxzUTXXfb9YLe2iNnn/BH73HvFP4NtYPbzv2zys3fhukXff4v9XdTONarpMCgVTHWMrza2SDZvQbk+9gBRDeH0L59wdKNUMJXSPLGfoRQwtqlyKhjM9k0pYKpjfMPGqmPqSQBKgJdeeuk7TGzNNFbmLjPxtZXxEybIujn97FICELaAWxKA7PW3KxGAjx+Lfya7LB5YKvm7oDNqbJGkT5xGuT74uRp/YxPyAMJzexTPotuiEkM9OxnPLYNuiyospILpg25LpcRs37lGMwVMd/TnoBILcbqzqvK3U41BqAJM9H2Niax+sAXMxFcWBGDr1q3/0Pw9rMAZW7eO4NcWcKUwqwt8eu50NX8eWMRGDOLP7eepJLYpSiExQZRM+lk4hG2KMvj8Zz8TA3K3DtimKIUvPvtMpILp8Eb+i88/xzZHGfz0vkhpkpw2AdsUpfDPsahYARw7vKq/d6oxCFWAiaufMRG2gwmt/8G+/YVS72G/X+bGtdjnHDNLzDFB+I+lDoG8+OKLLzGbksyef8e+/ZJxCMTWCiT8E1U6Y0wYqWAguBx7BqUKHz0qbJE8yjxBsUHVFcDYvLkilu3QYXRbVKGZAgYGFtX8jU0zFUzuQQTdlkqI2b6t+ObFC9Gfg0osztVZjb/d0BiECgErgH5dq3Xr1nVM0J2DNDDG9u+34efs9VL28++Z7zPSwIQgDQx7veQ5j9LAAFOHj1F6iQqZDcVRU8CYMSPV+Bub8fXrhZhZR6lg7NLcWsosmqecv7GpaioYzPZtxTdv2Yr+HFRjtTH14GePZAchKKimw6BUMJXTypI/YSyaDaoKwOThozThqJBmcPmT7ZuV8zc2rVQwO3eh21IJMdu3Gd+cOnEa/TmoRqu8aoWHtUgAEhyjmg6DUsFUTitL/qKFaDaoKgALE46h6LaoQrNk46dnTyvnb2yqmgoGs31bJS5vP0B/Dqqx2vKqJAAJjlFth0GpYCpjfNVK9Cz5qgrAXJwmHJXSTDD7s8YG5fyNTVVTwWC176dKXKb9L3GpOq3yquvWVexvbP1AUBzVdhjWsvVlyjFmh5HpU9Gz5KsqAIE04ajweRkpYD77yU+U9Dcms/cKqWCwbamEWO0725hEj29WmdXG1JMARAQcuoAybYw34fva2trvsp+9im1Xpai2w6h22TqobBzcT2yR3MHLkq+yAAyPGV5VnEwQaRWZ79peWX+jPr/MxyIVTPs38rnsj9HtsUus9p2+cNWIb8Ypcak6qw1xIQGIBCb0RjPBd4V9fdPM9/fyyy/XwM+wbasU1XYY1rJ1FRnMg0YYRBo6voWeJV9lAUgTDvvMXBcpYMIjhijrb2w2DujFn2H2QQTdFrvEat/YJS5VZ7UhLiQAkcCEXgzqARuvPzZ+/KWi18qg2g6DUsHYZ7YhZmTJ74Fqh8oCkCYc9llcXUBVf2PTSgVz9gK6LXaJ1b7ja1ajlrjUgdWEuJAARAJU/2BffhFe19XVfQRfX3jhhV9lr1OohlWBajsMSgVjn+kPLoktkonjUO1QWQBaombOLHRbZGdxfVFV/Y3N2NIlyqWCwWrf0VkzRHzz8VPoz0BVVhPiQgIQCUzobWAicJzxmgtA9v2Impqa1biWVY5qOwxKBWOfyd17xBbJkkWodqgsAGnCYZ/mdnnq4CFl/Y3NQiqY5ei22CVW+7ZSwNy6j/4MVGU1IS4kAJEAlUCY4LsAK36M/8oYhu+NUmxKwUmHQScz7TG2YoVYTdi2HdUOlQVgYcLRHt0W2WmmgMlcuaGsv7GZOn1OuVQwGO2bp4Dp/LaIb05RCphqWU0qGBKAuPgSE35/WlNT8woTf3/Gvv8ytkHVwEmHQalg7DEybbJYkTl1FtUOlQUg0ExtkqUJh63nlItllPY3Jq1UMIPUSQWD0b6zYSMFTO+u6PevMquJqScBSHAMJx0Gncy0x8ZBfY0UMA2odqguAM2VrfTl6+i2yMriFDCq+xv1OUIqmHav5xs6qJMKBsPf6YsiBUx4/Gj0+1eZ1YS4kABEQk1Nzbdra2sPMj5i/KnBn8FXbNsqhZMOg05mtkyeAqbDm2wweY0NKngpYMwOQ2VBEK2fJyYcBw6h2yIri1PAqO5vbKqWCgbD38l9B0Ss5IJ69PtXmdXE1JMAREJdXd0NJvbmMiH4f7PX/2cxsW2rFE46DEoF0zKzD6NiK6l/T3RbVBcExadbsW2RlcWnpVX3NzYjk9VKBYPh7/iaNSK+edNm9PtXnZXG1JMARAITf5+wL1/CtsMNOOkw6GRmy0yfuyCCySePR7dFdUFQEDcz0W2RlcUiWXV/Y7OQCmY3ui12iOHv6GwjBcyxk+j3rzorjaknAYgESPfCRODfYNvhBpx0GJQKpmXC4MG3SNhggm2L6oIgc/2usb05GN0WWWnF5R44pLy/sZnYvkOpVDAY/g4PHyTim2/eQ79/1VlpTD0JQCS0atXqN+vq6u4z7mNCcEUxsW2rFE47DEoF0zxh8OCrCGwwwbZFdUFgHXDo0g7dFllZOChzQ3l/Y9NKBTNtMrotdui3v60UMND/px6j37/qrDSmngQgEpjQ28LE3wOIA2RfJxcT27ZK4bTDsJatK8hgHiRCHjGRAuYcui06CIJQz84iMD+SRrdFRlopYNiETAd/YzJzN6RUKhi//Z2NpMSErFcX9HvXgZVWOyIBiAQm9P7XN7/5zd/CtsMNOO0wKBVM84TBg2+RsMEE2xYdBIG1wnXpGrotsrFpsmwd/I36PBVLBeO3v6EN8pCMcaPQ710HWif4bcbUkwBEQm1t7ZVWrVr9NrYdbsBph0GpYMpTpIB5gw8iMJhg26ODIIjWzxcTjv0H0W2RjU0HEB38jU04va9KKhi//Q1tkK9YLZiPfu86sNJqRyQAkcAE4IC6urpLjG1qamr+tpjYtlUKpx0GpYIpTxg0+BbSgF7otpgdhuqCILFxk5hwrF2LbotsbLqFpIO/sWmlgjknfyoYv/0NbZDHN7M2iX3vurCSakckAJHAhF+kDMPYtlUKpx0GpYIpz/SZ8yKIfMoEdFvMDkN1QZA6ekKInNmUCqYpm67G6+BvbKqUCsZvf0Mb5PHNrE1i37suLD7EZcff2PqBoDicdhi5OKWCKcfEjl0ijcSypei2mB2G6oIgc8NIBTN8ELotsrFpPK4O/samlQpmhfypYPz2N6Rj4vHNrE1i37suLE7jZMff2Poh0HjxxRdfat269X9uxYBtS7Vwo8OgVDClCcJPpIDZiW6L2WGoLgjMVDCQfgLSUGDbIxObJpLVwd/YVCkVjN/+hnRMvN9nbRL73nVhJdWOSAAigQm/36mrqzvN+C+MGePrmW984xsvYNtWKdzoMCgVTGlaKWBOf4Bui9lh6CAIIO2ESAWTQrdFJhangNHJ35gspILpi25LS/TT35CGie/89OyMft86sZJUMCQAkVBbW7uNccHzzz//a/A9fGUCsJ5xB7ZtlcKNDoNSwZRm48DeQqjcb0S3xewwdBAEkHaCTzguUioYk6Wq8ujib9TnaqWCeVP6VDB++jt9+boIxRg7Ev2+daJ1kn9EyzH1JACRwITehzU1Nb9c/LNWrVr9Cvv5YyybqoUbHQalgnmWPAVM+zc4ZRk4dBEEkHaCTzj2HUC3RRaWOoyli7+xaaWCeRhFt6U5+ulviFHjK1X189DvWydWUu2IBCASamtrG1u3bl1b/DP4PoingIGUCuZZwqof3zoa2BvdluIOQwdBkNi0WUw41qxBt0UWWltHRW1QF39jU5VUMH76Gyb7vA1u2Ih+37rRqnbUQkw9CUAkMAE4CMQe+9qzpqbm+/AVRCF7PRjbtkrhRodBqWCeJcT98eDxqZPQbSnuMHQQBKljJ41UMDPQbZGF1ir8unXa+RubZiqY5K496LY0Rz/9DTFqPL6ZTTyw71s3FlLBXG/R39j6IbBggu9txsOMd42vb7MffwnbrkrhRodBqWCepZU+Yrk86SN0EQSZm/coFUwTlorD1cXf2FQlFYyf/obJPk8Bc/0O+n3rRthWF9WOmk8FQwKQ4BhudRiUCuZpyphAVhdBkEs9plQwTVjqJL4u/sZm6pQaqWD89DeUK6MUMN4wsdFeKhgSgEioqal5tVWrVr8Pr1u3bl1XW1t7sq6u7hi8xratUrjVYVAqmKcZmTTeiBu6iG5LcYehiyAI9e4q4mTCSXRbZGCpCZhO/sakKqlg/PI3xKaJFDCd0O9ZRxZSwTRf7YgEIBKY4Au99NJLXzNe72acy0ThRCYCj2DbVinc6jAoFczTbOzXQ7qTgzoJgvD40UYqmKvotmCzVAoY3fyN+nwVSQXjl78h0TgPwWCTfux71pGZ60a1oxGDW/Q3tn4IJJjQ+xS+QuoXJv4+ga/s26+wn3+EbFrFcKvDoFQwBebSH7EB47V8Q8e3pBowdBIEsYX1lArGYOEQ1lBt/Y1NFVLB+OVvmOTzFSo26ce+Zx1pNxUMCUAkMNEXf/nll2uY4Puf7PUJ+BnkBQQxiGxaxXCrw6BUMAVmbj8UW0ZD+qPb0rTD0EUQFFLBrEa3BZvl2p5O/sZmZLJ8IR1N6Ze/4aS5SAGzAf2edaWVCiaSbtbf2PohkGBCbwDjPwGZ8PtH+Fnr1q3/X/b9eWzbKoVbHQalgikwdeK0CBqfMRXdlqYdhi6CIHXslBA9s6aj24LNUilgdPM3NlVIBeOXv2GiwVPAsIkH9j3rSisVzKXy1Y5IACICDnwwtC7+nvEPMW2qBm51GJQKpsDE5i1iQF69Ct2Wph2GLoIgc+u+WGUdNhDdFmyWi7/Vyd/YTGzbbqSCWYFuSzn65W8INeApYNikH/uedWW0fn6LqWBIABIcw80Og1LBCMYWLhCNd+9+dFuadhi6CIJc6km+4e0f5Rs6tQ18KphyJ/B18jc2VUgF45e/rRQwiUfo96wrrVQwa9c2629s/UBQHG52GOExwykVDDyH8WPEc7gg1wlV3QSBlQqmMdipYMpNvHTzNyatVDCD+6HbUo5++Bti0kQKmM7o96szU0dPGNWOyqeCIQFIcAw3OwxKBSMoa4463QRBQWhfQbcFi82FXujmb9TnrEAqGD/8DTFpPNZ73Cj0+9WZmRstp4IhAUhwDDc7DEoFI3eVCt0Egaxb7X6yXAoYHf2NTdlTwfjhb0i7xGMhF9Sj36/ONFPBNHRpV3YcIQFIcAw3OwxKBVM0c5OwTq1ugqBw2Ca4qWCaa3O6+RubsqeC8cPfkHaJl7hkbQ/7fnVnqJeZCiZV1t/Y+oGgONzsMCgVjL3YDSzqJgjMdDvRmdPQbcFiuRQwOvobm7Eli8WK8245U8H44W9oazwFDGt72PerO2GbvblUMCQACY7hZodBqWBgQLZXyBuDugmCzK0HIjB/6AB0W7DYXNytbv7GpuypYPzwNyS35ylgbj9Av1/dWUgFc7Csv7H1A0FxuN1hBD0VjDUgHyifvwmLugmCXNpIBfNOG+niLf1ieLR58v6m9v7GZurUWZEKZvoUdFtK0Wt/w+EXKG8JbQ7KXWLfr+5MbNzUbCoYEoAEx3C7wwh6KphyOdlkoI6CINSnm4iTCSXQbUG5/24dxYQrnguEvzEpeyoYr/0Nh1/4/ffrgX6vQWBL4UQkAAmO4XaHEfRUMKHu74gBOZZFt6VUh6GbIIhMGCsE9/nL6Lb4TVhl5yEXPToFxt+ozzvzUb6h3Wt8FUzGVDBe+zt97oJYAZ08Hv1eg8CWDhSSACQ4htsdRpBTwcAqDB+Qu3VEt6Vch6GbIIgtWigmHHv2odviN9OXr4sBYuzIwPgbmzKngvHa34mdu0UM5NIl6PcaBFqpYMqkFCMBSHAMtzuMIKeCyVy9JQbkUcPQbSlFHQVBYstWMeFYJVfdZT9o5mSLLpgfGH9jMzJ5glhxPnsB3Ra//R1bvkykgNmxE/1eg8JQry5liwqQACQ4htsdRpBTwSQPHRED8rtz0G0pRR0FgZkKJhLAVDAt5WTT0d/YjC1bKq0I8trfkSkThfg9cx79XoPC5qodkQAkOIbbHUaQU8HE170vVqPWr0e3pRR1FASZ2w9FYPqQ/ui2+M1ICznZdPQ3NhM7d0m7Deq1vxsH9BKrUQ8i6PcaFBZCXPaW9De2fiAoDi86jKCmgoFtbz4gHz6Gbksp6igIIB1FUFPBWDnZ7jwMjL+xCVVA+IrzJPkOQnjpb3EARu5ayDoysXVb2dyTJAAJjuFFhxHUVDCw7c0H5Ot30G0pRV0FQahvd7Ey0RBHt8UvWjnZ2r3GB+cg+RuT8D/GdzjY/xy2LX76O3OnQeoUOLoydeqcmHBMnVTS39j6gaA4vOgwZE6G7CVDXdqJlc/kh+i2lKKugiAyMXipYGAbjg/I/XsGzt+YhFXmhk5tRDLk1BN0e/zyd+rkGSMJ9lT0+wwSs/cbRTsf2Lukv7H1A0FxeNFhJDZubDaDuY7MRtJiZaBXZ3RbylFXQRBbvKhsnIyuhEB8PiBPmRg4f2MT8rLxlf6b99Bt8cvf5lZkEE/bY5Kv9Hd4I9/Q/vV8LvPxM/7G1g8ExeFFh5E6dkqchp01Hb0B+cX0xWvi9PO4Uei2lKOugqAwOK1Et8W3e96+U8QGLV8WOH9jEyoz8FjfoyfQbfHL39ZhhL370e8zaGwc1NeI9W14xt/Y+oGgOLzoMKBQeNBOZpo52WIL6tFtKUddBUEQt6fgFCofkHftCZy/sQlJ7vmEY8MGdFv88nchHclV9PsMGqFfK3XanwQgwTG86DD4yUyJSyZ5wfiaNSI/2KbN6LaUo66CAE7BBm3CEZk4TgzIH1wKnL+xKWu+Ty/9Herd1UhInEK/z6AxvnpVyXyfJAAJjuFVhxG0nFFRMyfb8VPotpSjroLgqRqtAUkFY518DpU/+ayrv7FZSHY/FN0WP/xtlSTr0i4w7UsmlttdIgFIcAyvBgg4ts4F0elz6A3ID0J6hOZysslAnQVBY78eRiqYGLotXhNOn/Lch52az32os79Rn3/CTHbfHt0WP/yduX5XCN4Rg9HvMYhMX7pWsuY3CUCCY3gWNLxiuVi23rYdvQF5TXFS603jpFbpnGwyUGdBYGdLVBfC6VM+IAwfFFh/YxNO+/MJR0SeLVGv/J06clxsec+ZhX6PQWQ2mhETjh6dnvE3tn4gKA6vBghIycGXrRctRG9AnjfQZnI1yUSdBUFsiZEKZrf+qWDg9CkfkGfPDKy/sRkeP1q6QxFe+RsOu/BDL+vWod9jUBnq1kHkmI3nnvI3tn4gKA6vBggoXs1XKcaPQW88XjN16qw4hTptMrotzVFnQQArzXzCsfLZkkm6Mb7ByLP53nuB9Tc2CzVa96Hb4rW/o/Pmins9dAT9HoPK8Ohnq2uRACQ4hlcDBJwWkz0xsltUJQ+dzoJAFRHuBq0B+eDhwPobm1aNVokmHF75OzxqmIhvvnoL/R6DylLVtUgAEhzDqwECgtMhSJovWyceoTcgLxlbWK9EklSdBUH2nrkN3wfdFq9pd0DW2d/YlHHC4YW/eT9ulrjUvB+XmYmNm56prkUCkOAYXg4QQZk5QvUPvjx/6Rq6Lc1RZ0HwdMkkeQ/iuMFQVzMeqPkBWWd/Y1PGCYcX/s6Gk2Inp3dX9PsLMlPHTj5TXYsEIMExvBwg7G5VqU44ncUH5GgG3ZbmqLsgUCEVj1NaNad7dmrxvbr7G5N8wtG+dI1WLHrh7/T5y2Klc8JY9PsLMjO3nq2uRQKQ4BheDhCJjRufWbbWjblYVgzI3Tui29ISdRcEMDvmuSePyZuM2ymtnGA2ak7r7m9sNg7qIyYcd0Potnjl78TO3SLWcekS9PsLMktV1yIBSHAMLweIwrL1DPQG5BXTl2+IAXnMCHRbWqLuggAmGjz3JJt4YNviFSupOa27v7EZmT5FTDhOnkW3xSt/x5YtFW1qxy70+ws6G/v3FLknH0Ytf2PrB4Li8HKAsJathw5Abzxe0RyQowvmo9vSEnUXBBBqwH0xby66LV4xvnp1ybqgQfQ3NuOrjBqtW7ai2+KVvyOTxov45nMX0e8v6IxMmSB8cea85W9s/UBQHF4OEKWWrXVjJQMyNnUXBIUarUPQbfGKkelTxarTidOB9zc24dQ/X41d2PJqrB/0wt+hPt1arDlN9IfWauz2nZa/sfUDQXF4PUBYy9YPIugNyAtaA/LJM+i2tETdBYFVtL7z29oWra8k7kx3f2MzffGq7XhMP+i2v3l7gprTGrcnlWjFYy5ZbPkbWz8QFIfXA0RkykQhkIxla90oWyB4cwyCICisWCTQbXGbcNoUTp1Cuhs7K+pB8DcmKzmR7Qfd9ncQVtRVItQ55yeyJ461/I2tHwiKw+sBIrZiuVi23rYdvQG5TTEgv8GpwhZ3EARBZOI4ESfDOktsW9xm5vZDEVM7uB/5WxIWcjLm0G1x299Q+o3H1L47B/3eiJ/ybXg+4WCTXNPf2PqBoDi8HiCSu/eKZevFi9AbkNuEVT8+IA/qi26LHQZBEEC6Cl1PLZZKBht0f2OzVI1WLLrtb6g1zdN4bdD3VL1KhG142I6HbXnYnicBSHAMrweIQiLRMegNyG1C3B+/txlT0W2xwyAIAp3zlsU3bBADMhuYyd9yMFo/XyS733cA3Ra3/Q3pu0RezZPo90YUDI8YIkKOrt0mAUhwDq8HiGw4pW0pITj5ywfk1avRbbHDIAiCpnEyOjE6d7YQG4eOkr8lIaSA4X3AqpXotrjtb6g6wcXGbX0r66jG4upaJAAJjuH1APFUMfHkh+gNyNXGuMCY/e8/iG6LHQZBEGQb9a1dGh4+SAzI1++SvyVh6tQ5MeGYOgndFjf9LWprv5lvaKd/bW2VmNi4SUw41qwhAUhwDj8GiPDIodayNXYDcvW+xowQ8T+X8eN/7DAIgoDHyZgTjsQjdHtcva9ObUT8T+oJ+VsSQnorHgfcvye6LW76O3u/UdzXwN7o90UsEPJ/8gnH9KkkAAnO4ccAUbxsjd2A3GSoW0chNGJZdFvsMCiCIDxqmJhwXL2FbotbhPJPfEDu14P8LRG5MH+nMmHuFd30d+rUWSE0pk1Gf8bEAq2DhwP7kADUHF+qqamZV1tbG2J8yF53L/fGurq6KOM99r5rjFfZe1+xexE/BojEps3GsrUasXJ2mI1mxFZjDzlygNlhUARBdP67YsJx4BC6LW4xdfoDMSBPmUj+lozW1vwNe1vzXtFNf1uxjatXoT9fYoHFW/OPsh+RANQVTNC1YWLuMLz+5je/+Vsg8tj33yrz3nDr1q3/sJrr+DFAQLF0sWw9Bb0BucX0hSsiSep4dU43B0UQFMfJYNvi2j1t3SZON69YQf6WjJUezvGKbvrbim+W4HQz8Wmah3Oytx+QANQVTOztqampebXo+6mM40q9lwnAyEsvvfSdaq7jxwCRvR8Wy9YD9IknaVqWRwUGRRCkjp8SE46Z09BtcYuxhQvEgLx3P/lbMlaanscruulv1eKbg8To7JkiPc/R4yQAdQUTdTeZ4Psz83smBruy71eVeW+E/e46+3qDcekLL7zwVbvX8WOA4MvWHd/KN7R7LZ9L48bJuEUr4TATgti22GVQBEHmTkNFFTNUYHjsSDEgX7xG/paMqWNiwhFFnnC46W/V4puDxPi698XYs/59EoCqggm2c4yPisnE24fwlYm9r5cQgN3KCUB4v/HyK+zvprD37bVrB3QYjx+LzsNLmnEy2Zt3Pb+WH4TE1jzu58JldFvsEvzsl78x+Shr1Mxt/wZ/jW2PGwx1NwbkeJb8LRmzdwsl+jDtcMvfuahZ47gz+rMlPktY+eMTjjkzSQDqikq2gIvRqlWr32bv+8TudfI+Ibuknv/Tfnr+rF+X9BTh3l34/Xz2k0+xTSGUQGyoiJP5eSaNbYpjfPaTn4h4016dsU0hlMAXn32Wb+jwBie8Vh0/fXhfhBtMGYdtCqEEfp5MiPCjkYNJAOqKurq6tsYhkC+bh0CYIPyDpu974YUXfrV169a/YX7P3tOP/d0Ju9eBfyg/VggSGzcacTJr0WdQTpmLmSeA30G3pRIGaUUItuP4lunxU+i2OGXm4lUR0zhuFPlbUsLqH9/huPsQzQa3/J3cvceIb16E/lyJz/JR5iN+ChhOA2965ZWvuKM4CLLhy0YamEbGBiYAe5i/YD//PuMSeP3iiy++BKlfimIAtzNB+E27F4EOg/9TeRy3YCWw1CAwP33hqnECeDS6LZUQ/OyXv7FpFbJfvx7dFqdM7t4rBuRFC8nfktKccEA8IJYNbvkbDrapFt8cNEKCbvDRw9d/0NoL8UEICPwaIIoTWGI3HqcsniFj21IJgyQIUkeMOJnZM9FtccrY8mViQN6+g/wtKa0Jx4YNaDa45W+Y2PLV8wtX0J8rsTShEggXgG3+8XvYGoKgMPwaIAongV/P59Jq15a0TgDv2IVuSyUMkiDI3HogJhxD+qPb4pSRSePFgHz2AvlbUkIOQD7hmDsbzQa3/G0dOIpm0J8rsTShqIIQgK8MxNYQBIXh5wDROGygODl76z56A3LCyISxYkA+fxmDXl/AAAAgAElEQVTdlkoYJEEABezhFDAwl/kY3R4nDPUSB46y4ST5W1JCFRAeFjJ8EJoNbvg7G05ZJ4CxnymxPKGsKheAbX+4EltDEBSGnwNEdM4sESdz5Dh6A3JC6Bz5gBxJodtSCYMmCMzA/MztB+i2VEvIw8YH5G4dyd8SE/KbQj1gqAsMux0YNrjh7/QHl0SsNpvkYj9TYnlmrt02VgB/eB5bQxAUhp8DBATk8ziZdevQG1C1tAbk7pUPyNgMmiCwMuYrPOGwDhyNG0X+lpyN/XuKieH9MMr13fB3YvtOEd+8bCn68ySWZy75IZ9wPGz76iNsDUFQGH4OEKljJ0WczKzp6A2oWqYvVj8gYzNogsCacCCX6HJCJyUHg+ZvbEKtcz7hOHEa5fpu+BtOmvMcgHv2oj9PYvNMbtuWf9DmlX7YGoKgMPwcIHQo0WWl5Fis1glgYNAEgSwlupwQTprzAXnXHvK35IyvXYt6EtgNf1s1gC/ZLzlIxCH4GVs/EBSHnwMEBOPzjPntX1c2MB+2RsQJ4J3otlTTYQRJEOiQeghWmkUN4Kvkb8mJnXrIqb9zuU/yoa7tjZKDOfTnSWzZ39j6gaA4/B4gIC2HCMx/iN6AqmFkonEC+INL6LZU02EESRA8nXroCbo9FdvPB+QOYkCOZcnfkhMOG2HucDj1dzYUF/HNvbuiP0uiPX9j6weC4vB7gFA9ML+QkkOtE8BmhxE0QWClHrpxF92WSpkNJRwNyEH0Nyaf3uHwP9epU3+nz5wXJ4Anj0d/lkR7/sbWDwTF4fcAEd9g1AReuxa9AVXKQkqODui2VNthBE0QRN+dI2LoDh1Bt6VSFgbkCeRvRWhNOG7e8/3aTv2d2LpNxDevWI7+HIn2/I2tHwiKw+8BInXyrBjUpk1Gb0CVEkojqVgDuLjDCJogSGzcJCYca9ag21Kx7eaAvHIF+VsRWhOOg4d9v7ZTf0fr5wvb9x1Af45Ee/7G1g8ExeH3AJF9GBVxMn17oDegSgkHP1TOkRVEQZA6eUbZCUe0fp4YkPcfJH8rwsSmzWLCsXq179d26u/wqGEivvnKTfTnSLTnb2z9QFAcfg8QENje0KWdcdLsEXojqoSxhfViQN67H92WajuMoAmC7IOImHD074luS6UMjxwithOv3SZ/K8LUqXNiwjF1ku/XduJv3i93flv0y8kP0Z8j0Z6/sfUDQXFgDBDhsSON1BZq5ZoyZ8iZq7fQbam2wwiaIOADW6c2PGt+LvUY3R7bdsMJZod2B9Hf2Mw2xESccJ9uvl/bib9V3pkJKkkAEhwDY4BwktwWi24MyNgMqiCwVtIUEu5QTowPyAN6kb8VIuYOhxN/W7HZCCuXxOr9ja0fCIoDY4BI7t6jXDWN7L1GY0DujW6Lkw4jiIIgtkC9rXsoJ8YH5OlTyd+KEauahhN/W2UTFczOEFSSACQ4BsYAkb58XZymZR0ldiOySx3KigVVEFiHd5YuQbfFLt1IlxRUf2PTqqe7298dDif+hvrsKudnDSJJABIcA2OAyCUe8a1UCDqGLRPshmSH8XXviwH5/ffRbXHSYQRREKQvXBUTjrEj0W2xy+gcI2H64WPkb8WY2LlLTDiWLPb1uk78DTsbPEzibgj9+RHt+xtbPxAUB9YAAacyeUWNBxH0hmSHkZnTxIB8/BS6LU46jCAKAojFAt9BbJYqE47GQX3EgHyngfytGK18oeNG+Xrdav0Np375hLxTGx7rjP38iPb9ja0fCIoDa4CITJ8iBNWJ0+gNyQ4hGJ8L1vuN6LY46TCCKgjgdKMqEw44ZMQH5HecDchB9jeq/8yKQV07+DrhqNbf6cs3hGAdNQz92REr8ze2fiAoDqwBIv7ee2JLdf169IbUEgsz5LZKz5CDLAhUmnCkr7gzIAfZ39iE+s18wtEQ9+2a1frbOpS3aCH6cyNW5m9s/UBQHFgDROroCXGoYtYM9IbUEt0akLEZZEFgTTgUiOF0a0AOsr+xCelU+ITj5BnfrlmtvyEbA9ia2Lkb/bkRK/M3tn4gKA6sAQKCjXlalYF90BtSS0zu2ScG5IUL0G1x2mEEVRCkjp0UaVVmVJ9WxS+6dYo0yP7GJsaEo1p/h8cMR0lbQ3Tub2z9QFAcWAMET6zc8a18Q7vX8rnUE/TG1BzhNB+fIe/YhW6L0w4jqILASqysQEm4Qk3WG+RvRWmmjXKSx9EPf1sl4CDBPZWAU4okAAmOgTlAqFKhITzamCFfvo5ui9MOI6iC4KmBLiFvDWo+MXrHnYozQfY3Ns0a1KG+3X27ZjX+hkNtqkyMiM/6G1s/EBQH5gARW2hUaNi9F70xlaM1IPOVSjVLwBV3GEEWBFaFBolrUGfuPBQD8iDnoRFB9zcmYcIR6tpelISLZX25ZjX+tkIjFE5wH1SSACQ4BuYAAbWAZT99lrn9QAzIg/uh2+JGhxFkQWDWoIZEvdi2lGPy8FFxOGrOTPK34gyPHyMmHB9c8uV61fhbpWwMxGf9ja0fCIoDc4CArV9+unbEEPTGVI7Jg4fFgPzuHHRb3OgwgiwIYKVZHOapR7elHOOrVwmRumkz+VtxxlYsF77cstWX61Xjb5XSIxGf9Te2fiAoDswBIpd+km9o/3q+ocMb+VzmI/QGVYqx5UYnvnUbui1udBhBFgSFCcdgdFvKMTJ5vBiQz5wnfytOa/I4d7Yv16vG3xj5Conu+RtbPxAUB/YA0ThsoDgIcv0ueoMqRSjnxLdxzl9Gt8WNDgPb35jMpT9iE443OOE1tj2lGOrZSQzI4ST5W3FmbvkbPlKpv+F/jB9UYf9z2M+KWJ2/sfUDQXFgDxDR+vniIMje/egNqimtk6MQyB2X9+RoJR0Gtr+xGR4+SEw4rt1Gt6Ups43uDsjkb1w+nerK+wNklfo7deqsOAAyZSL6syJW529s/UBQHNgDBOTW43FZSxahN6imzN4zUiQM6IVui1sdBra/sQnJvN1IsuwFIQ6LD8hTJ5G/NWF45FBXcjp64W9IUs0PgLz3HvpzIlbnb2z9QFAc2AOEzIXIU0eOK1Ouzm6Hge1vbFoHQRbIdxDEOpG5zp3qEeRvfFpVXXZ5P+Go1N+RaZN9L1dHdNff2PqBoDiwBwioAgJbJLBVAlsm2I2qmNaJzI2b0G1xq8PA9jc2YeuXr+oOG4huS1NGJk8QA/Kpc+RvTejnhKNSf4d6dRbxpqEE+nMiVudvbP1AUBwyDBCNQ/qLuKyb99AbVTEjE8eJ7RsXTmTKQBIEn/LT5nDqHE6fwyl0bHssuyBxcLeOYkCOpMjfmjBz/Y5vE45K/A2ij8ebMhGI/YyI1fsbWz8QFIcMA0R0/rtim2TfAfRGZfLpATmNbo9bHYYM/samWYIwfeUmui0mvSgdRv7GZy7zceEgiMe1divxN2z7uhlvSvSfJAAJjiHDAJHYvkNskyxdgt6oTGbvh32v5elHhyGDv7FpxmXJVBGkEG86nfytGa0ShBeuenqdSvztdrwp0X+SACQ4hgwDRPrSNekOgiQPGSW5ZutxAMTsMGTwNzYh5RD3bf18dFtMxlaucK0CCPlbLlrJ5D2uCFKJvyH1i4g3PYv+fIjV+xtbPxAUhwwDBD8IYlYEkSRBb2zZUm0qgBR3GDL4G5uZG3dFXNbQAei2mLQSjrtYN5b8LQet+s4eTyYr8bebCceJOCQBSHAMWQYIqAfsV74sW/aMGibsuXgN3RY3OwxZ/I3JQlzW674k6G3RHkgYDAnH3/6RqwnHyd9y0Awnaezbw9Pr2PU3lH3j4S29u6I/G6Izf2PrB4LikGWAgPg/vuK2bTu6LeKk6JvipGhKnpOibnQYsvgbmwWB721clh1mbhslwwb1IX9rSC9OeDvxd+roCXEAZPpU9GdDdOZvbP1AUByyDBDJQ0eMbZKZ6LZkrt4SMYnDB6Hb4naHIYu/sWnFZW3egm5Lcv9B8b//7hzyt6a0Yu5OehdzZ9ffsRXy/O8TnfkbWz8QFIcsA4RMp26t8nSL5StP57TDkMXf2LRWQWbgr4LEliwWA/L2neRvTQmnbb0uu2bX3+HRw6VZ/SY68ze2fiAoDlkGCL5N0v0dsU3SiBuYDCsxPC/h/oPoz8XtDkMWf2MzGzLioHp24v97mLZAkmCeCP3qLfK3pkydPicmHJPHe3YNO/6GQ3ZWInSNwluCSBKABMeQaYCwalMeO4VqR+PA3mJAvvMQ/Zm43WHI5G9shvp0ExOOBxE0G3KJR6IU4jtt+OEU8reezEYzYsLRtYNnEw47/k5fvi7CW0YOQX8mROf+xtYPBMUh0wCR2LhRbJOsWoVmA1T94B11l3boK0NedBgy+RubEG/KV3oPHUGzIX32ghiQx48mf2vOxgG9xMTytjcTSzv+hrRWPLxl2VL050F07m9s/UBQHDINEJADjQ+GY0ei2ZA6cVrbEkkkCJ4mnDjHrkBjxYatXUv+1pxWycvdez35fDv+hkozfJfl8DH050F07m9s/UBQHDINEFArk2+HdXzL9e0wu4ytMCoybNyE/jy86DBk8jc2oRYw9mnvyMRxYkA+fY78rTmtCjQun/auxN+Q+4+HPTyMoj8PonN/Y+sHguKQbYDwKiDeLsMjh2qXALq4w5DN35jk+R7NhNBs8uH79YsTQMey5G/Nmbkb8jQhdEv+BtHHw1t6dUF/FkR3/I2tHwiKQ7YBwkoIjVCCja9A8pJ0b0pTks7tDkM2f2PTKsF27qLv185cN0rSDelP/g4AeaaDHkYJtoa47/5OHjysXX3zIJMEIMExZBsgrPxs0yb7fm0ZYhC97jBk8zc2IS+bVzF4LdHKN7loIfk7IIzMnCbiAA8f9d3f0QXzxeR6527050B0x9/Y+oGgOGQbIKBUknUKN/tjX69tBeSvWYP+HLzqMGTzNzYxRT+sxHAxcOAQ+TsgtA4eLVnsu78Lp5AfoD8Hojv+xtYPBMUh4wDROLif6Kiu3/H1upGJYz0LyJeBJAieJSTDFYlx32CvH/t3XZ74vKNn24HkbzlplplsHDrAV39bic+7v6NdequgkgQgwTFkHCBiSxaJrQo2W/brmvxAQKc2IiA/nkN/Bl51GDL6G5uw+ud3HGDm5j0hBAb2Jn8HiPzgT6e2op+JZnzzt1VrfRbF/+lCEoAEx5BxgEgdOS7iAKdP8e2a6QtXtc+QT4KgNDHiABPbd3ga/0f+lpeQY5TvNBw94Zu/YwvrxaR6xy70+ye6529s/UBQHDIOENlwqlA2yac4QEsErFmNfv9edhgy+hubsPLndxwgTG64CGCTHfJ3sGjFAbos/pvzd+MAo7zlLYr/04UkAAmOIesA0Tior69xgOHRw8U24AeX0O/dyw5DVn9jEmL/IAbQrzhAmNTAISce/xdJkb8DRhBhfPu/f09f/F2I/+tI8X8akQQgwTFkHSCsfICbNnt+LYj5syqQpJ+g37uXHYas/sammQ/QjwNA1kEAj/L/kb/lJj8A1LOzmAA8iHju7+S+A5T/T0OSACQ4hqwDROrUObEtN36099cy6/9OGo9+3153GLL6G5uJjRvFttyypd5fi01q/LgW+VteQjk4ngJozz7P/W2lG2JCEPu+ie6RBCDBMWQdIPi2XIc3eWWOXOKRp9eyVhs3b0G/b687DFn9jU2rKscA707lmrRWG0+eJX8HlMn9B41VuZme+puHG3RtL1YbQwn0+ya6RxKABMeQeYCITBwnBsoTpz29TuPAPka84V30e/a6w5DZ35h8alvufqN314llee1hHm7gcbwh+VteQu5HHpfXraNrB91K+Tt96ZqY2AwbiH7PRHdJApDgGDIPEFAP2OtUGTDY8464RyffK49gdBgy+xub0fnvGqWydnl2DSvF0ZSJ5O+AE2JA+cGzy9c987eV3WD1KvT7JbpLEoAEx5B5gICSRVyc9e3u2ek1MyVDtH4++v360WHI7G9sWuJs6iTPrmHGfnkpMsnfahBKTropzkr5G/KacpF5/jL6/RLdJQlAgmPIPEDwbbk+3Yz6lQ89uUZkwhixzXz8FPr9+tFhyOxvbIrt2dfyDe+08eQ0OI/HMsu/uXj6k/ytJtNXbort2UF9PfE3r6v+9o/yDZ3f5pWOsO+X6C5JABIcQ/YBwiwLF9+w0fXP5ulf2r/OD5vkkh+i36sfHYbs/samWRbOiwMa6cs3xIA/uB/5mygmBEbcaeZuyHV/wwljvrsxcxr6vRLdJwlAgmPIPkBYVRpGDHb9s5OHj/oWjyUDSRC0TDPuNFo/z/XPdnvLj/ytPq0SbVu2uu7vyJQJIv3LoaPo90l0nyQACY4h+wCRy3zMS8J5sW0WYTNj3kHu3ot+n351GLL7G5vZh9FCGUL2v+fW50I4Q+OAXkbQ/w3yN5Ezdeqsa2UIi/0tdjfeyDd0eIO99jaNFhGHJAAJjqHCAGGdzty23bXPhNyCkIoDUnJkoxn0e/Srw1DB39iE1WYu1M5dcO0zoaSh1weayN/qMZd6km/o1IbH6jnN01fs7+TBw54faCLikgQgwTFUGCBSJ8+IWfKoYa59ptVBTta7+kfTDkMFf2PTqgqysN61z4yvXi22f1etJH8Tn2J07mwxwd26zTV/R6ZNFrsbe/ej3x/RG5IAJDiGCgMEnGALdevgWrA0EGbGQSuPRILAHrP3w/x/o6FLO75C4/Tz+Pbv/9/emcDYVZVxPJ3GanBBYktx6mxvlohYjSZCNKiIWyQQQtoOUuiMliJQaEVLK9oqlUpAg8AAIosQaMWyFNtoldJNCGtbOthFusy0nX1rgWJcGlzG/3ffucNlfDPz1rlz3/v9ki93Oefcd+47d/nfs30L5sWv35d3U97Y22zA7eWSa7JS3r0tnW8NbmvtCf38sNwYAhAyJiovCN9dW9uKFRkfq+eg/4C8sKAekAiC5G3AXduGzRkfq2tLo3MzN3/Umn8p7+iY18/ZTQ/U/ZemjMu7Y/Ua52buptDPDcudIQAhY6Lyguhu3BXvQ3XV3Iw9dpjPX+8BeWv2/HBGwRAEyZs1nWVrhHjL7Q3xJr5HHqW8sYTWes/d8Q/c5Q9mXN5+H1arWQz7vLDcGQIQMiYqLwivGW1R3Gdv57MvZnachd92nfy3hn5eo/3AiEp5h202cjI+SOiC/p6m1vSPY5NL+4ONMuzkT3nnrw0MErrikv7ervQmbbZyPtbW8pZryyyOYsfGniEAIWOi9IJod00bmYxs69qyPd4ct2DeqDbHjQVDEKRm5h4w01qZ9jW/i1+zP7uB8saGNRvklsm8fd70L/e5ifOXLw/9fLDcGgIQMiZKLwivVuZb9d6UCekOBvFHx7U/+ljo5xPGAyNK5R22de94JV6bMvfitAaDWFcFf/BH5zOj3xxHeUfLOtatjw8GWbokrfQ2+KN5zkXx2uamttDPB8utIQAhY6L2gvAHg1ifmVTTdu/aFx/dab4xC2jwR/CBEbXyDtsOLrs2XiuzNvXJwjs3/ile23zNglBqmynvaJn5n7YmYK97ytbGlNO3r1xZkH2bC9UQgJAxUXtB9Ow54PXLshG85rUhlbT+hNKjORfbWDIEQermz0HpDT5KoW+WCb6DixfFxeO69ZQ3lpRZy4TXZeD6H6eUzj5omy/7ZnwkcePO0M8Dy70hACFjoviCaLnzjpQn6u3euect4dhcmM0jCILUzRNyP/x+vNvA6jVJp/P9THvCsTu9Tv2Ud+FZb8fh/ua5c1KuBfT9THc13ER5F4ghACFjoviC8Py1SshZXxcTdiPF917iy5Zm3KE/6oYgSM9stHh8hOac/t4k3AZaf0ETfl7t34b0OvRT3oVrfi3ggR8sTGokr/c8vCTuTu5YexvlXSCGAMxjampqzpJtq66uPqblzcPFraysrFKc52T7FH+L7ORkfyeqL4i2Bx+Id5hevGjEh6SNqvNe4PMu9XwAh533MB8YUS3vsM3mA/T6VzXcMmJc+8jwrs1rF4c60pzyjqZZVwN/yquR3MPZ9eV7NWq94zbKu4AMAZjHmKiLxWJTJeauG0kAKnxTVVXVLFtX/Gna3prs70T1gWG1LAcWXjWid5CevQc8l16ZTK+QL4YgSN9sLkAbPDSSd5CuF7Z5NTHmaWY03b5R3vll/nRV5s5tuOvInxrLmo17W7oo7wIyBGABIGF37XACUOGTJPqOarXI36f43bJYMseP8gOj66UdcZduQ4zStL5+5n7Lq7m57dbQ8xu2IQgys44n1g+8lE3oDQ63F7X/sTEWphmivKNtrfffFxd38y9LOO1V56anvG4w9sFh0wxR3oVlCMACIAkB+EmF7wnus2Zg7T8jmeNH/YEx8FK2JpC7ftnfs++Q15Ha+l41z790YF6t3s4joec1bOMFkbnZCHLvept9YX/bw4/09xzq8kZgejUx1g/LPjbuuG1MTDJOeUfbrGuL3/Wg+fLZnntCe7aZRxnvOrSaZvvYeGwV5V2AhgCMMBJpz8v6giYhd9gtp/jx0hGA1gScigA8ciR+MUXVOp/cEB8U4oRg0A7d+JP+vvbe0PM4FszKOR/KO0zr63ujv/2hhxJea95HyL339Pf1vB56Pinv/LC+7lf7WxpuTny9zZ7Z36EPD8q7MM3KOW0BAtEg103A+cL+mdNi++rP/9X+utr2pvra17V8en/djJlLA/8LQLbYVzfj1P31taua6mp7da0d0fravXW1Xwg7X5Cf7K2bfu7++vM36jp7VctOLX+9t27ax8LOFwDkEBOAEni3DBdHYm+zrN7Fn57KIBAAAAAAGCNUVlaeKeHXbrV7sjdkbbKzLUwi7xzZPX7cWCxWY03KNg2Ma/49JbycAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA6tTU1Jwl21ZdXX0swRyD46qqqm5XWLNsv9avCCWTkDPc1EI2+Xij7GVdAyvCzhNkF/MlrnJ9zmYGMM9AspPDzhPkDpVzizkEsPvZ7mvd4zPCzhNkD5Vpg8r3kJb/raioGJj/kfscUsYumlgsNlUXy3WDBaC267R/g62XlpaeYA8WLqr8YqTJxSH6qHw3qZxn2bru32nMDZrfqHwP2jM97HxAblDZnl5SUlJs5RwUgNznkDaJhIAuorXaXxvY/qkJxdHPHeSKZCYXh+iCd6DCw2qHgsIA8pNgOXOfQ0YkEoDa3qmL6rRAnMu1/cBo5w1yhxOA7a75d2OyfqMhGiTyD27NQ5Rz/uKaB/+s5Q7ZvcXFxRPDzhNkn0ECkPsc/h/zCuL6eA2YLpTDbjnFj5ekAJyLAIwWI5V/ZWXliYo23uJq/TPa36tlScjZhiyR6MXgPASdEVKWIMeobD/kVserrG/UPf2HUDMEOWEkAch9DklDEzAYKt91ug7OCzsfkB1oGipsysvLTzL3oWHnA7IPTcCQNRL1BdPFU+8GgRT5g0DwLZxfBGuBY7FYtT00bGBQmHmC7KIy3Wz3sq3r/p1O5/D8pbi4+Djdx8f72yrv7+oZ/lSIWYIcMbivJ/c5pIxe9me6PmBH7UtR1iY72wUXuWlgDsiadEFdGWpmIetYk75r6rc+gNuo/cs/JAhqrCuATQ/hmoX4iMtTysrKKtyUTn4fwNUq/9Kw8wXZQ2V7l72zVbZv2ge7TdFm+7nPAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKLmwD+hWTiugnkV6bzO0r7eZvHLJ20AAAAAJBFnAB8Ppm4TgD+Jp3fcQKwK520AAAAAJBFEIAAAAAAKSJBdLW5VJS4+auWzRI6tYGwReZaUWGHtfxtWVnZB/0w8+3p0m7X+t+0XFVeXv5+pX/Q3DSaay+tf8SPX1FRMVn7HlZYj6zVxNhQeVK8NYpzdyAft8ieHCLu2wSgtn9ux7fzkb2k9c/5YU4APq79K9z57gqGT5w48b0B11Vd5lpSuye4tAhAAAAAiD7OH+ffKysrq2zbRJpE3IdtXfu/IcFzUHGqJX7eqe07tf2Mn9YEoPljVvyTSktLT3A+Pfcq3pcVPE7LhoBos+0tsuu0/g5LY8JRx704Ub6mTJnyAYV3KPxcHfNLJhotb4niDhaAWr/A8qPVIq3Pl/Xq995lYSYAzSep9s20cK3Xaf11nePxLu3jsvsmT578bsV9n8Kf0PYylxYBCAAAANFHgiZmAlDL83yR5KP9G2Tz/O1Jkya9x8RTWVlZhUtrArAuEL9B23/0tyWYPq19fS7uqbLO4PEVfpH2bRoqbyYkLb3VxinuOcOcw7BNwAp/Tek/4X7TBOC2Qb/TaIJQYZPs/Ez8BdJ+1mpAXVoEIAAAAOQHEjbTJXKesmZb2e+tVtD2a/2VwcLLRsEq/HS3fkjhXwmE3aA09we2P67tf7jfmKHtf5kYM7NaN9lRre8cJmtFrlZxz3D5T9AEvMDy7n7D7N+uVnKgCXhQ+tXat1Dn9Skt/+Pn0eXzqP0vLi0CEAAAAPILqwF0zbZP2/ZQNYCKV27bqQhALU+z5uRU8qNj/8imd7EaOq1/Z6h4QQFoNXayI4p/SiD8NT+fQ9QAbrcaQGti1vKYdo0fIj8IQAAAAIg+Vtsn+6L18dPmeC2vl8jZbGHWB9CaP60PoIlD7f+F7Fk/bZIC8J9us8j1AVxSXFx8nLbHWb/D4ACMIE4wvmrNzTaQxGryFP+jieIGBaDifM1qKd1glQnav9hqHgcJwDdlX3fnO8uObYNX3O9aH8A7/W0dr0RxvurSIgABAAAg+kjcTZXgedGN2rVmz41+E7AYJ9HzPau5s1o1G5lbUlJS7Ke1/cnWABoSUyfaCGHrC+iaZrcHRxz7WB88hTWZsPP3WU2kay6eMDj+oCZgaza+152P/c7VwXy6JuBV2rfcjQLebcLOP5bVcrq+jC2u+Xe31q90aRGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+pNm0AAAAdSURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh8D9DhEvBblylkQAAAABJRU5ErkJggg==\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=True) as figure:\n",
" figure.plot(np.sin, label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig = replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")\n",
"fig.plot(np.sin, label=\"sin\")\n",
"fig.show()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\") as figure:\n",
" figure.plot(np.sin, label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=False) as figure:\n",
" figure.plot(np.sin, label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=True) as figure:\n",
" figure.plot(np.sin)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9B5RcR3YlyO6WW400knab0xLV3QTBqtppaaSd0VlJu2dHZmaPNDvnSLszp0V2kyBBwnvvvSe8I1DwHgThvfcehPe+stJbECSb7FEbNZu18SL+/5koZFZl5jcvzLvn3FNVWVn53/+vIuJFxIv7XniBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFA8Bh1dXU/rq2t/etW3hOpqanp6OY67BpzGXPss75gn/XHbj6rNbDP/xt2ra/Yt1/38nPZZ/4ds/8h+/o5+zqVfX2TfX3g5TUIBAKBQCAQWgQLQDpAoMMCnvdaey8LVN5h70209J5SgZPbAJD97f/BPvdnbdq0+f1qP6MU2OeuZvata3Y9uI9fvuBxAAjBH/vsgV5+JoFAIBAIBEJFYAHJZRboPGHMsh9/taX3sve8yxhv6T0suPlbK3D6RrPruA0A32rt2mWg6P0FHAD+4tVXX/3PXn5mGWjRrwQCgUAgEAxC27Zt/3cIcliw8/ewugbbkS289z+y3/+U8UvY8oVtWPb9G/A7WPGDoIbxO+z7n8Bn2u9hnz0c3tM8AGzTps2/Ze/bC4EnrCqy39e/9NJLv1ns2ux34wuvzb7esWz6HfaZy+DvrSB2P3utzv479rtx7P1n2esT2dcU+3q3yGePYPwXxp8X2PxtOwBk/D577RFs2TIeefnll/+g4PN/HVZO2esh9p5P2NdTjP++xPOrtWyHz/wJXIc9r/+r+arqiy+++Fvs5zXs9acQ8DL2tZ5Pe+uaz62wNv8MK6DdzL4usp8LvP6d73znJfb9Bsak9dw3sGf+zVI+JxAIBAKBoCEgUGC8Zn2/kQUN51p6vxVoPLcKZweA8H3BytnXmv2tEwD+4R/+4f9iBSZ92Y+/8u1vf/t/huCKcWkl14YAkr1+nH3uiyyg/A0rRzBuB5JWAPgv7LVR7Mdfg/eUeg4lVgC/Yq+vh6Dsm9/85m/D84H3FvzdmoKg8Ovsb3pCjiIEpqXuw3pW/6nUfbHvVzFefOWVV74F9rLfL7eC08IA8JmVySKfsdr6m3fYj9+w7vvXINeQ/W46/AzPiH3WWrC/lK0EAoFAIBA0AwsCfpcN/v/MgoKu8DMEJRBYsODlT0r9TYUBYMkcQPZ1QPNgE1bDYBXyhWaBY6lrQy6gdd1/V/C2X2Hv+5h9/uvWdca1lrNo2V9yC5i9/ocFr0GAdw++t4JYuH5Ns8963NJKauGzKnJfX4NnwK7zX+zfQ+BprXxWGgCeL7wu+/m/N38WcG9gD6wMtvR8CAQCgUAgaAI4iABbkrC6Zb30NSt4WVzqb7wKAGFr0lqh+tQme+1HEJAWbrG2dG0WqP45XKf5tjF731X2+mDLlnGtrWpa9pSVA1hoA/v+L6wVwsJ7+Ix9/R/s69AWrlUyAGSv/xv4PeP3mt3Tx5UGgIwfNLvuUMg/bG4vPHM4YNPaMyIQCAQCgaABIK/NCsLSjBmgtSL4RUFQ+AxYoPB2awEg+/u/KmMFcCz7+ViF9hZbAWy+YvkN2Fpmn/+adR1YATzT2mez96ysNABk1/1urcif/HYl91HOCiD7/f9TYMe/brYC+GdwXVgZLPiMkUVWAJ+5H/h79npDJbYSCAQCgUDQCNahDziM8New6lTAGlgVZL/vVezv2Pv/Dg4wQM5es9edoAYOO1iB0R8VvqcwAITDInBoArZU2Wf9T/Zr7Of/r5TNpXIAIYcNbIfPYe+ZDduc3/rWt/6VdZ9lBYDsfVOsLdOvF7xWzkrbdsbdEAzCzxCUQfAG+XulrtVKAGjnAF6AABdWN9n3SwpzAK1DIj+yVjkhYPz38GxbCwDh79hrUfa7iRBUwmvw3OztcgKBQCAQCJqDBQE7GA+V+B0cpHjutKwFWGGDwyJPrW3EH1p/88vCoKY2L9j8qb0dyr4PF54ChtO6YAesQFpbkXetwxpFUSwAhDxG6xRw0tomPcCCr//V/n25ASD7m5chALS3RgtPAb/QQgBonQIeW3BKGE7XbmtJq7D5s2r+mQWngOFUMZxu7sOYLQzUIFCG1TzrJPZ+OGndWgAIgO31WnFwJWYFkY/Z3y5o7fkQCAQCgUAgEAKEdVgHVmv/EtsWAoFAkAasU5xvbX98xWbxf1rqfWyW28lKcG+oFVIT3yj1XgKBQMCCpaUIZfW+bp00hhVXKBXnqSA1gUAgKA0QpwUJA9heKhUAshl0GxCBBa0w+Blydtj3PYK1lEAgEFoH65teZf3VrVpRKxjEoEHcuhbbLgKBQJASsApYKgCEZGmQnbB/ZjPs/1pOXhCBQCAQCAQCQWK0EgC+z2bVwwp+/h6chgvMOAKBQCAQCASC96gkAAR5CgoACeXg/ts/+HeP2/9gQ8M7r2ca2v/g08ftXz/68J3X/t8XSlSrIBDc4OHbr/3nx++8vo/9nz1lX5+w/73tj9q/9hfYdhG0xNca3vpBO/a/dpb1b581vPOD+KN3frDi/pvfp3QDglrwawv4q6++aiKYic+OHmxq6PBGE+sYn2N2yYKmX/7859gmEjTBV19+2fTkg9VF/9eAn+za1kR9EcEr/PInP2lKzZ5W9H8t1KV90xcXzmKb6Am8ii8IkqOlAPDll19+BfS5QPT0BSGcCodAepbzufBP9PTpF00ff0zUneBn29+JbdtEh/juD5via9c05RoTTU+SHzclDxxsCvXoyH8XmfFe05PsZ+h2E937G9OOJ08+b4otfF/8v7HBN7lzV9OTeLYpF003JTZvbmro2I7/Lr5mNfozU5my+BubT9JPm8LjRopgr2+3ptSxE+y1T5pyjyNNsaWLnX4vdegwuq1u/e1pkEGQD6CSD2KpLAD8F6uU1WN4nX2/nH3/D/b7LBmYEMjAgHDsC2XKwECHwRvNE6LuBD8D0mfO8w4QVv9SJ04/977M/VBTqE833lHGVq1Ct5vozt/Y7Tux1ZpsdO/QlLlx97nfpz+60tTQ6S3+nuSBQ+jPTVXK4m9sRt+fx/+XGof0a8o2xJ/7fXLvfvH/yCYe6Wu30O1142+fwg6CKaAOwxyCn7/8/POmUK/OvANM7Npd8r2Zm/fYoCxWZtIXLqHbTqzO39jtO3Pnofg/YhOO9IXLJd+XOnZSDMpd2zdlHzaiPzsVKYO/sZk6fkqs/LHJRvZB6f+j+Pr1Ikgc2Lspl3qKbne1/saOHwiKw/QOwySCn3Orl4vt3envNeVyn7f4/sSOndZMun9TLvMpuv3Eyv2N2b5z2R81hUcPt1aSV7b6/mj9QvG/OXM6+rNTkdj+xmYunuNbvnwl+dCRlt8L/5tjxTYxpMBg216tv7HjB4LiMLnDMI3Z2/fF1m+nt5qyj6Otvh86ycbhg8RqIQsGse0nVkbsgCB55LiYQAzq05RLfdLq+7PRDF+54avOH11Bf36qEdvf2IytXiUmEJMntDq5BWZuPxCH4Dq1K6s/lI0UABJcw+QOwzRGpk4SM97168r+G56fBVsqPTqyGfYT9Hsglk/MgABWjCHwg/+d1NETZf+dveocHjW0rEGcKIe/sZkNJ5saOr/NJ7iZu4/L/rvoIrHqHFtcj34P1fgbO34gKA5TOwzTCMn3fDWmV+emJ8nKArnI1MliFXDrNvT7IJZPzIAguf9gPpDL/qjsv+OB44DeInA8dxH9GapEkwNAOKwG/zPR+XMr+jtY+eOn0Du82WLOoIykAJDgGqZ2GKYxOm+20FvbubVif6cvXnUkFXJpygVUhVgBAazcNQ4bKIK4U2cr/ns4nCS28sajP0OVaGoAmItm8qt/98pf/bMZW7ZUrAKuWI5+L5X6Gzt+ICgOEzsM05h9FBG5LqyT/PKLzyv2NwzodsI0yXSoQ6yAAE6NO7l/Faz+2cwlP24K9ezEP6OYbAxRLn9jM7F9h5gwzJ5R1d+D7BXPje72rlJpLhQAElzDxA7DNMbXrRUz3CWLqh4gbJkOCASx74dYHrECAjhh7vbgUPyDD8T/7CL1crNM8zcm+UE1K9fUzcGhyLQp4n92Z2lpLNlIASDBNUzrMEwjdJC2NELm5t2qBwjIzbL1A0HbDfu+iK0TIyDINsTEakrX9lyWo+rPgdws/jnv8BVB7GepAk0MACFPlK82D+3v6tBQ/nMGKHP4iAJAgmuY1mGYxtTp804yvtsBwpZZiK1cgX5fxNaJERDw0m6QjL/wfdefZZ9ahwMl2M9SBZoYAEbnzPJEpopPlPv3FBPc63fQ76tcf2PHDwTFYVqHYRojs6ZbVT/2uB4gIMGaHwbp2YmEoRVg0AEBP/wxpL/Yjrt41fXnOWkH40ehP0sVaFoACPl6/PAHnOCNpFx/XnzdOjHBXb4M/d7K9Td2/EBQHCZ1GKYRtuC4xAFjLpb1ZIAIjxkhTneeuYB+f8SWGXRAAHVV+QRhQK+qDn80J5w4B/1J+EwVhXp19zc24UAaP/wxbYonn5e512BNcDsrMcGlAJDgGiZ1GKYxefCIU/bN7jDc+ts+cRddMB/9/ogtM+iAILZypSU0vt6zz7TLw5EGpXz+xiZU/OApAkeOefaZttoBpM5g3185/saOHwiKw6QOwzTapzHtupheDBBOkj9IJqRbL+9FxGOQAQFs/8LKnzhsdN+zz7WT88NjhqM/T9lpUgCYDafyh408PCTkTHDrF6DfYzn+xo4fCIrDlA7DNMKWL9/+7dTOOY3p1QARHj+6apFfYnAMMiDI3LwnTlEO7O3pKcpc5rOmUA+hCZh9GEZ/pjLTpADQrjQTrVL7rxS5ZqqT5/wZ+n225m/s+IGgOEzpMEwjrPrx7d8ZU5/pMLzwt12v1YuTnkT/GGRA4Oj2rVrp+WeDFiDfBt6+A/2ZykyTAkDo1wp3N7wkKCa41RUMyt/Y8QNBcZjSYZjG6NxZz0loeDVAOLPkXp09SfYn+sMgAwK79Fv68nXPPxtWmqk0nFz+xmQu9dQ6/ftGUzaa8fzz45s2icnMsiXo99qav7HjB4LiMKHDMI1826x7B7FtFko802F45W9nwL96E/1+icUZVEDAS2nBhKB3V18mBJDj1dDpraaGjm8qVapLV39j054QhCeO9eXzM3cfif/n/j2lFoWmAJDgGiZ0GKYxfemaI/7cvMPwyt/xtaK8HJSZw75fYnEGFRAktm0XKyaLF/l2DVsUOnX8FPpzlZWmBIDRRQt9TQl45kDT3cfo99uSv7HjB4LiMKHDMI3xNWtEcPbBB891GF75O33lhkj6Hz4I/X6JxRlUQBB5b5Lvh4KgRqsqpzN19zcmecWO3l2tQ0GNvl0ntmSx9HmnFAASXEP3DsNEOtuz124912F45W/eEfe0TmeG4uj3THyeQQQEudQnTjUGP7dn4QQw35br01XqbTnd/Y1N57T50P6+Xid18ozIO2WTG+x7bsnf2PEDQXHo3mGYxvwBjS7P5WN5PUDYdThBcBr7vonPM4iAIG3r9E0Y4/v9wKCvUq1WHf2NTRAED6JcGy8z1/FNnnsKh06w77uUv7HjB4Li0L3DMI3JffvFVtn784p2GF76u6VrEfEZREAQW7VKpBts3Oj7/YDEDL/Wps3oz1ZGmhAARqZMDEyDFA6Z8GudlbPsJQWABNfQvcMwjdF5s61VucNFOwwv/e2sNvbtRttyEjKIgAByQIulG/jB1JnzYltuygT0ZysjdQ8AofJQEOkGNhObt4jVxhXL0e+9lL+x4weC4tC5wzCN/PRaHytB+nG0aIfhtb8bB/WxTss9Qr9/ov/+LiRIDPEJQI9OgehB8m05NvhDEJBLf4r+fGWj7gFg+sJlkW4wflQg18vnGw5Av/dS/saOHwiKQ+cOwzTa+lUQlJXqMLz2N0h/8NNyO3ai3z/Rf38X0q42A7mgQd1TeOxIseJ48Sr685WNugeAjvRUM3UDv8gPuvXoKCbUkRT6/RfzN3b8QFAcOncYpjGxa4/YslhUX7LD8NrfqWMnxbbc9PfQ75/ov78L6eix7d4b2D3F160LNAhQiboHgOHRw32rNlOKdsk5GfUnKQAkuIbOHYZpjMyeIfL/jhwv2WF47W8oxdTw7g+bGrq9S2XhJKPfAUHj4L6Bb/+nL1wK7NSxatQ5AMzFc6Kf6dq+KZcJbvsfdABFWbil6M+gmL+x4weC4tC1wzCNz+jyNSZLdhh++Ns+CJC5cRf9ORD99zfQyf/r2TnQA0C8Dmyndk0NHdvxEnHYz1gm6hwAps5csA4ATQz0utCn8bSaYQPRn0Exf2PHDwTFoWuHYRozN++3mrDs1wABRdMpD1A++hkQpI6eEAPyrOmB35ctzwEahNjPWCbqHABCyUm+9f/hh4Fel0+s7brqkTT6c2jub+z4gaA4dO0wTKNdKgtKGLXUYfjhb9hy5ocBZs9Afw5E//0NxAz6If+P8gCD9Tc2YcufB/0fXQn82pDfLGMeIAWABNfQtcMwjdG5lv7f4aMtdhh++DvbEKMyXRLSz4DA2fa/eS/w+7Krj0Qmj0d/xjJR1wCQ6//xbf83UapyJLZtD6T6SDX+xo4fCIpDxw7DRIb69xTbFI8iLXYYfvk7NKCXCAjuh9CfBdFffzsHf7p3QDn4w/UAnQMBn6E/Z1moawAIp375wZ+xI1GuD6UHeXrNyCHoz6K5v7HjB4Li0LHDMI35FbiWK3L4OUBAOTi+AnngEPrzIPrrbyjDxVfgpk1Bu7fGEYPp4FFA/sZmYvNmsQK3ehXK9WGSISqQvCHVwSMKAAmuoWOHYRqTR8vLwfNzgEju3SdsqF+A/jyI/vo7vnYNek3e2FIrB3HnbvTnLAt1DQBhohFU/d9SxMxBbMnf2PEDQXHo2GGYRshN4YPh9h2tdhh++dupQjK4L/rzIPrrb+cULuJgCLmufMIxdzb6c5aFOgaAz5zCjWbQ7IivsSc9m9CfSaG/seMHguLQrcMwkeFRQ8WAfO1Wqx2GX/7mdYjtskmIHTXRX3/DgAy5d5CDl0s8Qbs3yHXlaQ/9e6I/Z1moYwCYuftYTCyH9EO1I3XyjHQVjygAJLiGbh2GaYScFMhNgRyV1hTy/R4gIu9NEls1Zy6gPxeiP/7O3LL0JocPQr03PuHo201MOBpi6M9aBuoYACYPHhYrve/PQ7UjG05ZwuedpFE6oACQ4Bq6dRimEbbhyi2N5fcAQfpsctEPfyf37hcD8qKF6PcXnTNTTDiOnkC3RQbqGAA6epO79qDb0jioj1RKBxQAElxDtw7DNCa2bBVB15rVZXUYfvo7dea82CaZOhn9uRD98Xe0fqE47b3vAPr9JbZuE6dDV+GcDpWNOgaA4dHDRNB1/Q66LdH5c8X//sHD6LbY/saOHwiKQ7cOwzTCyV++CnLsZFkdhp/+hlJJfJukhzzbJCbTD39DTVQ+IN9+gH5/6YtXxer3xLHotshA3QJALgDd8U0uAp1Lt5zeEgRhFbK1aktB+xs7fiAoDp06DBNZjgB0YYfht79l2yYxmV772xFg7vYuigD0c/YkbEHod6SwB5u6BYDpq7dEgD9mBLotQNCc5PaMGopui+1v7PiBoDh06jBMYz4xuXNZK25BDBDRea2XpCMGQ6/9nb5wSQyAk+QpwdY4dICYcNx5hG4LNnULAKHOtEwl2OCQnVOSLv0Juj0UABJcQ6cOwzTCadtKcu6CGCBk67RNptf+Bg00nm+6bi36vdmMLpgvVV6WTv7GppNzJ9FkMjx6uDQ5iRQAElxDpw7DNMY3fFjRqdsgBoj01ZtSbduYTK/9HZkxFb0iQ3Mmdu0WE45lS9FtwaZuASCIysuWTgL5f/xU8u696LZQAEhwDZ06DNMIoqR8QD59ruwOw29/P5O43YouIdFfeu3vUJ+uIt+0MYl+bzZB/JwmHP74G5O5aMY6UNZRqgNlcPpdFhkkCgAJrqFLh2EiKx2QgxogGkcOETP3W/fRn5HJ9NLf2VBcDMh9u6PfVyHzE463jJ9w6BQAps5+JNJb3puEbkshMzctIXTWx2HbQgEgwTV06TBMI1Q/4ANyvx4VdRhB+Dtav0Dk7hw4hP6cTKaX/k6dPi9dKSybdilEOKWJbYsu/sZmfONGkd6yfj26LYXMZT7jk42GDm825VK4B0EoACS4hi4dhmlMnTgtBuSZ0yvqMILwt5OXRQdBUOmlv+MfVpZvGiRjixeJCceefei26OJvbEK/xtNbTpxBt6U5Id2gnNrrQfgbO34gKA5dOgzTGF+7VgzImzZX1GEE4e/05RsiL2v8KPTnZDK99LczIJ+Ub0B28rLq8fOydPE3NkMDepWtbxo0ZSlPRwEgwTV06TBMY2TKBDELPX+pog4jCH/nkh8Lgd4u7UmgF5Fe+tsRHH8cRb+v5oRcU56XNWIwui26+BuTuVhWygMgNpP7D1oTjgXo/saOHwiKQ4cOwzRCpwjiz3xAjmYq6jCC8nfj0P4iL+vuY/TnZSq98nfWPpFZpuB40BR5WbZAr7kHQXQJANMfXZFOcLyQUAaRTziGD0L3N3b8QFAcOnQYptE5kVnBARC7wwjK346I65Fj6M/LVHrlb1hl5vmmUyai31MpOgdBbt5Dt0V1f2MzsW27yCFetRLdlmLkE47Obzc1dHijKZd6iupv7PiBoDh06DBMY+pMdScygxwg8p34KvTnZSq98ndiy1aRb7p2Dfo9lSKdPNcnAJSxAkhzhseOFCk4V2+i+hs7fiAoDh06DNPolOSqUCIhyAFC9m0cE+iVv6NzZ4kDIEdPoN9TKSZ27hITjhXL0W1R3d/YbBw2UPr6znZFEMyT5xQAElxDhw7DNEbnzBQD8vFTFXcYQfnbSeTu3kHKvDET6JW/ZSzJ1ZzpS9fEhGPiWHRbVPc3JmFLFbZWYYtV5gNkEPjxCQcLBDH9jR0/EBSH6h2GibQH5OyDxoo7jCD93Tioj7DzYRj9mZlIL/ydiz/hPmzo9q7UgXwunjN+wqFDAKhKaT+n5vk4PKkrCgAJrqF6h2EaHYkVGJArnCEHPUBUu1JJ9IZe+FullbXGgb2l1Y5Txd/YlGFlrRw6/XDXd9BWKikAJLiG6h2GaUxfsUWWR1fVYQTp72pzFYne0At/q5RbF5klr1i1Kv7GplPVZe9+dFtaY7U7MV76Gzt+ICgO1TsM05jYvUcMyMuWVtVhBOnv1Olz4rTyjKnoz81EeuHv6KKFYkDefxD9flqjU65uwwZ0W1T1NzbDY4aLfNPrd9BtaY3R2TNQdzgoACS4huodhmmMLa4XA/K+A1V1GEH6G6pGcMHUgb3Rn5uJ9MLf+bqnt9HvpzWmTp216mNPQ7dFVX9jErZS8/p6n6Db0xrjGzei1semAJDgGip3GCbSzQw56AECkvEbunfg9uYST9CfnWl0628+IHdtz3OdIOcJ+35aoz3hgDqy2Lao6G9sZu41iAnj0P7otpRDZ8KBtMNBASDBNVTuMEyj2xkyxgABuYp8BenKDfTnZxrd+htym/iAPLgv+r2UQ14isUcnMeGIZdHtUc3f2IStVF5jd84sdFvKIfaEgwJAgmuo3GGYxszdR2JAHjaw6g4jaH/Hli5BF0w1lW79nTpxRqxwzJqOfi/lEoTH+YTjoyvotqjmb2xC7ibfUt24Ed2WcsgnHPYORzyH4m/s+IGgOFTuMEwjVGLgM+R5s6vuMIL2tyPrsGwJ+vMzjW79reKhCjitDDYndu5Gt0U1f2MzYh+qOKHOKW6QR+ITjkvXUPyNHT8QFIfKHYZpBDkVPiBv2lx1hxG0vx3Zmglj0J+faXTrb+xTjtUQDkfxCcfiRei2qOZvbDYO7ocqq1INY8uXoU04KAAkuIbKHYZpjMy0dM5Ona26wwja304lCYMrNGDRrb8bh/STvgRcc6avWpUkxuNVaFDV35jkJeBAWLlLe6lLwDUnyCPxXZlFC1H8jR0/EBSHqh2GiXSER6ssrYY1QDQOsCo0PI6iP0OT6MbfcMiID8iS12R9zu6EuRMOlQNAUDUQJeCGo9tSnd3Bl66jAJDgGqp2GKbRmSF3rX6GjDVAgEwCX7k8fR79OZpEN/52BrbRag3IQDiVySccDTF0W1TxNzaTBw6JlbT64FfS3PCZ0pwBTzgoACS4hqodhmnM3LjreoaMNUC4zV0kBu9vVQdkYGT6e2LCcfYCui2q+BubsVUrRS7d9h3otlRKpwZ1wDscFAASXEPVDsM0Jg8etgbkBa46DAx/p46dFLbPre70MjF4f8dWWgPyjp3o91Ep42vXCNu3bkO3RRV/YzMyZaI4TXvhErotFdtuTzjOBLvDQQEgwTVU7TBMY2z1KtczZKwBInPvsaXwPwD9OZpEN/6OTJ5gDciX0e+jUiYPHxUTjgXz0W1Rxd/YDPXpJlbRwil0WyplfO1a0Tdv2Rq4v7HjB4LiULXDMI2RqZPFgHzuoqsOA8PfvIJJp7eaGjq+2ZTLfIr+LE2hG3+HencVA3JEvQE5c/O+SJcYNRTdFlX8jclsNCMqavTqgm5LNcSacFAASHANFTsMExnq10MMyKGEqw4Dy9+NIwYLSZE7j9CfpSms1t+wCsMH5D5d0e+hGubSn/ByiaqdYMbyNzahaguvODN5PLot1TBz8x7KhIMCQIJrqNhhmEYoM8QH5B6dXJ00wxwgoHoJz5M5dhL9eZrCav0NeVh8QJ4yAf0eqmXjkP7KaRhi+RubIEsYQ4QAACAASURBVKLMxbtXLEe3pRpyySSECQcFgATXULHDMI3py95U08AcIKC+p2plxVRntf5O7NwlBuSVK9DvoVpGFSwrhuVvbMYW14t64fsOoNtSLZ0qJg+Dq2JCASDBFR61f23gZ4f3K9dhmMbkXque7lJ39XQxB4jUidMiT2bOLPTnaQqr9XdsyWJrQN6Pfg/VEiYafMLBJh7Ytsjub2yGx44U+c3XbqHbUi3dVmmq1t/YMQRBYTx+5/UnIGL5JP0UvQERS9OpN7l7j+sOA2uAcE4CDxuI/jxNYbX+hpVmPiBfvoF+D9US6hcL6SFzJhwqBoCQ0gIiyjAOgagytj3VEkPrlAJAgis8bv/6JZ4nc/MuegMilmZ40jgxIF+65rrDwBogcpnPmho6tbNOAn+G/kxNYLX+DvXqzP/fcrEs+j1USxMnHCoGgFCthec3D+iFbosbJo8eFxOO+XMD9Td2DEFQGCwAXMOXrY8cRW9AxNJ0BuRoxnWHgTlANA4fJBLz79JJ4CBYjb9B9kXlE8A2hfQQm3B0YBOOtBnSQ9jtuxqCrBU/cDR1Mrotbpi5/UBMOEYOCdTf2DEEwWe8+uqrNXV1decZH9XW1l5i/F7z99TU1PwNe/0njNcZb8BX9tqvt/bZj99+fShftl6/Dr0BEYszG05aA3I3TzoMzAECtuP4hOP4KfTnagKr8Xf64lVx4GiSmpIchYTBmE842OCMbYus/sYmVJrh+c2rVqLb4oYwyYDdDdA7DeokMAWABoAFfsdZMPc2fM8Cu++zny83f48VAF6v9LMb3n79H/my9azp6A2IWJxQiUFoZLmX5MAeIOIffmidBP4Q/bmawGr8ndxjHTha5u7AkQyE7Tg+4Th6At0WWf2NzdjiRcqfALYJlY74hONeQ2D+9iLGIEgKFti9yAK7H7Fvv26/xgLADGPbZu+DAPBGpZ/f8M5/e5UvWw/pj954iMWZ2LVHDMjLl3nSYWAOECYm5mOyGn87B47Y/x22/W5pmvQQdvuuhjocOLIZnTPTkh46HZi/PQgzCLKCBXZ/xoK9B4WvwTYwe/1vm70PAsDP2XuvWr/vUc7nb3nttW+EoERXByrRJStjy5ZaJ4D3etJhYA4QmbvmJeZjshp/g/gzH5A/uoJuv1uaNuHAbt/VMNRT/QNHNh3poQ+D2eGgAFBzFAsAYQu4eQD44osv/tY3v/nN37Z+/4eMt9h7/qmca8RGDxUClvce8X8oolyE8kh8W+HiFdef9fSpGCDgK8a9PMl+JvJkOrbj32M/W91Zjb9DfbuLATmcRLffLbN3H4kJx4hB6LbI6m9M5qL5A0fYtnjB1In8hCMof3sWbBDkQ7lbwEX+bjj7u/nlXCOzaD7/p/3xlUtNBPkQGSBqAP/i8x9hm+IJYqNETeCfZ1LYphCa4Zc/+WcRMPXq3PTVV19hm+MaX/3iF3zCEer8VtNXv/wltjmEZvjJw/si/2/6JGxTPMHPU+LAXmzMsMCu6TLEIMgOFuydYHwHvodVvWKHQNq0afP77MvX4HtYCWTvOccCwHfL+fxPdm0TW4wbN6LPoIjP8kniiVUDuGPTkyefezJjBGCuEDgngdlsGfv56s5K/Z25dkucAB4/Ct12r9g4JF+iC9sW2fyNTafC0bIl6LZ4wSeZT52awE9yPwrE317GGgQJ0bZt2zoWzF0AGRhr+/eP4HX2/XL2+j/A9+y1Xuz7u5YEzB3GMeV+/o8vfySWrefNRs+hID7LtD0gjx3pWc4IgHdWSPdkYokuLFbq7+T+g2JAXlSPbrtXjMycJiYcp8+h2yKbv7Gp04Ejm05N4EeRQPztV9xBMAQ/TyYCF7AklsfkwcMiOK9f4FmHgT1ApI6dtPJkaMLhNyv1d2z1KjEgb9+BbrtXjK9dK+5py1Z0W2TzNzZ1OnDk3NOMqWLCceZCIP7Gjh8IioPnyVjL1kEJWBLLY3ztGjF4bd3mWYeBPUBk7liJ+cMHoT9f3VmpvyPTpojB6+xH6LZ7xeTBI2LCsfB9dFtk8zc2Q/1EfnO2MYlui1eMr1kd2CSKAkCCa0CHUZgng92AiHl6vX0lwwCR43kywSrmm8pK/d04oLfoBx5H0W33ipnrdzxNo5CZMrTvcpmL5/Obc7nP0e3xik4axWL/0ygoACS4BnQYUYPyZFSiE5g/8CYwl2WAaBzc15pwhNGfsc6sxN+51NOmhnd/2NTQ9R2tBuRc8mMRaHTvoNV9ufU3Np385nGj0G3x9L6u3BD3NWFMIP7Gjh8IigM6jPg6c/JkVKEfK2WyDBCR6e8FlidjMivxd+bGXTFwjR6ObrfX1HGr0a2/sZk8cEhszS9aiG6LlwRBaz7h6NUlEH9jxw8ExQEdRuqwOXkyqjBz1/tcOVkGiNgq/Q4byMhK/J08fFT0Ae/PQ7fba0amTNTusIFbf2PTyZXbth3dFq8Z6t1ViKlHM777Gzt+ICgO6DAyN63Z/5gR6I2HKOiUsZrjXRkrWQYIKPwu8mQWoT9nnVmJv+Pr1okBefMWdLu9ZmzFcu3kRtz6G5vOLsBZ/XYBwhPHBlLfmAJAgmtAh/Ek9bHI/+n2rvZ5MqrQKWT/wQeedhgyDBDpy9fFhIN1lNjPWWdW4u/IzOliQD51Ft1ur5ncYwsOL0W3RRZ/Y7NxUJ/A9PKCJkxseYWT/Qd99zd2/EBQHHaHEerf04g8GVUYnT9XdCJHjnvaYcgwQGQjaacGKPZz1pmV+LtxSH9Rc/p+CN1ur5m+eJXfG9TVxrZFFn9jMpf+RCw4aCo9BqktfMKxepXv/saOHwiKw+4wHFFO1lliNyDiF03hUUPFgHzzvqcdhiwDRKhnJ5EnE8+h26Iry/U3DMJQM7ehYzstB+RsOCUmHH27odsig7+x6WiBjhiMbosfBB1NPuGY/p7v/saOHwiKw+4wYHuErzjt3YfegEwnbMM3dG3PZ8m51CeedhiyDBAg/8AnHNduoduiK8v1N6z68QF5aH90m/1iqIf+Ew6Z2ndLTJ047Xl+s0yEbW3engb18d3f2PEDQXHYHUZi526xbL1yJXoDMp0gxMs7kAG9Pe8wZBkgoLwdn3AcPIxui64s19+p0+fFisWMqeg2+8XweGvCcVXfCYdM7bslJjZvFvnN69ej2+IH+Yp657d5hS3Y7vbT39jxA0Fx2B1G6txFMQhMm4LegExn3heTPe8wZBkgQHOSDwLr1qLboivL9TdIcXBfrFmNbrNfjNYvtCYcR9BtwfY3NkFujPvikL6+aBw5RKTw3Hnoq7+x4weC4rA7jKCWrYmtM7Fjp1iNXeXtaqxMAwScNuVB7qzp6LboynL9HdSpRUw6Ew5NV50q8Tc28+kft9Ft8YvRubPFqfrjp3z1N3b8QFAcdofx7LL1p+gNyGTGliwWA/K+A553GLIMEJl7j8WEY9hAdFt0Zbn+zuuWXUe32S+mTp6x8s5motuC7W9smnAALL7hQzHh2LjRV39jxw8ExVHYYUDVCb5sffcRegMymeFJ48SAfMnbAVmmAYKXuoOTp530PHkqA8v1d6hPNyEBFUmh2+wXnco6mp48rcTfmMxGM0ZIQKWOnhATjvlzffU3dvxAUByFHQbMjvmy9Ykz6A3IZDq1S8PeDsiyDRC29lz2QSO6LTqyHH/nEk/EgNyjI7q9fhJ2NWB3Q1ftuXL9jU2ojsFF4CeMQbfFT2Zu3Rf3OWqor/7Gjh8IiqOww4D8GF3LQanCXOop94EfVVlkGyDg1CmfcJw+j26LjizH35nrd8RANXYkur1+06k+8TiKbguWv7EJeaY8v3lRPbotfhLku7jYddf2vlXXogCQ4BqFHQacyuLL1gvfR29ApjJz+4FvM0fZBoj4mjViwrF1G7otOrIcfycPHxVtfsF8dHv9Jpyq56kV5y+h24Llb2zG15rT5kHGy88JBwWABNco7DDgVBYPPsaNQm88phJOjfEBea73IqmyDRCmrAZgsRx/Q61pnqy+aRO6vX4ztmK5CD527UG3Bcvf2HRqTp8+h26L7/c6dZKYcFy47Ju/seMHguIo7DDgVBbPB+rZCb3xmErYfvdLrkK2ASJ9xYx8ICyW4+8g5CpkYWL3HjHhWL4M3RYsf2OzcegAcdDwXgO6LX4T/s/4hGP3Xt/8jR0/EBRH8w4DTmfxZetoBr0BmcjoIluw1vsKGbINEDn7RGCvLui26Mhy/O0I1t5+gG6v34SVGK49OXUSui1Y/sYklxrr1I6f/s9lPkO3x28mdtnVtVb45m/s+IGgOJp3GHlNsBvoDchEOs//ivfPX8YBItSrs9AEi2XRbdGNrfn7mZrTPpaskoXZhpgvJRZloYzt+5nn/7BRPP8h/dBtCYJpn6trUQBIcI3mHUZscb32VQFkZqivf5psMg4Q4fGjrRqtN9Ft0Y2t+dsOiEIDeqHbGgR5wNtF34BXxvZdyNSZC9rXnC6kU11rcF/f/I0dPxAUR/MOI18XdA16AzKNueTHQgKmewdfpANkHCCcLe8Dh9Bt0Y2t+dvZEn1Pzy3RYszXaNVP7F7G9l3IxPYdVonLVei2BEGx5f1WU0OHN7nwvR/+xo4fCIqjeYcBmmx8UJg5Db0BmcbMTUs8dPQwXz5fxgHCqdG6bi26LbqxNX/rfiiiGKNzZlli96fRbQna39jMl7jcj25LUIRSl34deqEAkOAazTuMzP2QWLYe2h+98ZjG1LGTQgJm3mxfPl/GAQKqzuheoxWLrflbd1mUYtRZ7F7G9l3IfInLa+i2BMW87I33YvcUABJco3mHwZetoUZrR6rRGjQTmzeL1bAPPvDl82UcIDJ3HmpfoxWLrfk7r1OmpzByMeosdi9j+y5kqG93X0pcykxH7H77Dl/8jR0/EBRHsQ7DrtEKq4HYDcgkRusXiC0SNkj58fkyDhCQjM9LJnXxr2SSqWzN340D/a1UICMdsfvx+ondy9i+bdr5zSGf8ptlpSN2v2SxL/7Gjh8IiqNYh0E1WnEIgsh+noiVdYAI9e8pApFQHN0WndiSv00NvEFuSIjdd0a3JUh/YzNz464IvMcMR7clSKYvXRf3PWm8L/7Gjh8IiqNYhxFfs1osW2/bjt6ATKLfItyyDhCRyRNE4PvRFXRbdGJL/na23kcOQbczaILwONee1EzsXtb2DUweOSa23t+fh25LkITtbj7h6NfDF39jxw8ExVGsw0juO+DbsjWxOHOJJ6Kj6NHRt2vIOkDEli4RW997zTkdGARb8jecgvWr5rTs9HulXUZ/YzO+YYPIb964Ed2WIMm1J7t3EBOO5Mee+xs7fiAojmIdRvriVSEFM9n7ZWticQaxRSLrAOHog602Qx8sKLbkb+fAkQ81p2VntN6/couy+huboGzA04qOnUS3JWiGRw8XOfU373vub+z4gaA4inUYkIvFV6P690RvPKbQkYCZP9e3a8g6QKTOnDeqQkBQbMnfcAqWB0GHj6LbGTR11Z6UtX0Dw6OGiiDolrdBkAqEPt2P4JcCQIJrFOswnqkRmtKvZJKMjG/aJAalDRt8u4asA0Ree3IAui06sSV/h8eNEtug126j2xk0Uyct7cnZM9BtCcrfmBTjyTtiGzT1FN2eoOlsf7M+3mt/Y8cPBMVRqsMAXTZRMukhegMygUGsyEg7QGQ+4+WSGjqR9mRQ/g716iwG5HgO3c6gmbn7SEw4hg9CtyUof2MyG076dhBCBToHYBbM99zf2PEDQXGU3CJis2NRMukMegMygaBLJlZkbvl2DVkHCCAUTOcnoB9F0G3RhaX8DUEfH5B76SeFUg5z6U/ZhOONpobOb2s14ZC1feelUMah24LBzPU74v7HjvTc39jxA0FxlOow4mvXCimYLVvRG5AJdKQpYlnfriHrAAGMTJssAuBzF9Ft0YWl/O3XgKQSGwf10U4EW9b27YghL65HtwWDubil8NCzk+f+xo4fCIqjVIfhNNpFZjbaYDuInC8dRLEOQ8YBApivS7sb3RZdWMrfySPHjdRkK2Rkqn4TDlnbNxy2MX0xwQ+NVwoACa5RqsNwlu0njkVvPLrTkYDxeUVG1gECmNi1R0w4WCCIbYsuLOVv0GLjSekffohuIxZjy5eJoGT3HnRb/PY3NqNzZhqfTuSH9iQFgATXKNVhOIm7fbujNx7dmTwazIqMrAMEEFZiuBTM1MnotujCUv6G/zN+4OjIcXQbsZjYuVtMOFauRLfFb39jE6rNmH6gMLrI1p70rs47BYAE1yhZKxSO7nd71xcFc+KzdFZkNvi7IiPrAAGEwx/8ZOagPui26MJS/rYlYCAXENtGLKbOXhATjunvodvit78x6UjAGC4p5mhPeii8TgEgwTVa6jBMFu8MkvkVmWO+XkfGAcImnMZs6PQWl4PJZT5Ft0cHlvK3IwHj44Ej2Zl90CgmHEP6o9vit79Rn3Oj2RIwNmH7m+/yzPGu9CIFgATXaKnDgDqhPHfj+Cn0BqQzIfcviBUZGQeIQjYOGyiew70GdFt0YDF/5w8cmSkB4zwHW3uyoz7akzK277wEjNllRTN3LO3JkUM89Td2/EBQHC11GLBczROlN29Gb0A6EwbjIER5ZRwgChmZOU1MOE6fR7dFBxbzN0nA5Kmb9qSM7dt0CRibufQnfBu8oUt7vi3ulb+x4weC4mipw4Bi6XzZun4BegPSlbANF5Qor4wDRCFjq1eJCcf2Hei26MBi/g7qwJEKdLQnz19Ct8Uvf2PT0ZPdug3dFmw2DugtJhwNcc/8jR0/EBRHSx1G+soNsVowYQx649GVzorMuFG+X0vGAaKQyX37xWrBksXotujAYv4mCZg8dZOCkbF9OxIwJ82VgLEZmTJRTDguXvXM39jxA0FxtNRhZCNpsTrVpyt649GVTp3IAFZkZBwgCgkdIz+ZOXkCui06sJi/oR5pEAeOVGBeCmYFui1++RubJAGTZ2zpEtH22ETXK39jxw/GoK6uLsOYbo3YdlaK1jqMUPcOIj8t8QS9AelIkH7hKzIbN/p+LRkHiEJmQwkx4ejfE90WHVjM3yQBk6duUjCytW8hAdPeeAkYm5Dawvv6NWs88zd2/GAMampq/qYcYttZKVrrMMKjh4sB48Zd9AakI6Pz54pZ4VH/RXllGyCakwYM//0dRM1pVaibFIxs7duRgKEJHWfq9Dkx4Zg9wzN/Y8cPBMXRWocRnTdH5HAcPYHegHRkeMyIwAJs2QaIYnS2jG4/QLdFdTb3N0nAPEsuBdNRHykY2dp3+tI1koApYObuYzHhGD7IM39jxw+m4tdqa2snMTYyfg4v1NTU/Je6urre2IZVitY6jPgHHwS2RWkiQz07WRIw/m+xyzZAFCMIpYq6oafRbVGdzf0dVM1plaiTFIxs7TsvAbMI3RYZmEt/6qkUDAWASGDB3gIW7B1k/CsWAP4IXnv11Ve/w76/i21bpWitw0gePioOKSyYj96AdGNeAqZLINeTbYAoxvi6deJk5pat6Laozub+JgmY5+lIwZy7iG6L1/7GJknAPM/QgF5iwhFKeOJv7PjBSMBhDxYE/mvr+0/t1+1gUCW01mGkr90KTKbENDrPdnwwz1a2AaIY89qTC9FtUZ3N/R1UzWmVqJMUjGztOzp7hljNP3UW3RZZCAoHXknBUACIBBboJb71rW/9K/jeDgDbtGnzu+z7KKphVaC1DiNIoWLT6KyuLnw/kOvJNkAUI2lP+udvkoB5njpJwcjWvhtHDLYkYB6h2yILQeOUt8H9Bz3xN3b8YCRYALiEcSUEgVYA+A328yLG+di2VYpyOox8npq/pcpMo5NfuWlTINeTbYAoxrz2ZDd0W1Rnc3/DSjNffbh2G902WZg6+5E2UjAyte9nTvSn6US/zcS27aLPX7vWE39jxw9G4pvf/OZvs2BvOwv+/oV9/SXjz+DnF1988bewbasU5XQYkDRO2mHe0zlhfexkINeTaYBoiY72ZPJjdFtUZnN/kwTM89RJCkam9k2ansUJ2+F818cDKRgKAJFRU1PzYtu2bf/8lVde+Ra2LdWinA4DksbF1pH/WnUmMTzG0li8eS+Q68k0QLT4XEYH+1x0ZaG/4ZS5kIDphG6XTNRJCkam9p2v6kMSMIWE7XA+4Rg5xBN/Y8cPxoIFfr9TW1v7JuMQ+Ao5gNg2VYNyOgyoG0r1Q71nqEfHQKusyDRAtMTovNmBrozqykJ/kwRMaeoiBSNT+3YkYKiu9zOE7XAuBdP1HddSMBQAIoEFfH/N+Bnj9bq6up3s6zX4WcdKILwxHyH5CK+ZjWYCr7Ms0wDREvO5kZvRbVGZhf4GIXfehufPRbdLNuoiBSNT+46vXSNOV2/bjm6LbIRtcT7haEy69jd2/GAkWLB3hwV+7QtfY8Hf2zrqAAIh949WD7xl+urNwE+7yjRAtMTkoSOBno7WlYX+JgmY0oytWK6FFIxM7TtCEjAlCZVR+ITj0nXX/saOH4wEC/6+YF++3uzlb1ivK4VyOgzKH/KeyYNWkFO/ILBryjRAtMT0VVsfcTS6LSqz0N8QTPM83sNH0e2SjbpIwcjUvh0JmLskAdOcUBmFt8UDh1z7Gzt+MBIs0FsPeX/NXvsh4zosm6pFuR0GnSD0lvH168Wqw+bgtjllGiBaIsb2uI4s9DdJwJSmLlIwsrRvLgHThSRgShEqo/DV+HXupGAoAAwQLODbyPihRS4Bw3jF+v6KJQmzDdvOSlFuh5EfQG6hNyAd6Bx0OH4qsGvKMkCUw6APyOjIQn+HenelCVwJ6iIFI0v7zobiJAHTAlMnzojdnzmzXPsbO34wBjU1NePKIbadlaLcDoO2kLxlePQwS+rkfmDXlGWAKOv52BI5N+6i26IqbX8/SVAKR0vURQpGlvadl4CZgP5MZGTmzkNPpGAoACS4RrkdBlSr4MvWH3yA3oBUJ98iQRA7lmWAKIdwWpWvkB49gW6LqrT9nblpScCMGYFuk6xsHNxPeSkYWdp3ct8BkoBpgbmUJQXT7V1XUjAUACKiTZs2v1FTU/Mfamtr/459/Xub2HZVinI7DNBkIxkJb5iNpMSKTN9gy53JMkCUQ0cKZuNGdFtUpe3v1DGSgGmNOkjByNK+42tIAqY1hvr1EBOOcMqVv7HjByNh6QDmoA4w+/olfGX8BWMY27ZKUW6H4QjJjhmO3nhUZ/ryDfEsJ44N9LqyDBDlEFINSArGG38n7NX7DRvQbZKVjhTMrj3otrj1N3b7JgmY1hmeNE5MOC5XLwVDASASWKB3lQV+feF7EIC2vo5iHIxrWeUot8PI2XlEPSiPyC3h+D8PbhYtDPS6sgwQ5RAOGwkpmFHotqhK298xyt9tlTpIwcjSvhuHD7IkYB6jPxNZGVtU71oKhgJAJBTqANoBIMOvsddTeFZVh0o6DOckYTSD3oBUpiMBs2VroNeVZYAoh3BalU84enVBt0VV2v4GPUU6wd8ydZCCkaF9PysB8yn6M5GV0PfzVXk2FrjxN3b8YCRY0Bf77ne/+3vW9/dramr++OWXX/4D9v3n2LZViko6DGcguUoDiRtG584KXALG7jCwB4hKCKdW+YQjnkO3RUXa/qaJW+vMPlRfCkaG9u1IwAzohf48ZGbqxGmxCzS3eikYCgCRUFdXN5sFe29Y3w9ifMqYYVyObVulqKTDICkYbxgeNVRskdx+EOh1ZRggKnpOY0aQFIxLf//ypz+l1I0yqIMUjAzt25GAmUISMC0R+n6e4sLGAjf+xo4fCC/wIPCvXn311f/6wvPl4aRHJR0GScG4J98i6fauWJFJPQ302jIMEJXQloJJHj2ObouKBD//LBohCZgy6UjBPAyj21Ktv7HbN0nAlEeQ/4Ln5EYKhgJAgmtU0mGQFIx7ZsNJsSLTr0fg15ZhgKiE8Q0fkhSMS3//+PJH1GbLZGTaFKWlYGRo344EzPYd6M9Ddob6dhcTjkh1UjAUAAaI2trajxgvtEZsOytFJR0GScG4Z/rSdfEMJ40L/NoyDBCVMHnkmAhe3p+HbouKBD9/sncnScCUSdWlYGRo35FZ00V+8+lz6M9DdoIMGJ9wXLlRtb+x4wdjUFdX9045xLazUlTSYZAUjHvaEjCxxfWBX1uGAaISpq/dFsHyOJKCqdbf2RWLKW+3TCZ2qS0FI0P7JgmY8hmtXyja5sEjVfsbO34gKI5KOww6UeiO8XVrUSRg7A4De4CohHkpmM7otqhI8HNiyjiSgCmTqkvBYLdvkoCpjInNW1xJwVAASHCNSjsMkoJxx+icmWKL5MSZwK+NPUBUw1DPziQF48Lf4X7dacJWJvNSMP3QbanW35jtO9sgJGAaB/RGfxYqEGTAeIrLvNlV+xs7fiAojko7DJKCccfGkUPEFsmdh4FfG3uAqIbhsSPF87p+B90W5ZiklI1KqLoUDHb7zkvATER/Fiowc/O+SHEZPaxqf2PHDwTFUWmHQVIw1ZNvkXS1tkhSnwR+fewBohrCARA+4ThCUjCVMnvrHh3aqpAqS8Fgt+/kvv0ih3LpEvRnoQJtKZhQ9w5V+xs7fjASNTU1LwZ1rVdffbWmrq7uPOOj2traS4zfK2FTJ/a7x4wNjEvZS98o5/Mr7TBICqZ6ZkMJ0eD790S5PvYAUQ3jH1pSMOwrti2qkdpq5YxMm6ysFAx2+yYJmMoZ6tNNTDiqSNGgABAJLMD6GeMexu+zH3/Vz2uxwO84C+7etq77ffbz5ebvacMAdYjtwJS9bzf7vkc5n19ph0FSMNUzfemaJQEzHuX62ANENYSVP5KCqY6JzZvFgLyBVuvLpcpSMNjtOzJ7BknAVMjwhDFWTv3NqvztbbRBKAss3vp9FmQNZkHXLasMXH3btm3/3OvrQEDHrvOjFwoqjFgl59oWvg9sYVxk/wxVSdjPZ8q5RqUdBknBVM/k/oOWBMwilOtjDxDVEHL/eNA8diS6LaoxVi/ydVOU8BdMkgAAIABJREFUr1s2EzvVlYLBbt8kAVM5o/ULRIrLocqlYCgAlAAsSPsPLCCbw5hmQdd99vMwr7aI2ef8GfvcB4WvwTYwe/1vm732Ply34Ofvsb+LlnONajoMkoKpjvG11hbJ1m0o18ceIKohnP7lE46eJAVTKe0T+xmSgCmbKkvBYLZvkoCpjvFNm6vOqacAUAK88sorf8qCrdnWytxVFnxtZ/ycBWQ93X52sQAQtoBbCwDZ939USQD49Kn4ZyqXhQNLJX9nOqPWFkn61FmU64Ofq/E3NkEHEJ7bk3gW3RaVGOrT1XpuGXRbVGFeCqY/ui2VErN95xptCZhe6M9BJebzdOdU5W+3MQahCrCg71ssyBoIW8As+MpCANi2bds/sX8PK3DW1q0rBLUFXCns6gJfXDhbzZ8bi9joofy5/TyVxDZFKSQmi5JJPw2HsE1RBr/86U/FgNyzE7YpSuGrL78UUjCd2jV99ctfYpujDH7yUEiaJGdMxjZFKfwsFhUrgBNGVfX3bmMMQhVgwdVPWRC2iwVa/439+CvF3sN+v8KLa7HPOWGXmGMB4T8VOwTy8ssvv8JsSjJ7/g378WvWIZCyViDhn6jSGWPCkoKB5HLsGZQqfPIkv0XyJPMJig2qrgDGFswXuWxHjqLbogptCRgYWFTzNzZtKZjcowi6LZUQs307+c1LF6M/B5VYqNVZjb+9iDEIFQJWAIO6Vtu2betYQHcBZGCs7d8/gtfZ98vZ6/9gv8+SgQmBDAz7ftkLPsnAAFNHT5C8RIXMhuKoEjB2zkg1/sZmfONGEcxsICmYcmlvLWWWLFDO39hUVQoGs307+c3btqM/B9VYbU49+NmnsINgCqrpMEgKpnI6KvmTJ6DZoGoAmDx6nCYcFdJOLv9k51bl/I1NRwpm9x50WyohZvu285tTp86iPwfV6JRXrfCwFgWABNeopsMgKZjK6ajkL1mMZoOqAWB+wjEC3RZVaJds/OL8WeX8jU1VpWAw27dT4vLuI/TnoBqrLa9KASDBNartMEgKpjLG16xGV8lXNQDMxWnCUSltgdmfNjYo529sqioFg9W+nylxmQ6+xKXqdMqrbthQsb+x4weC4qi2w3CWra+Sxlg5jMycjq6Sr2oACKQJR4XPy5KA+fLHP1bS35jMPshLwWDbUgmx2ne2MYme36wyq82ppwAQEXDoAsq0Md6Gn2tra/+avfY6tl2VotoOo9pla1PZOGyg2CK5h6eSr3IAGB4/qqo8GRPpFJnv0VFZf6M+v8xnQgqmY7umXPZH6PaUS6z2nb503cpvxilxqTqrTXGhABAJLNAbxwK+a+zrW7be36uvvloDr2HbVimq7TCcZesqFMxNIwwiDZ3fRlfJVzkApAlH+czcFBIw4dHDlfU3NhsH9+XPMPsogm5LucRq39glLlVntSkuFAAigQV6MagHbH3/mfXy1wq+VwbVdhgkBVM+sw0xSyW/N6odKgeANOEon4XVBVT1NzYdKZjzl9BtKZdY7Tu+bi1qiUsdWE2KCwWASIDqH+zLr8L3dXV1n8LXl1566TfZ9ylUw6pAtR0GScGUz/RHV8QWyZSJqHaoHAA6Qc28Oei2yM7C+qKq+hubseXLlJOCwWrf0TmzRH7zyTPoz0BVVpPiQgEgEligt4kFgROt73kAyH4eXVNTsxbXsspRbYdBUjDlM7l3n9giWbYE1Q6VA0CacJRPe7s8dfiIsv7GZl4KZiW6LeUSq307EjB3HqI/A1VZTYoLBYBIgEogLOC7BCt+jL9gDMPPVik2peCmw6CTmeUxtmqVWE3YsRPVDpUDwPyEoyO6LbLTloDJXLulrL+xmTp7QTkpGIz2zSVgur0r8ptTJAFTLauRgqEAEBdfY4HfX9TU1LzGgr+/ZD9/HdugauCmwyApmPIYmTFVrMicOY9qh8oBINCWNsnShKOs55SLZZT2NyYdKZih6kjBYLTvbNiSgOnXA/3+VWY1OfUUABJcw02HQSczy2Pj0AGWBEwDqh2qB4D2ylb66k10W2RloQSM6v5GfY4gBdPhzaaGTupIwWD4O31ZSMCEJ41Dv3+VWU2KCwWASKipqfmj2traw4xPGH9i8afwFdu2SuGmw6CTma2TS8B0eosNJm+wQQVPAsbuMFQOCKL1C8SE49ARdFtkZaEEjOr+xqZqUjAY/k4eOCRyJRfVo9+/yqwmp54CQCTU1dXdYsHefBYI/p/s+/+tkNi2VQo3HQZJwbTO7OOo2Eoa1AfdFtUDgsLTrdi2yMrC09Kq+xubkalqScFg+Du+bp3Ib96yFf3+VWelOfUUACKBBX+fsy9fw7bDC7jpMOhkZutMX7gkksmnTkK3RfWAIB/czEa3RVYWBsmq+xubeSmYvei2lEMMf0fnWhIwJ06j37/qrDSnngJAJIDcCwsC/w7bDi/gpsMgKZjWCYMH3yJhgwm2LaoHBJmb963tzWHotshKJy/30BHl/Y3NxM5dSknBYPg7PGqoyG++/QD9/lVnpTn1FAAioU2bNr9bV1f3kPEACwRXFRLbtkrhtsMgKZiWCYMHX0Vggwm2LaoHBM4Bh+4d0G2RlfmDMreU9zc2HSmYGVPRbSmHQfvbkYCB/j/1FP3+VWelOfUUACKBBXrbWPD3CPIA2dephcS2rVK47TCcZesKFMxNIuiICQmYC+i26BAQhPp0E4n5kTS6LTLSkYBhEzId/I3JzP2QUlIwQfs7G0mJCVnf7uj3rgMrrXZEASASWKD3P7773e/+HrYdXsBth0FSMC0TBg++RcIGE2xbdAgInBWuKzfQbZGNzcWydfA36vNUTAomaH9DG+QpGRPHot+7DnRO8JeZU08BIBJqa2uvtWnT5vex7fACbjsMkoIpTSEB044PIjCYYNujQ0AQrV8oJhwHD6PbIhubDyA6+BubcHpfFSmYoP0NbZCvWC1aiH7vOrDSakcUACKBBYCD6+rqrjC2r6mp+ftCYttWKdx2GCQFU5owaPAtpMF90W2xOwzVA4LE5i1iwrF+PbotsrH5FpIO/samIwVzQX4pmKD9DW2Q5zezNol977qwkmpHFAAigQV+kRIMY9tWKdx2GCQFU5rpcxdFEvm0yei22B2G6gFB6vgpEeTMJSmY5my+Gq+Dv7GpkhRM0P6GNsjzm1mbxL53XVh4iKscf2PHDwTF4bbDyMVJCqYUE7v2CBmJFcvRbbE7DNUDgswtSwpm1FB0W2Rj83xcHfyNTUcKZpX8UjBB+xvkmHh+M2uT2PeuCwtlnMrxN3b8YDRefvnlV9q2bfsf2zBg21ItvOgwSAqmOCHwExIwu9FtsTsM1QMCWwoG5CdAhgLbHpnYXEhWB39jUyUpmKD9DXJMvN9nbRL73nVhJdWOKABEAgv8/qCuru4s478wZqyv577zne+8hG1bpfCiwyApmOJ0JGDOfoRui91h6BAQgOyEkIJJodsiEwslYHTyNybzUjAD0G1pjUH6G2SY+M5Pn27o960TK5GCoQAQCbW1tTsYF7344ou/BT/DVxYA1jPuwratUnjRYZAUTHE2DuknApWHjei22B2GDgEByE7wCcdlkoKxWawqjy7+Rn2ujhTMW9JLwQTp7/TVmyIVY8IY9PvWic5J/tGt59RTAIgEFuh9XFNT8+uFr7Vp0+Y32OtPsWyqFl50GCQF8zy5BEzHdpyyDBy6BAQgO8EnHAcOodsiC4sdxtLF39h0pGAeR9FtaYlB+hty1PhKVf0C9PvWiZVUO6IAEAm1tbWNbdu2rS18DX428RQwkKRgnies+vGtoyH90G0p7DB0CAgSW7aKCce6dei2yEJn66igDerib2yqIgUTpL9hss/b4KbN6PetG51qR63k1FMAiAQWAA6FYI997VNTU/OP8BWCQvb9MGzbKoUXHQZJwTxPyPvjyePT30O3pbDD0CEgSJ04bUnBzEK3RRY6q/AbNmjnb2zaUjDJPfvQbWmJQfobctR4fjObeGDft27MS8HcbNXf2PGDsWAB37uMRxnvW1/fZS9/DduuSuFFh0FSMM/TkY9YKY98hC4BQeb2A5KCacZiebi6+BubqkjBBOlvmOxzCZib99DvWzfCtrqodtSyFAwFgATX8KrDICmYZymjgKwuAUEu9ZSkYJqx2El8XfyNzdQZNaRggvQ3lCsjCRh/mNhcnhQMBYBIqKmpeb1Nmzb/Fr5v27ZtXW1t7em6uroT8D22bZXCqw6DpGCeZeS9SVbe0GV0Wwo7DF0CglC/HiJPJpxEt0UGFpuA6eRvTKoiBROUvyE3TUjAdEW/Zx2Zl4JpudoRBYBIYAFf6JVXXvmW9f1exvksKJzCgsBj2LZVCq86DJKCeZaNA3tLd3JQp4AgPGmcJQVzHd0WbBaTgNHN36jPVxEpmKD8DULjPAWDTfqx71lHZm5a1Y5GD2vV39jxg5Fggd4X8BWkX1jw9zl8ZT9+g73+KbJpFcOrDoOkYPLMpT9lA8YbTQ2d35ZqwNApIIgtricpGIv5Q1gjtPU3NlWQggnK3zDJ5ytUbNKPfc86slwpGAoAkcCCvvirr75awwK+/86+PwWvgS4gBIPIplUMrzoMkoLJM3P3sdgyGj4I3ZbmHYYuAUFeCmYtui3YLNX2dPI3NiNT5UvpaM6g/A0nzYUEzCb0e9aVjhRMJN2iv7HjByPBAr3BjP8MZIHfP8Frbdu2/b/ZzxexbasUXnUYJAWTZ+rUWZE0Pms6ui3NOwxdAoLUiTMi6JkzE90WbBaTgNHN39hUQQomKH/DRINLwLCJB/Y960pHCuZK6WpHFAAiAg58MLQt/JnxTzBtqgZedRgkBZNnYus2MSCvXYNuS/MOQ5eAIHPnoVhlHTkE3RZslsq/1cnf2Ezs2GlJwaxCt6UUg/I3pBpwCRg26ce+Z10ZrV/YqhQMBYAE1/CywyApGMHY4kWi8e4/iG5L8w5Dl4Agl/qkqeHdHzY1dH3HeCmYUifwdfI3NlWQggnK344ETOIJ+j3rSkcKZv36Fv2NHT8QFIeXHUZ4/CiSgoHnMGm8eA6X5DqhqltA4EjBNJotBVNq4qWbvzHpSMEMG4huSykG4W/ISRMSMN3Q71dnpo6fsqodlZaCoQCQ4BpedhgkBSMoq0adbgFBPtC+hm4LFltKvdDN36jPWQEpmCD8DTlpPNd74lj0+9WZmVutS8FQAEhwDS87DJKCkbtKhW4Bgaxb7UGylASMjv7GpuxSMEH4G2SXeC7konr0+9WZthRMQ/cOJccRCgAJruFlh0FSMAUzNwnr1OoWEOQP25grBdNSm9PN39iUXQomCH+D7BIvccnaHvb96s5QX1sKJlXS39jxA0FxeNlhkBRMebkbWNQtILDldqKzZ6DbgsVSEjA6+hubsWVLxYrzXjmlYILwN7Q1LgHD2h72/epO2GZvSQqGAkCCa3jZYZAUDAzI5RXyxqBuAUHmziORmD9iMLotWGwp71Y3f2NTdimYIPwN4vZcAubuI/T71Z15KZjDJf2NHT8QFIfXHYbpUjDOgHyotH4TFnULCHJpSwqmS3vp8i2DYnicffL+tvb+xmbqzHkhBTNzGrotxei3v+HwC5S3hDYH5S6x71d3JjZvaVEKhgJAgmt43WGYLgVTSpNNBuoYEIT69xR5MqEEui0o99+zs5hwxXNG+BuTskvB+O1vOPzC739gb/R7NYGtpRNRAEhwDa87DNOlYEK9uogBOZZFt6VYh6FbQBCZPEEE3BevotsSNGGVnadc9O5qjL9Rn3fm06aGDm/wVTAZpWD89nf6wiWxAjp1Evq9msDWDhRSAEhwDa87DJOlYGAVhg/IPTuj21Kqw9AtIIgtWSwmHPsOoNsSNNNXb4oBYsIYY/yNTZmlYPz2d2L3XpEDuXwZ+r2aQEcKpoSkGAWABNfwusMwWQomc/2OGJDHjkS3pRh1DAgS27aLCccaueouB0Fbky26aKEx/sZmZOpkseJ8/hK6LUH7O7ZyhZCA2bUb/V5NYahv95JFBSgAJLiG1x2GyVIwySPHxID8/jx0W4pRx4DAloKJGCgF05omm47+xmZsxXJpgyC//R2ZNkUEv+cuot+rKWyp2hEFgATX8LrDMFkKJr7hQ7EatXEjui3FqGNAkLn7WCSmDx+EbkvQjLSiyaajv7GZ2L1H2m1Qv/3dOLivWI16FEG/V1OYT3HZX9Tf2PEDQXH40WGYKgUD2958QD56At2WYtQxIAA5ClOlYBxNtnuPjfE3NqEKCF9xfk++gxB++lscgJG7FrKOTGzfUVJ7kgJAgmv40WGYKgUD2958QL55D92WYtQ1IAgN6CVWJhri6LYERUeTrcMbfHA2yd+YhP8xvsPB/uewbQnS35l7DVJL4OjK1JkLYsIx/b2i/saOHwiKw48OQ2YxZD8Z6t5BrHwmP0a3pRh1DQgiU8yTgoFtOD4gD+pjnL8xCavMDV3bCzHk1Cfo9gTl79Tpc5YI9nT0+zSJ2YeNop0P6VfU39jxA0Fx+NFhJDZvblHBXEdmI2mxMtC3G7otpahrQBBbuqRknoyuhER8PiBPm2Kcv7EJumx8pf/2A3RbgvK3vRVp4ml7TPKV/k7tmho6vtmUy3z2nL+x4weC4vCjw0idOCNOw86Zid6AgmL68g1x+nniWHRbSlHXgCA/OK1GtyWwe965W+QGrVxhnL+xCZUZeK7v8VPotgTlb+cwwv6D6PdpGhuHDrByfRue8zd2/EBQHH50GFAo3LSTmbYmW2xRPbotpahrQGDi9hScQuUD8p59xvkbmyByzyccmzah2xKUv/NyJNfR79M0Qr9W7LQ/BYAE1/Cjw+AnMyUumeQH4+vWCX2wLVvRbSlFXQMCOAVr2oQjMmWiGJA/umKcv7Epq96nn/4O9ethCRKn0O/TNMbXrimq90kBIME1/OowTNOMitqabCfPoNtSiroGBM/UaDVECsY5+RwqffJZV39jMy92PwLdliD87ZQk697BmPYlE0vtLlEASHANvwYIOLbOA6KzF9AbUBAEeYSWNNlkoM4BQePA3pYUTAzdFr8Jp0+59mHXlrUPdfY36vNP2GL3HdFtCcLfmZv3RcA7ehj6PZrI9JUbRWt+UwBIcA3fkoZXrRTL1jt2ojcgvylOar1lndQqrskmA3UOCMrZEtWFcPqUDwijhhrrb2zCaX8+4YjIsyXql79Tx06KLe95c9Dv0URmoxkx4ejd9Tl/Y8cPBMXh1wABkhx82XrJYvQG5HsDbUGrSSbqHBDElllSMHv1l4KB06d8QJ4721h/YzM8aZx0hyL88jccduGHXjZsQL9HUxnq2UlozMZzz/gbO34gKA6/BggoXs1XKSaNR288fjN15rw4hTpjKrotLVHngABWmvmEY/XzJZN0Y3yTpbP5wQfG+hub+RqtB9Bt8dvf0QXzxb0eOYZ+j6YyPO756loUABJcw68BAk6LyS6M7BVV0aHTOSBQJQj3gs6AfPiosf7GplOjVaIJh1/+Do8dKfKbr99Bv0dTWay6FgWABNfwa4CA5HRIkubL1okn6A3IT8YW1yshkqpzQJB9YG/D90e3xW+WOyDr7G9syjjh8MPfvB+3S1xq3o/LzMTmLc9V16IAkOAafg4QpswcofoHX56/cgPdlpaoc0DwbMkkeQ/ieMFQDzsfqOUBWWd/Y1PGCYcf/s6Gk2Inp18P9PszmakTp5+rrkUBIME1/Bwgyt2qUp1wOosPyNEMui0tUfeAQAUpHrd0ak736drqe3X3Nyb5hKNj8RqtWPTD3+mLV8VK5+QJ6PdnMjN3nq+uRQEgwTX8HCASmzc/t2ytG3OxrBiQe3VGt6U16h4QwOyYa0+ekFeM2y0dTbAyak7r7m9sNg7tLyYc90Potvjl78TuvSLXcfky9PszmcWqa1EASHANPweI/LL1LPQG5BfTV2+JAXn8aHRbWqPuAQFMNLj2JJt4YNviFyupOa27v7EZmTlNTDhOn0e3xS9/x1YsF21q1x70+zOdjYP6CO3Jx1HH39jxA0Fx+DlAOMvWIwajNx6/aA/I0UUL0W1pjboHBJBqwH2xYD66LX4xvnZt0bqgJvobm/E1Vo3WbdvRbfHL35H3Jon85guX0e/PdEamTRa+OHfR8Td2/EBQHH4OEMWWrXVjJQMyNnUPCPI1Woej2+IXIzOni1WnU2eN9zc24dQ/X41d3PpqbBD0w9+h/j1brTlNDIbOauzO3Y6/seMHguLwe4Bwlq0fRdAbkB90BuTT59BtaY26BwRO0fpu72pbtL6SvDPd/Y3N9OXrZedjBkGv/c3bE9Sc1rg9qUQnH3PZUsff2PEDQXH4PUBEpk0RAZK1bK0bZUsEb4kmBAT5FYsEui1eE06bwqlTkLspZ0XdBH9jspIT2UHQa3+bsKKuEqHOOT+RPWWC42/s+IGgOPweIGKrVopl6x070RuQ1xQDcjtOFba4TQgIIlMmijwZ1lli2+I1M3cfi5zaYQPJ35Iwr8mYQ7fFa39D6TeeU/v+PPR7I37Bt+H5hINNcm1/Y8cPBMXh9wCR3LtfLFsvXYLegLwmrPrxAXnoAHRbyqEJAQHIVeh6arGYGKzp/sZmsRqtWPTa31Brmst4bdL3VL1KhG142I6HbXnYnqcAkOAafg8QeSHR8egNyGtC3h+/t1nT0W0phyYEBDrrlsU3bRIDMhuYyd9yMFq/UIjdHziEbovX/gb5LqGreRr93oiC4dHDRcrRjbsUABLcw+8BIhtOaVtKCE7+8gF57Vp0W8qhCQFB8zwZnRidP1cEG0eOk78lIUjA8D5gzWp0W7z2N1Sd4MHGXX0r66jGwupaFAASXMPvAeKZYuLJj9EbkKeNcZE1+z94GN2WcmhCQJBt1Ld2aXjUUDEg37xP/paEqTMXxIRj+nvotnjpb1Fb+62mhg7619ZWiYnNW8SEY906CgAJ7hHEABEeM8JZtsZuQJ7e1/jRIv/nKn7+Tzk0ISDgeTL2hCPxBN0eT++ra3uR/5P6hPwtCUHeiucBD+qDbouX/s4+bBT3NaQf+n0R8wT9Tz7hmDmdAkCCewQxQBQuW2M3IC8Z6tlZBBqxLLot5dCUgCA8dqSYcFy/g26LV4TyT3xAHtib/C0ReWDepbLA3C966e/UmfMi0JgxFf0ZE/N0Dh4O6U8BoOb4Wk1NzYLa2toQ42P2fa9Sb6yrq4syPmDvu8F4nb33tXIvEsQAkdiy1Vq2ViNXrhxmoxmx1dhbDg2wcmhKQBBd+L6YcBw6gm6LV0yd/UgMyNOmkL8lo7M1f6u8rXm/6KW/ndzGtWvQny8xz8Kt+SfZTykA1BUsoGvPgrmj8P13v/vd34Mgj/38vRLvDbdt2/ZPqrlOEAMEFEsXy9bT0BuQV0xfuiZEUiepc7rZlICgME8G2xbP7mn7DnG6edUq8rdkrPRwjl/00t9OfrMEp5uJz9I+nJO9+4gCQF3Bgr19NTU1rxf8PJ1xYrH3sgAw8sorr/xpNdcJYoDIPgyLZevB+uSTNC/LowJNCQhSJ8+ICcfsGei2eMXY4kViQN5/kPwtGSuV5/GLXvpbtfxmkxidO1vI8xw/SQGgrmBB3W0W8P2l/TMLBnuwn9eUeG+E/e4m+3qLcflLL730zXKvE8QAwZetO7/d1NDhjaZcGjdPxis6gsMsEMS2pVyaEhBk7jVUVDFDBYYnjBED8uUb5G/JmDohJhxR5AmHl/5WLb/ZJMY3fCjGno0fUgCoKljAdoHxSSFZ8PYxfGXB3reLBIA9SwWA8H7r22+wv5vG3re/XDugw3j6VHQeftLOk8nevu/7tYIgCFvzvJ9LV9FtKZfg56D8jcknWatmbsd2/Htse7xgqJc1IMez5G/JmL2fL9GHaYdX/s5F7RrH3dCfLfF5wsofn3DMm00BoK6oZAu4EG3atPl99r7Py71OU0DILqvn/7RfXDwf1CV9Rbhfd34/X/74C2xTCEUQGyHyZH6eSWOb4hpf/vjHIt+0bzdsUwhF8NWXXzY1dGrHCd+rjp88fijSDaZNxDaFUAQ/TyZE+tGYYRQA6oq6urp3rEMgX7cPgbCA8I+bv++ll176zbZt2/6O/TN7z0D2d6fKvQ78QwWxQpDYvNnKk1mPPoNyy1zMPgHcBd2WSmjSihBsx/Et05Nn0G1xy8zl6yKnceJY8rekhNU/vsNx/zGaDV75O7l3n5XfvAT9uRKf55PMp/wUMJwG3vLaa9/wJuIgyIavWzIwjYwNLADsbf+Cvf6PjMvg+5dffvkVkH4pyAHcyQLC75Z7Eegw+D+Vz3kLjoClBon56UvXrRPA49BtqYTg56D8jU2nkP3Gjei2uGVy734xIC9ZTP6WlPaEA/IBsWzwyt9wsE21/GbTCALd4KPHb36/rR/BB8EQBDVAFApYYjcetyycIWPbUglNCghSx6w8mbmz0W1xy9jKFWJA3rmL/C0pnQnHpk1oNnjlb5jY8tXzS9fQnyuxOKESCA8A2//TP2DHEASFEdQAkT8J/GZTLq12bUnnBPCuPei2VEKTAoLMnUdiwjF8ELotbhl5b5IYkM9fIn9LStAA5BOO+XPRbPDK386Bo2gG/bkSixOKKogA8LUh2DEEQWEEOUA0jhwiTs7eeYjegNwwMnmCGJAvXkW3pRKaFBBAAXs4BQzMZT5Dt8cNQ33FgaNsOEn+lpRQBYSnhYwaimaDF/7OhlPOCWDsZ0osTSirygPAd36wGjuGICiMIAeI6Lw5Ik/m2En0BuSG0DnyATmSQrelEpoWENiJ+Zm7j9BtqZagw8YH5J6dyd8SE/RNoR4w1AWG3Q4MG7zwd/qjKyJXm01ysZ8psTQzN+5aK4A/uIgdQxAURpADBCTk8zyZDRvQG1C1dAbkXpUPyNg0LSBwFPMVnnA4B44mjiV/S87GQX3ExPBhGOX6Xvg7sXO3yG9esRz9eRJLM5f8mE84Hr/z+hPsGIKgMIIcIFInTos8mTkz0RvbHUWCAAAfE0lEQVRQtUxfrn5AxqZpAYEz4UAu0eWGbkoOmuZvbEKtcz7hOHUW5fpe+BtOmnMNwH370Z8nsWUmd+xoetT+tYHYMQRBYQQ5QOhQosuR5Fiq1glgoGkBgSwlutwQTprzAXnPPvK35IyvX496EtgLfzs1gK+UX3KQiEPwM3b8QFAcQQ4QkIzPFfM7vqlsYj5sjYgTwLvRbammwzApINBBeghWmkUN4Ovkb8mJLT3k1t+53OdNoR4drZKDOfTnSWzd39jxA0FxBD1AgCyHSMx/jN6AqmFkinUC+KMr6LZU02GYFBA8Kz30Cbo9FdvPB+ROYkCOZcnfkhMOG2HucLj1dzYUF/nN/XqgP0tief7Gjh8IiiPoAUL1xPy8JIdaJ4DtDsO0gMCRHrp1H92WSpkNJVwNyCb6G5PP7nAEr3Xq1t/pcxfFCeCpk9CfJbE8f2PHDwTFEfQAEd9k1QRevx69AVXKvCRHJ3Rbqu0wTAsIou/PEzl0R46h21Ip8wPyZPK3InQmHLcfBH5tt/5ObN8h8ptXrUR/jsTy/I0dPxAUR9ADROr0eTGozZiK3oAqJZRGUrEGcGGHYVpAkNi8RUw41q1Dt6Vi2+0BefUq8rcidCYch48Gfm23/o7WLxS2HziE/hyJ5fkbO34gKI6gB4js46jIkxnQG70BVUo4+KGyRpaJAUHq9DllJxzR+gViQD54mPytCBNbtooJx9q1gV/brb/DY0eK/OZrt9GfI7E8f2PHDwTFEfQAAYntDd07WCfNnqA3okoYW1wvBuT9B9FtqbbDMC0gyD6KiAnHoD7otlTK8JjhYjvxxl3ytyJMnbkgJhzT3wv82m78zfvlbu+Kfjn5MfpzJJbnb+z4gaA4MAaI8IQxlrSFWlpT9gw5c/0Oui3VdhimBQR8YOvanqvm51JP0e0p2244wezSbhP9jc1sQ0zkCffvGfi13fhb5Z0ZU0kBIME1MAYIN+K2WPRiQMamqQGBs5KmUOAO5cT4gDy4L/lbIWLucLjxt5ObjbBySaze39jxA0FxYAwQyb37lKumkX3QaA3I/dBtcdNhmBgQxBapt3UP5cT4gDxzOvlbMWJV03Djb6dsooLqDKaSAkCCa2AMEOmrN8VpWtZRYjeicqlDWTFTAwLn8M7yZei2lEsv5JJM9Tc2nXq6e4Pd4XDjb6jPrrI+q4mkAJDgGhgDRC7xhG+lQtIxbJlgN6RyGN/woRiQP/wQ3RY3HYaJAUH60nUx4ZgwBt2WchmdZwmmHz1B/laMid17xIRj2dJAr+vG37CzwdMk7ofQnx+xfH9jxw8ExYE1QMCpTF5R41EEvSGVw8jsGWJAPnkG3RY3HYaJAQHkYoHvIDdLlQlH49D+YkC+10D+VoyOXujEsYFet1p/w6lfPiHv2p7nOmM/P2L5/saOHwiKA2uAiMycJgKqU2fRG1I5hGR8HrA+bES3xU2HYWpAAKcbVZlwwCEjPiB3cTcgm+xvVP/ZFYN6dAp0wlGtv9NXb4mAdexI9GdHrMzf2PEDQXFgDRDxDz4QW6obN6I3pNaYnyG/o/QM2eSAQKUJR/qaNwOyyf7GJtRv5hOOhnhg16zW386hvCWL0Z8bsTJ/Y8cPBMWBNUCkjp8ShyrmzEJvSK3RqwEZmyYHBM6EQ4EcTq8GZJP9jU2QU+ETjtPnArtmtf4GNQawNbF7L/pzI1bmb+z4gaA4sAYISDbmsipD+qM3pNaY3HdADMiLF6Hb4rbDMDUgSJ04LWRVZlUvqxIUvTpFarK/sYkx4ajW3+Hxo1Bka4ju/Y0dPxAUB9YAwYWVO7/d1NDhjaZc6hP0xtQS4TQfnyHv2oNui9sOw9SAwBFWVqAkXL4m6y3yt6K0ZaPc6DgG4W+nBBwI3FMJOKVIASDBNTAHCFUqNITHWTPkqzfRbXHbYZgaEDwz0CXkrUHNJ0ZdvKk4Y7K/sWnXoA4N6BXYNavxNxxqU2ViRHze39jxA0FxYA4QscVWhYa9+9EbUyk6AzJfqVSzBFxhh2FyQOBUaJC4BnXm3mMxIA91nxphur8xCROOUI+OoiRcLBvINavxt5MaobDAvamkAJDgGpgDBNQClv30WebuIzEgDxuIbosXHYbJAYFdgxqEerFtKcXk0ePicNS82eRvxRmeNF5MOD66Esj1qvG3SmoMxOf9jR0/EBQH5gABW7/8dO3o4eiNqRSTh4+KAfn9eei2eNFhmBwQwEqzOMxTj25LKcbXrhFB6pat5G/FGVu1Uvhy2/ZArleNv1WSRyI+72/s+IGgODAHiFz6k6aGjm82NXRq15TLfIreoIoxttLqxLfvQLfFiw7D5IAgP+EYhm5LKUamThID8rmL5G/F6Uwe588N5HrV+BtDr5Donb+x4weC4sAeIBpHDhEHQW7eR29QxQjlnPg2zsWr6LZ40WFg+xuTufSnbMLRjhO+x7anGEN9uooBOZwkfyvOzJ1g00cq9Tf8j/GDKux/DvtZEavzN3b8QFAc2ANEtH6hOAiy/yB6g2pO5+QoJHLH5T05WkmHge1vbIZHDRUTjht30W1pzmyjtwMy+RuXz0pd+X+ArFJ/p86cFwdApk1Bf1bE6vyNHT8QFAf2AAHaejwva9kS9AbVnNkHlkTC4L7otnjVYWD7G5sg5u2FyLIfhDwsPiBPf4/8rQnDY0Z4ounoh79BpJofAPngA/TnRKzO39jxA0FxYA8QMhciTx07qUy5unI7DGx/Y9M5CLJIvoMgzonMDd5UjyB/49Op6rLH/wlHpf6OzJgaeLk6orf+xo4fCIoDe4CAKiCwRQJbJbBlgt2oCumcyNy8Bd0WrzoMbH9jE7Z++aruyCHotjRnZOpkMSCfuUD+1oRBTjgq9XeobzeRbxpKoD8nYnX+xo4fCIpDhgGicfggkZd1+wF6oypkZMpEsX3jwYlMGUgBwRf8tDmcOofT53AKHdsexy4QDu7ZWQzIkRT5WxNmbt4LbMJRib8h6OP5piwIxH5GxOr9jR0/EBSHDANEdOH7YpvkwCH0RmXz2QE5jW6PVx2GDP7Gpl2CMH3tNrotNv0oHUb+xmcu81n+IIjPtXYr8Tds+3qZb0oMnhQAElxDhgEisXOX2CZZvgy9UdnMPgwHXssziA5DBn9j087LkqkiSD7fdCb5WzM6JQgvXff1OpX42+t8U2LwpACQ4BoyDBDpKzekOwiSPGKV5JqrxwEQu8OQwd/YBMkh7tv6hei22IytXuVZBRDyt1x0xOR9rghSib9B+kXkm55Hfz7E6v2NHT8QFIcMAwQ/CGJXBJFEoDe2Yrk2FUAKOwwZ/I3NzK37Ii9rxGB0W2w6guMe1o0lf8tBp76zz5PJSvztpeA4EYcUABJcQ5YBAuoBB6WXVZY9Y0cKey7fQLfFyw5DFn9jMp+X9WYgAr2t2gOCwSA4/u4PPRUcJ3/LQTudpHFAb1+vU66/oewbT2/p1wP92RDd+Rs7fiAoDlkGCMj/4ytuO3ai2yJOir4lToqm5Dkp6kWHIYu/sZkP8P3NyyqHmbtWybCh/cnfGtKPE95u/J06fkocAJk5Hf3ZEN35Gzt+ICgOWQaI5JFj1jbJbHRbMtfviJzEUUPRbfG6w5DF39h08rK2bkO3JXnwsPjff38e+VtTOjl3p/3LuSvX37FV8vzvE935Gzt+ICgOWQYImU7dOuXplspXns5thyGLv7HprILMwl8FiS1bKgbknbvJ35oSTtv6XXatXH+Hx42SZvWb6M7f2PEDQXHIMkDwbZJeXcQ2SSNuYjKsxHBdwoOH0Z+L1x2GLP7GZjZk5UH16cr/9zBtAZFgLoR+/Q75W1Omzl4QE46pk3y7Rjn+hkN2jhC6RuktJpICQIJryDRAOLUpT5xBtaNxSD8xIN97jP5MvO4wZPI3NkP9e4oJx6MImg25xBNRCrFLe344hfytJ7PRjJhw9Ojk24SjHH+nr94U6S1jhqM/E6J7f2PHDwTFIdMAkdi8WWyTrFmDZgNU/eAddfcO6CtDfnQYMvkbm5Bvyld6jxxDsyF9/pIYkCeNI39rzsbBfcXE8q4/E8ty/A2yVjy9ZcVy9OdBdO9v7PiBoDhkGiBAA40PhhPGoNmQOnVW2xJJFBA8Szhxjl2BxskNW7+e/K05nZKXe/f78vnl+BsqzfBdlqMn0J8H0b2/seMHguKQaYCAWpl8O6zz255vh5XL2CqrIsPmLejPw48OQyZ/YxNqAWOf9o5MmSgG5LMXyN+a06lA4/Fp70r8Ddp/PO3hcRT9eRDd+xs7fiAoDtkGCL8S4stleMwI7QSgCzsM2fyNSa73aAtCs8lH4NcvFICOZcnfmjNzP+SrIHRr/oagj6e39O2O/iyI3vgbO34gKA7ZBghHEBqhBBtfgeQl6d6SpiSd1x2GbP7GplOC7cLlwK+duWmVpBs+iPxtALnSQW+rBFtDPHB/Jw8f1a6+ucmkAJDgGrINEI4+24ypgV9bhhxEvzsM2fyNTdBl8ysHrzU6epNLFpO/DWFk9gyRB3j0eOD+ji5aKCbXu/eiPweiN/7Gjh8IikO2AQJKJTmncLM/CvTaTkL+unXoz8GvDkM2f2MTM+iHlRgeDBw6Qv42hM7Bo2VLA/d3/hTyI/TnQPTG39jxA0FxyDhANA4bKDqqm/cCvW5kygTfEvJlIAUEzxPEcIUwbjv2/dPgrsuFzzv7th1I/paTdpnJxhGDA/W3I3zeq4t28lamkgJAgmvIOEDEli0RWxVsthzUNfmBgK7tRUJ+PIf+DPzqMGT0NzZh9S/oPMDM7QciEBjSj/xtEPnBn67viH4mmgnM306t9TmU/6cLKQAkuIaMA0Tq2EmRBzhzWmDXTF+6rr1CPgUExYmRB5jYucvX/D/yt7wEjVG+03D8VGD+ji2uF5PqXXvQ75/onb+x4weC4pBxgMiGU/mySQHlATpBwLq16PfvZ4cho7+xCSt/QecBwuSGBwFsskP+NotOHqDHwX9L/m4cbJW3vEP5f7qQAkCCa8g6QDQOHRBoHmB43CixDfjRFfR797PDkNXfmITcP8gBDCoPECY1cMiJ5/9FUuRvwwhBGN/+H9QnEH/n8/86U/6fRqQAkOAasg4Qjh7glq2+Xwty/pwKJOlP0O/dzw5DVn9j09YDDOIAkHMQwCf9P/K33OQHgPp0ExOARxHf/Z08cIj0/zQkBYAE15B1gEiduSC25SaN8/9adv3f9yah37ffHYas/sZmYvNmsS23Yrn/12KTmiCuRf6Wl1AOjksA7Tvgu78duSEWCGLfN9E7UgBIcA1ZBwi+LdfpLV6ZI5d44uu1nNXGrdvQ79vvDkNWf2PTqcox2L9TuTad1cbT58nfhjJ58LC1KjfbV3/zdIMeHcVqYyiBft9E70gBIME1ZB4gIlMmioHy1Flfr9M4pL+Vb3gf/Z797jBk9jcmn9mWe9jo33ViWV57mKcb+JxvSP6Wl6D9yPPyenb27KBbMX+nr9wQE5uRQ9DvmegtKQAkuIbMAwTUA/ZbKgMGe94R9+4aeOURjA5DZn9jM7rwfatU1h7fruFIHE2bQv42nJADyg+eXb3pm78ddYO1a9Dvl+gtKQAkuIbMAwSULOLB2YBevp1esyUZovUL0e83iA5DZn9j0wnOpr/n2zXs3C8/g0zytxqEkpNeBmfF/A26pjzIvHgV/X6J3pICQIJryDxA8G25/j2t+pWPfblGZPJ4sc188gz6/QbRYcjsb2yK7dk3mhq6tPflNDjPx7LLv3l4+pP8rSbT126L7dmhA3zxN6+r/u4Pmxq6vcsrHWHfL9FbUgBIcA3ZBwi7LFx802bPP5vLv3R8kx82ySU/Rr/XIDoM2f2NTbssnB8HNNJXb4kBf9hA8jdRTAisvNPM/ZDn/oYTxnx3Y/YM9Hslek8KAAmuIfsA4VRpGD3M889OHj0eWD6WDKSAoHXaeafR+gWef7bXW37kb/XplGjbtt1zf0emTRbyL0eOo98n0XtSAEhwDdkHiFzmM14Szo9tswibGfMOcu9+9PsMqsOQ3d/YzD6O5ssQsv89rz4X0hkaB/e1kv5vkb+JnKkz5z0rQ1job7G70a6poVM79r2/MlpEHFIASHANFQYI53Tmjp2efSZoC4IUB0hyZKMZ9HsMqsNQwd/YhNVmHqhduOTZZ0JJQ78PNJG/1WMu9UlTQ9f2PFfPrU5fob+Th4/6fqCJiEsKAAmuocIAkTp9TsySx4707DOdDnKq3tU/mncYKvgbm05VkMX1nn1mfO1asf27ZjX5m/gMo/Pnignu9h2e+TsyY6rY3dh/EP3+iP6QAkCCa6gwQMAJtlDPTp4lSwNhZmxaeSQKCMpj9mGY/280dO/AV2jcfh7f/h3UR/z/3rhL/iY+Q6fs5ejhnvg7F03lD7fFsuj3R/SHFAASXEOVAcIu1xZfv971Z2XDdgfZzqgOkgKC8umUazt6wvVnpS9dt8rM9Q1s+5f8rQ55nrMlD5S51+Da38mdu6wyc7PQ743oHykAJLiGKgNE5vodkUPVv6frih1Q85d3kPO8q8OpAikgKJ+wdebVCfHogvlii2/zFvI3sShjy5aKCe66ta79beewwsoi9n0R/SMFgATXUGWA4NtoQ0XN3tS5i+4+Z0g/K8n/Mvp9Bd1hqOJvbMLJSXFI6I2mbEOs+s8BcWn7sJHLJH/yt750Dgn16tKUS1cn2gx+/lk8mi9t6eEpdqJ8pACQ4BoqDRAJa2vDzcm29KVrYjtuUJ9At+NkIAUElRHKA7pdlUns2iP+Z2dM/f/bOxcgq+o6jg/LRI09zIkVu7Sve3d3MqOmZtKpsTJ7TY6O4wBrkewWUiopUyn0wIIgJ5spaYnIJBzFB5YYzkSJvMIxNUUo0BF2WVjYZZ+AYNODscf2/Z37P9vpdnf3Pjl77v18Zn5z/s97/+f+z+N7/0/qGxvVbJJbPuv2ecu/rHEL569dG/r5YMU1BCDkTZReEF6rzBdbvCUTcp0M4s+O6/7lw6GfTxgPjCjVd9jWt+elZGvKvGtzmgxiQxX8yR89T5757jjqO1p2dNPm5GSQJbfmlN8mf3TMvSbZ2nygK/TzwYprCEDIm6i9IPzJIDZmJtu8fS+0JWd32t6YZTT5I/jAiFp9h22Hli1OtspszH6x8J6tv0u2Nn/95lBam6nvaJntP21dwN7wlOd2Z52/e926shzbXK6GAIS8idoLon/fQW9cls3gtV0bssnrLyh9JtdiG0+GIMje/DUovclHWYzNMsF3aNHCpHjctJn6xjIy65nwhgzc9p2s8tkf2o7rP5+cSbx7b+jngRXfEICQN1F8QRxetTLrhXr79u77r3DsKM/uEQRB9uYJuW99IzlsYMOjGefz95n2hGNfboP6qe/ys4Gjx4Y65s3NuhXQ32e6t/UH1HeZGAIQ8iaKLwhvv1YJORvrYsJurPTeS3zZkrwH9EfdEAS5mc0WT87QnDs0kMG2gTZe0ISf1/q3JbcB/dR3+ZrfCnjwmwsymsnrPQ+/kNxO7nR3F/VdJoYALGEaGxsvk+1saGg4reMdo6VNJBL1SvOUrE3pn5Wdn+n3RPUF0XXvPckB04sWjvmQtFl13gv8puu8PYDDLnuYD4yo1nfYZusBeuOrWpePmdb+ZHjX5uJFoc40p76jaTbUwF/yaqzt4ez68nc1OrJyBfVdRoYALGFM1MXj8WkSc0vHEoCK31ZfXz/b3Eo/Xf7nMv2eqD4wrJXl4IIvj7k7SP/+g96WXvksr1AqhiDI3WwtQJs8NNbuIL3P7PRaYmynmTO57Rv1XVrmL1dl27mNdh35S2NZt/HA4V7qu4wMAVgGSNgtHk0AKr5Sou+UnBV+mNL3yeKZfH6UHxi9z+9Jbuk2wixNG+tn2295LTcrfhR6ecM2BEF+dvSxzcMvZRN6qfH2ovb/bIyHZYao72jbkbvXJMXd/OvTLnvVs22HNwzG/nDYMkPUd3kZArAMyEAAvlfx+4Jh1g2s8Esy+fyoPzCGX8rWBXLnT4f62zq9gdQ29qpj/nXD62oN9BwPvaxhGy+I/M1mkHvX25zPDnU99Iuh/s5ebwam1xJj47Dsz8bKFeNikXHqO9pmQ1v8oQcdN8zxtie0Z5vtKONdh9bSbH82Hl5PfZehIQAjjETa07LBoEnIHXPHqX66XASgdQFnIwCPH09eTFG1nse3JCeFOCEYtM7bvzs02D0QehnHg1k9l0J9h2mDg68MdT/wQNprzfsTsvquocH+k6GXk/ouDRvsOzF0uPWO9NfbnFlDR/XHg/ouT7N6zlmAQDQodhdwqdA+a3q8reXqn7c3N3UfaGk6qeMT7c0zZy0J/C4AhaKteeaF7S1N6w80Nw3oWjsu98b9zU0fCbtcUJrsb55xZXvL1Vt1nZ3QsUfH+/c3T39X2OUCgCJiAlACb/loaST2tstaXPoZ2UwCAQAAAIBxQiKRuFTCr9ta92SvyLpkl1ucRN4Vsrv8tPF4vNG6lG0ZGNf9e0F4JQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgOxpbGy8TLazoaHhdJo1BifU19f/WHEdsna5vxRKIaFouKWFbPHx3bI/6hq4L+wyQWGxvcRVr0/ZygC2M5Ds/LDLBMVD9XzYNgSw+9nua93jM8MuExQO1Wmr6rdTx3/X1dUNr//IfQ5ZYxdNPB6fpotlaaoAlL9Z4VvMXV1dfY49WLioSouxFheH6KP63aZ6nm1u3b/TWRu0tFH9HrJnetjlgOKgur24qqoqZvUcFIDc55Az6YSALqKNCm8K+L9vQvHMlw6KRSaLi0N0YXeg8sNah4LCAEqTYD1zn0NepBOA8u/VRXVRIM0N8t9zpssGxcMJwG7X/bs1032jIRqk2x/cuoeo59LFdQ/+Scc9stWxWGxy2GWCwpMiALnP4f+xXUHcGK9h04VyzB2n+ukyFIDzEIDRYqz6TyQS5yrZREsr9wcUPqBjVcjFhgKR7sXgdgi6JKQiQZFR3b7NOSeqrm/XPf2bUAsERWEsAch9DhlDFzAYqt9Nug6uCrscUBjoGipvamtrz7PtQ8MuBxQeuoChYKQbC6aLp8VNAqnwJ4Gwt3BpEWwFjsfjDfbQsIlBYZYJCovqdLvdy+bW/TuDweGlSywWO0v38dm+X/X9VT3Dd4RYJCgSqWM9uc8ha/Syv9SNATtl/xRlXbLLXXSFWwbmoOyALqgbQy0sFBzr0ndd/TYGcCetf6WHBEGjDQWw5SFctxB/4kqUmpqaOrekkz8GcIPqvzrsckHhUN3eae9s1e2r9ofdlmizcO5zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgOjiFoB/JpO0bgH5dbl8j/J+2NYxyyUvAAAAABQQJwCfziStE4AP5vI9TgD25pIXAAAAAAoIAhAAAAAgSySIbrEtFSVu/qxjh4ROUyBuoW2tqLhjOv6qpqbmrX6c7e3p8u6S+y86rq+trX2z8t9r2zTa1l5yv8NPX1dXN0VhDymuX3bExNhIZVK6R5XmZ4FyLJc9PkLa/xGA8v/QPt/OR/a83B/y45wAfETh97nzfSEYP3ny5DcGtq7qta0lFTzJ5UUAAgAAQPRx+3H+NZFI1JvfRJpE3NvNrfDPSfAcUpoGiZ/Xyr9K/if9vCYAbT9mpT+vurr6HLen536l+7iiJ+jYGhBt5n9WtlTu11geE4763GvTlWvq1KlvUfxRxV+pz/yYiUYrW7q0qQJQ7s9YeeSskHu+bEDf9zqLMwFoe5IqbJbFy90s90md49ku7yOyNVOmTHm90r5J8Y/Jv8zlRQACAABA9JGgiZsA1PEqXyT5KHyL7CbfX1lZ+QYTTzU1NXUurwnA5kD6Vvl/6/slmN6vsEGX9kJZT/DzFX+NwraNVDYTkpbfWuOU9opRzmHULmDFv6z873HfaQJwZ8r37DZBqLhKOz8Tf4G8H7QWUJcXAQgAAAClgYTNDImcHdZtK/u1tQpauNwvpQovmwWr+Iudu1PxnwjEfU957g743y3/39x3zJT/HybGzKzVTXZK7r2jFK3CtSruG638abqAb7ayu+8w+6drlRzuAk7Jv0FhC3Re79PxX34ZXTlP2e/i8iIAAQAAoLSwFkDXbfuE+UdqAVS6WvNnIwB1vMi6k7Mpjz7727a8i7XQyf2VkdIFBaC12MmOK/0FgfiX/XKO0AK4y1oArYtZx9MKmjhCeRCAAAAAEH2stU/2URvjJ+9EHW+TyNlucTYG0Lo/bQygiUOF/0T2ez9vhgLw785b4cYA3hqLxc6Sf4KNOwxOwAjiBOMJ6262iSTWkqf070yXNigAleZT1krpJqtMUvgia3lMEYCvyj7tzne2fbZNXnHfa2MAV/l+fV6V0nzS5UUAAgAAQPSRuJsmwfMHN2vXuj23+l3AYoJEz9es5c5a1WxmblVVVczPa+GZtgAaElPn2gxhGwvoumZ3BWcc+9gYPMUdMGHnh1lLpOsunpSaPqUL2LqNV7vzse+5JVhO1wW8XmFr3SzgF03Y+Z9lrZxuLONh1/37otw3urwIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAcPgPiiXScSbN+WcAAAAASUVORK5CYII=\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"replot.plot([np.sin],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"replot.plot([range(10), (np.sin, (-5, 5)), np.cos, (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=True) as figure:\n",
" figure.plot(np.sin, linewidth=20)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"replot.plot([range(10), (np.sin, (-5, 5)), np.cos, (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\",\n",
" palette=\"dark\")"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9B3hbx5k1bCfbvu3f99nr3cSJZYnkv+XP/rvp2TQ7jp2y6cWbXjd1N47Xlqvcu61mVatYVu+VqhRFUaIoUhJFiWIRm9i7CICdtGPHmn/OoBCkSRDAvcDciznnec5DECSAufcdvO+ZmXfeueoqgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiAIgrAZGRkZg+np6Z+Y4n8a09LSfmLlc+RnzJe8LN9rQL7XP1l5r6kg3/+T8rOuyIdvs/N95XveKttfLX/2y5/Pyp/fkT+r7PwMgiAIgiCIiJAC5McQOlLwPDPV/0qh8kP5v62R/mcy4WRVAMrXfli+72vTpk3723jfYzLI910t27du3OfhOt68ymYBCPEn3/suO9+TIAiCIAgiJkhBUiSFTrdkl/z1DyP9r/yfH0m2RPofKW5uCgint4/7HKsC8HtTfXYUmPD6kiwA35gxY8an7HzPKBDRrgRBEARBGITp06e/HyJHip3bMLuG5cgI//sx+fdXJX+PJV8sw8rH38bfMOMHUSP5Lvl4BO8Z/B/53vfjf8YLwGnTpv29/L99EJ6YVZR/X/KOd7zjTyf6bPm3x8I/W/4sD7Tpr+R7rsDrAyL2gHwuI/g6+bdH5f/ny+efkD/b5c+KCd77AcnXJX8X1ubrgwJQ8uvyuRos2Upm33DDDX8X9v5/jJlT+Xyd/B+f/Hlc8l8muX/pgbbjPUfwOfJ+fXT8rOq111775/L3NfJ5LwSv5B2B+/ODwGe+ZYZ1/HsEBO1W+XNp8L7g+Xe9613vkI83SrYF7vtGec+vmczmBEEQBEGkICAUJM8FHm+WouFkpP8PCI23zMIFBSAeh82cXT3utSEB+M53vvP/BoTJHfLXP7j++uv/D8SV5PJYPhsCUj5/VL7vtVJQ/kkgR7AlKCQDAvB1+dws+esf4X8muw+TzABekc+vhyi75ppr/gL3B/8b9ro1YaLwbfI1v0aOIoTpZNcRuFc3T3Zd8vErkqdvvPHG69Be+feVAXEaLgDHzExO8B6rA6/5ofz17YHr/iPkGsq/PY/fcY/ke61F+ydrK0EQBEEQKQYpAv5aBv9hKQp+jt8hSiAspHh5z2SviVEATpoDKH/+z3ixidkwzEJeNU44TvbZyAUMfO7/G/ZvfyD/zyPf//bA5zw6Vc5ioP2TLgHL598Z9hwE3kU8DohYfH7auPeqjTSTGn6vJriuq3EP5Od8Jvh3CM/AzGesArAg/HPl718dfy9wbWgPZgYj3R+CIAiCIFIE2IiAJUnMbgWeujogXl6a7DV2CUAsTQZmqHqClM/1QZCGL7FG+mwpVD+Azxm/bCz/r1g+PzPQlkenmtUMtCeqHMDwNsjHHwzMEIZfQ6/8OSR/3hvhsyYVgPL5v8HfJf9h3DV5YhWAkhvGfe69yD8c317cc2ywmeoeEQRBEASRAkBeW0CEdUh2goEZwYEwUTgGUih8fyoBKF//8ShmAB+Rv+fE2N6JZgDHz1i+HUvL8v2/GfgczACemOq95f+silUAys99d7o/f/L6WK4jmhlA+ffPhrXjL8fNAL4Xn4uZwbD3eHCCGcAx14PXy+cvxdJWgiAIgiBSCIFNH9iM8AnMOoUxDbOC8u//NdHr5P/fig0MyNkb93xI1GCzQ0AY/WP4/4QLQGwWwaYJLKnK9/pfwefk71+erM2T5QAihw1tx/vI/5mLZc7rrrvuzwLXGZUAlP/3dGDJ9G1hz0Uz07ZTMhNiEL9DlEG8IX9vss+aQgAGcwALIXAxuykfLwvPAQxsEukLzHJCMP4L7u1UAhCvk881yb89AVGJ53DfgsvlBEEQBEGkOKQI2CWZNcnfsJHiLbtlA8AMGzaLeAPLiN8KvObNcFGTPlqwuSe4HCofN4TvAsZuXbQDM5CBpciKwGaNCTGRAEQeY2AXcFtgmfSgFF//T/Dv0QpA+ZobIACDS6Phu4CviiAAA7uAHwnbJYzdtTsi1Socf6/Gv2fYLmDsKsbu5t9IdoULNQhlzOYFdmIfwE7rqQQggOX1dP/GleaAiKyVr1001f0hCIIgCIIgkojAZh3M1n5Id1sIgiAcCekgFwSWQq7IEf0/B58PLGsVBEbpZ8YnWBMEQTgFgVqKOFbvbYGdxphxxVFxthakJgiCSBmgUC3KGWCpKVwABuqEfR+P0/1FXYv0tZIgCGJySF81Q/qo0nT/WcEoBo3i1um620UQBOF4YBYwKABRIBa5LleNzePBjsfp2hpIEARBEARB2ItxAvC9geWTELAMjPNKtTSOIAiCIAiCsB9TCUAsAVMAEgRBEARBpBDsXAK+cuWKIAiCIAjCXUiQxCCcjHABGPg9N3AoOgThN2LZBIJO5PUOCI+HTHXCzrS3OaS9zSLtbRZh50ToC8KhQMV8FE6VAu/1wLFWtXg+UHC2MHD0FZZ//yna94TDQGfq7iZTnbAz7W0OaW+zSHubRdg5cWqDMAJ0GOaQAcIs0t5mkfY2ixSAhGXQYZhDBgizSHubRdrbLFIAEpZBh2EOGSDMIu1tFmlvs0gBSFgGHYY5ZIAwi7S3WaS9zSIFIGEZdBjmkAHCLNLeZpH2NosUgIRl0GGYQwYIs0h7m0Xa2yxSABKWQYdhDhkgzCLtbRZpb7NIAUhYBh2GOWSAMIu0t1mkvc0iBSBhGXQY5pABwizS3maR9jaLFICEZdBhmEMGCLNIe5tF2tssUgASlkGHYQ4ZIMwi7W0WaW+zSAFIWAYdhjlkgDCLtLdZpL3NIgUgYRl0GOaQAcIs0t5mkfY2ixSAhGXQYZhDBgizSHubRdrbLFIAEpZBh2EOGSDMIu1tFmlvs0gBSFgGHYY5ZIAwi7S3WaS9zSIFIGEZdBjmkAHCLNLeZpH2NosUgIRl0GGYQwYIs0h7m0Xa2yxSABKWQYdhDhkgzCLtbRZpb4ewvUcMrNothp5ZqR4n0t669QPhctBhmEMGCLNIe5tF2tsBbO4Wg3PXilf/53kx/Mhi0d3mS6i9desHwuWgwzCHDBBmkfY2i7S35vt/qV0MPbVcib+hJ5cLT21bwu2tWz8QLgcdhjlkgDCLtLdZpL310VveIIYfWuQXf3PWiO6m7qTYW7d+IFwOOgxzyABhFmlvs0h766HvzEUxct88Jf4GXtqW0Ly/8fbWrR8Il4MOwxwyQJhF2tss0t7JZ8/Rs2Lk7tlK/PWvPyC6u/qSam/d+oFwOegwzCEDhFmkvc0i7Z1EXu4XfXuOK+EH9mXmqeeSbW/d+oFwOegwzCEDhFmkvc0i7Z0kdvWJ/nX7lfDD7F9PbrE2e+vWD4TLQYdhDhkgzCLtbRZp7ySw3ScGlm71i7/75gnfmUqt9tatHwiXgw7DHDJAmEXa2yzS3gm+v02XxdDsNf4afw8vUjt/ddtbt34gXA46DHPIAGEWaW+zSHsn8N7WtInhJ5f5y7w8tULV/NPeJgpAwiroMMwhA4RZpL3NIu2dGHpL68XwrIVK/A3OW6dO+9DdpqC9desHwuWgwzCHDBBmkfY2i7S3/fSdqhAj98711/hbvl10dySnxl+09tatHwiXgw7DHDJAmEXa2yzS3vayJ6dIjNz1gr/G38aDSa3xF629desHwuWgwzCHDBBmkfY2i7S3TUSNv125oRp/vftOJL3GX7T21q0fCJeDDsMcMkCYRdrbLNLeNhA1/tbuHa3xd+yc/jZFsLdu/UC4HHQY5pABwizS3maR9rbINp8YXLzFL/7uny98Z6v0t2kKe+vWD4TLQYdhDhkgzCLtbRZpbwv3rrFLDL2w2l/j75HFwlvRqL1N0dhbt34gHISMjIzPp6enn5MskY/LJH8w1WvoMMwhA4RZpL3NIu0d532rbhXDj7/kr/H39ArhqevQ3qZo7Z0MXUG4BFLw+dLS0v4Jj2+88cYbpBB89brrrvuzSK+hwzCHDBBmkfY2i7R37PReuCSGZy3w1/ibv150t3i0tykWeydHWRCugBSAnunTp38Mj6UA/GcpAFvlwz+I9Bo6DHPIAGEWaW+zSHvHRl9B2WiNvxU7RXdHr/Y2xWrvpAgLwh2Q4u8WiEDJJin++mbMmPGpqV5Dh2EOGSDMIu1tFmnv6NmbfXq0xt/mLEeWeYnG3snQFYQ78HYp+o5J0fdR/CLF4PulEOy4/vrr/0+kF8FheL3+zkSmNmFn2tsc0t5mkfaOgt39on9njn+nr2TfgXz9bbJg7+RIC8LxkMLvfVLwVYc/J38vwqxgpNcJgiAIgkhxXPn978Xrmw/6CzzPnCN+X1Klu0mWkVhVQbgGUgD+TXp6ev+0adP+PvB7mhSA3rS0tOsjvQ6diCNGM8gZArNIe5tF2jsC231icNEm/8zfA/OF71y1/jbZYO/kqAvCFZCi7z9Q/iVQBqYUv0/1GjgMdCbd+QxkcnJGaG9zSHubRdp7kvuCGn/Pv+Kv8ffoEuG92KS9TXbZOxm6gkhh0GGYQwYIs0h7m0Xae4J7UtUshh9f6q/x9+zLwlPvjhp/0dpbt34gXA46DHPIAGEWaW+zSHuPpfd8rRh+MFDjb8EGV9X4i9beuvUD4XLQYZhDBgizSHubRdp7lD0nS8XIPXP8Nf5e3iW6O91V4y9ae+vWD4TLQYdhDhkgzCLtbRZpbz97swpDNf76tma7ssZftPbWrR8Il4MOwxwyQJhF2tssGm9vKfT6tmWHavz1HirU36YE21u3fiBcDqMdhmE0PkAYRtrbLBpt785eMbBqt1/83TNH9ORf0N+mJNhbt34gXA5jHYaBNDpAGEja2ywaa+9WrxhcsDFQ4+9F4Ttfo79NSbK3bv1AuBxGOgxDaWyAMJS0t1k00d6e+k4x9Nwqf42/x5YKb1Wz9jYl09669QPhcpjmMEymiQHCZNLeZtE0e3srm1VhZ1XjT4pAT0On9jYl29669QPhcpjkMEynaQHCdNLeZtEke/vO1ajlXlXjb+EmtQysu0067K1bPxAuhykOgzQrQJC0t2k0xd7Y4DEyM1Djb9XulKzxF629desHwuUwwWGQow6D9jaHtLdZNMHevQcLVIkXVeNv+5GUrfEXrb116wfC5Uh1h0GOdRi0tzmkvc1iSttbCr3+LYf9O33vekH0Hj6lv00OsLdu/UC4HCnrMMgJHQbtbQ5pb7OYsvbu6BUDK3cGavzNFb6CUv1tcgApAAnLSEmHQU7qMGhvc0h7m8WUtHeLRwy+uN5f5uXBBcJbUqu/TQ4hBSBhGSnnMMiIDoP2Noe0t1lMNXt76jvE0DMr/eLv8aXCU9WivU1OIgUgYRmp5DDIqR0G7W0OaW+zmEr29l5sEsOPLPbX+Hv+FeFp7NLeJqeRApCwjFRxGGR0DoP2Noe0t1lMFXv7iqvFyP3z/TX+Fm0W3W0+7W1yIikACctIBYdBRu8waG9zSHubxVSwd0/eeTEyc7YSf/2rM42t8RetvXXrB8LlcLvDIGNzGLS3OaS9zaLb7d27P18JP1Xjb+dRo2v8RWtv3fqBcDnc7DDI2B0G7W0OaW+z6Fp7o8bfpkOjNf6yT+tvkwtIAUhYhisdBhm3w6C9zSHtbRZdae+OHjGwYodf/N07V/gKy/W3ySWkACQsw3UOg7TkMGhvc0h7m0XX2bvZIwbnrfOXeZm1QHgv1Olvk4tIAUhYhqscBmnZYdDe5pD2NotusrenrkMMPb3CL/6eWCY8Na3a2+Q2UgASluEWh0Ha4zBob3NIe5tFt9jbW9Eohh8O1Ph7YbXwNF3W3iY3kgKQsAw3OAzSPodBe5tD2tssusHevqLK0Rp/S7awxp9Fe+vWD4TL4XSHQdrrMGhvc0h7m0Wn27vnWLEYuTtQ42/dPtHd1ae9TW4mBSBhGU52GKT9DoP2Noe0t1l0rL0v94vevXmjNf52H2ONP5vsrVs/EC6HIx0GmTCHQXubQ9rbLDrS3l19on/DQX+Zl7tni56cIv1tShFSABKW4TiHQSbUYdDe5pD2NouOs3d7jxhYtm20xt/pCv1tSiFSABKW4SiHQSbcYdDe5pD2NouOsndztxicu9Zf5uWhhcJbVq+/TSlGCkDCMhzjMMikOAza2xzS3mbRKfb2XGoXQ08t95d5eXK58NS2ab83qUgKQMIynOAwyOQ5DNrbHNLeZtEJ9vaWN4jhhxb5xd+cNaK7qVv7fUlVUgASlqHbYZDJdRi0tzmkvc2ibnv7zlwUI/fNU+Jv4KVtKgdQ9z1JZVIAEpbBAGEOdQcIkvYmU9PePUfPjtb4W7+fNf6SZG/d+oFwORggzCEFgVmkvc2iFntf7hd9e46P1vjLzGONvyTaW7d+IJyFP0pLS1uUnp5em5GRUSq5bqoXMECYQwoCs0h7m8Wk2xs1/tbtH63xl1us/R6YRApAYgyk8JsvuSD4+4wZM/5mqtcwQJhDCgKzSHubxaTau90nBpZu9Yu/++YJ35lK7ddvGikAiRDe8Y53/KkUf/3XXnvtn8fyOgYIc0hBYBZpb7OYLHt7mi6Lodlr/DX+Hl6kdv7qvnYTSQFIhDB9+vT3ZGRkNEo+K3lWisG8GTNmfGqq1zFAmEMKArNIe5vFZNjbU9Mmhp9c5i/z8tQKVfNP93WbSgpAIoS0tLT3StF3Rf78Ln6Xj/9FCkGP/P3aSK+Dw/B6/Z2JTG3CzrS3OaS9zWKi7e0rq1eneijxN2+d8LR0a79mkwk7J0ddEI7HO9/5zv8rBd8b8uHVwefk70VTzQIKgiAIgoiA31fWi1cDNf5+t3q3uPL6G7qbREgkXFgQ7kF6enqWFHyfw+MbbrjhRvl7t/z5d5Feg07EGQIzyBkhs0h7m8VE2bv3aJEYuesFf42/jQeF53Kf9mslOQNIjANEX0ZGRq5kmRR/JVIMfmWq18BhoDPpzmcgk5MzQnubQ9rbLNpub9T425UbqvHXu+8Ea/w5iLBzMnQFkcJggDCHFARmkfY2i7baGzX+1u4drfF3/Jz26yPfam/d+oFwORggzCEFgVmkvc2ibfZu84nBJVv84u/++cJ3tkr7tZET21u3fiBcDgYIc0hBYBZpb7Noh709jV1i6IXV/hp/jywW3opG7ddFTm5v3fqBcDkYIMwhBYFZpL3NolV7e6pbxfDjL/nLvDy9QnjqOrRfExnZ3rr1A+FyMECYQwoCs0h7m0Ur9vZeuCSGZy1Q4m9w/nrR3eLRfj3k1PbWrR8Il4MBwhxSEJhF2tssxmtvX2G5GLl3rhJ/Ayt2iu6OXu3XQkZnb936gXA5GCDMIQWBWaS9zWI89u7NPj1a429zFsu8uIgUgIRlMECYQwoCs0h7m8WY7I0afzty/Dt9UePvwEnt7Sdjt7du/UC4HAwQ5pCCwCzS3mYxant39oqB1Zl+8TdzjujJK9HedjI+e+vWD4TLwQBhDikIzCLtbRajsjdq/C3a5Bd/D8wXvnPV2ttNxm9v3fqBcDkYIMwhBYFZpL3N4lT2VjX+nn/FX+Pv0SXCW9mkvc2kNXvr1g+Ey8EAYQ4pCMwi7W0WI9nbU9Uihh9f6q/x9+zLwlPfqb29pHV769YPhMvBAGEOKQjMIu1tFiezt/d8rRh+MFDjb8EG1vhLEVIAEpbBAGEOgwGirsMjTtQ1iZ0Xq8Sy8+fF/LNF4oUzp8Wzp0+JuUVF6rkNZRUip7ZBVLV2i8ssDeFKOkEAou9Utl4WuZcaxdaKSrH03Lkx/Q2PV5ZcEFvKL4o82Sfr2r3a75tbOZG9e06WipF75vhr/L28S20A0d3ORLJL9rfS5k6RXVMvNpVXiMXFxWJekb+/PSf724KzZ8Uq2d+2y75YUN8imjp6tLfZir116wfC5dAdIMjEEgH4XFO7WH6+RNyZd1R86eAu8cGdG2LiJ/dsEb84elg5z6NSFHZe7tN+XeTU1CEAEYARWBcUnxW/ys0Wt+7dFnN/w2vuOJ6jBiKF8r04AInP3r1ZhaEaf31bs1Oyxl97V58aqELg/STnkLhJ+qpY+9u/798p7jlxTKwpLRMlTe45/o4CkLAMCsDUZHFjuxrxfvFA7IJvKn46c5t48GSeOFh9SYrB1AsqqcJkCUAINMzePVyQL26LQ/BFE6CfOlWoPoNiMAp7d/eLvu1HRmv8HSrU3jY7iQHoAel77srLlYPTzbb3t28cylQz0xg4677WqeytWz8QLgcFYOqwratXrCstF9/L3m+7U5yMX5DBGcssNW3d2q+fHMtEC8CGdq9a0v3qwd1J62//kbVXrC0tE82d7l26S6S9r7zxezHwym6/+LtnjujJv6C9XXaxoqVLPHfmlBxkbE9af/vPnCyx62K16Ohy3qoHBSBhGRSA7ifyWF46f158JomOcTz/bddG8UhBvnLSuu8H6WeiBGC1FPuYXU7E7Eu0xFIfcrsamDM4au82r/jdS1sDNf5eVJs/dLfJDmI144H8PPER6WN09bfP7dshVl0oVYNs3fcjZG8KQMIqKADdSzgjCL+bM7dqc4yTCUEk/uu+P6bTbgEIsfXM6UJp403a+1m4EMRyXVOHT/v91mrrhk4x9Nwqf42/x5YKb1Wz9jZZZbkcTCI3T3cfGy8EV0sh6IQZQQpAwjIoAN1H5EHtuFglvrjf/vw+u/jx3ZvV0rCTRsym0S4BiET7lSUl4lMOGmiMJ5YFseuzy8AcQW9lsxJ9EH+vzVktvI3urvHXIMU8lnqdNNAYz68d3CMO19RpvU8UgIRlUAC6ixeaO8RPcw5pd4DR8ksHdon9VamxFOU22iEAsfHi6zLY6e5H0RL5r9g5rPveJ4u+8zVquVfV+Fu4SVx59TXX+nMMbJFvl8wcP6vEbvVyTWkvFICEZVAAuoPY+YaE+4/tdu6oOBLvyz8u6pmvlVRaEYDIK3288KT4kAP6Tqz88M6NYk7RGdGe4rPP2OAxMjNQ4++VPcIjr9et/hwpI785lqO978RD5MJiY1Kyd6hTABKW4VaHYRKRBP3tw/u0OzqrxCaVfZwNTBrjFYAoovv5fTu09xerRDmPghSdDew9WKBKvKgaf9tzVI0/JxT+jpUQTVi6/2Qc9fucxp8fzUrqJjgKQCJeXP2+Hes+9IGd6+7e1VArsmvrjMydcTrhHFGc1K2zfpNx1skTooVlPBLOWAUBEttRUNeNs36TEbOBC4uLU6depbyO/i2H/Tt973pB9B4+Fbe9dbOxwydmOmyTh1VCyG6rqEza91u3kCBchvduW/O+D+zYUD++434ra6/I0pzUSo4Sy6W/PZ7YJREUif6ZHLViefbRgnzxRGGBKrfwX8eOqNmTRCZh4/3PNrZpv8+pzFgEQVlzZ0LrR354pz9x/pe5h1UR8ccKT6olZvQ9PPdl2Rc/nMC+jn7u+lqVHb1iYOWuQI2/ucJXUBq3vXUTR1EmchPbR6XvQs3I/5a+DANO9DX0OewqRm2/RM9woyh6a4KP3aMAJGLC+7evv+kDO9cPR+q4qK2VMqNllxLLVjj9wG6nhAC8oOycmvFtiKJsBnZ/5tc1q9zDHx05aPvMEHYKry8r5+kOCWK0ggCJ94lYgvvu4f3ixbNnxfFLjVHN+OJ/jtTWq/OovykHCHa3B6eUYHlbt13iYotHDL64wV/m5cEFwlvy1lQKNwhAfNfhTzAza6dt8X4Q+Tjy8nRDa1RlWjDIRkoKTplJhL+9XfbhRJ4mQgFIRI/HHnubFH/l0XRcjMh5KLseIh/mozbOvCGwY+R7sh51wfotBQgkauOMV7tHzxgtp3rCvg5OJQgw0JtddMZWW35233Yp4M6IkmbrZ6oieD4tg7OddS4xywgB4qZBh6e+Qww9+7Jf/D3+kvBUT5zX6HQBCIF/d16urf0Ng1qcGW11djd4nOH9+cdt9b+fkIPcnRerEtMvKACJaPH+Hes+H0vHxRFfhQ2pmUDtRGK2DcsUdjmeW/duE4tloGsMm+mzK0BgRzKc2jdsnKX54ZED7l+icxgj2RtFnX+Vm22b/b5ycLfYUFaeECEP4YBTGD5n48ADS4FuyEP1XmwSw48uUeJv6PlXhKdx8k0GThaASDG43UZ/8f3sA2r2LhG565faPaq4+E02zopjUGR3WykAiajxwe0bfhNrp8USHZaHdDuPVCeED5ZY7XA0KEmwqLh4wuBmd4DoCtTtQq0/O9qOAO+fqdRvk1TgZPZG7uWXbbIZdnZD+CUjbQRFxVeVXBCfztxmS9u/nbXP0UcX+oqrxcgD8/01/hZvFt1tkdM2nCoAkVtuVxFxDDoPVl9KygwulohRTsiuGUHUDER5JbvaRwFIRI0P7tgwK96OC0HhpiUTN7FIBmO78k+Q7BxpFi1RAQKBGbONWO6weg1wtlvKL2q3SypwInsfkMHTjjN8ceQfcvWaNcyiITBjw5Idm0YwU557qVG7rcazJ++8GJk5W4m//jWZojuKnDYnCkDM3NphJ6QBoNYeVh+SfQ1lLZ22bciDgC1ttuekFgpAImq8b+fam610XOzWY56WvTwkR8Z2JN9jNientiEqh5HIAHGx9bLKH7XDUWIJhoMOaxxv73UygNqRfP+D7AOqNqXu60OKyu1Ze20Qs5uSVrojGvbuz1fCT9X423lUlX6Jx946idUBnBtthy+4Ky/XEekhGDx91oY0hFukmD1mw6CDApCIHo899gcf2Lm+w0rHRZ5WbZtH+xcxFbjWhmCMXbnPnj4VdS5TMgIERNuGsgpb8mf8gw79h667lUF7X+7uV/X9rNoD9ShfLnu2OJsAACAASURBVLngqCoB6B8YLHxkl3Vhu1D3Sgdq/G06NFrj78iZuOytWwCi/Mmdx49atgd2be+tqtHex8KJ6gkoY2T12rDSscPi5hAKQCImvHf7+o9/YMeG31npuKjd5ITRv1uJkfFzUrRZdSDYbRlrSYtkBgjMBtqR14hzjxu4Iz0uws6/+/3vbSm2e7vD6zZiNhAbUaxeJ9IooikhYjtR42/FDr/4u3eu8BWWx2Vv3QLwUptHzRBbtQNWEpww6zcZsQHlFhvyGq3sSKcAJGLGB7dt+OpUtQCn4s17tqh6Xbq/hG4jZursyCVBcVPsVIvHYSQzQCBfB7vfrNYPRKkH5OHotp/b2NDhFT8/bn1JHrvTE13U1g4iwf4eG8QujvRqjKJOpm1s9ojB+ev9ZV5mLRDeC/EV5NctAFH658sHrIlw5JairIsbTqbCBiI7xC6K8MeT20gBSMSF921b/Z4P7lh/yUqnxZILatbp/hK6hRgZf9+is0Ay9UvSOVoZMeoIEJipRLK9lWvHchCKUuu2o1uIshsQzlbuOTaL7Kl01hLcVPSnIJRb3rmJZP1k7BD21HWIoadX+MXfE8uEp6Y1/vfSKABRQ8/q7uzPu7AKAGaLn7chveLXudkxb6iiACTixvu2Lf+rD+7YsMdqx8VOQCbrR6Z/ZGyt7AaWGw5bPKpPZ4BAMEXZDSv3AGWJMl0mSHQQQfQ2i4Iby6luTvXAaTpWC5ajxE0ia6F6KxrF8MOL/TX+Zq8WnqbLlt5P1/cbpaCsCu6fHDnk6vxy5Cpa3V0P/1jVGv2yNwUgMSHS09N/LHklLS3tSxH/8bHH3ra6qtzy6AXLLm3cITwhT9gwMsY5zXYsgepeIsISuNUlOiwnYyOCbrs6lQhEH7dYjgdnQUdzVKDTaUd9TZQ2wu5Pu9vmK6oUI/cHavwt2SK6263f72R/vzHwx3Kt1RSPJ08V6Mm7tJko6WW1JipKgkWba0sBSLwF06dPf3dGRkYBOKUAlIDD2FNVbTlowNHGk5eWykQwxs5JK/cVRyfZdWKBbgEIBoOG1dpgT58udEWeUDKJmmtWg3EiTizQSewSfqQg39I9QV/Frn272tRz7JwYuTtQ42/dvqhq/EXDZH6/sRMctRit3FeU39mcYmlEOEL1P3OyLN2XaHPsKQCJ8bg6PT39iBR+/yp/HotWAKIjFda3WK5xhARgO84ATQW+4sBg7AQBGCRmVawWjkapCTdsTkg00UeetbizHDm9qRaMw4kTRKwOOlBKx9L3Ub62d2/eaI2/3ceirvEXDZP1/caA9DfHrG1mQ2FnJxbgtoPY0GFdHG+csiA+BSAxBhkZGXdL0fcIHscqANGhKlsvi+8ctpanZVeRS7dSlXk5Yz0YbyyzPxg7SQCCpxpaLQ86sAvvkotzh6wSwdhqzTXUbIy1pJAbidIdVlc6UFInroL4XX2if8NBf5mXu2eLnpwi268vGd9vLKtbjREoJXauyb35pdFypRx0WJ0EWFB8dtIcewpAIgQp9v5Rir5T8uHb8XssAtDr9XcmsLVLBpQ8awEFU/vbL1aG3tMUdlzutVxzDdP/ObX1CWkf7Dze3rpZ1XZZ/IfF0xywweZCS4f2a0k2kXJhdWe5yjlqatN+LckiNnV8Zt92S/fsx0cOqhI7UX9uR48YXLbdL/7umyd6zlQk5NoS/f0ulv3kCxaPrfzu4f2itr1bez9IFjNtSANCbUrMKk5k74QLC8IdkILvlxkZGe2SDZKN8vdXJbskfxHpdWICvHnlilhQds5SpwVXVZWJK/K9TED/714Tv8zLtiZkDu0WDf19ui8l6Rh8/XVxR761QcetMqiXert1X0rS0DjQJ75yyFqZl+/lHBDdI8O6LyXp6BgeFN86Ym0W65uH94q2oYEpP+vK0Ih4beEG/7LvI4vFm62dSbhC+3H2cqf41F5rhY/vLjgmRt54Q/elJB3lPo/4zH5rg47fSP8IPzkeydIXhMsQ7wxgOO04rgzH5nRMMHpJJWL2yWrNte9l71czOolspxNnAIPECPdhi8n6KEWxu7Ja+7UkmrmXGsSnLJ5C8KtA3THd16KLjZ0+8bOj1pL1UWqnoKF50s/w1rWL4aeW+2v8PblceC8ldqY1Ud9v5IZaPWrviVMnRVd3v3a76yKqOFg9qQYrJVgxCbd3MrQE4UJkZGTkxpoDOBEPVddZrm+EXVGpUFZiIubUWg/GSKi2a6dvJMLOU9lbJ5HrsuSctZln5NwsP1+SsrUpt1ZUqgRxK/cIQjsVym5YJXYIWz3XFTmFE51X6y1vEMMPLfLX+JuzRnQ3Jf5YM7u/3/gO4ZxlK/cHXGaheH0qETuErZYl+ty+HeJMY2vI3snQEkQKIxqHcbqh1XJR1a+n4HFe60rLLY+MHys8qUoqJKO9TheAQW5XIsda3gyOV2pPIZGDPvKCDScOLLZw9mgqEvdiwdmzlu7p+EGH78xFlesH8Tfw0jbR3Z74wR1o5/e72YbNRZiRR5Fo3TZ2ElEvF6W9rNxXTMigID4FIGEZ0ToMVCi3epLDrSlynBeC8dOnCi0HYysHgcdDtwhAECUirM6sYrTt5APloyVmz7Fka+VeQFBvk8Ja97U4lXYsc9574pjoyDkzWuNv/QHbavxFQ7u+3xio334o09K9QPH74wZXg4hEVIqw4/i4F88WCRzmoFtDEC5GLA4Do0KcEmCl02JHFPK0dH8J4yWOK7Ja6BNLeDqCsZsEIIhSESgZYeVeY8kk32Xni46/B1Zzh1Bz7Whtg/ZrcTpRCgclcazc6++sfUU03j9H9GXm2VrjLxra8f3GPbjF4sALu/JZD3ZqrrlQark2JY5zTduw4S916wjCpYjVYWD2C0f3WB29YATktjwkjGit1q3zl3nRE4zdJgBBzOChdISVe46lqA1lFa5b+sRA6ZMWBQl2lp9rTv2aa3YRx3lZTXf59K7NWuoqWvl+Y1bqJXVCj7VZUNPrcsbK/TbUpvzgzvWV79ux+u91awniKrX5olOyYyrqbmcQ8TqMl20ocvnDIwfExVZrB6AngxAOK0tKLC8RoeZaUZTnPCaCbhSAIDbI/LfFmWcQ5xA3uWAzEvKEkBtq9Xqxs9z76ojr7K2bSHf5lsXalPCNc4rOJHWQG+/3G4LNaooBeFdeLk/miYMF9S3itr3WysR8YMf6ofdvWz/lpk8iwUhLS/tkNNTdziCsCAI7KutjuQHvo/tLOBkxA2WHc7xdBpRKzWLXrQIQxMzz4zaIIhzW7uQ8VCz5Wi2MDf72eI4q6u5We+tmU0ePLd97FOpO1ua3eL7fWI2wuqoBPm/1mDzDWd7SpTZKWhKBO9e/9t7t6z+uW1MQLoLVAIEzhD9jcfQCPpCf57hSMXsqa1Qys9Vr+2XuYUfMPLlZAIKYiUVJCav2wEwujlhy0i7hzsC1WT01AHz6dKF6P7fbWzcxe/dQwQnL9kBe4ebyiwlPQYjF3phVtyOVBzlsa0rLtNsqFdjQ7hU/zTlkUQRuaL9q2zffrltXEH78UXp6+pOS9ZL9eCItLe0zGRkZ/627YUHYESAq5OjlmxZ3jYFI2D9QfUn7FxGzflaPdAvyqVOFqsix7msCU0UQoLTERy2WiQGx0/GkAzaInG/qUOkQdgTjVRdKU87eOgnRtri42BZf8IujhxM6GxitvbHDHhs1rF7PJ3ZvdoS/TiXinOl7LMae925b9ynduoK4Som9RVLsHZL8uBSAfXhuxowZ75KPK3S3LQi7AgRmuODg7HCUWL7SUTMQQg07s262mHgPYpZprcNGxqkkCLAhx47ZWYgmzIRg9J3sa8CuetT2s1rzEMRmkf3jUilSyd66uc2G2pQgUmaw2QKB3u42TmXvajmwvS//uC0+GvnMqA+r2y6pSAw65hXFX4D7/dvXP6hbVxBXqQ0hHVIE/mXgcU/w+aAYdALsDBBYMrF6nFeQmOGZXXRG1CchMOMLhzzEb9gwiwmift2R2uTvApyKqSYIkDdjNVk/3GbY6JOMZWF8T7Ar2Y7cKxBlYpA7mOr21s2CrDzxuc1rbbHZFw/sEjsvVtm6LDyZvTHQQAFwqyc6BfmTI4e40zcJxErHJ+LJsd++4Te6dQVxlRJ6rdddd92f4XFQAE6bNu2v5eMmrQ0Lg90B4nKgnIAdjgZE/gxGQ3UJEIJIWsYxTnYsvwWJM4FLmpxZAysVBQFymawumYQTMxsrSy4k5Gg+zPpslMLvSzYsvwWJjQqT5c6mor21UPqJvl25qrhz272zxY92WZ95DhKbwzC7aEeayHh7Y1UGxebtmCkPEhux3Fa+y81E1Ygvxugv3r997ed06wriKiUAl0mugggMCMC3y9+XSi7Q3bYgEhUg4h69TELMCGL5Iq+uyfKoGTl+K0pKLBfYHU8c8YPdg7qdxmRMVUEQ3BxiuahqGBE0cdpL8NxNKyxr7lRLvTgJx87+hveMdIxgqto7qZRip3/tXiX+cMJHz7Fzapb4UZtWOoJEwXNsTEI+dbxthZ2vXLkiTss++4hsn53+F8Xr15eV67eHgcTkx8+ORnf4wAd2ri/n6SAOwTXXXPMXUuztlOLvdfnzTcnX8Pu1117757rbFkQiAwSWpaweKTQRMUuDzRVYto1mZhAjVuSrQCTgi2S12Ol4It9vVckFxxcaTnVBgOK7t9ksskD0YaQjoGRGNAIfdfyQaI+A/p3D1o5PnIjIUY3mNJ1Ut3fC2eYTg4u3+MXf/fOF72zVmL9DENmxazucqB+IIwyxZIsTbKLJFWzs8ImD1ZfE82dOia9l2e9vIU7dfJpOKhAzxFOdBY5agB/Yts4xJeaIANLS0q6dPn36B2688cbrdLdlPBIdIFAY1K68wMmI3cM4ng1LgRiZo4jurJMn1LF1WGKxI3l7MuLUAMxK6nYQ0dAEQYDZXbs2I00WoL98YLf6DJQuQn/Dshhmp7Eci1lluwcY4URx52g3SJlg70TR09glhl5YrcTf8COLhbdi4nNtsURnV+7wRMTgEu+PvvXgyTzl20D4up/LwSwGw4n0rXceP+q48lwm81BN3YR5zx/Yub7uvdvWvE+3niDGQQq/v0pPT/+O5D34iRxA3W0KR7ICBPJcrB5r5TSiVIyO3aPx0hRBEDzWyurJLU7js6dPxbRJxRR7201PdasYfvwlJf6Gnl4hPHWRc3oxyLXj5BYnESk3qy+UOn5Vw0TCJljtWFdWJj64Y/1d79ux7kMylF+tW0sQ4yAF3yckeyXPZ2Rk7JY/z+H3VDkJJFYiv+XnUeYyOJlYgoOg1e0IYqVpggA1/r5msbq+E4gk8HjOjzbN3nbQe+GSGJ61QIm/wfnrRXdL9LtdM20qHK+bOL1kol3lpLOI77Vu/UBEgBR75VL4/SD8OSn+vp+KdQCjJUYvqI9nV0mCZPPXudmWErV1OwzTBAHy8eYWnXHtbOAThQWqjAftnXj6CsrEyL1zlfgbWLFTdHfEXqvvUrtH3G9Trb1kE7N+mDmPtLGIdA4pAB0OKf4G5I/xO3LeHnjeEdAVIFDD7Y7jOdqdXrREzTbsbHbzkojJggC7eb97eL/2fhQtkfd1NI5ZP9o7PvZmnxYjd72gxF//5ixV+sXK+2XV1KnNE7r7UbTE5jjO+rmLFIAOhxR665H3N+65b0mu09Wm8dAdIOAonbxMhw0kyL1ywlm+djgM3fbWScxs+AswWz+7OlG8OXOrOs4tEXXhyAmIGn87cvw7fSV79+fb9t6oJbmwuNjWcix28wv7d4o9le4e2JpKCkAHQgq+zZKbAlQlYCTPBh6fDZSE2aG7nUE4IUCgTAuOYPu8TScj2EHs9sRSjluXeydzGE6wt25iSXX+2SJHBWYcEYaBhp0nLNDeU7CzVwyszvSLv5mzRU9eSUI+BzvTUZcvkbvDYyVqUmK5FxtYtNuBjIsUgA5EWlrao9FQdzuDcFKAQM2rV6QQ/JxGIYiCpyjvgfIOuu9HIhyGk+ytm6gh+eLZs+KWzK3ahR9EAu2dRKLG36JNfvH3wHzhK566rqJVonwPSgbZXTswFmKTCk4HScRJN2RySQFIWIYTAwRmBFHoFrX9kjkiRqHNytbL2q8/kQ7DifbWTQRDFPL+D5vOFY6GSHvA2cOJLCNEe09yX1Dj7/lX/DX+Hl0ivBeTW8ezts2jZqC/kOAafuH8QfYBsbXiotoUpfv+k/aQAtAFmDZt2p+kpaX9a3p6+q3y521B6m5XEE4PEEhMhrP8ZgKKrWInMo5vO1B9yYjzLSkIpuaphlbx5KmChKQjfGbvdlU4GiVdkpFzRXtPcE+qmsXw40v9Nf6efVl46vWd2416lUdq61UR8U8lYBYaBcsxqMUpSLrvO2k/KQAdjkAdwMs4B1j+/D1+Sr4h2aC7bUG4KUCUNHWoEjKogh9PBXzU78OsIpwignAsRXVTgRQE0RMCDWkAWC7DbvV40hIQ1FE2aIl8jxN1TSrg09766D1fK4YfDNT4W7Ahphp/iSY2/eBEoXlFReqUmXjSEtBHHzh9Qqy6cEH1XW7sSG1SADocUugVS+F3Bx6jAHTg5yzJmXpbNgo3Bwicy1pY3yK2V1SpnZM4e/W506eUwMOsIc7T3FxeoUbZZc2dSQ/ATiMFgTUiTw9BGv0N50qjj6GvIYcPj1eUlIhNsr/hHGAs8+kOwLT3KHtOloqRe+b4a/y9vEttANHdpkhE38EGNAxUsXSLgUiwv8HHLTh7VqUtoCA9zunFcW20t1mkAHQ4wusABgWgxB/J59v1tWos6DDMIQOEWaS9/ezNKgzV+Ovbmm25xp9TSXubRQpAh0OKvuZ3v/vd/zvwuDItLe2fbrjhhr+Tj/t1ty0IOgxzyABhFo23N2r8bcserfF3qFB/m2hv0kZ769YPRARkZGTMlWLv24HHd0t6JTslV+puWxB0GOaQAcIsGm1v1Phbtdsv/u6ZI3ryL+hvE+1N2mxv3fqBiAFS+H18xowZn7vqrcfDaQMdhjlkgDCLxtq71SsGF2wM1Ph7UfjO1+hvE+1NJsDeuvUD4XLQYZhDBgizaKK9PfWdYui5Vf4af48tFd6qZu1tor3JRNlbt34gxiE9Pf2UZOFU1N3OIOgwzCEDhFk0zd7eymZV2FnV+JMi0NPQqb1NtDeZSHvr1g/EOGRkZPwwGupuZxB0GOaQAcIsmmRv37katdyravwt3KSWgXW3ifYmE21v3fqBcDnoMMwhA4RZNMXe2OAxMjNQ42/VbsfX+KO9SbvsrVs/EC4HHYY5ZIAwiybYu/dggSrxomr8bT+SsjX+aG9yInvr1g+Ey0GHYQ4ZIMxiSttbCr3+LYf9O33vekH0Hj6lv020N5lke+vWD4TLQYdhDhkgzGLK2rujVwys3Bmo8TdX+ApK9bfJAUxZe5OT2lu3fiAiIC0t7dokftYfZ2Rk7JasTk9PL5E8LJ+bMdXr6DDMIQOEWUxJe7d4xOCL6/1lXh5cILwltfrb5BCmpL3JiPZOhrYg4oQUYa9J7pX8uvz1DxP5WRCAM2bM+GzY7/8lP/fYVK+jwzCHDBBmMdXs7anvEEPPrPSLv8eXCk9Vi/Y2OYmpZm9yansnUlMQFjFt2rS/lSJsZkZGRmngGLgl06dP/0AyPluKwffJz2uY6v/oMMwhA4RZTCV7ey82ieFHFvtr/D3/ivA0dmlvk9OYSvYmo7N3MrQEYQPS0tL+VQqyeZIdUhRWyt/vS+QSsXzvtfi8qf6PDsMcMkCYxVSxt6+4WozcP99f42/RZtHd5tPeJicyVexNRm/vROkHwmbceOON/ywF2VzJTsliKQJ3SvZLofZruz9Lvv+DkgXTpk37k6n+Fw7D6/V3JjK1CTvT3uYwFezdm3dejMyc7a/xtyZTeLp6tbfJqUwFe5Ox2dtu7UDYCCn6rpMC7y4sAUux1wUBOH369PcE/y6f+wfJPjs/M7DkXHTNNdf8RTT/LwiCIByIN44XKeEHvn4oX1y5ckV3kwjCUbBTOxA2Q4qxV6UY2zNjxoyvyF//YKL/kX9/2a7PC4jNYiky/yra16ATccRoBjlDYBZda+/uftG/+dBojb8jp/W3yQV0rb3JuO1tl3YgEgDMACbrs6Twe6cUnFckL0meD5SCOTXV6+Aw0Jl05zOQyckZob3NoSvt3dEjBlbs8Iu/e+cKX2G5/ja5hK60N2nJ3snQFkQKgw7DHDJAmEXX2bvZIwbnrfOXeZm1QHgv1Olvk4voOnuTlu2tWz8QLgcdhjlkgDCLbrK3p65DDD29wi/+nlgmPDWt2tvkNrrJ3qQ99tatHwiXgw7DHDJAmEW32Ntb0SiGHw7U+HthtfA0XdbeJjfSLfYm7bO3bv1AuBx0GOaQAcIsusHevqLK0Rp/S7awxl+K25u019669QMxBdLS0n6akZFxVLIMv6enp39CPne77nYFQYdhDhkgzKLT7d1zrFiM3O2v8de/bp/o7urT3iY30+n2Ju23t279QESAFHqPSsF3Tv78XrDe34wZM9LwnO62BUGHYQ4ZIMyiY+19uV/07s0L1fjr231MPae9XS6nY+1NJszeuvUDEQFS6DXjPODA497A01eHPdYOOgxzyABhFh1p764+0b/hoL/My92zRU9Okf42pQgdaW8yofbWrR+ICMDpH/LHH+JxRkZGD36+4x3v+FP5uF1rw8JAh2EOGSDMouPs3d4jBpZtG63xd7pCf5tSiI6zN5lwe+vWD0QESKG3RYrAJwKPlQCUvz+Ulpa2Vm/LRkGHYQ4ZIMyio+zd3C0G5671l3l5aKHwltXrb1OK0VH2JpNib936gYgAnAQiBd8ZzPhJviHZgN9nzJjxN7rbFgQdhjlkgDCLTrG351K7GHpqub/My5PLhae2Tfu9SUU6xd5k8uytWz8QU+NqKfw+mJaW9k0p/j4kf3+b7gaFgw7DHDJAmEUn2Ntb3iCGH1rkF39z1ojupm7t9yVV6QR7k8m1t279QLgcdBjmkAHCLOq2t+/MRTFy3zwl/gZe2qZyAHXfk1SmbnuTybe3bv1AREBaWto/pqenH5bslhwJ8FX81N22IOgwzCEDhFnUae+eo2dHa/yt388afylub1KPvXXrByICMjIySqXYWyCF4Efk4/8vnLrbFgQdhjlkgDCLWux9uV/07Tk+WuMvM481/lLZ3qRWe+vWD0QESPHXL39crbsdkUCHYQ4ZIMxi0u2NGn/r9o/W+Mst1n4PTCK/32aRAtDhQLkXKQJv1d2OSKDDMIcMEGYxqfZu94mBpVv94u++ecJ3plL79ZtGfr/NIgWgwzFt2rS/zsjIqJY8KIXgK+HU3bYg6DDMIQOEWUyWvT1Nl8XQ7DX+Gn8PL1I7f3Vfu4nk99ssUgA6HFLo7ZDirwZ5gPLns+HU3bYg6DDMIQOEWUyGvT01bWL4yWX+Mi9PrVA1/3Rft6nk99ssUgA6HFLoDb373e/+37rbEQl0GDazq0/NgPQePqXyoQYXbVJFcHH6AZbGRu6ZK4YfXCCGH1+qTkYYWLVb9O05JnxFlaK71ZvQtnV194mqHp9YW1omHinIF784elh87eAecdvebeKmPVvEx3dvFrfKx18+sEv86MhB8eDJPLHk3DmRU9sgWjpZwsORbO8R3vO1ovfASdG/OlMMvrhB9q2XxPCsBf4SLJLDsxaK4SeWyb+tF/1r94re/fnqNd0dvZY+21tar/o1xN/gvHXqtI/wv6PPHLvUKFaUlKi+9J85WbJv7VZ97JOB/nbb3u3iqwd3q7+hT66U/5tf3yw6uGs4ZiZFALZ4lK/CRp+Bl3cpuw8/tlT5NBzvB2IWGD5vcOEm0b/hgOjNKvTPCtOmtttbt34gIiA9Pf3ctGnT/lZ3OyKBAtAGSuGGhPeBFTvEyP3zQzsgJ+LIXS9E/BuK5fbtzROe6hbb2/nTnEPigzs3TMoPR/zbRiUKl58vEWUtnfrvucH0NHSJ3kOFcnCxWYzMnBOxv70aqb/J12KAgsGKpyE2m/pOVahgr2r8LdsuxaR/gFDZelmsulAqfpl7WHx016aI/e1DEf4Gcfjr3GyxoaxcXGr3aL/nbmCiBCB8EQQfBqyR/JfqU5H+Jn3jwPLtoudYsRKSuu+X20kB6HBIATgzIyPjrOQP0tLSbgun7rYFQQEYJy/3C9/5GjHwyp5QIAw6wKHnVon+dftE75Ezwldc7T/6qs3nL4cBymDpaexSMyg9eedF344cMbhgY6hobpBwuD05RSrB3o42P154Uvw495B4TP7cUFYhci81ioqWLjVT0yXbdVmytbNX1LR1i4L6FrG9olLMKTqjhCMCcniA/rEUg/h7e5e1WSQySnb1CV9BqdpoER6Esdt2aM5a0b/pkBqEYGbPU9+pZgY93f3iypUrwtPhU8/hb6jP1785Sw00RmbOHjP4GFyyRX3GVDM16JPBNvRvPCg6ZH/edbFa/EoKtvBBxL9JAfiTI4fEs6dPiW2yr+TXNYuq1m7RJvtMsL81y74H0Xhc9sVN5RXi6dOF4nvZ+8VHdm0cM/i443iOyKqpU6/TbguH0lYBKH0O7IwZvjEiTvoo+Kq+7Uek7yqRPqxO+TI1mxz0b3JAjFQA39kq0Zt9Wq2EDD2zcow4HLlnjlr9gA9lmaD47a1bPxARIIVf4yRs0N22ICgAY6R0Vj0nS8XQ86+8JXjCYSpnGO97S/GF3ZP96w+oJbzg+2N5BcvEVkfNVgIEhN6h6jrxcEG++HTmtlBwxnIelombOrhEnBDKwNp7+LRa1h0NnnPFwMu7RU/+hYhpA1PaWw5K8B54r/BBDD4LgfstS8So8bcrN/R/XXuPi1dKLogv7N8Z6g+f3LNZLffurapR4i7e60Z/2nmxStydlztm8PGVg7vFRjl44RJxHPaOhtLH9O0+pnxOuP/BUq7a2W0hbQCbhZSolL4yWCRc5Y6+sFr5VArB2O2tWz8Qp7OjdAAAIABJREFULgcFYJTEjF9BqRrJhhzjY0tFX+bxmJfPoqIUgwjOGG2HL6H07Tzqn02M02HYYW+IQcz+YRYwGJhvydwqFhcXM1fQLkqBg6XZ4YcXjwbK51YpMRjtQCAme0shCdGHzwj170cWqzaoGUHU+Fu717/kO3O2WHPoiModDdr/u4f3qxm8RNi/scOnlpW/cSgz9HlfPLBLzWJ3UjTEZ+/xlD4FviU8hQW+p+dEieVc0QnbKgfKSHWBDw31b+lb1Qw0bRq1vXXrByIK3HDDDTdOnz79Y9MkdLdlPCgApyYSmJFcH3JUTy1XS2kQaUn5/NI6MbBs22hglqJALQ3H6CgTkSOEZT3kagUD87/v3yl2XKxSy3u67eZW+k5fFENPrxiTCoCcu6TYGwOdU+XqM0P9XbZlaPZqtYSX8+wS8bXM7SF7Y/NGdk19UuyNz9hfVavEZvDzv5W1V6Uy6LaZExivveFLwgca8DVIT0lKuzHQlZ8/9OTy0f4ufa23gjaNxt669QMRAVL4/V1GRka+5OuSnYGfJ9/1rne9Q3fbgqAAjEA5KkaO00i48ILw07T89BYhOnuN8FY2xeQwEmXvk/XN4idhm0wwO3iuiSVBYiFmksOFvpoROXMx/vezaG8lRJ8aDcxFj70oPrt5rbLvtw/vU7vDddynoBD8+sE9of52z4ljKndVtw219p8Y7e292BSq3+if8dugr4aj9KnwrUEhirQa+N54VztMIAWgw5Genr5Lcum111775/gdP6UAXCK5R3fbgqAAnJgIvMHlCSQsW1l6tZVqKbpMlfUIbgJAXlY0s5GJLhOBwIzNAP8eyAnDLtCl586JzsvM15rKpmpjxQPzQzlXaqnX4kDDqr091a1iUH4HCh+bLzrv8edseeTPgl1ZossBOXjIA0TZmJv3bFH9DbmpSE0wdfY5antLX6GWewN5ePAl8CmOWHrFUvSOHOVzg2k2PFVmcnvr1g9EBEih50lLS/vj8OemTZv2J/J5r642jQcF4Dhi1m/N3tFR8bx1wlNlf0kWy2zvEX1bs0O7MTFb5L0YedkkWYVikQeGnZ8fDssP42zgJDZp6FT10kLLby/vUsnytry3BXt7L1wSTY8tEj9ftcq/2WfLWnF23mh+INqckNzXOFjb5hF35eWGZgOxYxjP6W5X0vtSFPbG0mowjxm+o29btvIlutv+lmuRPjd8BzJ8siMG4A4iBaDDkZ6eXj99+vT08OfwO3cBO5NY/ggueaHcQW/WKWeMiiO1uaw+lLiPum6oDzdZm5N9UsCJuiZVaDpY1w27N02dnZmIyLUL7vbGhgtfYbmt7x+vvdGOrGcXi1u2rPNvuNi/UxyprQ/9DW0NzlTa3WYrxOzzrYGNKZ/Zu13lJupuUzIZ0d7ye4eCzMG6kfAZ8B262xyRwTYHymMhT5DHDI61t279QESAFID3QuzJn79JS0v7In5CFMrH9+luWxAUgAN+R3MozDnOXuOv3ae7XdGys1f0bzk8Oou0dKvobnprPpSOo6JQ8+2pU4VjcrWaOgwfycNem7NG7bV8e0IK48Zj787DheLJJctD9rp3InvJtg4s3zE6O4NcrQTsFI2HKBr9m2M5oULTc4vOGJOCMKm9m7vFwEujuaXwFcnawGbLdUlfHMxVRO1KnHrj9IF5suytWz8QU0AKvh9JHpGsDPz8kXz6at3tCsJ4AdjqDSXeY7OHWhJxkXMMJ5L2g0dzIXdm/Ahf51mh+6pqVakYBGYcNXemsVX7/dJBFMgN1pBEnpPK9UtQMIvJ3rIN1TuyxHfWvuKv57dzo9haEWEDCgZN2adVTUL/oGm18NR1aL+/IGaZXy65oApR41pwgk21ARtEJrK3Oq7v0SV+nzBrofQRFdrbGReRtyh980j4oCnBR2c6nRSAhGWYLACR5B4stwHhZGXHpVOI+lrB2oEQGGrXcpjD0GlvnPgQrB2IJWEs2em+X8kkToUJLvmi302Vs2m5L8SwKeDYup3i04El32/t2SFKm6PL78Mu9NB3CAKj2Dk2LWxoUWcP45o+u2+HKlmku03JtDe++8HNFPAJOEJQdxutEucQh3+HEnFkpltIAehwpKWl3T5t2rS/x+Pp06dnpKen52VkZOTise62BWGqAFRnmQZ2XarZi3pnJLTbwq4+0bd1dEm4f8NBFeR1C0AQOzfDl4TnqCW6FF/OCaYYBHZdqtmLJCS0R2Pvy61esXL1RvHhHev9S75ZB2Mv5hw+i363s5boUET6v44dCR1NhzxU3W1KuL0v96mjAYPff7Wq4YBd27ZdZ12HOj0kWBzfSXmoyba3bv1ARIAUfHU33njjdYHH+yQXSFH4tBSBObrbFoRuQZB04jirzLzRpYTVmaGD7FONOKszeMTX4Pz1wtPSrV0ABrm5vEKViUFgxhmyDamaF9jRK/rXZI6mGOw5njRxNJUAbK9vF/et8df1gwBcmV8Q/yYd9b06Hvpe9eN75ZBUCpwfPK+oKDToeKKwICWPkoOdrwyNhGqF4ruPs8Z1tyshlD57zPdK+nSnDDqSaW/d+oGIACn0BvATpV+k+OvHT/nr2+XzPZqbFoJTBEFSKAPSwCt7QiUQeg8WpLzTwDJj8BzZ4SeXiTe7exxjbxSP/ty+HSoo45iv8hb3L1GNYXN3qJSFjpmKSAKwvrxe/GTdGn+Jl63rRc4Fe9IfkGMWPE4MQqS72TnlWPZUVotPBM4V/sXRw2p2UHeb7KS3plW89vTy0RzgVN8xq3YJnwrNrEMQOmXQkQxSADocUvS1zJgxI00Kvq/Kx8fxHOoCQgxqbloIxgjAFs/oyPiBF4XvbJX+NiXLUTRdHj3aa9YC4TvnnDwtnN7wvWz/0V637d0u8utTI0/LU9MWOt4KhXY9Vcm/rskEYPmZMvG1jf6Zv69v2SDKau1tm7eyWQ46loZKd3hqnLPhp6ixLVSo/Jty0FGRIoMO7/laMfJgIDdODjomqgKQqkReoFMHHYkkBaDDIYXeTMlhUAq/b+C56dOn3yJ/P627bUGYIADVzstgoroMTF4NwVg7O3pUkeFgnlb45hDdRM7ZncePhjaH7Kms0d4mK0QRZWyIUMF4zlrbCjtHy/auXnG0tkEsKi4Wmy9ViYM1l0JLngW5p8Stgc0eP9mySdS3JKZtuGZce6he4Hnn2BSDjuB5wqgXWFjv7o0EPSdKQps9frd+r/AYNAsW5JhBx1PL1QBMd5sSTQpAFwAbPiSmh/8u+Z5EfFZgtrFAskaKzDOS/zDVa1JdAKIUyvDDi/yO4YXVapes7jZpcxjd/eKNrJOjyeE7chyzBI48refOnArVb1t2/rwri0b3nCwNlUZBrbxkn7KAna7BGa5w4tzchXv3i49t82/2uGf7dtEW62aPWIlBx4qdofptPceKtdsnSAw6cGJIcNCxt8o5AjVqYgl0f/5o3uX2I+LKm1dS2p9Hon/QsSY06MCsqO42JfR6KQCJcEjhdzQtLe37eCzF39fl70VTvSaVBSByroKbIFRxZMOPEgouCfYeL1YB2X/02G7HFPEF15aWiQ/v3KgC82OFJ11VxBe7X0PBGMV2kyxgcVrHv+3a+BbxF2Jgp++czH1KcCelXdgcIgcaoUHH7mOOGXRg9/kzpwtDg46VJRe0tylqdvWJ/g0HRvOZD592xC5/7Rwz6JijNsJpb1OCSAFIhCCF37VS9PXJh28LPicFYGf47ONESFWH0Xv4VOicXHVSQQru+ovHYQTt7TtXo3IhgzuEnZQ3c6imTnxyzxYVmH+dmy2aEz1TZZUIxrKPhYIxjuNLchuwxPv1wLF7UxGiJ2kCMEBVky6YrO+gHcLg6guloXOrnzxV4PyyRHIgiwFt8MhKHCmI5ykAA8SgY/uR0KCjd29q7hCmACRCkALwvVLsVYU/h2Vg+fxNkV6Xcg4DX/6t2aHyAFgi0d4mh3B8gMCB68Edwv5kfefkzeCkkM8Hdgh/O2ufqGp1aFJ7uy90zBZmm30FZVracaD6UlTiL8i783JVrmAy2zgmWX/BxoQcf2fl/gV3CGNpOOZaiEkiUliCNfCGH148ZqcvBeBY9h45MzoJsG5fyk0CUAASIUwkALEEHI0A9Hr9ncn1RJmXlTtHT8HIL9HfJgcRdn6LvZE3E9ghjAr7vguXtLczyKq2y+I/svaqoIy8trNNbdrbNIa4d7MDwfihRcJXVq+tLS9fuBCTAAR/mnNINHb6ktsHK5tUiRI16HhmpfDWteu3Y4CnGlrEZ/ZtV/cGO9NxrrDuNo25d1XNY+9dfcfYv0/0/TacPWcuqllSNehYvFl42pPb3xPaH7wUgEQAVpaAUwEogPraIv8RaK8+tFC82dimu0muwZXX3xC/W+uvj/jqPXPF70trdDcphKHXXxe/PenfIXxz5lZx5nKH7iYpvHnZJ157yl/m5bXnXhZXfH1a27OqqixmAaiOfTuyT3QNDyW1rVf6B8Vr8wJliR5dLN5s7Uzq50dCp7wXuCe4N185tEc0Dui1axBv1rWIVwNlXn730hZxZeQ13U1yDd5s7xavBnYIvzZntbjSN6C7SbYh4cKCcA9wzJzkD/EYZWei3QTi9hGj91KbGA6ruYaCqLrb5ERGnCHo7hf920aXzvv256vndLcZ7OruE48U5Kug/JFdG8Wm8gqt7fGVjNZcUyestOqfKTp2qTEuAQiiGHfSZ1fbfWLwpa2jJ1YUlmm/h0FiVvRnR7PUvfmUHHTg3upsz5hNW6/sEZ6u3gn/jzOAk9Pb0CGGnlvljxGPLhG+i3ptass1cQaQCEfgvOFClIEJLP/+01SvgcNAZ9KdzxAvvRfqtNZccxNh56nsjd2EobyZ9fsdkzeDkjBLzp0LiZb5Z4u0lIlRNddmzgnsoN7lmB3U7dJOt2Rui1sE3rRni8ipTfLJEQ7YPBPpfj6Qnxc6Q3h7RWXy24F85j3HR3dQ78qNuJkhmu+30Wz1isFFm0dP5jmjwaY2EnZOhq4gUhhudhi+gtLRMi/Ltie95prbGG2A8J2qCMub2eKo8jnbK6pUQEZgvi//uArUyfrs8Jpr2GXolJ2FEMILi4vjFn9BooQM7m+y2z+2fE6Wo+7ri2fPhu7PYjkASdqgA+J47d7Rwu05RVO+hgIwyvu6bl9M99WppAAkLMOtDgOzBaGZqs3OCRpOZiwBArsLhx9Z7J9ZfW6V8NR3am9/kLmXGtXSHILyf+ZkiYZ2b2I/c/xM1eHT2u9BkCj/MuvkiZCAe7zwZEggx0sdRbjHFNB22GBuc3mFSj3AvXm4ID90qkrCqGaqNo3OVBVFN1NFARglMbO6N8+RBfFjIQUgYRmucxgIxlLwhcq8HDipv00uYawBwlPXIYaefTmUN+OtaNR+DUGeb+oQXzqwSwVl1L8rT9SZrm3jyrwEaq45gY0dPvHzQK7azWFLuBDINwcEcrzUUQ9vTDrH7DWOSufIrqlX9xj35pe5h0VTR2IEqqc+LFdNDsBi+c5RAMbGnuPnw9I5nFUQP1p769YPhMvhKofR4lFb+f1lXuaqWQPtbXIR4woQ4bMRKDp7+qL26wiyts0jvp99QAXl2/ZuFwU2n+nqqW0bFcAPLVLHCuq+5iBLmzvFNw5lqmv/4v5d4lxT+5i/n21sm/BIuFiI85nbklwrUN3zp4Lndr8kPA46tzv8nqI8UWWrvQLVW3Jp9NjKOGbdKQBjp5ML4kdjb936gXA53OIwPNWto4EBI+NS5wRjtzDuABGeN4Ml0GznLIGiYO9vE3Cmq+9ctTpPVAXj51ep2VDd1xokZqOCS+DfPbxf1LRNXCQbdRS/k7Pfkgj80ZGDoj7RS+zjKYMwgrHqbzI4wxa673mQ1fJef/vwvtDu6VMNrba8rzopJTAbNbhkixp4xfoeFIDx0VMdVhD/qeVqEKK7TdHaW7d+IFwONzgMdYJAYJSGwrueBufko7mJlgIEDp4Pz5vZmu2YHcJYqnw6cKYrOK+oyNLyJQRu8NiygRU71Gkfuq8RRF7eypKS0LFl2ATTGuFINdh58PXfhUqaxEsssVckaol9MqKo+6rdgTNdZ6tTHXTf/yBxNOF/HTui7s3Hdm8SW8otzIpjcLXl8Oj3ysLmIgrA+KmKus9Z459gkAM/3xnnrHREsrdu/UC4HI52GAHREdzsgYDQnaDcGxNoR4DA4eqhmYoFGx2Vp7WutExthEBg/lVuduwzV7JvBWc6VTDefcwxyeEQesGyJBCAy8+XTLlRI2jvjst94p4TxyyJwM/u2y5O2zTbFTWRrL/zaMge/WsyHfP975T39Pkzp0P354nCgph3pOO7E0qvQErL8fOW2kQBaJHtPaMnScmYgxI8Tvn+T2Zv3fqBcDkc6zCau9VSSGjZcd8JR38Z3UC7AoRK1n90yehy/Pla7dcWZH5ds1qaU7lxB3ZFLVo8Na2h5HvkOvbkX9B+LUEiv+/2QL4fln4P19TFbO8u+d15IUywxMNP7tmilp+Tff1qh3DgDGG1HO+gJbpdF6tDZwj/8MiBqM+s9p2vCe2ytyulhQLQBmLSAWWJgisAL21z1JnV4+2tWz8QLocTHYYSGIEzL5EU7St2Tg6Qm2lrgGjqHi2qKp0lauQ5RaAjJw7n3CIof3TXJrHqQmnE2TKIvZDAePZl4amydzOJFWJ5MSgwkHuGzR9W7I178SELIhDlULZWJH95DHlaOP82mBfoJIFe3Nguvnpwt7o/n87cJvZXRRgQBUqQBFc1MANo1yw6BaB9VDnADy0MbUbCBh3dbZrI3rr1A+FyOMphdPWpaffg6GtwwQbhaUxy7lEK0/YAgWC2KzdUxFctCdc7Y7PE+CW6X+dmv3WzRKtX9K/dN3aJ0SH155o6fOLBk3njlhhj25E7mb33VFar3DUrs4FLklkUOUiU5Hl596i9Vmc6pkg5SvLclZcbuj+ox4gNSmPsUd85OmhKwBIjBaC9VPaat27UXkgJcUjec9DeuvUD4XI4xWGg3AM2eIS+bDuPOurLlgpMVIDwna0KLQmr2Zk8a7lMdhJLlshfQ1C+be82sS8wO4NZ5eHAAfFqyddBJwJgiTdYbgS153ZXxjcDHsnex8OKacdLiJxk1wqEYOrJLQ7N2KrZGYekIEAQbyyrCM3YokzPyfrm0TY/EGjzw4sTsqpBAZgAqkmJY6MztnPXOmaFgAKQsAztDqOzV+X3jdzj31gw9ORyR063pwITGiBaPGNmZ5A747nUbv/nxMG6dm+oVMxNW9eJo4tWj85ayhG+U3LKcKLJIwX5IYGF3btWdt9OZW/kFn7BYq3AO+R9jbQTOVGEzUKzM5gNXLffMblaJc0dqjwP7s8XNq0V5XNeHv1e4Pzo5ujyBO22Nxk/vRcuhUrFYBOcmg3U0O/H21u3fiBcDp0OAzNHQ0+vGF3S2XTIMUtwqchkBAjM/g3PWhA6OaMvM0+7owQvy5F8/p7Dov0+/0Cj/67nRcHGTNHhgLZhg8aGsnKVPwbRgBmkNaVllpdYo7E36tp9K2uvJRH4g+wDSmQn/d5Jm/oHj3NDxbp7jp9zRC5qe7tPnFi7Q/Tc7Z856rx3jig8cCyhy+YUgAlmm0/FqOBsIGKXzhqVFICEZehwGN7KJnXeZ1D4YfelU5ZxUplJCxDN3aqcSnCWbfjJZf5lYU2BGcttWLoJ9rey55aJr25Yo8TL1w7uEZmVNcnPZ+v2LxliiTo4WwT+5liObcfaRWtv5Bv+4uhhSyIQmyDKWvTU51SzgYETgoLHyGnbOIbl3hMlqs8H23N07gpx65a16j6hsDZ2qifkPlAAJoXe0rpQxQA1q7t0q/BqOLGGApCwhKE7nr7l98UXhaczObNuyPNDLb/gCAp5PL0HC5jrl0SHkcwAgaV8lO0IF/rq+L5k2FsGYgwqBhduCn0+8hTV7lH5tyO19WNmvnCkHE4R6UqCEITwO1rbIH4S2KkMfvnAbnGg2t7Uh1js3SFtcn/+cUsiEMfxFdp8HF8s9lbCK1A9wL/DdrNfCCZD3OPzZd8OHh3oL1nzivoOwN5bKyrHHM0HoZ9X16TN3qRFInUJ5WICBxQgpg28skd4LybpvPQO+fnHzwnEcN06gnApRv7n+RbVeR9cIPq25yRmB6d0fr7C8lDB09DS4LZsV527mArUEiAQGLEsHDYjglwaVTYmETlb0jHiWC0E39DnzVqonPX4w967VGC+OCYwY0YQy68NHfbvLkWu3IayCvHtrH2hz/vsvh1i9YXSmHf4JsLeECpzi85YEoFYvj5UHV2dwoSwwx+Yg2kIQSHWc6w4MUWkpQ9DXw7mhwXzmCdaiob9l547pzb2BO8XZgR3XKyy5cxlCkANlD4MpyIFi+OrgcfiLcJ3qjwhA10cSYnTYkJpNnc+16xbRxAuxcidz3z0d0tHl06wZDf44gZ1FJYlMSgdHQqdIl8iWOzUv0N0vjr2iKVd9FBrgJDOEDttw2dI4DSxWUQtD1sZDLT7lMMdWJ0Z2h0anPHDSTJTlQrBCQ6byyvUrs1gYEb9wLvzclWh3wYL+W0oBYKdx/eeOKYKKQffH5svcKxbIjdQxGtvCOAPWxCBH965UWyS91Nrf2/1+oVZYHd6cMUBpX4wILV0vJ8M+j3HzomBZdtCm9eCOWEYfEwV+LHk/tL586Hd6eDNmVvFowX54mD1pbj7BAWgPnoaupQwC+709uekLlQxUOUJWvie4+jT3sOnVFm04OqZ6m84L/u3z31Mt44gXAw4DN/FRuUYUQ4j2Ln8B2OvEP1r96plWmzY8FS3+g8px8gWlJ0andNb3qCOCOvbkaNycd7yPjLo9x4+7ZiaXabSEQECM8KyL6ngOXP2aHCWjg0zNf0bDqoBCJZv1e7c8E1BHb1qBIwcHJTV6Nt6WAxKJzjmfTCIkc9hOTDWEThmBLEMe+fxo6Ej5fyCxr9E/OSpAlXmA0t32J2LWZvgkjGCdmXrZVX2Y3P5RVWDELM7498HuXZYak5G+RQr9oZo/XignEm8XFhcrCW3cgwx8Dh+Xg1sR8J8EvoM+kn/liwl5rDLUw16EaiD/k36K+xkx2AWfbJ/40GV0hAehFGzdGD5jriWmjHri0Lf/5kz9qxm1GjEDnCc3ILZQfQpnDDSHuhvuKdNHT2qD+ZeahTrSstV30Qffb7kDAWgTmLgcahQDL2wekwMxOADM4OIkUhD8ZbV+ydCwvubHFh4atqUf8R7IPZiNnnM+8jYivxqLDUzB5CwjDEBQgZbBM6BlbvUsll4x4uFKpjLLwBq+elIjiUnpiMEYDgxk3LkjDryb/ygIab+NnOODPDr1YyPXWkM2NW6trRMlTn55J7IQijSyRoI5gjwWOZ9SyFqh9v7hBS6wZ3J8RJlbVCUW3tf6/Yvn2HXsJpJCRs0TNinIv1N9lX0WVU70qY0Fmz8WXb+vOor4YOGWPvbL/OynfP9NpyIfRB8qG8bqT9NRcRixGSVvxw2IKYAJCxj0gCBJPqKRuXkMI2NHD4k8aPUAkYzcIL4idwX7LpDB0Vle19BmWPqcZFj6TgBGM6uPuEtqRW9WYWqphtmbLCkNvzgAn9/Ax94UY2IUf8Ny70QfL6iyoSXDsISMWb9IOIeKjihZme+fnCPEkc37dmiZsrwGPmDPz5yUP3PipISNTuTiNy+ZNq7pKlDnalsRQT+17EjbzkVQzvbfP6ZFtmHsDENs4HIUw31t3vnKl+HPojBRf/6/WolBMdUJnoTE2b3cmoblCC8L/+4Otbwy9IGt2RuVWkE6G9YPkbKAvoiTolB3yxsaBFvvPmmM7/fprO5W6WpoKj0wIqdqioBCtHDp4X628OL1WoZYm3/5izRKwfH3srmSWeWKQAJy3CsICBtp6MFIOlYe2Pm8juH91kSgd/L3i8utXFg6AZ7k+4gBSBhGXQY5pABwizaae/mzh7xq9xsSyIQpW5Km/XUCjSB/H6bRQpAwjLoMMwhA4RZtNveqBU46+QJSyLw1r3b/OfjOuD+pBr5/TaLFICEZdBhmEMGCLOYCHtjB+r8s0WWRCBy2Owuek3y+20aKQAJy6DDMIcMEGYxkfZeX1au6v3FKwLxWpx/rPsepRL5/TaLFICEZdBhmEMGCLOYaHtjFs9qrUDMJmqvFZgi5PfbLFIAEpZBh2EOGSDMYjLsjXw+5PVZEYHIK+zgeeCusDfpHFIAEpZBh2EOGSDMYrLsjZ292OFrRQRih3Gz02oFuoz8fptFCkDCMugwzCEDhFlMpr1R4w+1/qyIQNQaTPZpKalEfr/NIgUgYRl0GOaQAcIsJtveOO0Dp35YEYFfOrBLnT6i+965kfx+m0UKQMIy6DDMIQOEWdRhb5z7i/N/rYhAHKuHc4h13z+3kd9vs0gBSFgGHYY5ZIAwi7rsjV29C4uLLdcK3FdVq/0euon8fptFCkDCMugwzCEDhFnUbe9N5RUWawVuEGtLy7TfR7dQt73J5Ntbt34gXA46DHPIAGEWnWDvQzV14hMWawXOLTrDWoEusTeZXHvr1g+Ey0GHYQ4ZIMyiU+xdWN8ibtu73ZIIfCA/j7UCXWJvMnn21q0fCJeDDsMcMkCYRSfZu6ylU3z1oLVagb84elg0dbBWoBvsTSbH3rr1A+EApKen/0ayPCMjo1T+vJCWlvbdaF9Lh2EOGSDMotPsfandI36QfcCSCPx21j5RzVqBrrA3mXh7J1JXEC7BjBkzbr7mmmv+Ao+l+LteCkHPDTfccGM0r6XDMIcMEGbRifZu7ewVdxzPsSQCv7B/pzjX1K79WpxGJ9qbTKy9E6ssCFcCs4GSn4jmf+kwzCEDhFl0qr07L/eLxwtPWhKBt2RuFccvNWq/FifRqfYmE2fvRGsJwmXIyMj4tBR/rddff/3/iub/6TDMIQOEWXSyvbGrd8m5c5ZE4Md2bxJ7Kmu0X4tT6GR7k4mxd6L1BOEASEFXKNkdTixID/rBAAAgAElEQVTzBn6+M/h/06dPf498riUtLe0j0b43HIbX6+9MZGoTdqa9zaEb7L214qL4yK74awV+SHJ1aan263AC3WBv0l57J0ZxEK6DFH3/KMVg44wZMz4Vy+sEQRCERpy53CFuytxiaTZwcfl58eaVK7ovhSCSikTpCcJFSE9P/weIP/nz1lhfi07EEaMZ5AyBWXSTvU83torP7rNWK/De/GOi43Kf9muhvclk2TsReoJwGaTwy5YC0Cd/npcsCfyMSgzCYaAz6c5nIJOTM0J7m0O32buipUt8/eAeSyLwZ0ezRGOHT/u10N5kMuydaG1BpDjoMMwhA4RZdKO969u94kdHDloSgbdn7RVVrebVCnSjvUlr9tatHwiXgw7DHDJAmEW32rutq1f8T95RSyLw3/fvFMWNZtUKdKu9yfjtrVs/EC4HHYY5ZIAwi262N2oFPnmqwJIIvDlzq8g1qFagm+1Nxmdv3fqBcDnoMMwhA4RZdLu9UStw2fnzlkTgv+3aJHZdrNZ+LbQ3mQh769YPhMtBh2EOGSDMYqrYe3tFpRRy1moFriwp0X4dtDdpt7116wfC5aDDMIcMEGYxleydU9sgbtpjrVbgs6dPia7L/dqvhfYm7bK3bv1AuBx0GOaQAcIsppq9ixrbxOf27bAkAmeeOCbau3q1XwvtTdphb936gXA56DDMIQOEWUxFe19svSy+cSjTkgj8ac4h0ZCCtQJT0d5kZHvr1g+Ey0GHYQ4ZIMxiqtob4u0nUsRZEYHflCISYlL3tdDepBV769YPhMtBh2EOGSDMYirbG8u4d+flWhKBWE7GsrLua6G9yXjtrVs/EC4HHYY5ZIAwi6lub2zowMYOKyIQG0uwwUT3tdDeZDz21q0fCJeDDsMcMkCYRVPsjRIvH7JYK3B7RZX266C9yVjtrVs/EC4HHYY5ZIAwiybZG8WeIeSszAai6PRlF5eJMcneJAUgYQPoMMxhKEA0XxbeklrRk3de9O47Ifp2HhV927JF/+Ys0bc9Rz3Xc+SM8J2tEp76TtHt4qBoMh0hCGTf8dR1CF9xtejJLRZ9e/NE344c0bc10N9k3+s9cFL0HD0rvOdrRXdTd9yfhWPfcPybFRH41KlCdQydbtu51t66if5W0yp8RZWiJ6dI9O05Ntrftsj+titX9B4sED3HzglvaZ3obvXqb7MFe+vWD4TLYbzDSHVKh+itaha9+/PF4LJt4tUnXhKv/s/zMXHkvnlicMFG5TwRyLu7+vRfFzkltQgC9DcZWNFXBhdtFsOzFsTc3/CagaVb1UDEW1of0wDkbGOb+Pf9Oy2JwDuPHxVtLqwVaKQA7OxVA1UIvMH568XI/fNj72+PLhEDK3eK3qxTwlPVov+aYrC3bv1AuBzGOQxD6K1sUiPe4ceXxuwQp3SYD8oA/coe4TtVTjHoYCZNEED0na8V/Wv3SvG20P7+JgN0/8aD/hnCKMRgZetlcXvWXksi8MdHDor6dnfNDhkjAKXP8RWWi4HlO9Tg1O7+NvT0CjVriIGz9mudwt669QPhchjhMExhR4/ozT4thl5YbbtTnDQ4P7ZULbN4Grv0Xz85hgkXBM0e0ZeZJ4afXJa0/jb07Mui9/Ap0d0WuZBzY4dP/OxoliUR+PWDe0RFi3v6daoLQM+ldjmoPSyGH7J/kDEZB19cL3pOlKiZRt3XP5G9desHwuVIZYdhDFu9onevDMQPLUqaYxzPkbtni/51+5ST1n4/SMVECQJPQ6eaXU7E7EvU/e3++WqWBiJ0sna2d/WJe08csyQCP7tvuzjd0KrdljrtrZtYzcCKA3yMrv42/MhilTuIQbbu+xFub936gXA5UtFhGEPM+EnhN/JA7HkvCReCdR3674/htF0QSLGFjRsjM/UF4kmF4CTJ/KgV+MKZ05ZE4Cf3bBHZNfXa7Zl0e+u+nto2lZunu4+9RQgeKnTEjCAFIGEZqeQwjKEMaj3Hz6vlV90OcdLAfO9ctTTspBGzabRNEMhgh01EIw+8qL1fTRqYH1qodn1OliP4yoVSS7UCP7Jro9hacVG7TZNib91s8ailXicNNMZz6KnlwndGb3+gACQsIyUchkH0VLeq3W66HWDUgfnxl4SvoEz7fTORdggCbLwYemqF9n4UdWB+YbV/5/AE17KnskZ8bLe1WoFLzp1zbK1A1wtADGxPlCQ1x88qB17apmYqddlbt34gXA5XOwyT2NWnaqiN3DNHu9OLy1Gu2i26m+Ov8UbGTkuCoNUr+tcfECMO6DuxcuSuF0Tf9iOiu+Oty3THLzWKWyzWCny88KQjawW6WQAiZQSlf3T3nbj6233z/BuTktwnKAAJy3CrwzCJSIIeen6Vdkdnldik4iso1X4/TWG8ggBFdJHrpLu/WCXKeahiv+Ou71xTu/iCxVqBdxzPEa0OyAOzw95aiVm/nCKtG4rsImqlJnMTHAUgES+uHvntMx8a+e2zd79RWCJ6ii7ytAcnUtoExUndOus3GftXZ05ZxoO0zpgFgRQ0OBHGjbN+k1HNBu4+9pZ6ldVt3eLbWfssicAfZB8QdQ6qFeg6AdjiEQMrnLXJw3J/k0K251hx0uytW0gQLsPwHc++79U7n6sf33GHnlslfKedneRsFJu7VX5JIp0VikQPLtiglmexc7d/wwFVbmFwyRY1e5LIJGw1O3OxSf99TmHGIgg8NW0JrR8JIYbE+cGFm1Qf61+3X/Sv3y8GXt6tnkOuKP4nUZ+Pfu5pGFvTr6mjR/zi6GFLIvCrB3eLspZO7baO1d66iaMoE7mJbWTmHFUzEr4MA070NfS5gZW7xOCLGxI+w42i6N3tid0ARwFIxITBO5+9SYq/4UgdV5VU4OkOep1jaZ06/cBupzT85HLxemauf8a3ZfL6aSF29kpHfUnlHg7OXWv7zNDIPXNV4WrOPieG0QoCJN4n5EQFKShx1q/vfI0MhlHM+Lb51PIzzqMeemal/f1/1kLhO1M55jM7pK+7P/+4JRF4297torBB/xFirhCA8ruucpltFvt4P4h87Fb3ljdEV6ZFDrKxQQ2nzCTC36IPJ/I0EQpAImo8dtVjb3v1zufLo+m4GJFbOZSdjJ8qH2amfUu+COwY+Xov1AlPd7+lAOGp71BnvNo9elaj5QkS9klrnFIQYGPRtmx7RdbDi9QGDE+1dUHkrWwW/ZsO2VrnUi0JSwESPujArt65RWcs1grcLA7VvDXf0FH21k0p8AdW7LBXZD21XJ0ZPX52N2YGjjPEaoit/vfeuaIn73zC7K1bVxAuwfAdz3w+Jkf+2FLhLXN+8dOUoRyxYpnCtkA8a4Ho23N8zEyfbQFCCgc4NSzj2ubI56y17sTJMYxo72aPGFy02b7+9sQy0XvkTGKEfLtPncJg58ADBYbHz0quLS0TH7ZYK3BTeYUz7a27LyLFwMZZ3aHZa/wbyhKweuBpuqxWwlBk3K72ql3pNreVApCIGiN3PvebWDstlujUOYgOcCCpTAgfLLHa4Wgw46eS3idYcrM9QGAHX16Jyt+yRUTIAI+ZSt32SBVOZm/kXtpms4cW+YVfMtJGcPINhOCDC+wREc+tesuuzX1VteLjuzdbmg1cWFyspVagUwUgcsvtKiKOQafvVHly0kaau5Vws2tGEGVuJjuxJl5769YVhEvw6p3Pz4p79AJBwTythNBb0Whb/gmSnSPNoiUsQMjAjNlGLHdYvQY4256jZ7XbJRU4kb19heW25PvhyD/k6mnZzS0DMzYs2ZFHhply37nqMe9/oq5JfDpzmyUR+EhBvui8nNxcaicKQAh2O+yENABVa09Dfro6ks6mDXkQsJ4ae86WpgAkosbgHU/fbGn08vJu5mn9/+2dCZBU13WGg+TILjmR44oknJFZhlnKiaOknFSsJCVZLid2yqk4LpUtV+yyZVW2KjtawEJeJNnaYTBICKEFhBZ2hMQqBGLfBAgEI8QiFrFvw2imZx8YEGZezn/n9bgZZpjuPvf1fcv/Vf3V23vd7/V5795zt3Msq27jTiuVscm2sXl3VgVGkBUEgrli/qiNghKLB9joUNqji70blmy0Uhm3jppoYlO6Pj9MUcFKT7VzMXTkRaE7th6u8r61cI7KCbxj1TLv6MnCpUIMlQMo9y7yRtsoC5rHzwrF9BA0nk79Wj8NAb2hdZV7rdjbtV9BIsKqrz70idODK6p0Bf8kr/aQ+xsxDkJrVlsZY1UuCtmsVljWFKiCwLDwsk1W5s+Y7CEhC7YbJXXau6bJymIPxKNsWLguXFECELsQ87Xu0Ycs6jrSsfd4jfeDJbpYgT9c+qa373gWK+5t2tu1A3ii3mse97raHli1Xb8uZIHjEbvw5Xn6ewkjHat1i0PoAJKcaBsy7Ka2IRVnVTclFoeEoPUfWaFl/Kq+ZYzVlgiZkWuBUagKwvQGWpjXiLzHWLDg3G4RFOzcfu6cWfCgtYMJaRHiuI3oDcRCFO15miDlGY2OIyfrvZ+sXKpyAr+9cK637UjwsQLD4ABiAQV6iNX3/dPTQ93ZgAUoNuY1Ns5fk/dIBx1AkjOn7xp+S2+xAHttvfxydM7OB9VseupszCVBcFMUtPkUGAWtIBBmBJOotc7HY+OdJVyPsmqP1nhnxk7TO0VTFgYe1NaKjqVMoF/1/TVm2gWr5xEr8P51a1VO4NffeM1bdyC4mHDG3o4dQIT+0Trh6MlFWJcoTP/AAiIbzi6C8OfTq04HkORF6x0V17cNqdinvVERs871TRgVmZbxSF2mBQwZN7yhazG6qCAQfBeT7TXnjuEgBKV2bceoCGE3EPhbdb0hrdXb7zs/l5yE9ImYgqBcuWkm62esEMaq3tGb31U5gVhdvHBPcNewSwcQMfS0q7MjGQUAUxBmLlE7gS3PzMh5QRUdQJI39f9b8ZnTgyvmaS9csxIwAq01lzItY2XYDTNxeJMuVZ/LCsK0lite0v0HCEsUtjlBIRQqUTjMqsr4kXGRnuphsuko4wYixE3XWKhTtu/w/n72tLydQOw7Vb4jiHN2dX+bTDJKh7vlycmhHvLt9T+Qckm7oM+EJTqQ/VQBOoDkAkpKSq4tKyurFs3JZntkBzm3bIO69YJhF4QCcX0ThlEm56WyZWwKBgtDoK6HiMwQuHI+GoaTzUKEENg2jDIV0b26cDwtz7yaXarAkMtGfE2ENsLqz8zvRS+eNlbgU5s3W48VWPD7G72tC9aqp3g0TV0Ui8VeqQ8OqRv6CAmW7VxbOoDkAuD4lZeXT8jWAQQoMDDMo640pKDNZ15anNVRGetaxs0vXJyxIF85dwChdKWhXAGNFGHseb5QJuaasjIOImOBUyHDzqQFOicQUy8Qgy7jezGfD/P6NE7g1O12s4YU9P6ubjSxGFX/69AYTiM6XOO1PDVV979kOceeDiDppLS09D9Fo8QB/HGuDiAupNS2A+oYRxg2spEDNA5qeGtD6CrjUDiAvkxAYmXg6OZxr0VjcULQshBzLe5zem0EJEYoncz7ESt7scI3XwfwxrnTve0WVwcX7P5GTt/nZuqut1+Jk7NlT7DH6Uo2nGPcj70ExKcDSAwDBgwoFqdvkziAn8zXATQX1IEqr3XEy8ob206Qy8jKhHnRTQoOqjIOkwMImdAdykYHVuEluucZw+rjdCvLk7Kq34Tu0DY60COfERAfMf4Q6y9fJ3DCVnupNgtxf2NYXVtHdIQSC3ZFdBiEqSrqToA5K3vsBKADmBDEodsgqsmUOHq1eBSn7/PyfKXoy/62t+fqAKZSHReTUVWd16KtUIaO9BpWV/7+O5Oikw36OW5SGddv3hXI8cHOF9nbsVJodCizOZx65Hkvtfeo83Mp+H93uFq9shxzjuo+OOT8XAqlOjQ6Hhir+s9asWDhaE3ndx6rrjdZP/JxAO9evdze9RDw/V2367Bx3lT/3W9f9lKHqp1fB4VS/br39dOAJs73aqsburV3cF4HiQTiAF4FZ1B00Beet4oTuCyb/b1uaD/f7n08f6XqooXOLV3vtbe3d/cTsaP9VJt35hldGrQzj47zzlenXJ9KwWlvO+OdVTY62h542jt/8LjrUykYuE5wvaiut1GveO2Nza5PpeC01zV6Z0boVqSfGT7BO59q6PzOc+fPe8MqN+bsAD60eb3DfyJ7fvfhYa9NGfj47IuzvPYzZ12fSsE5f/iE1/ZrXaPj7LiZppzsStD+BYkY+QwB99RitJGurPmVed22XuIk9D5pY66hJwc9OoEeZwh7ADsl10jzpDdU/6FJr7R2q/tzCViYO6XNQtAydrpXezzl/Fyc6Vit1zJGN1kfoXbqtu3v/M6amiZv7JYtOTmA2N7WOQV1fzeseFedag9z4mo/anRvd0dKfXhM6ghdgw0jJRgxybR3kL4EiSCaOYDdzpt5Z6c6vhFWRcUhrES3/8/m3erKGBOqba30vZRg597s7VQfNXmN81frnEBRw5tvx2sla4bqV27RV8biaMch7IZamLKhzOvaXWzKadt3ZhUr8OZ5M7zdx2qsnY/1+xv346zlqv8Hikpmj8CFFcLKsEQmWPbOQ532DtKXIAkgmwIjteOgOqhq62MvxC6dV8PSjfrKePKbeaUBykehdwB91a+qNPNIdf/rgng5OUirN3OpujJunLealXGm4OTM0U136a7R8dae/d5XeokV+OJWu1lWrN7fWOk77nXd/+L3yDu3cZhUVW8WEqn+V2TokUYHHUCiJtsCAxHKtZkckA4sFum8sMx/+lv6yliRCDwfRcUBhKwMcyI25cHoZhfo1NFar2XsDGVlPFIc6y3uzyWkwqp7bWOu+cU5F/TkVx4+4f3PisXd9vzN/mC39XOwdX+jod46bIKurL9vjFf3XoKjQVxKaHRYSB/XNHuFh2QOrn0IEmFyKjCkVdjy7Ku6iujeaLcKka5IHejzHjeVcZQcQCi1+4h61WFHftHoNjoQLgPxNVXXW5xjrlkUclZjFb7mvzZZe7rkEF6175A3adt2k0sYWUQOB5Q1ycb9jXBA2oYXsmEwHmzvali8QT3HHulc6+586CrXfgSJKDkXGCbI5SJ16wUtoKgN0aFFq41bZ2Kubbbf+s9GUXMAzTEf0scdM0NRyzZFbujT5FhVzr/FSmE40q7PJSrC/Cp1DmH0fjmIq6i6v5Gh5401aock8XE5c1Td+u3q2JRtgyt2Nd8x7AuufQkSQfItMGwEuWwdNcmr3V/l/CbMqnB88231EFFHnsdDzs4jig6gkYWeZ8jkrD6Wcn8+vamq3swN1Z5v629f8dqbW6Nnb8eyMd0FZaPJ5FPARm6+9zccNu0UA3N/jZ/FzDx5KLVtv3fqgae1/3/rqbuH/btrf4JEDI1DYCOyvskcsn6b1RvKpkxCeQuFI5bwI9OK03OJqgMIoed5ii69knHCH34+1PNQ0VunDYxtKuPnXzNB3SNrb9eShgJC5ajv+5ETC7b4LZ/7G6MR2lENyIzoRKyHPUwy8y4fe0Fnh8EjzrQNGXaTa5+CRAhtBWFyCCsj65sK6+V5oQsVU//2+2Y4R3tuLU9PD0XPU6QdQAg9sQvWqu2BnlyTYilMUxDEwcW5abMGQFighO+LvL1dS66Ppom62JTmekN2H+R1DdhBysnex+u8pmn6qTwYMm5Y/I57W8VBR2q9ltFTdPYYPOLEa7feerlrv4JEBCurxvadUK8agzD3pm7DDuc3Inr9tEv1OytjKWQLFeal1/OKiUNQv2armdentQ2u2dT7+52fTy16/Ubp4oN1VsaL1sfO3k6FFZvzVlkpC9AQDLI3MFt711XuMT3h6uvt50+EoryOlaoazFQV1XU2ePjXXPsVJCJYqyAwZPK0fsgEMsNXLmIGohcGK7OUKwFN4XjPSJNJxXmBkqE4OQRmQY6F3lk4TcZJP+Kg9/l4ndf42lJ1zENzHr940kwoj6u9XQur9q3YSZwmLLZARW/7GHuzd+3Bk17zS3OtlNFmPvOOg87tEkupA3BX3OfaryARwWoFgSETZTqvzoJy6ChTOdYcsRcp/1I3HCrP1seVczDSx455jQ5WAfamuDkEZt6McrJ+ps1MMN9CDAvLb2BVso25V6YyfmScCRcTd3u7Vmrrh2Iz/XQXY7OHn/Pq17xndVi4R3ujoTFvtXpFeVotT07mSt8CyEQByGOO/enBFXe69itIRLBeQfjhBGwUNOZi/uVo0xpCGh3rN5kcKyKq2xh+S6v1sfFe7e5wxsCKpUNwos5rnmBnuN5UzA8+a1a4o9K0fqxVDSbgsI3ht87KeOz0HufOxtLejoVeNKvlxfAXO2KCWpgmcpG9j6W8RimLbfSUp4WFWKGaOxtzmbBED+cWC/XU4IpvuvYrSEQIqoLIt/XSoyM4dJQZvki996G61YzYcujt0QbY7SrMGwzDYo8ezzuuDoG/OEQbw+yCQlQqTSymSOfdVP3ve4+b3mxkwrF5vSE13KUch9ja27Uw0jF5gVVbIuA5FiZlBpHO+ToTO7e3t3t1Ow54TZMW2C1/MaVl6Ub3/30ShRzCY7JMPjB4xA5mByFZE2QFYUJaWFgcclFh+eCzZt6WCR+TTc+gFNiYrwInATeSTUehs3DE5PuQh0GIu0OATA6n7lfH07pIuIbhwJkA3tk4+FX1JvMGKnRtEOturzesKs0im07c7e1aJhe4hVXbF9h2SEcKQwzZmgw22cwVPFrr1b2zw2uaucQ78/h4++WtOKdRzqYTC2WXC7y17c5hN7v2KUiECLyCOFFvbV5gjwXUb54x6dkwFIiWOYLoNr0y3wQPxhCLjcnbl/pt0yvpuoDIQklwCEzcxjHTArM3Kmj0HOM3ELrIXG9TFpreacSLxGe2GxiZQnDnbBdIJcHeroXA7rbmDnd7vUnjEt+Pa6tZyjRTtomwUhTXIBrDQZatzeNeD114riSrbuPO7uc9Dx6x/9Rdw//WtT9BIkahKgizis7SJOSwyAz5ulg9mqcS4xCk01opM7eETU0zFuc0/yox9natE3Yyt4RJmHLT8NaG0I9qJFJYtLhpV0cP9OCKn52+e9gNUpX3ce1LkAhSyAoC81uC7J0pWOGIIThM3HZdEOT6/yfMIUCMv9ZH7Q+JFVqYBJ5P/uik2du1sKDM5oILV0L2EuaPDr9wX7v2H0jEKXgFgd6ZJe9Etjew5ZkZqonarguMxDkEVfUmJ2tUewObpi7Me0VyIu3tWAiPYivWXqFlev0QozAkgeupXq41OoBEi6sKAvOYEPDZdaGXrRCzzUy8j/CQSJIdAqzmxfw519dRtsK8Lywkob2jqbqNH5jFE66vo2yFxXHs9YuW6AASNa4rCBSUiJ3nugDsSVhAYuZehTi8Sy4Fhmt7O1V1ox+A2U4w30Cut1+N7lhRHkRcOKqwOlHnNc5dZTUci23BSUXO8yg3bJMqOoBETSgqiJMNJgUbVtS6LhA7K2IRhnKiOtzbU4ERCnu7FjIjzFoeqor59L1PmIaGzQwLtHc4hJXpJi5fgKvDc3b87h/TMdx7ot75/0PleV3RASRaQlVBVDWYlWcuHUHMFUN4D4R3cP5/BFBghMrernW4xmucvcKkgXPu+B2qpr1jLkx7Qcgg27EDc3L87htjsoMEkumGKuz1RAeQaAllBYFcqWu3mth+hWwRI9Bm7YEq9+cfYIERSnu7llSGGHZFzMhCXW9YnWxyDwcYRoj2Dqfg7KPhUcg5gq2jJnr1K7eYRVGuz5+ydB3RASRawl5BYGIyCssgMopgJXLzC7O8ug07EpHfkg5BFtfb9gNe09RFgfRCn3pgrAkcbUK6FGDOFe0dciGe27u7zFSTIHqhEZQcjVpkQXJ+rpR10QEkaqJUQdTuPmpCyCAKfj4R8BG/r+WpKaZQNJVwApy+rgVGlOztVFI5Y+Uwhsuan5uZl0OISh1hgxrnr/ZSW/U5rGnvGKu60WQUwtxUxErNxyFEpIKzE+d5jYvWd0xh4cKOWIsOIFET6QriWMpLbTvg1a+uNEN4yL3a9Opik7cVBSnyadYvf9e0smv3Hk98gUiHQPn/Haw2lbS53hasNT3TuNYwhw/XG4Z0zfVWuadjTp/j6432jrDk2sECNDRUMXTbOH/N7683lHFS1qHMQ0B6k6f3aC3tnTDRASRqWGAkR6wgkiXaO1mivZMlOoBEDQuM5IgVRLJEeydLtHeyRAeQqGGBkRyxgkiWaO9kifZOlugAEjUsMJIjVhDJEu2dLNHeyRIdQKKGBUZyxAoiWaK9kyXaO1miA0jUsMBIjlhBJEu0d7JEeydLdACJGhYYyREriGSJ9k6WaO9kiQ4gUcMCIzliBZEs0d7JEu2dLNEBJGpYYCRHrCCSJdo7WaK9kyU6gEQNC4zkiBVEskR7J0u0d7JEB5CoYYGRHLGCSJZo72SJ9k6W6ACSTsrKyr5TXl6+XR534HHQoEH9s9mPBUZyxAoiWaK9kyXaO1miA0gMpaWlXxLHb1dxcXFfvO7bt++nBw4c+Kls9mWBkRyxgkiWaO9kifZOlugAEkN5efkUcQL/O599WWAkR6wgkiXaO1mivZMlOoDEUFZWVil6VLTaf/6IvN0nm31ZYCRHrCCSJdo7WaK9kyU6gAlBHLoNoppMlZeX1/qP1/lz/xbIplcUFRVdKa+Xl5aW/jSb70aBkUp1XExUvAU7097JEe2dLNHeyRLsHLDrQaIAnD/R7enXcP7ECZzs8JAIIYQQQkiQiPP3fdH0P+gY9r1cnL95ontcHxchhBBCCAmOPuIAjsRKYAwHi56V9z7h+qAIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh2VJeXv6vos1lZWVn5PHJLh/3KS0tHSuf7Rd9KM//z8lBksAQmz7oBxR/T7QVqQRdHxOxS0lJSanYdb1or9h4k+jPXR8TCQ6x82HRbtzPuK/lHr/V9TERe4hNx4h9D5hPhIAAAAZJSURBVMlje3Fx8V+l3+d9TnIGF82gQYOuR8q4rg6gvL5N3l+G5/379/8sChZeVPECDmA3jj+JEWLfFWLnH+G53L/fkdfvuj4mEhxi34Mo010fBwkGse2N/fr1K4KdMx1A3uckb7pzBOQielPe/17G6xF+bmESE/wewNGuj4MEg9j3GrFvozy9LP2e3OcnRYMcHhYJEPQOZToGJJ5k2pn3OVHRnQPo5xW+IWObn8jriYU+NhIcvgN4zB/+Rd7or7o+JmIPseffYDgw8z0MD9HO8cUfHnxfHreJJhQVFV3t+piIfbo4gLzPycXIRbDBn+PVKblQav3H69LbZekA/pQOYLTozf4lJSXXymaXY1t5/o/y/kfy2M/xYRNLdFcxYGiIFUN8Edt+3n+KVKAVck8vdHpAJBB6cwB5n5Os4RAwAWLfxXId3OL6OIgdODSUbAYOHPg5sX+T6+Mg9uEQMLFGd3PB5OL5sb8I5LL0IhDZ7ouODpEEQGYv8KBBg8pQaGBhkMtjInYRm67EvYzncv9+l5PD40tRUdGVch9/Jv1a7P0zKcNXOzwkEhBd53ryPic5I5X91/w5YI1oKYqOiv7N//gyPwzMAdE+uaDucHqwxDoY0veH+jEHcDN7/+KHOATlmAqA8BD+sBAbcTFlwIABxX5Ip/QcwLli//6uj4vYQ2w7DnW22PZjNNgRog3v8z4nhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghJLr4AeDfyWZbP4D8jHx+R/a9GXHM8tmXEEIIIYRYxHcAN2Szre8ATs/nd3wHsCqffQkhhBBCiEXoABJCCCGE5Ig4REORUlGcm2Z53C+OzvcyPvs5UivKZ7XyOGfAgAF/lv4MuT39fSvleas8zho4cOCfyP6TkKYRqb3k+V+kty8uLu4r770qn1WLjsAZ6+mYZLt5ss34jOMYLVrSw7YXOIDy+gl8P85HtEWefyX9me8Azpb3p/jnuyPz86uvvvqPM1JXVSG1pLx9hb8vHUBCCCGERB8/H+epkpKSUryGkyZO3BfwXN6/XRyeg7JNmTg/n5TXz8nrt9P7wgFEPmbZ/nP9+/f/rJ/Tc49s93X5uI88jslw2vB6k+gRef6H2AeOo3zvf3V3XNddd92fyufH5fNvy3f+M5xGHFt323Z1AOX593E88vQyeX6X6CP5vU/hMziAyEkq7/0An8vz2+R5g5zjZ/x9Z4te6tu376dl26vk87fk9aP+vnQACSGEEBJ9xKEZBAdQHm9JO0lp5P1lojvTr6+55po/gvM0YMCAYn9fOIC3ZWw/Rl4vSr8Wh+kf5L0af9svi05kfr98/kN5b0VPxwZHEvujN062/dYlzuGSQ8Dyeb3s/yX/N+EAbu7yO+/BIZTPrsH5wfnL2Pcm9ID6+9IBJIQQQkg8EMfmu+LkrMawrWgBegXxvjzf1dXxwipY+fxG//kh+fwbGZ8Nl31eznj91/L6tP8bt8rrc3DGIPS6iRrl+fZLHNplfq/i7ksdfzdDwPfg2P3fgH7n90p2DgF32X+uvHevnNffyeP59DH6x9mI/8Xflw4gIYQQQuIFegD9Yds1eN1TD6BsNxCvc3EA5fEGDCfncjzy3b9BeBf00MnzIT1tl+kAosdOlJLtv5jxeX36OHvoAaxEDyCGmOXxjLx1eQ/HQweQEEIIIdEHvX2if8IcP3l5uTw+Lk7OSnyGOYAY/sQcQDiH8v6zonXpfbN0ANv8l5f5cwAfKCoqulJe98G8w8wFGJn4DmMdhpuxkAQ9ebL9X3a3baYDKNt8E72U/mKVK+T9+9Hz2MUB/Fj0H/75/gjfjcUr/u9iDuBz6dfyff1km3/x96UDSAghhJDoI87d9eLwbPRX7WLYc3l6CFjoI07PL9Bzh141rMzt169fUXpfvJ9tDyAQZ+parBDGXEB/aLYyc8VxGszBk8/2wbFLv4eeSH+4+Iqu23cZAsaw8QT/fPA7QzOP0x8CniXvTfZXAe+EY5f+LvRy+nMZD/vDvzvl+R3+vnQACSGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQtzw/36zqWR02CupAAAAAElFTkSuQmCC\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"replot.plot([range(10), (np.sin, (-5, 5)), np.cos, (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\",\n",
" palette=replot.sns.color_palette(\"husl\", 2))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"ename": "InvalidParameterError",
"evalue": "Second parameter in plot command should be a tuple specifying plotting interval.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-8-123737853af4>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msin\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 111\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"__call__\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 112\u001b[0m \u001b[1;31m# We want to plot a function\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 113\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_plot_function\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 114\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 115\u001b[0m \u001b[1;31m# Else, it is a point series, and we just have to store it for\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36m_plot_function\u001b[1;34m(self, data, *args, **kwargs)\u001b[0m\n\u001b[0;32m 145\u001b[0m raise exc.InvalidParameterError(\n\u001b[0;32m 146\u001b[0m \u001b[1;34m\"Second parameter in plot command should be a tuple \"\u001b[0m \u001b[1;33m+\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 147\u001b[1;33m \"specifying plotting interval.\")\n\u001b[0m\u001b[0;32m 148\u001b[0m \u001b[0my_values\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mx_values\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 149\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplots\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_values\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_values\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: Second parameter in plot command should be a tuple specifying plotting interval."
]
}
],
"source": [
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, None)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\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",
" 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 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);\n",
" canvas.attr('height', height);\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'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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;\n",
" var y = canvas_pos.y;\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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",
" 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 + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"ename": "InvalidParameterError",
"evalue": "You should pass at least one argument to this function.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-9-04fab9ca003f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 107\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 108\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 109\u001b[1;33m \"You should pass at least one argument to this function.\")\n\u001b[0m\u001b[0;32m 110\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 111\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"__call__\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: You should pass at least one argument to this function."
]
}
],
"source": [
"with replot.Figure() as figure:\n",
" figure.plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "physique",
"language": "python",
"name": "physique"
},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}