Skip to content

Instantly share code, notes, and snippets.

@JanDupal
Last active May 26, 2017 08:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JanDupal/9b29b4fe78f98d11b62f7551e8851c1c to your computer and use it in GitHub Desktop.
Save JanDupal/9b29b4fe78f98d11b62f7551e8851c1c to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Strava analysis"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Dependencies:\n",
"\n",
"* stravalib\n",
"* geopandas\n",
"* sklearn\n",
"* scipy\n",
"\n",
"Resource: [Schroedl, Stefan, et al. \"Mining GPS traces for map refinement.\" Data mining and knowledge Discovery 9.1 (2004): 59-87.](http://www.isle.org/~langley/papers/map.dmkd04.pdf)"
]
},
{
"cell_type": "markdown",
"metadata": {
"run_control": {}
},
"source": [
"## Getting activities from Strava"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GET 'https://www.strava.com/api/v3/activities/900047530/streams/time,latlng' with params {'page': 1, 'per_page': 200}\n",
"GET 'https://www.strava.com/api/v3/activities/1002237205/streams/time,latlng' with params {'page': 1, 'per_page': 200}\n",
"GET 'https://www.strava.com/api/v3/activities/902111943/streams/time,latlng' with params {'page': 1, 'per_page': 200}\n",
"GET 'https://www.strava.com/api/v3/activities/992899791/streams/time,latlng' with params {'page': 1, 'per_page': 200}\n",
"GET 'https://www.strava.com/api/v3/activities/970929318/streams/time,latlng' with params {'page': 1, 'per_page': 200}\n"
]
}
],
"source": [
"RIGHT_OFFSET = 0.0005\n",
"\n",
"from stravalib import Client\n",
"client = Client(access_token=\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\")\n",
"# for activity in client.get_activit():\n",
"# print(activity)\n",
"\n",
"stream_types = ['time', 'latlng']\n",
"activity_ids = [900047530, 1002237205, 902111943, 992899791, 970929318]\n",
"activities = []\n",
"for activity_id in activity_ids:\n",
" activities.append(client.get_activity_streams(activity_id, types = stream_types))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": 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",
" fig.waiting = false;\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",
" 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",
" 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",
"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",
"\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",
" 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",
" // 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.send_message('closing', {});\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-danger\" href=\"#\" title=\"Close figure\"><i class=\"fa fa-times icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Close figure', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\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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R9nWVuB6bT+3FSRV7UP2KJurfI9UGwIvJAESIAFXI6A/XIJFA0X6y11r4XRf/1Ho9n7RFJEGNtpXSkcEzxFVZppOgkjT1fsfFOWKOovUtNbIIBor0pVLNK+nRemiSJEtzdZl0zJoHz8NgLSGSAPWvaKHRGabJxvKSFlpR/XfROagQjZtZo4umz6rz0WbRFr7Yi9zdLmipCDajG3WSNnWz8E5IlvXSDu6bFIE4xRLv8urdrHQz/CLogMi7Z5hS3N02Rz5PWJLTkyLBEiABFyGQJJ4ov/wVNq0a97uJ9tqbUS/iDJEh0Tvi/Sfptm0Jm++eUdex4v2iTJFWqOyQJQosjRtmlohShWdFC0W9RXZ2pIkQXN5bFE29W+oSAd2aPl2irT/nwbLZouWDQ2U0kr0qbxGiGxtSZKgI8vWvyQ/rbHV94JZp2TblpYkiTmyXOV9T5QD+l7RgMbWliQJOrps4ZLnhyL9nKWI9LPaXmRrS5IEHV02R32P2JoV0yMBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABErA5gf8HKmLkcr392zEAAAAASUVORK5CYII=\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1174daa20>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%matplotlib notebook\n",
"from shapely.geometry import LineString\n",
"from geopandas import GeoSeries\n",
"\n",
"lines = []\n",
"for index, streams in enumerate(activities):\n",
" line = LineString(map(lambda c: (c[1], c[0]), streams['latlng'].data))\n",
" lines.append(line)\n",
"\n",
"g = GeoSeries(lines)\n",
"g.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {
"run_control": {}
},
"source": [
"## Clustering activity points"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"run_control": {}
},
"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",
" fig.waiting = false;\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",
" 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",
" 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",
"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",
"\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",
" 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",
" // 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.send_message('closing', {});\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-danger\" href=\"#\" title=\"Close figure\"><i class=\"fa fa-times icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Close figure', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\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"
},
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x115388eb8>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.cluster import KMeans\n",
"from shapely.geometry import Point\n",
"# from numpy.ndarray import flatten\n",
"\n",
"x = []\n",
"for line in lines:\n",
" x.extend(line.coords)\n",
"\n",
"model = KMeans(n_clusters=300)\n",
"model.fit(x)\n",
"clusters = model.cluster_centers_\n",
"\n",
"h = GeoSeries(map(Point, clusters))\n",
"h.plot()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"run_control": {}
},
"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",
" fig.waiting = false;\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",
" 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",
" 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",
"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",
"\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",
" 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",
" // 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.send_message('closing', {});\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-danger\" href=\"#\" title=\"Close figure\"><i class=\"fa fa-times icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Close figure', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\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"
},
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1169c1710>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"\n",
"activity_lengths = list(map(lambda it: len(it.coords), g))\n",
"activity_splits = np.cumsum(activity_lengths)\n",
"labelled_activities = np.array_split(model.labels_, activity_splits[:-1])\n",
"\n",
"\n",
"clustered_activities = []\n",
"for labelled_activity in labelled_activities:\n",
" coords = []\n",
" last_label = None\n",
" for label in labelled_activity:\n",
" if last_label != label:\n",
" coords.append(clusters[label])\n",
" last_label = label\n",
" \n",
" clustered_activities.append(LineString(coords))\n",
"\n",
" \n",
"e = GeoSeries(map(lambda a: a.parallel_offset(RIGHT_OFFSET, 'right'), clustered_activities))\n",
"e.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {
"run_control": {}
},
"source": [
"## Generating road segments "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"run_control": {}
},
"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",
" fig.waiting = false;\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",
" 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",
" 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",
"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",
"\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",
" 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",
" // 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.send_message('closing', {});\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-danger\" href=\"#\" title=\"Close figure\"><i class=\"fa fa-times icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Close figure', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\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"
},
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x116e0a6a0>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"segments = set()\n",
"for act1 in clustered_activities:\n",
" for i in range(0, len(act1.coords)-2):\n",
" a1 = act1.coords[i]\n",
" b1 = act1.coords[i+1]\n",
" segment = True\n",
" for act2 in clustered_activities:\n",
" if not segment:\n",
" break\n",
" \n",
" for j in range(1, len(act2.coords)-2):\n",
" a2 = act2.coords[j]\n",
" b2 = act2.coords[j+1]\n",
" b2_ = act2.coords[j-1]\n",
" if a1 == a2:\n",
" if b1 == b2_:\n",
" continue\n",
" \n",
" if not (b1 == b2):\n",
" segment = False\n",
" break\n",
" \n",
" for k in range(1, len(act1.coords)-2):\n",
" b3 = act1.coords[k]\n",
" a3 = act1.coords[k-1]\n",
" a3_ = act1.coords[k+1]\n",
" if b1 == b3:\n",
" if a1 == a3_:\n",
" continue\n",
" \n",
" if not (a1 == a3):\n",
" segment = False\n",
" break\n",
"\n",
"\n",
" if segment:\n",
" segments.add((a1, b1))\n",
"\n",
"f = GeoSeries(map(lambda s: LineString(s).parallel_offset(RIGHT_OFFSET, 'right'), segments))\n",
"f.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {
"run_control": {}
},
"source": [
"## Merging road segments"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"run_control": {},
"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",
" fig.waiting = false;\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",
" 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",
" 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",
"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",
"\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",
" 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",
" // 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.send_message('closing', {});\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-danger\" href=\"#\" title=\"Close figure\"><i class=\"fa fa-times icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Close figure', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAAXNSR0IArs4c6QAAQABJREFUeAHsvQd0XNd17/0fADPojSBBgr1XsYvqvVGyZcuyZUfuLfGzn+Mv7yXrW89LX16Ws5zyZa2Xzy9x4sR5jh1XOZarZEuiKmUVqlHsYifBCgIgQKL3wfff986QIAiAA2BmMPfe/+bamJk7d84953eGM3v2PnsfQCICIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIjAOAr/ia6PUOwe0cT/vb6U2UY9Rv0odSR7gkzuojVR7zW7qH1OHkhIerKbaNbOoEhEQAREQAREQAREQgTQS+BSv9TTVjLE7YtfdwNsO6vtij9fwtob6ldjjoW6m82DVgCdu5v1O6t0DjsXvfpd37Jp9VBmAcSq6FQEREAEREAEREIE0EJjJa5h3bxZ1oAH4d3z8FHWgfJ0PDgw8MMJ9M+puoponcOWg88yofINq3ka7pgxAQpCIgAiIgAiIQJxATvyObkUgBQRCbNM8cWbYnRiifXt+oGTzwUJqIbVt4BMD7pfyvhmUBdRu6ueou6hxqeCdb1LfQ62MH9StCIiACIiACIjARQIyAC+y0L3kE/gSm+ynfmeIph/nsf9GfZD6BNVCwGbM2fm2fm84A9A8fmXUCPWj1O9Rj1Dfppr8C/XfqO9SRzIAzfi0kHILVSICIiACYyVQzBeeptpnl0QEREAEAk9gAQnYh+LsASQsHHvngMcf5v2t1AbqFupfUHupedRE5Xc88R9jJz/MWzMEzZNochvVrhl/zLsXZAbv2Qe2VAz0HtB7YLzvAfs8kYiApwjIA+ip6fJUZy1Bw8KxZuANlF/wwU+pX6Q+FlPeOPIN/n2NaokdiYp5AuNevI28v5R6JvbicOzWHv8p9Yexx3bjvObEiRMoKTGHo7/kkUcewd/8zd/4a1Cx0fh1bH4dl02bX8fW3NyMWbNsefOFzyC7LxEBTxCQAeiJafJkJ/+TvX5mQM8t5HqC+oXYcXu8gfoO1Yy4h6ifpd5HHU4+xSfMU3iEaq/5NNUSQf5vqsl/p/4/zj33zw28+Rl1HdW8jJeJGX9+NAAjkYgvx2UT6Nex+XVcfp6zyz5QdEAEPERABqCHJstjXbUSL6aD5SwPnKead+6bVPPYWZbuW1RL3DADLy7/yjuzqXbcZD71a1Rb29dO3UG9l7qdamLtmsbFrmWhnVNUCwVLREAEREAEREAESEAGoN4G6SRghl5cenjn2viDYW6/OOj41/jYNFHZzBOHWv+X6Os9e97GjRYN96f4dWx+HZe9C/08Nn/+L9OogkDAwnASEQgiAVv410Txbag0iJOqMYtAOgnYGsDSUqtMBfvTnM5r61oiMF4CAz0y421LrxcBERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkklABmAyaaotERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkklABmAyaaotERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkklABmAyaaotERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkklABmAyaaotERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkklABmAyaaotERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkklABmAyaaotERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkklABmAyaaotERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkklABmAyaaotERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkklABmAyaaotERABERABERABEfAAARmAHpgkdVEEREAEREAEREAEkkkgJ5mNqS0REAEfEujtAhoPAe1ngZ4OoJcav+3tdO/38ZzsXCBcQM0Hcqjx++FCoHweUDQNCIV8CEhDEgEREAHvEZAB6L05U49FIPUEzMA7u5+6l8bfYSDae+k1s7JjRh4NvfxJNP4igBmBPe1AW71rJPb3X/qavDJg8lJgyjKgZBaQpQDEpYD0SAREQATSR0AGYPpY60oikNkEulpp8O0D6t8FzlcD/VF67Giklc29aLTFvXpZ/OgYyZtnxl/cO9h5Hmg44LZ98nXANEKvYMUSt90yegez9VGU2W8O9U4ERMBvBBSP8duMajyJEijhiU0UlJTY3QBLD8O41ZuBU2+6Rp9598oXuMaZGWkRhnWTIWYUtp6JGZn0LLbVua1ayLhqPTD9anoT6SWUiIBHCDQ3N6O0tNR6a3+aPdJtdVMEHAIyAPVGCCoBGYBmkNXuAg4/A3TT+1cyE5h5HT1zixje5Xq+VEt7A72NNATPbOP6Qt43j6KFiGdc43odR/Iwprpval8EEiAgAzABSDolYwnIAMzYqVHHUkwg2AagrdM78Ds31Gth3fl30Qu3duSwbqomxAxRW2d46g2Gig+6VymsdA3BqatojHJ9oUQEMpCADMAMnBR1KWECMgATRqUTfUYgmAZgbzdw7CXgxBZOJw0vC73OuyN5Yd7xvknaG91QtHkFLfs4J88NDZtnMrdovK3r9SKQVAIyAJOKU42lmYAMwDQD1+UyhkCwDEDzslm49dDTQBeXKhVPBxa/l2HfGRkzIZd0xAzV2h1MGKFX0MrPWNKJeShn3cB1guWXnKoHIjBRBGQAThR5XTcZBGQAJoOi2vAigeAYgLa+7uCTbpjVPGrz73Q9f14ow2KGq2UmH3+FS+xPuVnJlVcBs29iXUGGiSUiMIEEZABOIHxdetwEVHth3AjVgAhkKIG+HoZ7X2a491XW8esDpq0BFtztlmDJ0C5f1i1LBLG6gZYccu6oawjW7qR3kDqZGcqzb2b+JZNXJCIgAiIgAqMiIANwVLh0sgh4hIAVcT74FGA1+IqmAosY7i2b7ZHOD9FNMwQnzXfVPIHmEbSQto3TDNuF93LnEXo3JSIgAiIgAgkRkAGYECadJAIeImAZtbsedUu5mGFkZVW8EO5NFLGtW7zqD9wdRw5tYhmZ7fQOHgGWvM8tYZNoOzpPBERABAJMQHsxBXjyNXSfErAt10wmLWTSBLNn/WT8uSNz/xZOAVZ9nIbf+91t6Hb+GNj7a25H1znwrOTdt/WItp7SElPe/QVweitD69wtRSICIiACHiQgD6AHJ01dFoERCRRUcCcPhkstecK2d/Nz+RQLDU9fR2OXO5fsfyL53kArRWNrD8/Rq9p4COg4dxG9FdE+8Row93agcsXE1FC82BvdEwEREIFREeCnp0QEAknA31nAde8Ce37mZvzOYaJEEMQ8dDWsH3iYYWEz3Maa9NLT4e6QYnsiNx13t8czflZ+xryqtk2ehaFr3nENQLtW0TSXtT2vHUyC8G5zxqgs4MBMtS8HKgPQl9OqQSVAwN8GoGX9bvmGWz/v2v/Lv2HgoSa6s8n1BprHzvY1nrLcXQdpW90NZ5xZKNfWEVoBavOcGr/sMBNn5rneRTPs8idd/vrudjchxfZRjvby/Dluwo1K1Aw1M747JgPQd1MaqAHJAAzUdGuwAwj42wC0gR55gWVgfu+uk7P9fYMk8cLXZpidr3ZHXlzFcPEGYOpK17izo7bziCWRmFqBbJNyGn3mPTTD0YzARKSTr7UdVswDGSkE1v0RkGdvMYmfCcgA9PPs+n9sMgD9P8ca4dAE/G8Amifs9f/NzNjFwMqPDk0hCEdb65iw8RaNvB1MFuEOI+F817izHUbOH3MJ5JW6Rp8ZfuPZaaR2NxNEfu7utLL2s4kbkEGYBx+OUQagDyc1QENSEkiAJltDDRgBM2oqWCzZQpp1e9xEhYAhcIZr4Vjb9m7+Xa4RaF5By+C17eXMG2hGn4V6k5EtPZW7lLTXA9UvAft+Ayz/0OVh4yDOgcYsAiKQcQRkAGbclKhDIpBEAovewy3UTtIY+TVQMNktCp3E5j3VVE4uMPMargdkGNjKuUSKUlM8eu5tbo3COnoDC2l8zr3FU5jUWREQgWAQyArGMDVKEQgoAVuHtuIjblLD7v9kjTxmuAZdLBGkkMZwqnYOsfaXfsDNDD7KdZgWFpaIgAiIQIYRkAGYYROi7ohA0gnYFnCL7mMNOyY87P2lihcnHfAQDeZE3HWX5mW0NYE7fwK01Axxog6JgAiIwMQQkAE4Mdx1VRFIL4HpVwNVa4GGg1yf9mJ6rx3Uq9kazLWfc9deNhwA3v42t+j7KdBaG1QiGrcIiEAGEZABmEGT4fOu/Irji1LvHDDO+3mfq/HBdFUco36VOpI8wCeZygm6spzXWGztj6lx4d5g+D71CLWFyi0c8DdUumMCLhaWXMRECCtgfOxlJoW8G3AgaRp+AWsHrvgwsOFLwOSlbkLOW//CIt2PuesE09QNXUYEREAEBhOQATiYiB6ngsCn2Gh+rGFu1+AIV+KD34L4GpWuEphx9yfUr1CHk7f4xL1Ufqs6r+G3Kv4X9W6qSRGVKa+OkVnM27uotHrwd1RJNnO+bD2g1anb+wvuYrGFu1zEp0N4UkqgaCpDwg8D67/gluWxrOy3vsWfKPLGppS7GhcBERiWgAzAYdHoiSQR4PYL+DqVlXEvkYf4aDOVG7g6sp1/v0MdyQA8zefjC6nsvWvWC/fhwhmqyVHq38Zu7TE3cMV3qbfbAwkJWFhy1Sd5WwYc2sS1aT8iQXOWStJCoGQ6+X+MhaL/0M3KPv4KE3M603JpXUQEREAEBhKQATiQhu4nmwDjjo4BZgbgiSEat+cHSjYfLKTSRTWsmLfwPNW+NZ+mmmG5izqcbOQT7wz3ZCCPF0+jJ+q/cE3gOgbTaSNbSPLs/kCimLBBl/J30czr3OxsWx8oEQEREIE0E5ABmGbgAbuchWjNS2eevcHyOA+YZ+5Bag6VWQr4HNXOL6EOJ7ZekO4rJ9z7Zd5+j2qvHUr+Jw+upv75UE8G+phlqS59vxsSNuS7HgUO/I47ZfQEGktaB29rAm1tZr3WY6aVuy4mAiLgEJABqDdCqggsYMNmeA0O/ca9fq/yuU/Ezqnl7TepXBTlGIDneHsl6eYJ36duptoaw8FiXkfG2XAb1ULHkqEIVHK/26u/SJN6LnDqLabk/JuyVIfilIpjthazdA69sIeAXns7S0RABEQgfQTM8yIRgVQQuJmNVlC3Dmqc2Qf4KZVWh5ME8tiA57/B+69RLbybqNCV5WT8xs83A/OfqHdTrQ/HqcPKI488gkjEmgA2btzo6LAn+/UJWxe4mjb0CaK3wsVb/w/XqH2e+9lW+XXEmTOuKTTAz1fTCGR5nsoVmdMv9WRYAps2bYKpSXe3DPdhQemJjCcQ98ZkfEfVQc8RyGePywf02t5rJ6gPU5+hWijXMoFtfZ5ZYJYU8o/U+6hbqEOJefrsuSNUe82nqWY0Xk+1JBL7QWNewdXUu6hnqMOJhZmbKCgpGSniPNzLfXr8PO3lHUSYT9vdMlYtc1iSOgKWgPPa37vGn5WLkXiKQHNzM0pL+QPKrUrQ7KnOq7OBJ6AQcODfAikD0MGWTw/QU7ErneWtJXGYZWFh3waqhYA/Q+XGtZcYf//Kx09S4zKfd+yntxmPx6gfot5LNePP5EbqR6l2Hl0qjmeQ37DQBzMhJCS2a8icW1mjrk4FoxMCNs6TcotpOpC5FehWNvA4YerlIiACoyFgXhmJCASRgDyAw816NAps+3eaz7Tf13yW6wNpoEhSR+DMDtZl/BVgu7UsuT9111HLSScgD2DSkarBNBKQBzCNsHUpEfAEgSx+LCx9kBmq2Syr/WslKKR60qaucpNwTr9N3/jxVF9N7YuACIiAQ0AGoN4IIiAClxMonMxAOpdRdjRyxeWzlz+vI8kjYKVglrwPyOKqiANPsBRPb/LaVksiIAIiMAwBGYDDgNFhEQg8gZnXXiwPc+5o4HGkFEBBBdde3uLuD3zCKiRJREAERCC1BGQAppavWhcB7xIwz9RCy7GhqFixyyGVf2czh6mwkulNv3cNwVReS22LgAgEnoAMwMC/BQRABEYg0BJL3jbDRJJaAllcc2mh4H4m4eznRjnRvtReT62LgAgEmoAMwEBPvwYvAiMQ6O8HTr7Ogj15wFQrrShJOYHSWdwjmGUtm1gy88BvaQxyDiQiIAIikAICMgBTAFVNioAvCDQedkORVetoBFrdbUlaCFjyTcUioGYb97HResC0MNdFRCCABGQABnDSNWQRSIiAef9sHeCMaxI6XScliYCV4VnOjXGKpjID+zmgbk+SGlYzIiACInCRgAzAiyx0TwREIE6grZ770x4CJi/jtnBl8aO6TReBnFxg5ce44WGRWyS66WS6rqzriIAIBISADMCATLSGKQKjInDyDff0mdeN6mU6OYkE8rjHrBmB5oXd/ShrMtoOihIREAERSA4BGYDJ4ahWRMA/BLq4fXIttycrmcF9apmUIJk4AiXTgWUf4j7B7cCen6lI9MTNhK4sAr4jIAPQd1OqAYnAOAkcfZGGRo9bmNi8T5KJJTBlKTD7Zndv5sObJrYvuroIiIBvCMgA9M1UaiAikAQCrXXAGWafls1hJuriJDSoJpJCYO5tQPk84NRb9M7uSkqTakQERCDYBGQABnv+NXoRuJSA7ftrtecW3OOuPbv0WT2aKAKWGWyh4NxiFol+QjuFTNQ86Loi4CMCMgB9NJkaigiMi4BlmjYcdL1/xVx7JsksArnMCLbyMNFe4N1fZFbf1BsREAHPEZAB6LkpU4dFIEUEslnsOZwPnD8G7PghvUxnU3QhNTtmAhaat+ScjkbtEjJmiHqhCIiAEZABqPeBCIiAS6CI+/1e8xXAdv44dwR4+19YiPh5NyFEjDKDgO0P3HqGRuBMhegzY0bUCxHwLAEZgJ6dOnVcBFJAIFIALH0/sO7zQMEU4NjLwJv/xMQQloXpY+hRMrEEWmpcg7x09sT2Q1cXARHwPAEZgJ6fQg1ABFJAwOr/rf8CsOg+oLfT3Y1iy98Dh1iGRKHhFABPsMnmE+6JMgATBKbTREAEhiOQM9wTOi4CIhBwApZ5OvNaoHKlWxj69FbgxBZXbS3a9KvdreKy9TGStndK03E39GvrACUiIAIiMA4C+uQeBzy9VAQCQcDCwrOupzHIbeEsQaSGhmD9u+79aWtYnuQDl2Co2VOH7vZu9HT2oreLylu7H+2LonBSAYqnFjlaWFGA7BwFIS6Bd6UHFgIumAzYXsESERABERgHARmA44Cnl4pAoAjYriDlc13tZmjY2S6OyQiDpP5wA7rbuh1PVU4kG+G8HBRMyueWtiG0NbSj9WwbavbUIis7C2YElkwrRun0YuSX5TnnDGpODwcSyCuj4V0N7PsNd2q5FYQ28FndFwEREIGECfATXSICgSRQwlE3UVBSYnclySLQ2dKF7HA2zPgLZbGoNLiGEB1O8/3RMrSf60JzbStaqK31bY5n0J6MFIRpCJagtKrY8RBaG5JBBNob3ELQZgRmkY9lbNs2cXl6Dw8ilZaHzc3NKC0ttWvZn+a0XFQXEYEkEZABmCSQasZzBGQApmzK7HvwRep5qhl/A8VCl1VUW8M2ncZfKY3Adpw/3YLm080w49ERegvzinMdz2FBeT4cpYcwJ1dBC2enlnNHgaMv0OQ4SUOQTGZcA8y/i/cVUnffQOn5KwMwPZx1ldQQkAGYGq5qNfMJyABMyRw1sdXfUtuo06gsLH1BrYwM17CB+w3DPIMmXF8IZhzDyprMRGdzP5pqmh2jsP1cB7paYwYhnzXJK8mjd7AQxVO4jrCykHWrw+4TQfxr6wH3POYWhbbwvNVwLJgURBITNmYZgBOGXhdOAgEZgEmAqCY8SUAGYNKnzTx+Zvy1U2+nLqIOJWbUsZgxTlOtrMk5qomFfM1oNIOQRalRwSSSLLSf72TYuAPtjR00DFuZYNLD51wxg7BoSiEq5pXTKCyMH/bvrdVitPDvqTfcbftspBWLuR7wFgYhL1+P6V8QmTEyGYCZMQ/qxdgIyAAcGze9yvsEZAAmbQ7Nm1dLfY5qxt8d1IXURKWFJx6jmjF4itpHNbGPJ5smZr06Wsno5xQmmETRUtfmrCG0W8s4ZvYIltwxn15B7pfrN+lkSL3xoGvw2Q4tfe54MWW5u/6v2IxmyUQQkAE4EdR1zWQR4OIRiQiIgAiMlkCULzCjj2vRHG3lra0/G63xx5egmHpVTM27Z+3aPsRxPcz7pmbnZSO3aAp1OibPt7WEC9HW2IO9zxxC3YEGfxiAUbJtoXe04YCrtvWbiYV5S+gdNY/flGUM91a4x/VXBERABMZAQAbgGKDpJSIQTAJxT98hDt8MP/P2mZgBt5pqXj/z1o1HbE2fhTIHhjPp8QKzXx3D0NYQmkEUM4q4vrBw0ged8G8Tk0h6u/uc7GOe4E1pqwd2/YTr+mJh8XA+MHUVjT6G0yeRrz2WiIAIiEASCMgATAJENSEC/iZga/sYgoQZfvFKF1Z/bil1HtU8URauTZVE2LB5+0zXUM37aN5B8wrupB7CpLmzGBZuxfmTTfQMejgR4sjzrvE3+0ba0uRbPEOZvZxhiQiIQPIJyABMPlO1KAI+IdDHcTxHrY6Nx5IskuXpizU5phsLNbtJIiyKx/sHUT7rKhx/+xQaq8972wCMMgRuoV6r76cQ75jeHXqRCIhAYgTsk1QiAiIgAoMIWLj3FWo1dQ71vdSPUa+jjjfMyyaSIpY1vIDayLDveaeIdDO9gD0dNKK8KpbN20/2B37n3np1HOq3CIhAxhOQAZjxU6QOisBEELDQ6j6qrcW7J3abiR8XXBfnyFGUzWDGMI0n22XEs1JGY9u8f5btW7vLs8NQx0VABDKfQCZ+omc+NfVQBHxN4CRH9wa1nHoXNZM/Jqayf7ZG8JSzfRzvOOVh7NazsuBuDonh9sObQHemZ4ehjouACGQ2gUz+ZM9scuqdCPiWgNXjsxDwrdTcDB+lfYRNp9YjlzaTbR9nHsB+C6N6VSzTdwG9rt3cTeXwM14dhfotAiKQ4QRkAGb4BKl7IpB+Aub5M/GK94mZsk5m8GnHC9jd1s0t5Kx0jIfFSr+Uz+fOeduAbf/B3T+OeXgw6roIiEAmEpABmImzoj6JwIQSiJdRsdp7XhAzAE1OobTKahKySMyRRufWs38sE3j5h7gecC3QdJxG4PeA7d+nIcj7EhEQARFIAgEZgEmAqCZEwF8EzACkAeIUX/bCyKwmYSn1IDOB82D7A9uuID1dvV7o/PB9tHWASx8ArvljbpHM+oe2B/C279IQ/IEMweGp6RkREIEECcgATBCUThOB4BDI4VDNqPKKB9CMVSsQ3YVQ1h5Mv2oqor19qN1bz2M+kAIa5Ms+EDMEWYfx/FHXEHz728DJN5Uo4oMp1hBEYCIIyACcCOq6pghkPAGWVIGVU/FKMgW3SnO2pNvJotD5rhfwoA+8gAPfJ1YYetmDwIYvM+9lPZdoMsx98Engtb8H3v0FS8fQMPRy8svAseq+CIhAygnIAEw5Yl1ABLxIII+dti3XvFJU2YpCc72c4wV8F9NXul7Amj11POYzKWQh7iXvA67/M4aI6RksZha01Qy0NYJv/CNrd/+eGDxcC9Fn06XhiECmErBYj0QEREAEBhEwA9Ckk2p19rwgi9nJd6jmBVyBwooC1O2vR+GkfFTMjWc2e2EcCfYxh/NSxdC3aRv3Rj7DjOEzO4CjLwAnXuU2zXfQU7hBewkniFOniUDQCMgDGLQZ13hFICEC8fp/XQmdnRknmRdwHbWT2+m+ggU3zUakIIzqN06gpZ419fws5hW0AtLX/3dgxUeAHNYSPPgU1wr+Oytjn/HzyDU2ERCBMRKQAThGcHqZCPibgBcNQJuRJdQ51IM0/vZg4S3zmBiShcMvV6Oz2UvGrI1lDJJFI7hyOdcJ/ldg1g00/mqArf8GHHoG6O0eQ4N6iQiIgF8JyAD068xqXCIwLgJxA9BCwF4S+0i7k8qECbyFgvLTWHDjbNo+fTj0+6PeLw2T6FRYeHjhPcD6L3CNYBVDwq8Rxz+zQOKBRFvQeSIgAj4nIAPQ5xOcQcP7FftiWQX27RyX+3lnK7WJeoz6VepIwqJo4CInWJVfe81uKoukXSLlfPRj6nnqOeqPqKVUyagIxJMnCkb1qsw4Ocxu3EtlHT28yNqAHZi9bjo6W7pw4PnD6G4PkCeseBpzYz4PLHoPPYA05nf9BNjzmJJEMuONql6IwIQSkAE4ofgDc/FPcaRclORIvK4IV6eD30T4GtUMNDPu/oT6Fepw8hafsG92q1Rsr/kS9X9RufjpgpjBN4U6n7qQOpXK9EhJ4gTMQNpHNcz0HnlSitjrjVSrEbgJlYtzMXNNFTqaOrHv2UPoOE9jKCjCEDhmXuOWj5myDKjbw1yZ7wDtDUEhoHGKgAgMQUAG4BBQdCipBGayta9T/2hQqw/x8WbqE7Hj23nLb6URDcDTfJ6Lmhyx964Zk7awK77K3RZ/3UdlfQzHS2jfcHb//VTrhyQhAvt5lhmBK6lmQHlV7HfAHVQz9n6DacuyMe/62ejp7MW+5w6huTZgpVLySoCr/oDLJPnfoYsOdNtVxNYISkRABAJJQAZgIKc9bYM264HfMo4BeGKIqw62LrJ5jnntLHY3nJjnz8K79q3+NNUMy11UE9bDcAzC+GM7tpNq1ow9J7kiAYvSW2Q9j2pT4XWZxwHEjcDHWQ6mHYtutWNME9l8BI3H7K0UMJnOTOkVNAR7+dtp+3+4BaQDhkDDFQERYIUoQRCBFBKwEK156cyzN1ge54HbqQ9Sc6hXUz9HtfPpqhhWbO1fGdVifF+mfo9qrzWx19nzg8W+5Udqc/D5AX58jGNvpq6g2rT4QcyQNcewyVMomVaLJXctQE5uDo5uOc6ayeZEDphMWQqs/iQHHeJPpB8xLPxuwABouCIgAjIA9R5IFYEFbPjPqYNDv/zGceRV/v0E1c6ppX6T+i2qGYDnqFcS8+p9n7qZamsMTcxyMQ/hYDGD0Z6TjEjA0O+gmiN2+Yhneu/JGewyQ5+OZ/N5FJQdwNK7F2DudbOQWxTPePbeqMbV47I59It/xq0Z+O5jwKm3x9WcXiwCIuAtAn75ie8t6sHo7c0cZgV166Dh/oKPf0r9IpXfOo7yxpFv8O9r1NGs0I/w/Bbn1Qxo8da+zW3x2q7YsdW8tXPsucvkkUceQSRiTzNlYONGRy87KTAHzPgzW9y8f17M/r3SRNnb8QPUJ6mvI7fwMNWcx/b7IP67hHcp0fPnkVVmx30uliW87vO0+38IHPgtt3/mmsA5t9BOHup3lM9ZJDi8TZs2wdSku9t+h0pEwJsELv3U8+YY1OvMJJDPbpUP6Jq9105QH6Y+Q7VQ7QbqO1SzwB6i/iPVYnVbqEOJefrsuSNUe82nqWY0Xk+NG3j8FkOY+jGqXdOMzVaqffMPFCdc3NTUhJISRYeBerL5NdVYfJBqCP0qFvK13yUW9uyj0ghy3orTectFpFu2oOv1N1D4yU8ge/Jk55jv/9jewXt+xv+Vx/m/hoGhaWuA2Tfxd8Ak3w99PANsbm5GaaljLNsfRRnGA1OvTTsBhYDTjjwwF+zgSE8P0FOxkZ/l7XmqeZ+/SW2gmtvpM1QWK7vE+PtXPjZ3TVzm84799Dbj8Rj1Q9R7qdupcbGFTXaNw9RDVLo0LoSIeVdyOQHzYjxPNXv5TqqfjT8Oz3ES38Bb+y1ioe466hNU++1Qh5x587gQoR+dzz7HGwuLB0ByuaR27WeBVVyVUTKT/2v4u+xN/vd8lw77VuMjEQER8BsB+8SXiEAQCcgDeGHWN/PefqoZRRY9D5qY48Y8ggep9pH4IDpf2IXubduQd9ediKxezWMBk/PH+BPr9yymZL+jKFY/0ELDtquI5AIBeQAvoNAdDxLQGkAPTpq6LALJI2BOUjP+ZlOvSl6znmrJfgvcTqWRg8epLyP3xnvRc/Agul5+BTmLFiGroIDHAySWIFJGZ3rTSeD4y1whsNfV8nksrb6KBiE9pzm5AQKioYqA/wjYz12JCASRgDyAThT9Oc59fAlmfhDfB4PGbEtMd1JvQfeuXnQ+8yzy33MfwsvMOAywtJyhIfgKF1fQEIz2sYAYfQeTl7jG4KSFfJwdSDjyAAZy2n0zaP4vloiACASPwAEO+SWqGX+2jFLGHyFQ1lLNAKxFKJ9r4UwCsgzQHewwfy1beMVDQA+X9tYzeaaWjGxLOdMwvaOVzBw3z6CtHwwN7Vfoq69HVlERueq9NgxlHRaBtBKQAZhW3LqYCGQCATNwzNPFhf94L7WMKrmUAPPjolH3UNbQBs2l5wfkUZjG2/T1rnYwl6tul2sMnnqLdQSp+Uz8n0Jj0AzCIhqNA4zBjiefQrShAdnTq5Azf76TbJPFLOvQgHMCQlHDFIGMICADMCOmQZ0QgXQQMFfWm1RLmuYXtZN0bUag5CKBuLtvoAHI+5LLCeTzh8Ocm91yMa0MEce9ghYqNi2oiBmDV6G/cAoi69ai98gR9B3j7iunTjvrK7OKi5HNrOvwggXInjMboexghpIvh6sjIpB6AjIAU89YVxCBDCBgpV74pexkuk7lrYV986iSSwnEDcABR+OewAGHdHcAAfPgWXaw6YJ7mDhygp7B3W6o2DKJqaHCSkSYOBK5fQP689+DvlOn0Hv0KA3Co+jZudPREBNtwkuXILx8ObIqK+UZHIBYd0UgFQRkAKaCqtoUgYwiYOUYN1NbqHOod1L9XuuPQxyTmFFsXqhmZJUucFqwXUEkCRIwY7CMGeWmC/kjo+mYu07Q1g1Wb3Y0FClCTsUi5Fy1GLj5BvQ1t6P3wH70vLsX3e9sczSrYpJjCFryjXkJJSIgAsknIAMw+UzVoghkCIFe9uNtqq35M6OG4Tqn1InWtBHEMGLhXoY2uR11VgVDmJTo2QbnVn9GSSCLLK1sjOmi+1zPYAOTjxpZb7Fmm6vMHs4um8vw70pE1n8U0fpz6Nm7Fz379jkh4q5XXkXO3LkIr1rFdYPzuEmJwvGjnAWdLgLDEpABOCwaPSECXiZwlp1/kdpItZDvbVQzbCRXJjCJpxxEKMLqJtzmq++ssZSMi4CViSmf6yruATrOcQ8gGoJmEJ4/6hScDmWHufXeMmSvXY3cW29Gb/Ux9OzZ44SJLVwcYgZxZOVKhFdeJa/guCZDLxYBl4AMQL0TRMB3BLivq7Ovr61nu4ZqO1nIc0IICYolyJjQCzi5gmvVqtHf04NQWGFzl0sS/lq28Ey+N02ttIyVk6nd4SaSMJkklFuMcCWNvbtuYDL2HejZvRvdO3fF9ml+3fEGRtasoedwjtYKJmE61EQwCcgADOa8a9S+JnCSo2OxXsfrx2K9klEScEO/tEqQPWMGeg8zc/X0aeTQ2JCkgICVlplxtavt9FhbNrEZgydeczSLu5LkzluPyIbP0Ct4Aj27drpeQc6LhYdzb78d2ZPiRnsK+qcmRcCnBGQA+nRiNawgE6iNDT5WyDjIKMY0dtavczymp5Azaw26+Kj3+AkZgGNiOcoXFTD8Pu82YO6tXDN4HDjNPZotgYR7E4dYcDo8bTXC99yMaO8d6HrtNSdxpPf730fuhg2IXHuNvLSjxK3Tg01ABmCw51+j9yUBMwAtc7LQl6NL/aC4+A9TqDUsR3IXw5G56DtxIvWX1RUuEnCyielxtT2Ju5lNbB5BMwZPsIA5NYtZxPm3bOR6wJXofP4FdL3xBo3Bd+kNvA05CxcqLHyRpO6JwLAEZAAOi0ZPiIAXCXSy01xgj4Ve7HwG9XkG+8Lt4LIakT1rphMG7u/sRChPtRPTPkkRbjU363quF7zO8QTiNHccsTWDjYeRM/NaFH70Ia4R3I+uV19Fx+NPODuM5L/vfnkD0z5RuqDXCGhluNdmTP0VgREJxMO/FsaUjJ2AeVBN2lmceCkia9egv8/WVUomjIB5BS2TeMWHgXV/6Baepjcw9NY/IzKtH4Wf/TTCixc7Baa7tthWhxIREIGRCMgDOBIdPScCniPQH+ux1QCUjJ1AU+ylpQgvKacqmWbsLFPwylKubzUj8Mx24MjzwP7HkVUyA3kbP4FoUxO6t77jzFn2VCuBJBEBERiKgDyAQ1HRMRHwLAFL/Milsr4a4sagZwczgR03A5AeJ2ct5QR2Q5cenoB5BKvWAtd+hRnEG7h5yymEql9A3j13O6/pfPY59Gsbv+H56ZnAE5ABGPi3gAD4i4A59RdSrQB0vb+GltbRmAFYgu7uKI4fP44mepUkGUoghz94Fr2HCSNzgVNvITvcxl1F1qGvttbZVi5De61uicCEE5ABOOFToA6IQLIJxMOV5gWUjI2AFX/JQx/X/dXV1aGtrW1szehV6SFg3sAl7+eOhyzWzXBw7jXrnV1cupkYYiFhiQiIwOUEZABezkRHRMDjBCaz/1bM+BBVawHHNpnmSe1FVmzv2ahCiWPDmM5XOTUE73S2mQud2oK8u+5Ef28vut9m+RiJCIjAZQRkAF6GRAdEwOsEbO3aYqp5saqpktETcA3A7Oxs56XmCZR4gEDlCreTnecvluzJ1tecB2ZOXZwAAvqfMQHQdUkRSD2BRbyE/ffen/pL+fIKZgB20wMYcooK93AvYIkHCNTvdTs5eSl69u1z7ocXx5dEeKD/6qIIpJGADMA0wtalRCB9BLi/KriLAk5RW9N3Wd9cycLoHTQAW1BUVITm5mYoDOyBya1ngWiuA+yftJAG4H5nHWBWlWpiemDm1MUJICADcAKg65IikB4Ctg7QSsEogWH0vGfHXlKNsrIyx/gzI1CSwQRazrj7B09ahL4z9ehn4k4O6zeGLEFEIgIicBkBGYCXIdEBEfALASsFY19+k/wyoDSOYzqvZWHg444BaBc+f/683UgykUDbWWDnD/l251cat4zr2RsL/y5bmom9VZ9EICMIyADMiGlQJ0QgFQSsDmA5laUxJKMkYMafFdU+g1yWmcvjHsAtLS2jbEOnp4VAB/e+3vEDoKcDWP5h9NJR27NnD7KnTEH2ZAvlS0RABIYiIANwKCo6JgKeJ8AvQ5jBMsXzI5m4AZgX0ELodc46wK6uLigZZOJmY8grd9LaM+Ovm+/1ZQ+it7sEHb/+DULhMLeFu2fIl+igCIiAS0AGoN4JIuBLAgyJOSIPyNinN76PbC0KCwudZlpblVAzdp5JfmUnCzzv+L5T9w+L34c+VKLjl790LpL/4IPQPsBJ5q3mfEdABqDvplQDEgEjEN8GTh7Asb8fLInGQsFnUFxc7DSjLeHGTjOpr7Q1f9u+C7Q3sOTle9EXmY32X/wS/azXmP+BB5Azw7y3EhEQgZEIyAAciY6eEwHPEjAD0P57mxEjGRsBKwJthkQN1wD2OWHgxsZGZ3u4sbWnVyWFgGX7bv8e65xb2PeD6AvPQftjP0c/Q/QF738/cmbHM7iTcjU1IgK+JSAD0LdTq4EFl4CtW4sngJgHSzJ2AlZEOEo9iMlMKLBagGYESiaIQNMJGn//wV36OoEVH0Fv32S0/+wx9Hd2Iv999yNn/rwJ6pguKwLeIyAD0Htzph6LwBUI1PF5q/1nWayS8RGYw5dbUe19KC8vg20Nd/ZsfH3l+FrWq0dJwMn2ZamXfhrkKz+O3vZ8dPz857TPoyj44IMIL1w4ygZ1uggEm4AMwGDPv0bvSwKHY6Na4MvRpXdQFga2fZWbaPzV0QgsRxsLDLe3t6e3G7oa0HAA6Ot21vxh0nx0vfwK+nt7kbNsGbIV9tU7RARGTUDxoVEj0wtEIJMJWPj3CLWEqgzg5MyUhYF3UPczDLzB8QCaF3C2jI7k4E20lfzYetajL7AwYxlyb78dnU89hZ6dO9F78CBCzNTO4rZ9ocIChAp4n4+zq6qQPb0q0SvoPBEIFAEZgIGabg3W/wS4QN4J/67hrbbASs58WzFtKwlzhOVgrkd+fr6zDnDmzJncK1hBlOQwTqCVCoZ4F98PHN7krAPMmX0TCj/xMXS9+Rb6Tp9Gf2sb+k6edLyCA1sLr1iO3FtvRRbnTSICInCRgAzAiyx0TwR8QEDh39RMom0p9hL3lT3sJIOcOHHCMQItMUSSRgIzrgbK5gJ7fwEcexmhxsPIW3YzsHo+EClCf7iAYeJ+RNva0d/SjO633uauIO+i92g18m67FTlLl2pv4DROly6V2QTkIsjs+VHvUkfAYqQs69aEkhK76xfhongwQxIfp+q/d/JmtYdNMQGBofXe3gewa9duhLnbxIoVK2RQJA9y4i1F+4Dqzdyq+RUmhdiyhwGSHXGMQZTNQf+8O9B7+CQ6N29Gf0cHcubNQ96ddyCrtHTAC8Z+t7m5GaVuW9YgtyWRiIB3COgbwjtzpZ4ml4BPDcAfkJJ9Fz2QXFpqjQS2UHdS78WpUzmoqanB/PnzMWnSJNGZKAKtzHhvOc3Nf5n13s1dWrpjt120xdqZrZ2TB8y/C9Hy5eh66SX0vLsXoZwc5H/og8hhCH+8IgNwvAT1+okkoBDwRNLXtUUgqQToFYHtAaxdEJKK9UJjK3lvD3UbKivfg9raWscILCsr01rAC4zSfKeoEjAdLOYVPLuP5RufAg78lh6/Hci/+X6EmTHc8ZvH0fnkUyj81CcRyqOBKBGBgBLQCuaATryG7UcCZvyZcB2UJAUEitjmYmotw7/1mDZtGjoYVjx27BijkIPCkCm4upocBYEQg1tTlgHXfJnlMK9jcPYk8Pa3kVPcg1yuBYy2tDhh4VG0qFNFwHcEZAD6bko1oOASYAjMERmAqXsPrGbTVhvwJVRVlcG8fw0NDY43MHXXVMtjJpCTCyy6F1j3R5w2rg3c9xt6ARc6awEtOaSH5WMkIhBUAjIAgzrzGrcPCcSLExf6cGyZMiRbX3kTtYXJH89i3rxZTlmYU6dOwdaDSTKUQAmXRSx6j7NOMMSQcN7ddznh385nn2PGsO2aIxGB4BGQARi8OdeIfUsg/t/Z1gJKUkfASsKsop7h7iBbsDC2BVldHRMSJJlLYCrXcFau4DbZe5HVdsQxAi0zuPOZZxTCz9xZU89SSCD+jZHCS6hpERCB9BCwgsUm59wb/U0hgWvZ9gzqfuTm9iGPyQSdnVZ+R5KxBGxd4KL3ArnFTA55EuFZlU5SSO+Ro+jdy4QRiQgEjIAMwIBNuIbrZwL8YoMl9jf6eZAZMjb76Jwb60uDYwB2dXUhGo1mSP/UjSEJRLg+dsn7gd4u2u6/cRJCQgUFTkJIVPs7D4lMB/1LQAagf+c200b2K3bIvh3vHNAx7uuErdQm6jHqV6kjyaf4JCu/ooHKIl94kXoDdaBYbO4Zqj1fT/0ldTY1AGL/ncuo8gCmZ7Lju4C4BqBlAssLmB7y47pKxSJWSlrP/yZHkXV+H/LuuN0pEt31gn2cSEQgOARkAAZnridypGa4xTfijNfL2MBjj1G/RrWV9Q9Q/4T6FepwYnU4/pJqBt1U6q+pT1MtFmfCGA9+R7VibbYD/DyqbeHwKDUgYkWJbVE7PRySFBO4GPK1XUFMuru7U3xNNZ8UAvPvdkPBh59Bzpwq5CxcgJ79+9Fz6HBSmlcjIuAFAjIAvTBL3u6jldv/OpV1GC6Rh/hoM/WJ2NHtvP0OdSQD8Ft8/lmqWTiW6fAPsdureWtSQTVj8LtUM/ysLort37WWGhDROsD0TbStG7PfHAtx7tw5pxh0UZH9RpFkPIEwC0Avvp+h4E6EuB4w7447EMrNRedzz6FfRnzGT586mBwCMgCTw1GtDE3Avh3NGDMD8MQQp9jzAyWbDxZSCwceHOG+rcS3b9wdsXPO8tZCxF+gmsfR4qGfof6CGhCxIZucd2/0N0UEjO9x6mwWg85GCwsLl5eXI4fbjEk8QmDyEmYFX+XsGJLVcQK5N96AfpaE6d4R/zjxyDjUTREYIwEZgGMEp5clROBLPMtCvubZGyyP88Dt1Aep9q1pXrzPUe38EuqVZBZP+E/q31KrqXH5PO9spLZQba3gXOqfUQMiZgObmF0sSQ2BKJvdHGt6DerrbakpN56YMiV2TDeeIbDoPiDM34qHNyF81XJklZSg+8230K+Mbs9MoTo6dgIyAMfOTq8cmcACPv3n1MGh37jX71U+94nYObW8/SbVQrxmAF4pi8G8hL+n/pT6F9S4TOOd16j/H5Wf6iim/o5qxwKwPYahO0A1B+p0qiQ1BHaxWXvLrkR7e4ljABYwk7SwMFHHdWp6pVbHQCDCOZt9M9DZhFDNVkSuv84x/rrf2TaGxvQSEfAWAcUrvDVfXuotP1WdNXlbB3XawrFmuH2R+lhMeePIN/jXjLWLq+vd4wP/Wpbv09R/pv71wCd4/yZqmPqvseO2DvDvqf+TuoL6FvUSeeSRRxCJRJxjGzduhKl3pYZdN8fnaqp+26VmHvvYrL2lS1nyZT2qqw85l5kzZw53Bon/tknNldVqigjMuAY49QYj+i8jvOGP6QEsR/fWrQivXYOsfPsdeals2rQJpiZK+rmUjR55i4A+sbw1X17qrX1yxjMSrN/2XjtBfZhqZVqaqBuo71DNArOkkH+k3kfdQh1KbuDB31K/RrVzB4t5Bt+lfpn6Par9wPkf1D+lzqbaNeNiYeYmCkoY9vGHbOYw9lM/Qh2Ing8lSSLQwHZ+Tl1Lz988HDt2jHsCV2HGDMs9kniOQJQGfQ0/gqpfcraJw1UPo+dsPzqefAq511+P3BuuH3FItv1faWmpnWN/mkc8WU+KQIYRkJsgwybER93p4FhOD9BTsbHZIjVbQW/GmYV97Ru1lvoZKjfrvMT4M0/ek9S4/BXvmLVmnj9zdcX1q7xvYu4YMyT/iFpPtevfTr2fOtD440O/SS8HdIRq69Bk/KVudhtjTVegLbaH7NSpVpFI4ikCZvidpuH3Bj+CDtgqES6fWLgR/ZMWsiZgpzMUrQP01Iyqs2MgYF/CEhFIF4GBPzgsPGtZvCOJhYkHyh0DHwxz/3EeNw2YWN0/Q2oGoCR1BE7Gmq7g+r/TzvIBZf6mjnbSW+7j/5Ez2xmLeA3oOOcmgMy/C/3Tr0bvoaPo+v4PEWVJnxDXc0YYApaIgJ8JyAD08+xqbAEiYDku2dS2AI053UM148+SbKajt7fQ2fXDP8sH0s0yzdfroVfvNJcAn3ydoV7+Hwnz/8u8O9DP9X+9R4+j68c/RbShESGuB7bQb2TdWoS4v7NEBPxMQAagn2dXYwsQAVtiaaVfWgM05nQM1byqFlq3tZWWZGMfmbfi+PETzr6/VvtPksEEutvp7XuVxt/b7v6/eVyqx9Iv/VNXo7f6BLoffQx9LOMT4k4ukWuuQe7V6xEaIvEjg0eoronAmAnIABwzOr1QBDKNgBmAtvRRkhwCx9jMi1QLr5t3dQF1FRobe6mNKCsrw6RJk3hMkpEEGg8De3/lJncUcmnEopu4xm8pt3w7gO5nHnVDvSzcHaHRF9mwAVks5SMRgSARkAEYpNnWWH1OwAxAy7UxgyXX52NNx/AsGT1KpeHQP59r/qJoaGjA2bNnYXv/qvRLOuZgDNfoY0LUkefccG8O/x8s/QD6y5eie9dudP/6P5zdPmzbN/P4Rdavk+E3BsR6iT8IyAD0xzxqFCJAAmYAmlgYWAagg2JcfywbtBI9PYtx8OBBGoAMJ1LyGSI048+MQEkKCViShhlynSwa0E9D3FFm69qtZe32U/PpgS1m0fPiKveWe/ti7y/5X4CFBUpno5/GX291LTp/+V2nwHOosAC5t9yMyKpVzt6/Key9mhaBjCcgAzDjp0gdFIFECbjlK5wvx0RfovNGIGCldXIcw8+MPwv5Ws0/2/VDRZ9HwJaMp5pZwWnXT9zwbS4rP4VYQOCCcr1riCF5MwDPVwONhy69op1nCR6V69H5wmaGfPczq7cAeXffhfDy5Qhpv+ZLeelRYAnIAAzs1Gvg/iLQzeEcpFbE1F+jS/9oaFzAdv3IoZ1h91ldkQkf2u7NQZHaPw006Pb8jAYePX1X/QHX7S2mIdjtzkOUx+KanY1QQT5C7WdZEZQGY2uNazDOuhG95/vQ8cMfo7+1FTkLF9D4u1uh3tTOmlr3IAEZgB6cNHVZBC4nYOVJzAi8imoZwZLxETDjzyT7ggEor59LJKV/a1ijbz/LeNravas+gZ66TnQ++i3091g29uViGbvZLMSdVVmJ7GmLkTW9Aj3bdnIrt3eczN68jfcgvGKFPLaXo9MREXBqGgiDCIiApwmYh2o31db9LfT0SDKn8/FwesQp92L9kgGY4tk59oq75i+vjMnWH0f3wVMM4b7oePnCS5cyAszQrqP8gWO33T3oq6tD74kT3Mqt+pLOZU+fjvz77kUWw/YSERCBoQnIAzg0Fx0VAQ8R4Begs9PdGt7qv3RyJq451kwJo4/mWeWG1SwSLEkRAUvasISPoqnoX0njb+tudL3+OrIYdi/44IMjGnL9fX0s4tyAvtpa59ZeE1650jUYU9RdNSsCfiCgbws/zKLGEGAC5v3jnqZOnboVAeaQ7KHbNtMmxejqsrI69K+ydIgkRQS6YrwnL0W0sc01/ioqUPCRD19x7V6IawGzLQRMlYiACCROgH50iQiIgHcJnGTX6T3BEmq8DIx3R5M5Pb/UALT9frXnbwpnp3weLWxm+9a8g6xJZe42bPTsaTu2FDJX04EnIAMw8G8BAfAuAfP+vU1lSQys9e4wMrLnZxyu/f0ljgdQ4d8UT1IW38Mzr2UN8xaEzu1HZM0aRM+fRy/rL0pEQARSQ0AGYGq4qlURSAOB47xGHXUpVd6/5AG3NX9mAM5AZ2evswawqEh8k8d3mJaq1vO3DNdZntyC8No1Tr2+7jfeRH+v1WOUiIAIJJuADMBkE1V7IpAWAh28yhaqvH/Jx82ack4NwFloampymi8tLU3+ZdTipQTCeUAVPdlMCMnqPIPw6lXoq69H+08eRR+335OIgAgkl4AMwOTyVGsikAYCZvz9lmrGyXXUQqokeQTiYcfZjgGYxZIjxcXFyWteLQ1PYCbfzyGWeTn6PHKv30C9Hn3M8G374Y/Q9fbWCzUZh29Az4iACCRKQAZgoqR0nghkBAEz/n5HbWMYzCIAAEAASURBVKRyzZRT+Jk3kiQRsOSPo9RZXPuXi1buJGHePzMCJWkgkF/OyDvf182nENr6beQum4bCh/8AWZyDrpdeQvtjP0c05pVNQ290CRHwNQF9qvl6ejU4fxGw4sRm/DVQzfizun+S5BLYw+YsuWYl6lhk2LaBmzJlSnIvodZGJrBwI5e1PgD08v2+4wfIbt+Dwo89jMjq1ehj0ee27/8A3Tt2yBs4MkU9KwJXJCAD8IqIdIIIZAqB37MjMv5SNxuWbLCPWo6+viqc5bqzfG41pvBv6ogP2bKFgG0t4NVfZBnG6cDxVxDa/UPk3bAGBR/6oFMapvO5511vIDOFJSIgAmMjIANwbNz0KhGYAAL2ZVdGlecvNfAt/GtFn+eisfEcjcA+VLK4sLaASw3tK7ZaMInVjT4HzLmZiSE1wFv/gpzQSRR+8uMIr2KCiHkDf/BDdG/fLm/gFWHqBBG4nIAMwMuZ6IgIZCgBM05yM7RvfuiWu+MHkMfyLxZuB0pKWJxYMnEErD7g/Dv5m+eznBb++OF2caHdP0D+tctQ8NCHXG/g8y+gd//+ieujriwCHiUgA9CjE6duB5GADMDUzrpr9JmRbd4/E+3+kVriCbdeNtsNCc+9FWiv5+6H30FO/zEUMEHEpLe62rnVHxEQgcQJyABMnJXOFIEJJGDr08wokQcwdZNw0QPYy+LDFvpV9m/qaI+65WxuXT/vdmD9fwEKJgPVL3Kf4FyEWKQ7Wq86gaPmqRcEnoAMwMC/BQTAGwTixgl3SpCkiEB8/988xwNo3j+t/0sR6vE0Gy5gbH4Wk7WZrd1Sg2xmaVuh6P6Y13Y8Teu1IhAkAvxJJREBEch8ArY9mYk8gC6HZP+10i8HqAWIRidxDSB3ogiHk30RtTcWAmbonWV29pkdNPi4S0tX88VW+rqQZWV6jh5F9Nw5ZE+mZ1AiAiKQEAEZgAlh0kkiMNEE4gagPICpmYlTbNY8gGu5+0crenp6nAzg1FxLrSZMoJO73Rx8kgYgkzxCDFgV0tibtMAtD1M8g57A6UwEcQ3CaGOjDMCEwepEEeAaZ0EQARHwAgE3KcHd+9cL/fVaH/fGOryU9f9qndDvZHmTJm4So1Hg9FvM+n2eS1/542fqSmDBRkR7Q4jW1qHv+Bn01b6JvjO16G9rQ4je2uxp0yauv7qyCHiQgAxAD06auhxEAvxCdETLdpM/++b5q6a62781NzejrKxMIeDkg06sxQ7Wu3z359wO7qRb+mXFh9EXLUPnL55AX03NxTa4PV92RQWy5s9HZM1qZKlkz0U2uicCCRCQAZgAJJ0iAhNPQAZg6uZgJ5s2vqsubP8m71/qaF+x5YO/c42/Wdejf/Yt6H57O7re4DFKeNkyZE+vQvbUqc7avxATdSQiIAJjI6D/PWPjpleJQJoJxA1AFsaVJJGA1f5jggEq0Ns7leHf3c72byoAnUTEo22qndsdFlaif+6daH/0p+jjnsxZ9PTl37tRYd7RstT5IjACARmAI8DRUyKQOQTiawC5T6okiQTeZVtWY3E1jb8Gp/zLNK4lU/mXJCIebVO25i9SxDV+tY7xZ16/vI33IJStHz+jRanzRWAkAlpQNBIdPScCGUNAhl/yp8IMvz1UFhKOzkUtDY5IJILy8vLkX0otJk7ADMBsZrt3u5nv2bNmyvhLnJ7OFIGECcgATBiVThSBiSQQNwCtXp0kOQQOsZl26ko0NjZdKP2i3T+SQ3dMrVjNv5gB2M9SPCZa5zcmknqRCFyRgAzAKyLSCSKQCQRkACZ3Fsz7t52ayw0lluDMmTPIZohxihUVlkwcATP+THI4L92uAYiwal+6UPRXBJJLQAZgcnmqNRFIEYH4f9V4MkiKLhOYZndzpCwyzLV/TU0d3Pmj0zH+zAiUTCABK/1iwjWA6HGNwVBEO7K4UPRXBJJLIP6tktxW1ZoIiECSCcgDmDygrWxqK7WUa/9W4OTJk7Cwb2VlZfIuoZZGT8DCv9UvuTt+VK1Hb3W104bq+40epV4hAokQkAGYCCWdIwITTkAGYPKm4HU2ZSHgG1n3r9Hx/lVVVTkJIMm7hloaNYHz1XTKHgemrUFfUyd6jxxFzqJFyGJRbokIiEDyCcgATD5TtSgCKSSgJJDxwbUQ42HqXCaZTsXp06eRl5eHqSwsLJlAAo73b7Pr/ZtzM7peNyOdKzSvv8651R8REIHkE5ABmHymalEEUkCgLdZmYQraDkqTVkvxVaqt87sBJ06cYAg4ilmzZjkh4KBQyMhxmvfv/DF6/1ajr7kbvYePIGfhQmQrKScjp0ud8gcBGYD+mEeNwvcEbL9aEy6Ol4yRwC6+jvvMYi2am/tx7tw5Z8/f0tLSMbanlyWNwHEa5iF+Hc3h1m9vvuU0m7thQ9KaV0MiIAKXE5ABeDkTHRGBDCRgiQsmMgBdDqP9a96/HdRiev1W4vjx447Xz7x/kgwg0MHt3yL0bocLESp0vdydmzcj2m51GiUiIAKpICADMBVU1aYIJJ2AGYBWDy036S0Ho0Fb+2f7/i5j0edmJ/HDtnzLzRXPjJj/qauALnq5t38PuTdejQi9f301NWj/yaPoa2zMiC6qEyLgNwIyAP02oxqPTwmYAWjev3g2sE+HmbJhHYy1vBANDQ0q+5IyzmNseO5tzMuhttQg9M6/I2899/+9+y5EW1rQ/uhP0b1tGwtDx4pEj/ESepkIiMClBGQAXspDj0QgAwlY5q8ZgMUZ2DcvdMkMh2pqFbq6ImihUVHG0iI5OTle6Hww+hjiD5t5twFLH6AnsBnY9u+IzC5DwQf4mM91vvAiWv/Pd9D58iuItsaXQwQDjUYpAqkiIAMwVWTVrggkjYCVLbE1bCVJazFYDR2N8VvkeP9s7BUVFcFC4JXRVq3l1swfA6J8v+/4AXIiDSj6/GeRd+cdCOXnM0HkTccQ7HjqKfTV1XllVOqnCGQkARmAGTktvuzUrzgq28fszgGju5/3bUsG25OLNSDwVepI8ik++QqVK8Zxlvoi9QbqYPkMD1jKp7kKaqn/QPWo2DBfohZQuU5KMgYCFv7N5p6/c7n+rxHhcBglJTKmxwAyPS+pWMhE7c8yISQfOPBbhN7+J0TKmlD48Q8j/4EHkD19Onre3Yu2H/7oQr3A9HRMVxEBfxFQDMRf85mpozHDjZ/mjsQrGVuNh8eoH6E+QV1DfYpqBe++SR1KbBHcX1Jfo9qK/j+mPk1dRj1FNfkz6pepn6Ruodoq/6VUD4plQG6iGrJ7qDZ8yegIWNmX09S5aGvrc5I/rOhzyEKOkswlUFwFbOB/45p3+D/7DeDoiwgdexlhJouE33sb+lqj6Hz2OXS9yo8C7t+skjGZO5XqWeYS0Kdg5s6NX3o2kwOx6rs3UY9R76K+QP07qrm07qPG5eu88wfUxfEDCdye4zmfof6Gam4dMwQfpv6OOpLYuU2UDPUGWcj3t9Qz1NuoS6iS0REwhvbbwkKF72Pplx5u/VaH5cuXo6DAPKoSTxBgsW6c3Quc5O4gTSfcLs/YgOjM29H+s8cQZVJP3u23I7KO4eM0S3NzM2J1JEt5aS5elIiAdwgoBOydufJiT+0HxnepZtjFPrkvGcbgHyDZfJbxH7iFwC45dcgH1/KoucV2xJ61cLC91qylA9RaqnkIzdD0kJjH7xWqGX/WdRl/hDAG2cbX2FtgFdrbS3H27FnH8MvnWjKJhwhk8WuqcgWw7vPUPwTK5vJn3lvIOvkiCh76ELImTULniy+ie+dODw1KXRWBiScgA3Di58DPPfgSB2fWzHeGGOTjPHY79UFqDvVq6ueodr55564ks3jCf1L/llpNNZns3uAB3t5KnUPdTjUjMJE2eVomiIUs91HNeWo2rmT0BIzhO9QKFn5eh6NHj3INYD9mz56t8O/oYWbOK0r5f2LVx4Hy+a4RWPMKCj70QWRxN5fO555H75GjmdNX9UQEMpyAffFKRCAVBBaw0T+nXjeo8bjXz8LCn4id8x3emsfuW9S/oFpYdyRZyCefpf6UaufHJR6C+RseqIkdfIS3X6FeT7UFdZfII488gkgk4hzbuHEjTCdezsa6sI63+o02+vmwdX/PUMPUO3Hy5Bl0dHRgxowZKCrSOsrR88ywV2RzXq96mGleP3bCwllZ2Sj48ENOUkjHM8+g6NOfcjKGU9XrTZs2wdSkW7UJU4VZ7aaBQPzLOA2X0iUCRuAzHO+3qXGjzIZfEXtshtsX7cAg+QYfr6feMuj4wIcWEzWP3j9T/3rgE7xvXsFj1PuocWPPwsrWhw8OOMa7jkcwQ9cA/p7d45onJ49Fa9VsshKXDp76a6olgN/L/X6LcPjwYRQXF2Px4sXy/iUOMvPP7O0Cdv7IXRe4/CF017NeIA2z8PJlyL/PPgJSL1oDmHrGukLqCMi9kDq2QW/ZwrPzqKtjuiYG5Au8/SrVfnxcQzUvtFk5n6J+lvo/qMPJDXxiM/X/pQ42/njIWWdo3/7m9auk5lK/Tm2kvkr1iDSxn+aVzPdIfzOlm5b0YXa/2fs3obW13An9WtmXefPmyfjLlGlKVj9y+N/bPIFhfnwc/B3Ci2YjZ/48p0RMz6HDybqK2hEB3xKQAejbqZ3wgZkr5vQAPRXrkcU3LUZnht83qVbTr5b6Gep7qFuocflX3nky/oC3f0W1tXxm/LUMUDMo4/Jp3jlE3Ue1a5rhaXFdcwl5RMwALKWajSxJnIB5Te2ttIo7fsx3PH/22oULF14I89tjiY8IRJjztfh+oKcDIdYMzLvzToS4v3Pnc88iyrC/RAREYHgC9iUsEYF0ERj4g6OHF732ChceHCa+4wrn29NmGH4+pvbYY2JYrBRilcf6PdHdNW7bqIVM+liPQ4cOore3FwsWLEBhYaJJ5RM9Bl1/TAQql7NMzEra/ruQNWU5cm+7zQkF97yzDbk3WtBAIgIiMBSBgV/IQz2vYyIgAmklEHeUmgdQkjiB3Ty1nbqW2701OUkfVVVVzp6/ibehMz1LYBGDBxEm+BziGsAlC5HFNZ/du3ah32oISkRABIYkIANwSCw6KAITQeAkL/o8NUxdMBEd8Og1mQzglIIsofdvMWpqapzt3mzHD0lACNi2cbNvYii4HaGGfQivWon+tjaWhTkSEAAapgiMnoAMwNEz0ytEIAUEqtnm09Rs6nup5VRJYgSO8TQzAteivr7RKc0xbdo07hBmLCWBITCN+WZWIoZFosNXXcUKSlno2bEzMMPXQEVgtARkAI6WmM4XgaQTsJwVK2tomb9c0A55rghhFFIXO3cGy76cQ05ODqZMmTKK1+tUXxAwL2AlDb/mk8jqb3UygnuPHUOU2z1KREAELicgA/ByJjoiAmkiYGVLdlFfoPLLC++nxjcz4V1JggQs87eA4d8CbvnW7iR9ZNn2YZLgEZh+tTvm028jspIlQ7n7S8/+/cHjoBGLQAIElAWcACSdIgLJJdDJ5vZS91At49cq25jnr5gqGR0By/5tpM6m8ddBIzCqrN/RAfTX2cXT+VuggnsJHUH2mrucsUUbrNKURAREYDABGYCDieixCKSMgJU/NI/fAWov1cqTWCWcZVSrWS0ZPQFb+zebOssx/uz1WvtnFAIqIdbOLOQSirN7EQrnIFRIz3DjuYDC0LBFYGQCMgBH5qNnRSBJBKxMyauxtmx9GsNTzkYpSlSIQRnjTRFfZ3W++b1f2Ofs9tHa2gplADtIgvmngMsoGPpFRwOyyichWlfHh/3aCSaY7waNegQCMgBHgKOnRCA5BM6wGdvgxGr73Ua1JA/t8kEIyRH7so/20fOXg4KCArS0tOgLPzlkvdlKYSwBqK0eWZMmoe/kSackTKjIfixIREAE4gS0UjpOQrcikBICtt7vOar9V7ubOo0q448QxiSt3S3o6O249LUdDPH9/q+AI8+jiF/ytgNIV5eFhiWBJGAeQJP2s8imAWgSbbR1ohIREIGBBGQADqSh+yKQVAL0TDkZvpbowSK14OJ0ybgIvFX7Fn575Al09ZphHZO+mLGXHXEKQNtRMwIlASWQYxn1lL5uLq210kqMCPfo/eCA0B8RGEBABuAAGLorAskl8C6bO0FdSl2S3KYD2NqZtjOoaa3BjKIZyM3Ju0ggbgxm5yoR5CKV4N7rt/JKlCyur+1z74dytNbWhaK/InCRgAzAiyx0TwSSTCBefuKaJLcbvOZsEf/2+m3ICmVh1WRLoBkgvTEPYE4uv+/dL3xlAg/gE7S70Zi3L4tL3HtjxqB2hQnau0DjTYCADMAEIOkUERgbgfhav/jt2FrRq4DjLcfQ2NGIReWLUBQZVC/xQgj4ogGoQtABftfEDcBQNvqZHGQSkgEY4DeEhj4cARmAw5HRcREQgYwg0MeQ3o76HQhzn9erKrjV12CJh4O7mpCX54aG29ps3aUkkARiRh8cD2DcG6ivukC+FzToEQnof8WIePSkCIyHQNzzZ8kgkrESOHTuIFq7W7F80vJL1/7FGyyb6673OrsfZWVlztHz563otiSQBCKxci9ttciqcBOveo8fDyQKDVoERiIgA3AkOnpOBJJCQAbgWDG29bRh19mdyGdm55JJlkwzhHDtH8rnA+erkce1/uYFNAPQ1g1KAkiggKVfbEu4+neRM3c2Qvn56Nm9R++HAL4VNOSRCcgAHJmPnhWBcRCQB3Ac8BDtj+L106+hu68H11RdixwL6Q0nFcyy5vloPIjy8nL09PSgqalpuLN13O8EpjJRiMlBoXOHEF621KkD2He6xu+j1vhEYFQEZACOCpdOFoFECNjCcwtBxsOQcUMwkdfqnDiBfY17Udte5yR+WOmXEWUyDUBmCOP0VlROmQJLAjl9+rS8PiNC8/GTlVwrau+H2p0IX+WuG+155x0fD1hDE4HRExjhJ/XoG9MrRCA4BFhkFs3DaCuPx8OPDEUhVpiW9ySJEWjoOIudTPwozS3F2sp1V35RLjODp60GarYh3HoSU2gE1tbWOl7A+LrAKzeiM3xDIJfrAG1ZQOMhZC++HzkL5qPnwAHkHD6CMO9LREAEABmAeheIwGUEzIDbTLX6cgwrwjx6pgPvD7WzQJjnlFDnxm5tGyr7spEHkBASlp5oD7Yw9Gvcbph+w8ih34GtzrkFOLMDqH4RU1d8AvX19Y4XsLS0FKGQ5mAgqkDcn3mdYwDi4O+Qd8d70XbyFDqffRY5Mz6NUCxbPBAcNEgRGIaADMBhwOhwkAns4+BPUQupZtTZfxMmGjj7+dqOAqZWbsTq0ZUOuLVjMjQIYVyyvW4bmrnn77qp61CeZ0Z0gpJfDlTRW3j6bUTaTqKCGaBmBNq+wPHyMAm2pNP8QKBiITB1JcPAu5BVuRK5t92Kzk3PoHPzZuTfe68fRqgxiMC4CMgAHBc+vdh/BCx0e4RqYduPUbmOSJI2ArUs3XGQZV+mFlRiSfkwWb8j9WbmtY4BaKG/4kkbHAPQagLKABwJmo+fW3gfvYCHgYNPIrzhv6L3wDz07GF28Pz5CC9e7OOBa2gicGUC+na7MiOdESgCjRztOeo8qv57pHPqe7mDw5tn3mDIN5tZv9eNLWxbMJkOW3pim0+hoKDA6X57e3s6h6FrZRKBCN8Di94D9LQjZKHge+52ysJ0Pvscoi0tmdRT9UUE0k5A33BpR64LZjaBo7HuLcjsbvqwd5b00cLQ76opq1E8eLu3RMdra/2sBlxrDXIjYeTk5EC7giQKz6fnVa4ATOv3IqvloGME9nd2ovPpTcoS9+mUa1iJEZABmBgnnRUYAvE1fJblK0kXgbPM+t1/bj8m50/G4nKWdBmPlLBkDGsHhtrqUVhYCPMA9vVZEo8kkATsRwEzgZHLBK2DTyE8fRLCK1fCdgfpfv31QCLRoEXACMgA1PtABC4hYMaH/bfYfclRPUgdgT7u3fpGzetMnwnhWoZ+s6x+23ikdLb7aq4DtAzgaDSqotDj4emH14a5pnfZg0zk7wH2/hJ5t96MbJYK6nptC3oOcY2gRAQCSGCcn7QBJKYh+5wA64c56/8sC9jWA0pSTWBH/XY0dTVh5eSVTt2/cV/P6r/ZF37dbmdvYCsBo72Bx03V+w2Uc13vrBu4PvQkQtXPIf+B97vrAZ96Cn0NDd4fn0YgAqMkIANwlMB0ehAIuDsHAHuCMNgJHePp1lPY17jPCf0uq1ienL4wiQSTmUHcegaR3hYnDGzbwpknUBJwAvPuBCZxfS9LBWW1HkD+/e9Ff28vOn7zOPpZLkgiAkEiIAMwSLOtsSZIYCrPm0I9QO1M8DU6bbQEOno78DpDv5HsMAs+3zj+0O/ADthWYCb0AtrewLYGsLm52T2mv8ElwC0CsfwhVnlifUmuB8wpjiL3ppsQPXcO3du3B5eLRh5IAjIAAzntGvTIBCwRhNuKwXb7eGvkU/XsmAj09/fj9dNb0NnbiWumXYuiiIXekyilc9zG2s9eqAHYS0+PRASc5QFXPcylviyDy/WAkTUrkVVSgu6t76C/W8lfeocEh4AMwODMtUY6KgLzeXYVdS+1blSv1MlXJrCvcS9q2mqwoGwBZpfEjLUrv2wUZ1hBbwoTSszYlIjAJQSKKrnU93bu9tiMUO12RK7ZgP6ODnTv2HnJaXogAn4mIAPQz7OrsY2DgHkBb6La7StUrR8jhKRIA0u+WOJHCctyrJu6PiltXtZIf2y+BmQUaz/gyygF+8D0qwHzPB97GeGlixFiyaDurW+jv4eZwhIRCAABGYABmGQNcawEuE4I3EsU9VTbH1gyXgLnOs/hpZMvsZkQbuS6v3CW7bWcAokbgLxOlq37oqggdAo4e7lJrj3FnJuB7laE6rYjdwO9gG3t6Nmn/+tenlb1PXECMgATZ6UzA0lgHUddSH2Tqi3FxvMWMM/fC8efQ3dfN26acTPK88zATpFkR7glXC5w/iiK8yMoLi5GXV2d6gGmCLdnm62iB9reJ2f3IXuOWz+yv1lbxHl2PtXxURGQATgqXDo5eARoSOBGqpWIsFCw1pMRwqilrr0OL5x4AX39fbh11m2YWTxz1G2M6gVWCsZKfnScQ+jQ05g3b56zLVx1dTW6tdB/VCh9fXI2E0Fs72juQw17z1D6VS7I11OuwV0kIAPwIgvdE4FhCMzjcdYOw1HqkWHO0eHhCFiyx2Yafya3zboDVYWWXJMGmbEBqFgEnOEi/3MHMHv2bPRwfdehQ4egjOA08PfKJUI0/LgbTSjL1vtSeF8iAkEgIAMwCLOsMSaBgHkB6SlwvIAdSWgvGE2cbDmBl05sRja/ZO+g8VdZwOzLdIntAbvkAS70Zwj/wG8xKTeKGTNmOHsDmxGo/YHTNREZfh3z/NEzzcWibkflAczwCVP3kkVABmCySKodnxPg1mJOKNgKQ7/q87GOf3hRJmHsqt+Jl0+9zELPEdwx+y5U5E8ef8OjbSGXWZ5LuQcs1x1ix/cxrTSCadOmobW1FYcPH9buIKPl6cfzrUyQ6QUDkPclIhAAAjIAAzDJGmKyCFgYeC7VNo+3cLBkKALtPe14kSHfXWd3oSy3DHfPuYcJH+VDnZqeYxULgWUfdLM9d/wAMyoKMWXKFGdnEEsMkQSYQB/X/nVwz++CCkS5XaBJqMiSviQi4H8CMgD9P8caYdII2Bohqw3IrEEnFGzeQMlAArbe7+nqp1DbVotF5Ytwz5yNKI4UDzxlYu5P5dZwSz/gFv7d+SPMmjkD4XAY9fX1KhQ9MTOSGVdt4w8AKxlUVIW+mjNOn7LpIZaIQBAIyAAMwixrjEkkYN6B66lWEmZLEtv1dlMW8rXizptPvOhk+t404yZsmHYNsmOZlRkxumnc3m826761NyCr8SAmT56Mrq4u7RGcEZMzQZ1odY0+FE1DtLbW6UT2VNsLXCIC/icgA9D/c6wRJp3AYrZoNcMOUI8lvXWvNWgh3xeOP489Z/c4od775t6Xou3dkkBmxjVuuY9TbzphYNsdRGHgJHD1ahPNJ9yeF9MDeOYMssrLEcqzZC+JCPifAIsgSURABEZHwELB9CThMerLVAsZWVg4WGJ77B5uOoRtddvQ09eDJZOWYM2UtZnl9Rs8JZYUMmU5ULsLkZ4mlJaWOsWhrSxMTo4+Dgfj8vXjVnr8zuwAiqczGSiM6PnzCC9b5usha3AiMJCAPIADaei+CCRMgIYErqO2UXcl/Cq/nNjc1YTnuavHmzVvOtu5WXHn9VOvzmzjLw5/2lr33tn9KCkpcdYAWlawJEAErNTL/ic4YGb8Lnkful9/wxl8zpw5AYKgoQadgAzAoL8D0jf+X/FS/NTFnQMueT/vb6Va+p3FUr9KHUk+xSdfoTZQz1JfpN5AHUpKeLCaatdM0ft8CZsupe6mssxIAMR28th9djeeYqKH7e5hiR7vnXc/ZhTN8M7oS2fzHUFvn20Txy3iTFpatP2XdyZwnD3t5vrdY78Hmk8CM69Hb3MU3du3I3vGdOQslwdwnHT1cg8RUMzDQ5Pl4a6a4ZYf6z9/cjvCbRqcGOpHeGs/xddQn6KaS+2b1KHE3G5/SX2N2kn9Y+rTVPvUPkUdKP+bD/ZRZw08mNz7ZlcysQD8MsHe2H3e+FRsL983zryB853nUZpbimuY5DElnYWdk8XVtv8q5dui6TjyImEnG1gewGTBnaB2mNhjO77gPH9HhvlRE+FHRVzDTNzqZfH2Jq73szV/dq5JXhn6Z96Izp/8zKkBmHfPRtiaUIkIBIWADMCgzPTEjdM2ff061eqnmJcvLg/xzmaqGX8m/PTGd6hfoQ5nAH6Lzw2Uf+CDr1Gvpg40AN/Hxyuoj1DvoaZQFrHtrdSdVLuk//5L9UR7sLN+Bw5wO7UQ/62cvBLLK1Z4I9zLGRlSzAt47ihC7WeRx0X/HR00ECTeItBLr3v9HqBmm2PMO51n0XFnX18r7TKU5JcDU1cBJfxYmrIMXa+/jei5c8i95RZkT+JzEhEIEAH/fVsFaPI8MFT7Of1dqhmA/Ol9mQz+uZ3NMxZS+ZPd8QRe9oJBB67lY/MK7hhwvIL3zYB8D7VywPEU3bX/QvxCcUrCHOAtEwx8JGfazuCNmtfR1tOGydzJ45qqa53izp4fIr0/jnQ1Ox5ACwFHuS4sK74bhOcH6OMB9ND5f/gZoI5LL2yHFwvnT13JXKy16C+b63rxemjQd7e6yvcussKO0ReNZiPKen99x6lvPIve6mpY3b/I+nU+BqahicDQBGQADs1FR5ND4EtsxkK+5tkbLI/zwH+jPkg1L+Aa6ueodr6t37NQ8Ehiod3/pP4ttZoal3/hnX+jvktNgwFol7UI9DtUs0OXUi007G0xr992ZvcePHcQOazlt37qeq73W4yskPfH5sxMrr3FKExmycmZ6ty1TOBIhB4kSeYSMK/frh+74Vxm76JqHforV6DvdB16Xt2FnsNPIMRs7lBhIUIFBcii2v1+enj7zrzmZPpeGByN/exZs5B/910IyfC/gEV3gkNABmBw5jrdI13AC/459bpBF457/V7l8U/EzjED8QDVQrx/QT1HHUkW8slnqT+l2vlxeZh35lM/Gj8Qu41fc9BhxogfeeTCl/7GjRthOnqhd8FxXDIc5XTdnJDelYFev6lc43dt1XUoyoTdPJKJlJ4/R+g9yup3jVoZgMkEnIK2bNu23fwvb2v5Zt+IaNWN6Nm9Gz1PP3rBsLNEDvAHS397G6INDeg7efJCR6zGX5hJHubxM82qrEQo24IOo5NNmzbB1KS7mwapRAQ8SmDYL0aPjkfdzhwCn2FXvk2NfdM6HTPLyB6b4fZF58ilf77Bh+upt1x6+JJHFm99mvrP1L++5Bnge3z8YSrjP46YZWaungbqn1J/SI2LHW+iOKVA4gfHdtvFlz1G5RcUPvb/t3ceQHKdx53vyTObAzYn5BwJECQAElwSzKJE0qbC2aIMuU46+e58tktVVzo5nFyOVVd3OktnleyzeSVTUomkmMQIEswBAEEQRM7A5oDNYXZ38v37zQ44WO4udhczsxP+jWrMm/fefO/7fm9mp6e/r7uhqelFmuj121i6SZYVLE/PhfGH8VYZbJXQ9u/KybMXxefzyfr16zkFjHdvUkowAOMPDv8e/E6sulGCpTvE/asnJOR2G54+25o1Yl+31kjkHN3/UCAAY3Ak7BV0uaIPxWR7cHDQyCWJxvKh0X/rYtI+GyGBeBKgBzCedDO7bZ2efS0Kgf7YwE93+fb4fn1+I/QTqFpMGhTyTeh90KlkOw68CP0B9EfQifIn2PGnUTv1fIT4yQ1QNQLjJAfQrht6GzQ1jb+JXr+t8PolRQ3feNyxUTiYNVoU68ZGvEEjAKQU3iCu/4sH7Bi0iYTjcuqZsPGHcn7Byttk5IknDcPOuesOsa1bN6UnTz18pvFUPzHoCZsggbQiQAMwrW5nUg1GvXART1x0x7rxpB+q3rkfQ1dCdQ7uIFQDN/ZBI/JTbNRCdb/KX0PVc6eev2jvn27/PVTbVY2IXgvfHkaEcDCyM7aPrWjuFFTz4K2IbdMJau0consPdhw01vptKd+Svl6/CE94/gwpXi59iABVKS5O7Wl7YxDp+l8XPl+XTxhRu6GF98joU08bU77OO3eJfcOGdB01x0UCcSdAAzDuiHmBKALREQQ+7L8p6thkmxOnie+Y7KRp9r2NY7Nf5DNNg1cf0inf96D6MboVqk7N1JIx/5hRyi0HOdNur7kjfb1+0bcFqV8MyVogI+1DhucvC8EClCQlEFmvWXWTjL33gQS6usSxYzuNvyS9XexW6hCI/kJOnV6zpySQFAR0RnsAqk5MXQKUenK8+5j4g36jhm/aTvlOvC0RA9BVLB6Px8gDyATAEyEl0XOrI9wZpHzRaF4sShX7Tdf67ZhE/WdXSCBJCdAATNIbw26lAgGd9tWF5Reh6tBMLRnyDsn5/nNGfr+aXM2qkyGC1C9GtQiLzagDrAEgAQQLUJKUgNUZ7ljAIyYXtnVN4NhYknaW3SKB1CFAAzB17hV7mnQENOBjC3QEqjkAU0u0ukcQX6YbSjamZ6TvVLdDq0BoomAkEq6oqDAigNvb26c6m/vnm4Bl3AOI5QomVG1RCdEAnO+7wuunAQEagGlwEzmE+SSg078FUDUANRI4NaRntEcaBxulKqdKyrLLUqPTseplLdZrar1YVJNYUJgnuv7v8uXLcCrRqxQrxDFtJ+IB9KsHUD3uSLjUOh7IE9MLsTESyCwCNAAz635ztDEnoB+hm6EaEKKBzMkvIXj9Pu06bHj91pdkYBSlHQEfi3ahCsiQmBrfk9raWqMMXEtU0uDkv4sZ1EM11lXcnWJbjryU2Vky9vpe8Z0+Hd7P/0mABOZEgAbgnLDxRSQQTUAz1eh6QCSplbboA0m53THSIZ34Ml2Ut0gKnYVJ2ce4dwolxCS3QqRln+SYPVJUVCT9/f0yPIz6sZTkIqB1m/OxRrXzmJh7D0vWV75qJH8effkV8Z3Qio8UEiCBuRCgATgXanwNCVxFQNO/3ALVjDNvQbUyyOwk5EPFgkCcUhVO6MrJnhNiQbmsdSXrJxzJoKda+3XpvSJaYaLhbamsrDQ8oq2YWlQPKSWJCCDqV9b9Tthgx72yDByR7K98Wcw5OTKKkmyqQRruSXTD2JVUIUADMFXuFPuZ5AR0HeA2qHqQPpxVX0PBoASOdUrgSIeEvPGPRtXo3wJHgWTbsmfVz7Q7uaAOGaCXGZ4lp6/fSAY9NDQkWt6LkmQEdBp4wzeuGIHm/iOS9dWviKW6GvWAT4j7Xx8Tz4f78PnxJlnH2R0SSF4CNACT996wZylHYBV6rNPBOhV8cUa9V29TwOcVU4FLQoMeCXzShvqm8f0S05q/NrNtRv1L+5MW3REe4qU3DS+gloNraGgQLw2J5Lv1E43A1r2S9aW7xfXgg2LKyxPPvn0y/NhjMvriS+L54EPxnTwlAUR3M2I4+W4le5QcBFgJJDnuA3uRFgR0Kvg26FPQd6EaXTu9l63j6Icy1HZJ6m59AIGpCyR4tkcCh9vFvAa1aQvHF7+jlViJGpya+JkG4DhRXQdYusYoNWbH2shFixbJhQsX5Pz587JixQqxoJYsJYkIRIxArQ2MNYGm7tNiq9kh1t/9GtYDnhLvoU/Ed+bM5zpsxhpP+6aNYluzRkw2/vj5HCDuyEgCqVe7KiNvEwcdBwJaU3gAInnwHsRWLqG516CYYpR7oFN/zHrOH5W2w++Jxe6Quh33i8tcKMGTl0UCITGvKBZzeS5eHztR799TZ56URfmLZFvl9tg1nIQtBYIh6Rn2yOWBMRi9IdlYN0XAy0gPgkEO4HbtFHHkiOYE1LWABQUFsmTJkszKkZiE93HKLvWcEzm/B2k4UdrPgc+wenMLF0vI7JQgPtdB1Hk2tLdX/BcvGZ5AzSOo9YNtMAbN2dP/OJvyulEHdLlAfr5RBUj/49qBKDbcTH4CU38zJX/f2UMSuB4CcTQAtVtvQM9D74QugU4tg/AANh94TXQtYPWNuyS/eKGxJlDsFrFsqoipATLiG5Hnzj8rywuXy5byG6fuVAoe8SCQpnNwzDD4OmD0dWFbDT8Vp80iX9+xcAYsQwgCGcM0cIf09PQYKWJKS0tTkEaGdFmDeNoOIZDnrXBybx22xS6COs9XFF7eUE6N+E6dNjyEQUR7owC02FavEmd9vZgc44mm54CMBuAcoPElSUOAU8BJcyvYkfQioN61FugHUE0RE65ggI3PSV7lIllc/7A0vP+SYQh6194sCzZtMIyVWNeo9Yc0XyHyIKMMWqqLH1HTDd1u6egfFTX4+rF2Mmzu6fjMUpbvHFeXlOY5Z2T8iezBeSMw/L5opISJeALtdhgVlOQjgGh2qd6K1RbrjMou4u4KewTVKzjUdqW/JqSSsVfdKLavf1X8ze3i/eigETxiysoW560awU8hgcwjQAMw8+45R5wQArp+T6OC4ZmQ/dB66NTiKiyVJbsekcb3X5TuM4elsG6l2LJyrnqB1qzV6clqRD5qsMJcxBcI1yy2mlL3o6/rGJt6RmT/uW4ZHAuPJ9thlcWlOVIKo6883yVF2XYwmu0Eh56v0dyNWPt3EkbgQjl37pw0NTVxKngub7ZEvkbXBsLAu0pQOUR0er8HawLVS3jhdTE1vC229Y+K5Usw8P/pnyWEqG8KCWQqgdT9FsjUO8ZxpxCBZegr1ikJvoBkKbQaOrXYs3Jl8e2/jQIV/Z8z/vRVOiWpJcvUEFy8ePEMPFqfv5auAVRJVQ/gwIhX9p3vlmYYgHZ4+bYuKZYlMPxynLHyaGpt5wbox1jbtchIEN2LNWR9WE+myaIpKUTAiqndvMqwavm/Y78U6UN0PoKgvIdgEEKsy/RzSSGBzCQwNzdCZrLiqElglgTUo4QvHtHfWe9Bw9Ov2JhSLDa7ZBVNvuasrKzMMELUGNGpybmIwxJe7+T2pU7dYh2nTvd+fLFHnv6o2TD+lpblyiM31cqG2sIYGn96Jb1Xes/0Xr0rNTXVYrVapa0N6XngeaSkKAFUvpGBJuQRrJSgvVR8nx4R84IFYl1KAzBF7yi7HQMC+teOQgIkEDcCGmuiU1P7oB9DtW7w3ETXAy5cuNDIUdfR0SEOLF4vKSmZVWOaANoBz4iWgksFUaOrocst++H1G/b4jand7ctLpAJ5E+MnVWh6JRQpRmxtsgCGgvKOWvAfv0uz5dgS0CCRxneh+AGGz48svlO8H38sIb9fnNu3zcmLHtsOsjUSmD8C9ADOH3teOWMIrMVI1at3FIrF6deUMZyBL65JRNf+aWoSNf50bdpsq1aoEVmWVSZ9nj7x+PU6ySuDoz559Wi77D3RIV5/ULYtWyAPb6mJs/EX4bEZG/rn8bhoFLBy6+xMDaM5MoKMflRvbX+jyKH/ixn9d5COE5+/zd8Wv9smXnj/LPjhRO9fRr9DOHgQoAHItwEJxJ2Afsx0WhEeCHkbOrlxhwPjokEj/w86uYFmQyLbpZi60iTFmrR4dHQ08sIZPZZllRvTmZ0jyDeYpDLq9cuLh1ulpXdEliMX4pcx3bu2umAOgR1zHaAG4Gj6nlax2welsLDQMLZny3quV+fr5kBAjb6hDiPYQ/b/b5HD+Ay58R5HfsfQut+TsY9OysiTTxnGvKP+Nnr/5oCYL0kvAjQA0+t+cjRJSwB5yWQDFFGJcuwavUQqC9EpTueU57lcLiMQJIjcgRqpOpvSZeXZ5Ua7nah8kYyiCZzfONEpbkz53rayVG5bVSZZiPJNvKwbv+QxwwuoTzQQh5KEBLpOixz8CVZZ/FSk6YNwB2t3iGz5jvhty8T981+K9/BhsVRVStajj4q1Vks2UkggswnMx1/VzCbO0WcwgRswdq0RrGsBF0GNCgJ4jBYvnvRB9fj0ohVM6urqkLS4YValy3JsOZJty5LOkeSc0jyIYI925PZbU5UvyytiXaVleqZXH9X1lVrO75JkZ+80gkGGh4evPoXP5peAH5+XC3vCaV6s+MGkqWBK10kIXm4/Phe+N/aLH2X9TAjk0aTPWgHENMcUSvM7UF6dBGJPgAZg7JmyRRKYgoB+3FBuTF6Avg19AIpEtleJrhHEVJaxZvCqA5M+0QAF9f5plOrFixeNqeFrJY8OrwMsl4sDF0Urg2TBGEwWOd85JMea+5HLzyk3LVWv6XyLBoR0YrqwF0Zgtgwhb5x6Xeeah3G+R5NW1x9qFzn5dDjxs5aAW/mQBNp7xLfvBIy+30gInwvcOLEuXCiO228XS9EUpQDTCgoHQwIzJ0ADcOaseCYJxIAA8pKJTi3qNPC70Hqorg2MSGRd3uSpYCJnRT9WVFQYRmB3d7cRGFKL6a1rGYFlmAZWA1CngRflL45ubt62tW7ve6cvS5bdKrvWlItl1omc49H1ivFG2yUnp0SLR4vb7Zbc3Nx4XIxtzpRAy0dhz5+ev+RuCRZvkLGXXxP/pUtGC5bycrGuWCG2FcvFzHs1U6o8L8MI0ADMsBvO4SYDgZvRiUHoWagaEpp8WAU1So0pYjUIZ+79UmNPjT71BHZ1dRkRwuX4ApxONBJYpWukKykMwDHU8d17rAPBKaievHa+1vxNRkwNcTNUDcDwtLxOA9MAnIxVgvYNNKPM9itYJovE3KsfEX+vV0Yff1xC7hGjvq/j5pvFjKAdCgmQwPQEaABOz4dHSSAOBNSg2AXVqeBDUDX4eqHqvdDp3xXQ2VW2iKSHOXPmjLS0tCBy1T5t5Qqd9nVhzVTvmF53fiWIoI+3TnYaZd1uQY6/MpRySx6xoytqpA8ahrX2SyuxUOaJgJYyPP0cPjIWCa39GlK6nBPPgQNiQmS86777DANwnnrGy5JAyhHQbyIKCZBAwgmogXcvVI0LDQrR4BCNTHwQWg+dvWhaGE0P43ROHT0c3WqRs1j6Pf0S0GS58yhHseZP072sQMDHysr5DPqYCkL0FL0uK7v6+VSv4v44ELj0Vri+76Lbxd/SK579+8WCPI3ZX/9dGn9xwM0m05sAPYDpfX85uqQmoMEX90ORwkKWQYuh1yfq+Vu9evWMghSKnEXSOtxqGIHFruu/9lx7fq5j0Fj3tx2JnpPZuIqUgkvmPs7qHoxhGYLWxu2H53kEwUeh4LjCCx3Z1gAhTaeyYKVavrNqPuYn69Rvyz7U9q2W0IKNMvZvj4sJP3Zcv/WwmLP0s0QhARKYDQEagLOhxXNJIOYECtCirgmMncw0QrUQBqCKTgPPpwGY67JJKzyAI96A5Lk4KRG7d8KElrwjMPYawgafGn4jPZ+d4IDn1YyIdJPyh6Gnj2Z8PWjJwONPGEaXLLlLpKDus9ckcguR13IGSyYw9SsrH5Sx9z8w1vy57r2Xxl8i7wOvlVYEaACm1e3kYEhg5gTUA6jSN8/rANfXFEhzz4gcbeqTW1bMPPp55iO9njPhDRMPNM+onnI9LSX8tZojb6DpMy/fcAc8ezoeiBM/PCo2waBbJFK4SEJmLBtAfdyQGlr6GAjCBjSJyWURk9bRbcMyBa2skYPgomzkR1SPsQZhZOExC8+tulYyjnL5+HhVj1sR9DEmvmPHxYocmNbVq+J4UTZNAulNgAZget9fjo4EDAKeYa84cq7+kg4HgrjmPRCkosAlZXlOOds+JJvqiiTbmUx/lgbAbxS6REZG4EGDzHSNpXFyov/T9Zy955G68BjKTmNpQdAf7oFO5ZashrG32DD6QpZsCSB3pP9MkwQaj0gAKYSuGIdRfbbU1Ihz561iqYaXuuHtsAdR244W9RxiWjZsTKL9PORO1H2xEjVK9doIWgpVbxPPE88gfaZFnHfuSuolA7EaPtshgXgRSKa/tPEaI9slgYwm0HOpTxo+apbazVWyYEnRVV+aJfDejPpHDe/WfK1t0+tuXFgoe462y9HmPtm2TCtwJIvAa2ZIuUSqgOTk5CRL5z7rx0ALjL4jIpdPIEw5bKga07W6dg9evpBrgQQ6OyXQ0CT+5tdh/CGJshpWEBPWz1kRPGRCeUETDCskYDQMuBCSXvtOnxb3L34ptuXLxbZhi5gX3ismO7yCo6hWM4oIcl07ONgMw7AxrGqoWfBDQ6eKDe8iDMIcpBy6nvWDOi69lgZ+NLRI4PJlsd+wScwFunyCQgIkMFcCNADnSo6vI4EUIODHVJ6rwCn2LLs0HmwRN6Zaa7dUwUGDL3nIjspbrjII52tINUVZsiDHIafbBmVDbeE81f6dbPRYA2eIGoCNYkO6EYfDMdmJ87ev4R1kEHorfH2dnq3ZZpRDC/rM4jt7TgIH90kAqYFC4+lrNGWKdWGdWGpqMY1aK2ZUk5nK+LdvvVE877+Pds4aqhfRwAtzcZGYi4rFgtdaqu8S8xr8sBhq+2x9oa4x7DkX7pN6HzHNLMVIb1S6ZnbeQU37ouOzuSRUuVU8v3zCSPliv+mmcNv8nwRIYM4EaADOGR1fSALJTUCTKz9/qEWWl+fK2ruWyKX9zdJ9sVdG+sdkyY46Y0p4qi/+RI8s4gXce7xDjrcMyNYlWFs276LTp/BsoWaz3++Q0dFRKYDXKVmYGXiGYaCqgZSNtZOrfktC1nzxofatb/9rEmhtDU/rovatpbJCrEgWblFFknDD0zcDvmrgZT2kJdbaxd/aJsHeXmiPBHt60X6bwDwzRL2HVkwXW2qhdQ+JOS9LTBq1qxHGfdCuk2Hv5MW9ItUw3io2w6jDusPpRD2UJ38tMtaPGfi7xX/uknFdB4w/Rv1OB47HSGBmBGgAzowTzyKBlCPg8wfFioX8H1/qla4hj+zcVis9Z7ql/USnnHrtnNRsqpSC6jyx2GK4Xus6KC1ckC2F8FSebB2QtdX5SeAFhOFirP/bIP39/cY0eVJVAFED6cxv0McQImMfEs+RC+I5eDA8tYupXNuyZWJdtdIw/ExID3Q9YkG5QdWIaEqcEAziYEcn8vE1S6CpWXznzn3mJcQ0uXoXrfAyWlagMocD77H2T5DGZT9KuL0Ou/rdsBFYs13wSyTS7GePGqxy7iWsYzwjUrZegkj74nn1F2KC99W+BcYjhQRI4LoJmK67BTZAAqlJIA/dRmnXAcnL0830FJ0Cfu9Ml5zvHJJ8pFu5c225mOEBVG9gAB5CnQrOq8iVotoCya/MnXdj8NLlYdl7ogPpYGxyz7oKKci+PsNl7ncVBog8C+2D4fc7curUJfF4PLJu3TqxWpPkd3PLARhJrxhTvn7Hahl58ilMzRYbBpJN1/TNMCH43Bld/Uo1CP2YalZj0N/cZHjrImdosmb75s1iXbZYTN3wBjZ/iKjeLngBMT0Mz6UUL42cGvZaqoGo09oIWgmt/LKMPP2sBDo6xHnXnWJfv/6zc+d5a3BwUPLz87UX+t/gPHeHlyeBWRGgATgrXDw5jQhkhAGo90u9NSfgVTtwvhvr+82yc2Wp1CDqtg8VOPqaBmSoy2186SaLMXgKff3wXJfYYJzuWlMuVVgfmHjRtX/PQVdj7d8mOY1giFIYMVpzOSnEMyxy4EeGARXa/B/EjbVxwf4Bydn9e0kTHBFEzWTDGGxqFD/WIuoaRBM8g/ZNG8W+di3WDGKd4NkXRQJIs1N7q+Hpky4EsRgpX2AcIuVMaP03ZPSFV8Tf2Cg69eu4ZUdS4I90ggZghAQfU5EADcBUvGvscywIZIwBGIHV0T8qb8C7pgmX74Z3rQ5Triq+UR+MwQFDI8ag7ncgKMOVj0oLCCKJqBP7ND9cvEVLw72JvvrgwdyOqOBVVYaXJd6XjWof05RGeb4vy8WL/dKLtW9rYbQkTQqYLqR4Of4rkeUPiAexF5533xXH9m3i2IYAkCQU9Q56jx0T7yeHkcDZjUhiu+HNs9UhQvjEkyJDiEqOiHoFESwSqrtNxl5/R3yob22D51W9f0m1/hL9pQEYuWl8TEUC8f9LnopU2OdMIJBxBqDeVLfHbyRc3roE0ZuTGHLeEZ/0IwhjGF5BDRbxYO1gpASavl69hI5ch1ixpstqtyLjhz5C8Ty8bQ0fc+AR+3VfJOJYXz8b6Xd7jdQwg2M+Y03gTeizeZI+z6bNmZ3bh9OegtZi2vd2OX78uOjav+VIhZI00n4YFQSfF1n/uzLy1lEj4CPnP/1HMSXL9PQUoEKBgPhPn5Gx9941KnnYN2wQx84dYmrdBysWM6glMPxya8Tf1IJkz0fFf/GSkaLG9cUH8MMjHLk+RdPzspsG4Lxg50VjRCBJFrPEaDRshgRIYFoC2TDMpsuz57N5pW9Bt+RXFUiVo0xsJruMDXpkFMbgCDyIowNqFHplFIaiH2sIYR1Oez09qEEmVjUIYSSq8Wh4FdWzCLVn26b06uj6vwc3VxtrAjUyeBCeyvpVZeKYELSi1StiaxzAuNLACtkkHVh3pgZwOSJnk0p8o+HuaHJkrE00cvglufGnHdboY9ua1WJBGprRl14W7xEkoUaEsfOeu5GzekD8+8/C6HtVQl5UMYFYly4R1xfuj/H9NZrmfySQ8QRoAGb8W4AASOAzApdHLsuhzkNXdrisLilA2bCCbGhRgZQ4CiTbliM2s82wkTSQxI8p5QDUD++ibhuPHt2P5/qI/QE8qndR8xBGi9lqgSEYNgrVSDRbzYZaoh5vqciTI6gOcrZjSJ4+2Cy3LC+R2vHp65GeDmna96oUL9sgRYvXwNi83qARrfxxHlolXm+h9PQcF038nFTRvwoQybsNwf1RAxDJCcPPU+R/c3a2ZD3y2+Ldt188Bw6I+/GfX+m5RhtbEcFsW7Y0adYzXukcN0ggjQjQAEyjm8mhkMD1EqjKqZI7au+Qfk//FVWjsH04ao0WLqJrseyo+OAw2/GI1BzYNp67HMbaQcf4vmw8Oiy5UCfUISGk1huDF1E9iVcU3sWJhmH0OHQt4s4HVkgZPIYHzvfInmPtsqQ0R25eugDrF93w0AWl4+gHcvnkQSlaskYWLNuIvMHh9Y3R7cxsGzVnDe/fDdKJyhlBeBfV+5dsa8/EPxYejiZIHhszEjPPbHzJc5Z6bR07thu5A32nTosFEcxWNfrSOCo/eeizJyQADzshkAAJkECEgBpx5dkVhkb2BWFgDXuHYBAOQPuM0nHegFe8iN70QN0+t/Rhf0Dr0E4jakTlwHuY78hH6gx4FEvzpcxRLLn2XEz5hYy0NAHkLgz6gmI86jbUZDEZBtjKynypKco2IoQvIF2MBopsXVIiy+57VAabzkr32U+RNu4wClAcMTyC5Wu3zXLqUBM/n4MWic+3QLq6jksWyqSNp/mYZmQJPqTT7v0N4dq4kSngFPMARhPTBNKqFBIggcQSoAGYWN68GgmkHAGzCbkCYbSp1uLfVOIP+mEUemEUYp0gDMPwdthI1Odac3gARmTbcKu0DLVcaUbbz7FlI+2LXawmrBfE9LKM/GKsAAAfXklEQVTVjDWDWNOmgSZqMBZJuO5rNqaCNZdhA4JUNFXMe2cuy6eNVgSJVMnyXStlrKvJ8ASqITja1yW1N9+DtYeuK9eafqMRhzGdirV/ZrNFKisrxaX1ca+nju30F5zbUS2zpjn0kEQ50NhkJH7WsmwUEiABEpgNARqAs6HFc0mABKYkYBhtMNyyNI3HNKKewkHvoGEMDnjDU81u77CMYVrTjzliNSSjvYkVORWytGDZlRbVIFuEKeDKQpeR3/AkAkT2IcfhJw29shrpYtbf9rB0HX1fei+ekPN7n5S6HV9AGpsFV14/9cZZHNJI02ViQbBC0gV+RDqu1TTUKK3aKt6X30SXzWLfuCFylI8kQAIkMCMCNABnhIknkQAJxIqABd61QmehoVO1GQghsASGohqDU4lGA9+wsEjW1xTIOQSIHENi68ONfdKMQJO71t0irsJSaTv8jlx889dSteUOKaidLo2LrqlD7VrDwzm9ATtVfxKy390tmONGupTVEhgBn4YGsSE9DdfNJYQ+L0ICaUUg+RIrpRVeDiaKwLPYDkJ3Re17ANsacqqhlzr/9j3odPINHHwf2gPFN6GgVpSgmOgVKcHWz6CYI5Mh6CXo30KvNzQUTVASScCCqWBdj6jexGt5FK3ITaiJoh/ZWmsYhN3DHnnu4xbxFC2WRbc9JGZEBjcfeE3aPn0PQR1TrVP0YXia+iXJfxNrCTWV6puNpMq6abvhBn2gkAAJkMCsCCT5X7tZjYUnJy8BNdwiC7H0W1blRqhm2/0K9AXoRugrUNQlkx9DJxOtGv+XUP0WVJfNf4a+Cl0FbYXq8dPQH0DV+FsCfQaq1/4TKCWNCWiS6M2LiqQ4xy5vn7osL3/aauQ8XLrrKzAA9xjBIWNYF1iz7R6xOSdGCeeCjAYiXICuxdpCswwh76A/EIIXEoqKJPoYgLrgeVxanivLoJpXMWEyht9JnUdQdbZWgrZi8Z88KZayMrFUViSsC7wQCZBA+hCgBzB97mWyjqQaHfsr6LcmdPARPH8bqsafyqfQf4H+oT6ZQn6C/VqjS41EdeX8w/jjFjyqqNH3d+OP+ly/zR+D3q5PKJlBYGFJjnzphirJcdqka3DMSAmjnkDNFejubpPzrz9pPH6ehjqTLdD3pWdoTLpRBWVozG+Uo9OqKVmoalKI5NRjyH148GKP/Gpfg7yOlDRNPW54FiO/az7fasz2NH0AHzre9nU7xXvoE6TU8Yt9643JF6QSswGzIRIggXgSSODP13gOg20nKQET+qUGmBqAzZP0UY9Hi377LoWqe0aNvGvJTThBvX5wi0wp9+DIJ1Me5YG0JFCE3IFaRcQKw02DRkyYUq7ceKtkFZVJ68dvyqV3npcVX/jGBE+gRhrr2++MPLTFiUeUJhMNDLkFmiNB1LDVqhWmtQulGbkLT7cNSmO3Wxqg6gk0AlCwHjEu5eo8wyLteBvnVkrIVSm+I68auf80YTKFBEiABOZCgAbgXKjxNTMl8Ac4UV0j6tmbKL/Bjj+GPgyNTAH/Prb1/DzotQzAGpzzBFQ9fg3QyeTPsVPDI//9ZAe5L70JOCeUjNPRaiCIM79YRno7Jxh/elTXATZB9feHGoNvQrXiRvjPpO/YMfF88KGYsrOkYs1aqVu7RtyoSqIVSs60DxpeQa21vH3Zgth75XTqVwNiam8xyqdpqTTnjVtjfx2MlkICJJAZBGgAZsZ9no9RLsFF/wx684SLR7x+mM+Sr4+fowaiulp0ivcvoH3Q6WQpDupU8K+gev5kol7Hb0DroW3QSeX73/++2O1249g999wjqpT0JqAGoOrn5Sh2qcG3E3oROgDV1QXqDUSwxZo1xqPv2HHxfvSRoRYkMF6/fp1s2LpM9hzvkJOtA5LvsslaeAJjKh71RkLya8R37AMj6te6amV4H/9PKIE9e/aIqop3vGZxQjvAi5FAjAhEvoxj1BybIYErBHZj65+g499cxn791tXnarh9x9hz9X8/xNPNUP0GnkrW44AGfvwj9G8mOUnf0/8Hehf0Tqi6dCYT9TIOQCSPpacm45Nh+zowXnVEazCIOqV/DYXHTf4dNPwDARuGhFCJI9DYCEPsuPjOnzcSMVuXLhXTfffLi4dbZQA1j+9aVyF14/WKI6+7rseTzyAABAbqzj+VwR//RKy1tZL1W9pPynwSGBwcjFSKyUc/ov/WzWe3eG0SmBEBegBnhIknzYGATs++FvU6Ncx0HeC3x/fr8xuhn0D1G/YR6Deh90GnEl2l/yL0B9AfQSeKvp9/BtVpXzUi9VudQgLXIDCC43uhZqj+bjgHHYaq8/pq4w87jGlX68KFouoYGZGxvW+I/9w5se//UO7ecrP85pNWeetkpzywqUoW5Dr0JdcvqKIiFhvWR6CPgYCYxr3W198wWyABEshUAvoXj0IC8SCgc2ltUdo6fpFuPPZD1Vj7MbQH2gndDb0fug8akZ9i4+XIEzz+NVQ9d+r5G4rS72FbZQdUXTaLofotHjmHv8wBgzIZAUTVGsafLjm9DVoMXQrdDA1P+WJjSjGjVrDr/vuQiqVSvAc/FteFM3IXStUF4SXcc7RNBpFKJibiw8fJ6tI5x3BzNABjgpWNkEAmE9AvYQoJJIpA9A8O/Wa86RoXnjhNfMc1zn8Hx6OvcY3TeTijCQy1I/3408giibeMZSNQqOGn4oRuMbZm8p8JNYtdD35JRn7xS8MbuODhXLl9VZm8caJDXjnSZqSkcaGm8XWJegBtLtHgDxWT3XZdzfHFJEACJMAvS74HSIAEMo9A53GRw4/B/wxn9NANGP+1fotMj8jwBGJNnslmk9HfvCC1wWHZgQhh9QDuOdouXn9w+gaudTSE16tqDWBIyKfrEykkQAIkMHcCNADnzo6vJAESSDUCQRhRF7De7ySCPKzw9G3cjYwvutbPct0jsRQXi+vhh2CnBWXk2edkRVYQpekKpQsJpdUbeF3JonOrREa6xeS0Ig1NtgTadHUFhQRIgATmToAG4NzZ8ZUkQAIpQmC0v0v6LhyV4NGfIy78fawkhUG1+dtIq1Id0xFYq6rE9cAXJDQ6KiNPPyMbSxyyoiJPWnpH5HiLLn2doxTUwe0XEtNgs+g1gj09Ehobm2NjfBkJkAAJcL0U3wMkQAIZQKDn3FHpOPC8dO9/WnpGLDK66IsijlwJdHQYyZ2Dwxr1GxuxISWM885dEkSKobHnnpdtiwslD7kBD13qNeoLz+kq+TAAVfobxQIDUI3BQBvWMFJIgARIYI4E6AGcIzi+jARIIHUIlK/fLiVbvijD1fdJm7tALrz1jAR8XvEePSqe/fslhHQusRT7+vViv/FGCXR2SvDTw8Z6QD/qBe87r0Hwk4sP6wSnnCZ2FuDnOgJJBtQArDQa8LdGAusnb497SYAESGA6AjQAp6PDYyRAAmlBwOpwyYLlG2Xh/d8SC7ZtWbligkHmP31GLGVlYiktjfk4Hdu3ibmwULz79kul2StLynLCtYO7Pu9tbEI94V9/1GRUErmqI/D0SdcpkYM/CZeCQyoYc0mJaORxoI0G4FWs+IQESGBWBGgAzgoXTyYBEkhlAsMdTRLwjknhwlVI3nwe0bQ+saGmbzxEjTSdCg75/TL25lty0+JicVjN8uG57itRwSOoHawBInuOhSOFrZaoP8kjvSJHHhc5jpzqmgZm6b0SWvHbhkGpbZpsn09SHY9xsE0SIIH0JHCdyanSEwpHRQIkkJ4E+i6dxMBMUli3UrwvvITgX4vYVqyI22C1ZJtt1SrxnTolrqZLsmVxmXxwtkt+ta9Bcpw2GR7ziQdTvwtLsmX70hJxDveLrkc05+SgmzAGEfQhFZsktOgO8Z1rEs9L/yYht1vMxUXiqK+PW7/ZMAmQQPoToAGY/veYIyQBEgAB36hbhtobJLe8VswwvAItrWJbuVJMLlTYiKM4btsp/osXDS/gyt2/J8O1hdI5MCpueP+cNovcurJU6mzwEr7ygrgvXjJ6Yi4qEkt1tVjL70W6mgLxPvm8BC5fNvrq3HWH2LDG0GSO8hbGsf9smgRIID0J0ABMz/vKUZEACUwg0H32UwTPhqRoyVrxnThhHI3X9G/0pc3I2+fYeauMvb4XRt4rsgkeQXNFvpgKio21fFpCbvijj4wav7bly1HxA+v7mprFhwAV39HxlmDs2W/cIo6tW5ELUCuVUEiABEjg+gjQALw+fnw1CZBAChDwe0al9+JxceYVSU5RhbifeVnMBQViwRRtIsS2bp34L1yAJ/CSoVeuqZU9YJSakURaPXvWmporhzSNjL+5WUKYEtZpag0ooZAACZBArAjQAIwVSbZDAiSQtAQ0D2DQ75OSVVsMz1rI4xGdmjWNl1aLd8f1Oq6HHpKgpoXpxzo/GHeqoWG3WOvqxLZxg5iwHjFazPn5YodSSIAESCAeBGgAxoMq2yQBEkgaAprvr+f8UbHn5EteWZ24X3pTTAiysK1endA+qhFoKS83dOKFdWo6NIbIXpR6o5AACZBAIghwFXEiKPMaJEAC80ag98IxJH32SMmKG8R/4qSR9NmBJM0TPW7z1UE1/oLneyVwqA0Rvt756gavSwIkkGEEaABm2A3ncEkg0wg4sO4vt7xO8muWiefgQTFlZWHadZmEkAg6GSTUhOng1kGRbJuIix7AZLgn7AMJZAIB/rXJhLvMMZJABhPIq1wkqsHBQTHn5oqlbrEET6Akm7NfzKjTayrOSthawIm3Idg2JIFLfZiStotlbRlTu0wExOckQAJxI4AQNAoJZCSBPIx6ACJ5ebpJyQQCxlo7f0CkdViCzQjCCASRjsUplsVFYspzJBRBsMstwZNdMEStYtlULiY7f48n9AbE4GKD+FGRHw7U0WgduHEpJJA6BDgFnDr3ij0lARKYIQE19Hqb+rH2D8ZelGgghhl59swLkQLmpirk48vFzwCP+D9pk8CpLgkhOXMiJNg/KkFcT2xmsayH54/GXyKw8xokQAJRBPiTMwoGN0mABNKDgLtnRC5+0CilK0okd7VTfEG/lLhKrprqVaPLsmKBhKrzJHixDylahiWE15nrCsSEffFKERMa9kjw+GURM6KC18H4c2HtH4UESIAEEkyAHsAEA+flSIAE4k+gB+vqVIrh6TvRc0L2Nr4ubp970gubsrH+DoaYqljNErgwHpE7MDbp+XPdaUT7dmDN3+EOEQSgmNeWiik3sdPOc+07X0cCJJB+BOgBTL97yhGRQEYTCPiD0tvYL1kFLrHmW6TlcouUZZVKjj1nWi5mDQbBesAgonJDWB/oP9wu5vIcBIpgfaD9syTNasjBpQjF9DKupZG715rCDWHdYfBsjwQvu8XkwBT0qgWoRBLfGsTTDpYHSYAEMp4ADcCMfwsQAAmkF4H+lgFj7V8xInwbBxvgbAvK4oIlMxqkyYI1eYsKJVSWg9x8MNg6MC3cPWIEiIS8MPhUYfwZRmBUi5rAWb15Gs0rCCbRR5MtbDSG4Ek01hci0bN5QZaYMe0cORbVBDdJgARIIKEEaAAmFDcvRgIkEG8COv2r6/eK6grlcMfHmNW1SnVuzawua8qyiVnX58H4C2JKOIRAEVEvoBp6eZawRxAGnglTxqERn4SGPIahqJG9EdG1fdpOqHc0vN5vebGYEHQSr7WFkevykQRIgARmQoAG4Ewo8RwSIIGUIOAb9ckggjkKKvPEbRqW3tFeeP8WI9h29oEWaqiZSrLFBK/dTIw2TSkjw96wMTgUfgwiqMTI8bcKAShYa0ghARIggWQhQAMwWe4E+0ECJHDdBPweTNFijZ4La/l6RpHsGVKVU3Vd7c7E+NML6PSx5DvFBI2IYRQi2nembURex0cSIAESiDcBGoDxJsz2SYAEEkbAruXUIB7U1HVZs4ztMT+mb+dJDKNwnq7Ny5IACZDAdASYBmY6OjxGAiSQUgQsWJdnRZStF1OxkajfYd9wSo2BnSUBEiCBRBCgAZgIyrwGCZBAwgg4EIGrHsBsK9bvYR2fmwZgwtjzQiRAAqlDgAZg6twr9pQESGAGBBwIttBgEAmaMA3sEnoAZwCNp5AACWQcARqAGXfLOWASSG8C9vFoWy+8gDm2HATmDn0ub196E+DoSIAESODaBGgAXpsRzyABEkghAhoBrDLaPyaFzkLkbvbRC5hC949dJQESSAwBGoCJ4cyrkAAJJIhAVlG4xJq7d0SKnMXGVXvHehJ0dV6GBEiABFKDAA3A1LhP7CUJkMAMCThRks1stcgIKnAUO4uMV/WO9c7w1TyNBEiABDKDAA3AzLjPHCUJZAwBjfzNKnTJSN8o1gDmGqXgekfpAcyYNwAHSgIkMCMCTAQ9I0w8iQRIIBUIhFAFpPt8L7x/I0Z3Q4EQpoGLpNfTlwrdZx9JgARIIGEEaAAmDDUvRAIkEE8CPo9fGg+0SH/rgGgk8OJttdLv75Mh76BYTZZ4XpptkwAJkEDKEaABmHK3jB0mARKIJhAMBGWgfUiaPm418v8V1RZIzZYqOTd8Ro42HsGpJtleuT36JdwmARIggYwnQAMw498CBEACqUdAjb6hzmHpax6Q/pZB8Xv9RuDHoptrxVlll3c73pZOd6fkO/IN469wPBgk9UbKHpMACZBAfAjQAIwPV7ZKAiQQYwJq9A12wOhr6sc076AEfAHjClkFLilduUCKFxZKV7BT3m48IB6/R5YVLpNNpTcYQSAx7gqbIwESIIGUJ0ADMOVvIQdAAulPYLjLLefeufSZ0Yco30JM9RZW54spKyQtwy3yYc8JaXe3i8Nil53VO6U6tyb9wXCEJEACJDBHAjQA5wiOLyMBEkgcAa3u4cp3SkF1nhTW5EvIqUZfs5zuPy6dbR0SRPSv2WSWGhh9m8u2SJYtK3Gd45VIgARIIAUJ0ABMwZvGLpNAphGw2Cyy8PZqaR5qkhO9R+XyyGWjvq8afRXZlYbhV5VbDe+fI9PQcLwkQAIkMCcCNADnhI0vIgESSDSBdnebHOw4KBazRapyqmD01RqPdkz5UkiABEiABGZHgAbg7HjxbBIggXkiUJVTjYjeHYbRZ7PY5qkXvCwJkAAJpAcBGoDpcR85ChJIewLq6VuYvzDtx8kBkgAJkEAiCLAWcCIo8xpK4FloELpLn4zLA3g8BB2ANkK/B51OvoGD70O1sGs39C3oxAy/hdj3C2g/VOt//RyaD6WQAAmQAAmQAAmME6AByLdCIgio4eYav1Bo/PFGPD4F/QFUDbQHoX8E/UPoVJKDA38JrYWWQZ+DvgqtgkZEDb4S6GLoUqie9zNoRsmePXvSdrzpOrZ0HZe+EdN5bGn7QePA0p4ADcC0v8XzPsBq9OCvoN+a0JNH8Pxt6Avj+z/F479ApzMAf4Ljr0PdUM0C/A/jj1vwqFIHvQ/6XWgvVD2Fuv0lqPYjYySdv3DTdWzpOi790KXz2DLmjwoHmnYEaACm3S1NqgGZ0JvHoGoANk/SMz0eLRY8Ua9ddvTOabZvwjH1CmrBV5WNUA/0mD4Zl6N49EL1GIUESIAESIAESAAErKRAAnEk8AdoW6d81bM3UX6DHX8MfRiqXkA10H4fqufnQdXLN51omYcnoH8HbYCq6OsGjK2r/+sfP3b1XjwbHBz83L502OH1ejm2FLuRvGcpdsPQ3XT9+5F6d4I9JgESSCYCS9CZNqiu14tIEBu7Ik/w+GXoIahO1e6D/gXUD3VCpxP1El6C/v2Ek3Qd4eiEffp0DKoBJ9Gi6wbV2KSSAd8DfA9c73sgeh1y9N8ZbpNA0hKYOAWXtB1lx1KOwG70+J+g0S624vHnv8Ljd6AT5YfYsRm6c+KBqOfrsa2BH/8I/Zuo/bpZB70E3QCNTAPr9mGoGqIt0Ijoe78SOhTZwUcSIAESmAOBXLxGf+yqEUkhARIggYwnoFG/amBFVH8hqwfwK9ACqBpgW6G6DEELt34DqlO126BTyXYc6IX+l6lOwP4XoRoCq8bmAuhe6HNQCgmQAAmQAAmQAAmQwDwQUAPwjvHraimHA1Bds6deuDehauBFy0/x5OWoHXqOThHr+dH6vahzCrEdyQOoBuXjUF0bSCEBEiABEiABEiABEiABEiABEiABEiABEiABEkgVAl9DR9+DqvdQvYoT0xk5sO9voQ3Q4fHHR/E4ldTjgLYT7VVsmnCyrj18DaoVSLqgz0BrobGWWI9N+1cNVa+o9l3XZB6HroNGJNpr2oedP4fmRw7G8DHRYytB338GvQjVe6vrQ/V9YYfGUhI9rui+q3e7ATrZ5yD6vLluz9fYdqPDx6D6+e2E/gM01jIfY0vU35FYs2J7JEACJJAUBO5GL74K/SZ0si8+TTGj6wAXQ1V0LeByY2vy/+qxW9vRdYmTie5vhv4QqlPXmntQU9B8AI21xHpsRehgA/R/QNXQU1kCVeMoIi9hQ41bPbcYqsm247FuMtFjW4Rx/DeoPqrouI9A9T7GUhI9rui+P4Ynr0I1MfrEH0LR5811ez7G9l109iJ0B1THpOuJN0FjLYkeWyL/jsSaFdsjARIggaQiUI/eTDQAd2HfCFSNvplKPU7UdixTvEDb0uPRXjNNK6PXiZfUo+FYjO2v0M5H03RSI6cnjk29FLpPPYfxkHo0moixTdb3P8LOTyc7EIN99WgjkeP6Iq6n62j1PT/xutgVU6lHaxOvMZfP2rXej+rRVG/tF6CJknpcKBFjm4+/I4liyOukIIF4/GJMQQzschoRuAtj0am+70HboE3Qx6Dq2bqW6Os6oBo5vDPqZJ06fR/6bah6Iwqgu6FPQxMpcxlb5DXPoqM90NPQP4NGPvsbse2BHoNG5Cg2vFA9liiJ9HM29y3ymqnGNlnf78HOTyY7EKd9kT7Gelz6fv4x9JtQ9f7Nh8RjbBoIppWAVkDPQjuhr0L1R0kiJR5jS5a/I4nkyGuRAAmQQFwI1KPVib/c/2V834/wqMZaKVSnN6OjifH0KinDM/XuqVGk07vfhWpC6Q3QiCzDhn4h+aH6hfsxVNuOl9Sj4ViM7Tza0f7+DtQC1S9SNYr/K1TlUagavRNF9+lr4iH1aDQRY5vY9z/HjlZo5cQDMXpej3YSNa4nca3vj/d7suuOH4rZw2TXmMtn7Vrvx6+jx8rwHWgF1An9e6j+mFPvYDykHo0m6r4l+u9IPHixTRIgARKYdwL16MHEP9z/C/vU4FHjLyI3Y0P36ZfJTOVNnPg34yeX41EDP74DtUE1b+FfQvXLTLfjIfVoNBZj+wTt7JvQQfVG7R/f9yAeZ1o9ZUIzc35aj1cmYmzRHdSpx0aofgHHS+rRcCLG9TVcR3+AqEGvUg/V60aeYzPmUo8WEzG2L41fRz21EdEfZm5o9L7IsVg81qORRIxtPv6OxIIP20hTAvrBopBAOhE4hMGEJgzINL5PH+cit+BFavj9FOqDjkD/J3QxdA00UTKXselrJkqEh+7X9XAO6Dp9Mi7q+bRD9ViiJB5j077rWP8RqkFDt0LPQRMp8RiXGkIroR1Q/WHyHFRFnz9qbCXmv3iM7fAkXZ/r53aSpma8Kx5jS5a/IzOGwBNJgARIINkI6A8XJ/RuqP5yVy+cPtcvCt1ugv4QqoaNrpXSiODnoVOJtrMIqu3q6/8YOga9AaqiXiMv9FtQrVyi1/rv0AFoPjSWEuux6Rh0jZ8aQOohUoO1Afon0Ii8iA1lpKx0ofpeaMSowGbMJNFj03v1C+hxqHpf4iWJHlcBBqLT2BF9BNv6OaiBxtojneixYQhGiqV38KhLLPQz/LfQZqguz4ilJHpsifw7EktObIsESIAEkobAbvREv/BUdWo3sr0T2yoroK9Bh6Ct0H+G6pdmRNST93LkCR7/DNoIHYaqR+UNaD00WnRq6iNoH7QX+jb0VmisZTcajIwnFmPT/j0A1cAOHd95qK7/U2M5IoXYUEOpf1wfx2MeNNayGw0mcmy3jV9PPbb6XojoILZjKbvRWCLHNbHv9dih7xU1aGItu9FgoseWi2v+K1Q/Z91Q/ayuhsZadqPBRI8tUX9HYs2K7ZEACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACcScwP8H5Mf+DG5GF6wAAAAASUVORK5CYII=\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1179c9f98>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from random import shuffle\n",
"\n",
"for_merge = set(segments)\n",
"merged_segments = []\n",
"\n",
"while len(for_merge) > 0:\n",
" segment = for_merge.pop()\n",
" merged_segment = [segment[0], segment[1]]\n",
" while True:\n",
" found = False\n",
" for candidate in for_merge:\n",
" if merged_segment[-1] == candidate[0] and candidate[1] != merged_segment[-2]:\n",
" for_merge.discard(candidate)\n",
" merged_segment.append(candidate[1])\n",
" found = True\n",
" break\n",
" \n",
" if merged_segment[0] == candidate[1] and candidate[0] != merged_segment[1]:\n",
" for_merge.discard(candidate)\n",
" merged_segment.insert(0, candidate[0])\n",
" found = True\n",
" break\n",
" \n",
" if not found:\n",
" break\n",
" \n",
" merged_segments.append(merged_segment)\n",
"\n",
"# shuffle(merged_segments)\n",
"\n",
"d = GeoSeries(map(lambda s: LineString(s).parallel_offset(RIGHT_OFFSET, 'right'), merged_segments))\n",
"d.plot(linewidth=1.5, alpha = 0.5)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment