diff --git a/.idea/other.xml b/.idea/other.xml new file mode 100644 index 0000000000000000000000000000000000000000..a708ec78108573c549112f9a71e489890930c832 --- /dev/null +++ b/.idea/other.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="PySciProjectComponent"> + <option name="PY_SCI_VIEW_SUGGESTED" value="true" /> + </component> +</project> \ No newline at end of file diff --git a/README.MD b/README.MD new file mode 100644 index 0000000000000000000000000000000000000000..1fc958001eb67f26b248c1206d6af5aefc1448c0 --- /dev/null +++ b/README.MD @@ -0,0 +1,99 @@ +# Alma Data Extractor + +Takes a list of ac-numbers, makes requests to sru/alma/önb, extracts data from the returned marc:xml, brings it in tabular form and writes it to an excel. + +## Concept + +The program is mostly written async, so that it can process the data, while watiting for new requests. + +The main controller is `travelogues_extraction.controller.main.FromAlmaOutputToExcel`. + +1. It takes an path to an excel and generates ac numbers from a column in that excel. +2. Makes requests to sru/önb and parses it with lxml, and take the first marc:record +3. Runs a list of "Extractors" through each record, that populates th output dataframe + + +### Change or Add to the software + +You will need a solid knowledge in python and xpath. + +#### 1. AC-Number-Generator + +If you would like to change the way the ac-numbers are generated, see here `travelogues_extraction/getrecords/acnumber_extractor.py` + +#### 2. Requests + +`travelogues_extraction.getrecords.session.RecordRetriever` + +You can change the url, the requests, the xpath for the records. + +#### 3. Extractors + + +All Extractors inherit from `travelogues_extraction.dataextractors.abstract.AbstractDataExtractor`. + +There are a bunch of more detailed Abstract extractors: + +- `AbstractSingleDataExtractor` +- `AbstractXpathDirectlyToColumn` +- `AbstractXpathJoinDirectlyToColumn` +- `AbstractMultifield` +- `AbstractParentAsSecondCast` + +and all extractors in `travelogues_extraction/dataextractors/dataextractors` inherit from them + +A lot of the classes actually only have properties and no methods and it would be possible to just give this properties +their parent classes in the constructor. However a lot them do have custom methods. The controller only needs to rely on +the interface of the top `AbstractDataExtractor` + + +##### 3.1. Order, Include / Exclude Extractors + +The columns in the dataframe will be generated in the order of the classes in `travelogues_extraction/controller/main.py:33` +and will take the names of the columns in `travelogues_extraction.dataextractors.abstract.AbstractDataExtractor.get_columns_names_I_work_on` in their order. + +You can change the order of, include, exclude extractors there. + +##### 3.2. Write an data extractor + +Inherit from `travelogues_extraction.dataextractors.abstract.AbstractDataExtractor`, implement a method write, that +takes a `travelogues_extraction.getrecords.session.RecordRetriever.Record` as input and writes to +`self.target_dataframe.at[record.ac_number, self.column] = 'your data'. You will find the lxml parsed xml representation + in the `lxmlelement` the property of the record. + + There are a few parent classes you can use: + + +####### `AbstractXpathDirectlyToColumn` + + Child classes define the column a xpath object and this class writes the first found text to the target dataframe. + Example: `travelogues_extraction.dataextractors.dataextractors.index.MMSID` + +####### `AbstractXpathDirectlyToColumn` + +Child classes define the column a xpath object and this class joins the text results with property `join_string` + +###### `AbstractMultifield` + +Looks up data in the record with `primary_xml_path: lxmletree.XPath`, than it uses each of `xpath_isgnd_tuples` +for data generation. `XpathIsGnd` consists of a xpath object, and tells if this is a datum containing gnd data. +If so it wil render the output as uris. The output will be rendered as a string with one of the `join_string_*_level` +properties. + +Example: `travelogues_extraction.dataextractors.dataextractors.combinedsubfields.VerfasserGND` + +###### `AbstractParentAsSecondCast` + +The last looks in other records, if it does not find them in the current record. It takes `parent_ac_xpath` +to look for the parent, which is called so, because in all our cases, it was a parent record. Implement your data +extraction in _write(). write() will take care of the rest and use your _write. + +Example: `travelogues_extraction.dataextractors.dataextractors.übergeordnet.Schlagworte` +` + + + + + + + diff --git a/RequestTimeAnalysis.ipynb b/RequestTimeAnalysis.ipynb deleted file mode 100644 index 6c936f625c589f361d869a9ab40a0eb796b08593..0000000000000000000000000000000000000000 --- a/RequestTimeAnalysis.ipynb +++ /dev/null @@ -1,3507 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "c = pd.read_csv('log.csv', index_col=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>time</th>\n", - " <th>n</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>AC02116741</th>\n", - " <td>1.594926e+18</td>\n", - " <td>1.0</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC02922671</th>\n", - " <td>1.594926e+18</td>\n", - " <td>2.0</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC07754577</th>\n", - " <td>1.594926e+18</td>\n", - " <td>3.0</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC01967894</th>\n", - " <td>1.594926e+18</td>\n", - " <td>4.0</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC07754583</th>\n", - " <td>1.594926e+18</td>\n", - " <td>5.0</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " time n\n", - "AC02116741 1.594926e+18 1.0\n", - "AC02922671 1.594926e+18 2.0\n", - "AC07754577 1.594926e+18 3.0\n", - "AC01967894 1.594926e+18 4.0\n", - "AC07754583 1.594926e+18 5.0" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "c.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib notebook" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('<div/>');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", - " 'ui-helper-clearfix\"/>');\n", - " var titletext = $(\n", - " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", - " 'text-align: center; padding: 3px;\"/>');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('<div/>');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('<canvas/>');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('<canvas/>');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('<button/>');\n", - " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", - " 'ui-button-icon-only');\n", - " button.attr('role', 'button');\n", - " button.attr('aria-disabled', 'false');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - "\n", - " var icon_img = $('<span/>');\n", - " icon_img.addClass('ui-button-icon-primary ui-icon');\n", - " icon_img.addClass(image);\n", - " icon_img.addClass('ui-corner-all');\n", - "\n", - " var tooltip_span = $('<span/>');\n", - " tooltip_span.addClass('ui-button-text');\n", - " tooltip_span.html(tooltip);\n", - "\n", - " button.append(icon_img);\n", - " button.append(tooltip_span);\n", - "\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " var fmt_picker_span = $('<span/>');\n", - "\n", - " var fmt_picker = $('<select/>');\n", - " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", - " fmt_picker_span.append(fmt_picker);\n", - " nav_element.append(fmt_picker_span);\n", - " this.format_dropdown = fmt_picker[0];\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = $(\n", - " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", - " fmt_picker.append(option);\n", - " }\n", - "\n", - " // Add hover states to the ui-buttons\n", - " $( \".ui-button\" ).hover(\n", - " function() { $(this).addClass(\"ui-state-hover\");},\n", - " function() { $(this).removeClass(\"ui-state-hover\");}\n", - " );\n", - "\n", - " var status_bar = $('<span class=\"mpl-message\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "}\n", - "\n", - "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", - "}\n", - "\n", - "mpl.figure.prototype.send_message = function(type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "}\n", - "\n", - "mpl.figure.prototype.send_draw_message = function() {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", - " }\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1]);\n", - " fig.send_message(\"refresh\", {});\n", - " };\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", - " var x0 = msg['x0'] / mpl.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", - " var x1 = msg['x1'] / mpl.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", - " var cursor = msg['cursor'];\n", - " switch(cursor)\n", - " {\n", - " case 0:\n", - " cursor = 'pointer';\n", - " break;\n", - " case 1:\n", - " cursor = 'default';\n", - " break;\n", - " case 2:\n", - " cursor = 'crosshair';\n", - " break;\n", - " case 3:\n", - " cursor = 'move';\n", - " break;\n", - " }\n", - " fig.rubberband_canvas.style.cursor = cursor;\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_message = function(fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message(\"ack\", {});\n", - "}\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function(fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " evt.data.type = \"image/png\";\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src);\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " evt.data);\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig[\"handle_\" + msg_type];\n", - " } catch (e) {\n", - " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", - " }\n", - " }\n", - " };\n", - "}\n", - "\n", - "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function(e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e)\n", - " e = window.event;\n", - " if (e.target)\n", - " targ = e.target;\n", - " else if (e.srcElement)\n", - " targ = e.srcElement;\n", - " if (targ.nodeType == 3) // defeat Safari bug\n", - " targ = targ.parentNode;\n", - "\n", - " // jQuery normalizes the pageX and pageY\n", - " // pageX,Y are the mouse positions relative to the document\n", - " // offset() returns the position of the element relative to the document\n", - " var x = e.pageX - $(targ).offset().left;\n", - " var y = e.pageY - $(targ).offset().top;\n", - "\n", - " return {\"x\": x, \"y\": y};\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * http://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys (original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object')\n", - " obj[key] = original[key]\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function(event, name) {\n", - " var canvas_pos = mpl.findpos(event)\n", - "\n", - " if (name === 'button_press')\n", - " {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * mpl.ratio;\n", - " var y = canvas_pos.y * mpl.ratio;\n", - "\n", - " this.send_message(name, {x: x, y: y, button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event)});\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "}\n", - "\n", - "mpl.figure.prototype.key_event = function(event, name) {\n", - "\n", - " // Prevent repeat events\n", - " if (name == 'key_press')\n", - " {\n", - " if (event.which === this._key)\n", - " return;\n", - " else\n", - " this._key = event.which;\n", - " }\n", - " if (name == 'key_release')\n", - " this._key = null;\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.which != 17)\n", - " value += \"ctrl+\";\n", - " if (event.altKey && event.which != 18)\n", - " value += \"alt+\";\n", - " if (event.shiftKey && event.which != 16)\n", - " value += \"shift+\";\n", - "\n", - " value += 'k';\n", - " value += event.which.toString();\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, {key: value,\n", - " guiEvent: simpleKeys(event)});\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", - " if (name == 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message(\"toolbar_button\", {name: name});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.close = function() {\n", - " comm.close()\n", - " };\n", - " ws.send = function(m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function(msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(msg['content']['data'])\n", - " });\n", - " return ws;\n", - "}\n", - "\n", - "mpl.mpl_figure_comm = function(comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = $(\"#\" + id);\n", - " var ws_proxy = comm_websocket_adapter(comm)\n", - "\n", - " function ondownload(figure, format) {\n", - " window.open(figure.imageObj.src);\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy,\n", - " ondownload,\n", - " element.get(0));\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element.get(0);\n", - " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", - " if (!fig.cell_info) {\n", - " console.error(\"Failed to find cell for figure\", id, fig);\n", - " return;\n", - " }\n", - "\n", - " var output_index = fig.cell_info[2]\n", - " var cell = fig.cell_info[0];\n", - "\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function(fig, msg) {\n", - " var width = fig.canvas.width/mpl.ratio\n", - " fig.root.unbind('remove')\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable()\n", - " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", - " fig.close_ws(fig, msg);\n", - "}\n", - "\n", - "mpl.figure.prototype.close_ws = function(fig, msg){\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "}\n", - "\n", - "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width/mpl.ratio\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message(\"ack\", {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () { fig.push_to_output() }, 1000);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items){\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) { continue; };\n", - "\n", - " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", - " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i<ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code'){\n", - " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,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SXIwZ84c+Pv7i4+12b17N7y8vCRd73bs2IEjR47gzJkzKCgoQGBgIBITEyXbICsrC25ubti5cyfq6+uxfPlyaLVai8GaDh8+DEEQUFNTc4e/iDIMZFwAvVckS0tL0dDQgO3bt8NgMGDx4sUW676d7Sx3YikjIwNqtRr5+fmS+LP1H5ZrC1JSUuDv74+DBw+itrYWTz/9tMVgPw8++CB+/OMfo6SkBFVVVZg+fTpGjhxpt1fgBzomLl68CJPJJD4m5sMPP4TJZBLvE758+TIGDx6MxMREnDhxAnV1dUhNTYWzszNOnDgBoH/tSU5ODpycnPDqq69KYqLv92xraxPbe0EQsG7dOphMJpw7d04s09TUBJPJhP3790MQBLz99tswmUyS50MnJyfDaDSiqKgI5eXlFo9bsUdKi4tPPvkE69evh8lkwtmzZ1FYWIjx48cjODhYHNjN3A146dKlkt+879MGOjo6xN986NChSE1Nhclkkozce+DAAbz//vv4/PPPcejQIYwaNQrjxo2T/MczMjLg4eGBPXv2iI/s6vtYGwBYv349jh8/jrq6OmzYsAEuLi7iI9iI6D+DCaudmD59uuzDvIFvByKqqKjA9evXkZ6ejrCwMGi1WhgMBkRFRWHr1q2SR4+sX78eRqMRarUa4eHh+OSTT8R55jOfcq++Z7Wjo6NvWcb80O6bX33V1NQgNjYWLi4uCAgIwOLFiy2urprPZB86dKhf20vuIHXOnDmydel71tbeKC0uioqKEBkZCXd3d2i1WoSEhCAtLU1ypjkzMxPBwcFiPSZNmoSioiJJ3W9+oHtQUBCWLVsmORlifryFs7MzjEYjli9fLjsgTnp6OgICAqDT6RAZGSk7SvCsWbO+V89THMi4AIC0tDT4+PjA2dkZISEhWLt2rez9ZrezneUSVmvtibXRiM2fubkt6OzsxJIlS+Dt7Q29Xo/Y2FiLAVtaW1vx1FNPwcPDAwaDAQkJCXY9SvBAx8SKFStkf6u+I6ceO3YM999/PwwGA/R6PSIiIvDee++J8/vTnljbD5lHCwest119y2zZsuWWsXXt2jUsXLgQnp6e0Ol0SEhIkCS09khpcVFZWYn77rsPBoMBGo0GP/jBD5CcnCx5Nqq1fbl5dF/g2yvltsrk5eUhKCgIarUavr6+WLRokUXi3tPTg+effx4+Pj7QaDSIiYkRR683e+yxx2AwGKBWq3H33Xdj27Ztt/MTEFE/MGElIiIiIiIiRWLCSkRERERERIrEhJWIiIiIiIgUiQkrERERERERKRITViIiIiIiIlIkJqxERERERESkSExYiYiIiIiISJGYsBIREREREZEiMWElIiIiIiIiRWLCSkRERERERIrEhJWIiIiIiIgUiQkrERERERERKRITViIiIiIiIlIkJqxERERERESkSExYiYiIiIiISJGYsBIREREREZEiMWElIiIiIiIiRWLCSkRERERERIrEhJWIiIiIiIgUiQkrERERERERKRITViIiIiIiIlIkJqxERERERESkSExYiYiIiIiISJGYsBIREREREZEiMWElIiIiIiIiRWLCSkRERERERIrEhJWIiIiIiIgUiQkrERERERERKRITViIiIiIiIlIkJqxERERERESkSExYiYiIiIiISJGYsBIREREREZEi/RuDjACCN2WCbAAAAABJRU5ErkJggg==\" width=\"940\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "<matplotlib.axes._subplots.AxesSubplot at 0x7efea4630080>" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "c.n.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('<div/>');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", - " 'ui-helper-clearfix\"/>');\n", - " var titletext = $(\n", - " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", - " 'text-align: center; padding: 3px;\"/>');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('<div/>');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('<canvas/>');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('<canvas/>');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('<button/>');\n", - " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", - " 'ui-button-icon-only');\n", - " button.attr('role', 'button');\n", - " button.attr('aria-disabled', 'false');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - "\n", - " var icon_img = $('<span/>');\n", - " icon_img.addClass('ui-button-icon-primary ui-icon');\n", - " icon_img.addClass(image);\n", - " icon_img.addClass('ui-corner-all');\n", - "\n", - " var tooltip_span = $('<span/>');\n", - " tooltip_span.addClass('ui-button-text');\n", - " tooltip_span.html(tooltip);\n", - "\n", - " button.append(icon_img);\n", - " button.append(tooltip_span);\n", - "\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " var fmt_picker_span = $('<span/>');\n", - "\n", - " var fmt_picker = $('<select/>');\n", - " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", - " fmt_picker_span.append(fmt_picker);\n", - " nav_element.append(fmt_picker_span);\n", - " this.format_dropdown = fmt_picker[0];\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = $(\n", - " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", - " fmt_picker.append(option);\n", - " }\n", - "\n", - " // Add hover states to the ui-buttons\n", - " $( \".ui-button\" ).hover(\n", - " function() { $(this).addClass(\"ui-state-hover\");},\n", - " function() { $(this).removeClass(\"ui-state-hover\");}\n", - " );\n", - "\n", - " var status_bar = $('<span class=\"mpl-message\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "}\n", - "\n", - "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", - "}\n", - "\n", - "mpl.figure.prototype.send_message = function(type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "}\n", - "\n", - "mpl.figure.prototype.send_draw_message = function() {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", - " }\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1]);\n", - " fig.send_message(\"refresh\", {});\n", - " };\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", - " var x0 = msg['x0'] / mpl.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", - " var x1 = msg['x1'] / mpl.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", - " var cursor = msg['cursor'];\n", - " switch(cursor)\n", - " {\n", - " case 0:\n", - " cursor = 'pointer';\n", - " break;\n", - " case 1:\n", - " cursor = 'default';\n", - " break;\n", - " case 2:\n", - " cursor = 'crosshair';\n", - " break;\n", - " case 3:\n", - " cursor = 'move';\n", - " break;\n", - " }\n", - " fig.rubberband_canvas.style.cursor = cursor;\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_message = function(fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message(\"ack\", {});\n", - "}\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function(fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " evt.data.type = \"image/png\";\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src);\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " evt.data);\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig[\"handle_\" + msg_type];\n", - " } catch (e) {\n", - " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", - " }\n", - " }\n", - " };\n", - "}\n", - "\n", - "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function(e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e)\n", - " e = window.event;\n", - " if (e.target)\n", - " targ = e.target;\n", - " else if (e.srcElement)\n", - " targ = e.srcElement;\n", - " if (targ.nodeType == 3) // defeat Safari bug\n", - " targ = targ.parentNode;\n", - "\n", - " // jQuery normalizes the pageX and pageY\n", - " // pageX,Y are the mouse positions relative to the document\n", - " // offset() returns the position of the element relative to the document\n", - " var x = e.pageX - $(targ).offset().left;\n", - " var y = e.pageY - $(targ).offset().top;\n", - "\n", - " return {\"x\": x, \"y\": y};\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * http://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys (original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object')\n", - " obj[key] = original[key]\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function(event, name) {\n", - " var canvas_pos = mpl.findpos(event)\n", - "\n", - " if (name === 'button_press')\n", - " {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * mpl.ratio;\n", - " var y = canvas_pos.y * mpl.ratio;\n", - "\n", - " this.send_message(name, {x: x, y: y, button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event)});\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "}\n", - "\n", - "mpl.figure.prototype.key_event = function(event, name) {\n", - "\n", - " // Prevent repeat events\n", - " if (name == 'key_press')\n", - " {\n", - " if (event.which === this._key)\n", - " return;\n", - " else\n", - " this._key = event.which;\n", - " }\n", - " if (name == 'key_release')\n", - " this._key = null;\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.which != 17)\n", - " value += \"ctrl+\";\n", - " if (event.altKey && event.which != 18)\n", - " value += \"alt+\";\n", - " if (event.shiftKey && event.which != 16)\n", - " value += \"shift+\";\n", - "\n", - " value += 'k';\n", - " value += event.which.toString();\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, {key: value,\n", - " guiEvent: simpleKeys(event)});\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", - " if (name == 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message(\"toolbar_button\", {name: name});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.close = function() {\n", - " comm.close()\n", - " };\n", - " ws.send = function(m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function(msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(msg['content']['data'])\n", - " });\n", - " return ws;\n", - "}\n", - "\n", - "mpl.mpl_figure_comm = function(comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = $(\"#\" + id);\n", - " var ws_proxy = comm_websocket_adapter(comm)\n", - "\n", - " function ondownload(figure, format) {\n", - " window.open(figure.imageObj.src);\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy,\n", - " ondownload,\n", - " element.get(0));\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element.get(0);\n", - " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", - " if (!fig.cell_info) {\n", - " console.error(\"Failed to find cell for figure\", id, fig);\n", - " return;\n", - " }\n", - "\n", - " var output_index = fig.cell_info[2]\n", - " var cell = fig.cell_info[0];\n", - "\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function(fig, msg) {\n", - " var width = fig.canvas.width/mpl.ratio\n", - " fig.root.unbind('remove')\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable()\n", - " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", - " fig.close_ws(fig, msg);\n", - "}\n", - "\n", - "mpl.figure.prototype.close_ws = function(fig, msg){\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "}\n", - "\n", - "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width/mpl.ratio\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message(\"ack\", {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () { fig.push_to_output() }, 1000);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items){\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) { continue; };\n", - "\n", - " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", - " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i<ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code'){\n", - " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5wAAAHgCAYAAADJzWJCAAAgAElEQVR4nOzdeXwV9dn//wOBECkCIloRSjAIKFBxjYKt0RbF1lZvtbdUEWO1+PUu/d1pVUhYJAUkiAtKWRQXQAQDUln0EMIadgg7gbAlJIQQkrBl3885798f3g4ck2AOkJlk8no+HvNHhpnJZfFqr3dn5jMOAQAAAABQCxxWFwAAAAAAsCcCJwAAAACgVhA4AQAAAAC1gsAJAAAAAKgVBE4AAAAAQK0gcAIAAAAAagWBEwAAAABQKwicAAAAAIBaQeAEAAAAANQKAicAAAAAoFYQOAEAAAAAtYLACQAAAACoFQROAAAAAECtIHACAAAAAGoFgRMAAAAAUCsInAAAAACAWkHgBAAAAADUCgInAAAAAKBWEDgBAAAAALWCwAkAAAAAqBUETgAAAABArSBwAgAAAABqBYETAAAAAFArCJwAAAAAgFpB4AQAAAAA1AoCJwAAAACgVhA4AQAAAAC1gsAJAAAAAKgVBE4AAAAAQK0gcAIAAAAAagWBEwAAAABQKwicAAAAAIBaQeAEAAAAANQKAicAAAAAoFYQOAEAAAAAtYLACQAAAACoFQROAAAAAECtIHACAAAAAGoFgRMAAAAAUCsInAAAAACAWkHgBAAAAADUCgInAAAAAKBWEDhtaN26dfrDH/6gdu3ayeFwaNGiRT6dX1JSotDQUPXs2VN+fn564oknqjwuLi5Od9xxh/z9/dW5c2fNnDnzsup+66231Lt3b1111VVq1apVjc4JDQ2Vw+Hw2vr16+d1zM6dO9W3b1+1atVKbdq00aBBg1RQUFDl9c6cOaP27dvL4XAoJyfH68+mTJmiW265RQEBAeratau++OILrz//5JNP9Ktf/UqtW7dW69at9dvf/lbx8fGVfseBAwf0xz/+US1btlTz5s119913Ky0trdJxHo9Hjz766CX9Hdbk34GCggINHjxY7du3V0BAgG699VZ99NFHPv0eAAAA4GIInDYUExOjESNGaOHChZcUVgoLC/Xqq6/qk08+Ub9+/aoMnCkpKWrevLlee+01HThwQJMnT5afn59iY2OrvW5ISMhFQ+moUaM0ceJEvfbaaz4FzkcffVSZmZnGdu7cOePPMzIydM011+jVV1/VoUOHtG3bNvXp00dPP/10ldd74okn9Lvf/a5S4Jw2bZquvvpqzZs3T0ePHlV0dLRatGihb7/91jjmueee09SpU7V7924dPHhQL774olq1aqUTJ04YxyQnJ6tNmzYaMmSIdu3apeTkZC1ZskTZ2dmVapk4caJRi69/hzX5d2DQoEHq3Lmz4uLilJqaqunTp8vPz09Llizx6XcBAAAA1SFw2lxVYaO0tFSvv/66brzxRjVv3lzBwcGKi4ur8vzQ0NAqA+fQoUPVo0cPr339+/evdHfxQj8VOH8wc+ZMnwJndXdgJWn69Om6/vrr5Xa7jX0JCQlyOBxKSkryOnbatGkKCQnR6tWrKwXO3r1764033vA6/rXXXtP9999f7e92uVy6+uqrve6E9u/fX88///xP/nPt3r1b7du3V2ZmZpV/h/v27dOjjz6qn/3sZ7r++uv1/PPP6/Tp01Veq7rA2aNHD40ZM8Zr35133qkRI0b8ZH0AAABATRA4ba6qsPHXv/5Vffr00fr165WcnKx3331XzZo105EjRyqdX12g+/Wvf62wsDCvfTNmzFDLli2rraW2AmerVq103XXXqWvXrnr11Vd15swZ48///e9/q0OHDl7nJCUlyeFweNWSmJioG264QWlpaYqLi6sUOO+8806NHDnS6zojRoxQ06ZNVV5eXmVt+fn5CggI0HfffSdJcrvdatGihcaMGaNHHnlE1113nYKDgyv9/RQVFenWW2/V4sWLJVX+O8zJydF1112nYcOG6eDBg9q1a5cefvhhPfTQQ1XWcbE7nHfffbdOnDghj8ejNWvWqEWLFlq3bl2V1wEAAAB8ReC0uR+HjbS0NPn5+SkjI8PruN/+9rcaNmxYpfOrC5xdunRRVFSU176lS5fK4XCouLi4ylpqI3BGR0dryZIlSkhI0KJFi3TrrbfqnnvukcvlkiTt379fTZo00TvvvKOysjKdO3dOTz/9tBwOh1F/aWmpbrvtNn355ZeSVGXgHDZsmG644Qbt2LFDHo9H27dv189//nM5HA6dPHmyytr+53/+R0FBQSopKZEk425l8+bNNXHiRO3evVvjx49Xo0aNtHbtWuO8V155RS+//LLx84//DseOHatHHnnE63elp6fL4XDo8OHDleqoLnCWlpbqhRdekMPhUJMmTeTv71/pvVQAAADgchA4be7HYcPpdMrhcOhnP/uZ19akSRM988wzlc6/nMA5btw4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y+OYePyI/oBy9AVURH9AOfoCKqI/eC8CJ64bVhSoiP6AcvQFVER/QDn6AiqiP3gvAieuG1YUqIj+gHL0BVREf0A5+gIqoj94LwInrpvCwkLFxsaqsLDQ3U2BB6A/oBx9ARXRH1COvoCK6A/ei8AJAAAAAKgRBE4AAAAAQI0gcAIAAAAAagSBEwAAAABQIwicAAAAAIAaQeCsJbZu3SofHx8NGjTIbl5RUZFmzJihW265RYGBgWratKl69eqlBQsWqLi42Fxu7ty5ioiIkL+/v7p3767t27eb83JycvTMM8+oU6dOCggIULt27fTss88qNzfX5r2effZZdevWTX5+furatatdWy5duqTo6GjdfPPN8vX11dChQx3+P4WFhXrhhRcUHh4uPz8/RUREaP78+eb8qKgoGYZhNzn6/yXpj3/8owzD0OzZs20ef/nll9WzZ08FBgYqODjY4XNrI0/oD2fOnNGAAQPUqlUr+fn5qW3btnr66adtLme+ceNGh99jdna2uUxpaammTJmiG2+8UQEBAerQoYOmTZsmq9VqLnPy5ElFR0erVatWCgwM1IABA3T48GGHn8s999yjhg0bKigoSHfddZcuXrxYaVsMw9COHTuu8pvwDDXdHyQpPT1dv/nNb9SsWTMFBQVpxIgROnnypDm/up/vkSNH1KhRI7u6fOedd3TnnXcqJCREISEh6tu3r11bKnJW+5KUmJio7t27KyAgQCEhIQ7XRwsXLlSXLl3k7++v5s2ba9y4cU7fqzZwRV94++23FRUVpaCgIBmGoXPnztm9V1pamoYMGaKmTZsqKChIvXv31oYNG8z5VVl/LFu2TP369TP7XI8ePbR69Wqb99m0aZMGDx6sVq1ayTAMffrpp3ZtWbZsme69916FhobKMAxZLBa7ZS5duqRx48YpNDRUN9xwg4YPH27Tv2sjT+kL999/v9q1ayd/f3+FhYXpkUceUVZWljl/48aNGjJkiMLCwtSwYUN17dpV//nPf2xeY//+/Ro+fLgiIiKc1vv58+c1fvx4hYeHKyAgQD179rRb91itVr344osKCwtTQECA+vbta7ct2b17t/r166fg4GCFhoZq9OjRys/Pr+STBnAlBM5a4oknntD48ePVqFEjmxV1UVGR7r77bjVp0kRz586VxWJRRkaGFi9erF/+8pfmhvXDDz+Un5+fFixYoAMHDmj06NEKCQnRDz/8IEnat2+fhg8frs8++0zp6elav369IiMj9dvf/tamHc8++6zmzp2rUaNGOQycBQUFGjNmjN555x0NGDDAaeAcMmSI7rjjDq1du1ZHjx7V1q1b9fXXX5vzc3JylJ2dbU779++Xr6+vFi5caPdan3zyibp27arWrVvbbYReeuklzZo1S88995xXBU5P6A9nz57VP//5T+3cuVPHjh3TunXr1LlzZz300EPmMuUhJC0tzeb7LCsrM5eZPn26mjZtqsTERB09elQff/yxGjVqpH/84x+SLg8QevToobvuuks7duxQamqqnnrqKYWHh6ugoMB8na1bt6px48aKi4vT/v37lZqaqoSEBPPy6kVFRTZtyM7O1pNPPqn27dvbhNvaqKb7Q0FBgTp06KBhw4YpJSVFKSkpGjp0qG6//Xbzu6zO51tcXKzbbrtNAwcOtKvLhx9+WG+99ZYsFosOHTqkxx57TMHBwTpx4oTd/11Z7S9dulRNmjTRv/71L6WlpenAgQNKSEiwWeb1119X69attXjxYqWnpys5OVkrVqy4ym/BM9R0X5Ck2bNnKy4uTnFxcU5DRmRkpAYNGqTk5GQdPnxY48aNU8OGDc0fm6qy/hg/frxmzJihHTt26PDhw5o0aZIaNGigPXv2mMusWrVKkydP1ieffOI0cL7//vuaOnWq3n33XaeBc8yYMWrXrp3Wr1+vXbt2qUePHurVq9dVfAOew1P6wqxZs7Rt2zYdO3ZMW7ZsUc+ePdWzZ09z/vTp0zVlyhRt2bJF6enpeuONN+Tj46PPP//cXGbHjh2aMGGClixZorCwMIeBc+TIkbrpppu0adMmHTlyRLGxsWrcuLHNuiM+Pl7BwcFavny5kpOTNWTIELVv316XLl2SJGVlZalJkyYaM2aMUlNTtWPHDvXq1ctuLASgegictUB+fr4aNWqk1NRUPfDAA5o+fbo5b8aMGfLx8bHZAJcrLi42B+Tdu3fX008/bc4rKytT69atFRcX5/R9P/roI/n5+amkpMRuXmxsrMPAWVF0dLTDwPnFF18oODhYOTk5lT6/otmzZysoKMgmYEjSiRMn1KZNG+3fv18REREON0LS5b0Y3hI4PbE/lPvHP/6htm3bmn+XB05Hg5Byv/71r/X444/bPDZ8+HD9/ve/l3R5T4lhGNq/f79Ne5s3b653333XfOyOO+7QlClTnL7PTxUXF6t58+aaNm1alZ/jiVzRH5KSkuTj42Oz9yk3N1f16tXT2rVrHbarss/3b3/7mx555JEq1WVpaamCgoK0aNEim8crq/2SkhK1adNG//73v52+7tmzZxUYGKh169ZV+v61iavXDc7q+/Tp0zIMQ5s3bzYfO3/+vAzDcNpfJPv1hyM33XSTpk6d6nCes8BZ7ujRow4DZ25urho0aKCPP/7YfOzQoUMyDEPbtm2rtD2eylP6giMrVqxQvXr1bPak/tSgQYP0hz/8weE8R9v6ixcvytfXV4mJiTaPd+vWTZMnT5Z0+cfLsLAwzZw505yfm5srf39/LVmyRNLlPbYtWrSw+VE0JSVFhmHoyJEjV/zfADhG4KwF5s+fr9tuu02S9Pnnn6tjx47mHoNbbrlF/fv3r/T5RUVF8vX1tdsQP/rooxoyZIjT57377rtq1qyZw3nXEjjHjh2rvn37KiYmRq1bt1ZkZKSef/5589BHR26++WaNHj3a5rGysjLdc889euONNyQ53giV86bA6Yn9Qbr8y3BUVJQZFKUfByEREREKCwtTv379bPZkS5d/3Y6IiFBaWpokae/evWrRooV5SFX5xj49Pd3meW3btlV0dLQk6YcffpBhGHrzzTfVs2dPtWjRQn369NFXX33ltL1Lly6Vj4+PMjMznS5TG7iiP3z22Wfy9fW1uRl3YWGhfH19FRsb6/B1nX2+69evV/v27ZWXl1elujx//rwCAgJs9nZcqfa3b98uwzC0YMEC3XrrrQoLC9N9992nffv2mcskJCTI399fixYt0s9//nO1adNGI0aM0HfffVdpezyZq9cNzkKG1WpV586d9eSTT6qgoEAlJSWaOXOmWrRoobNnzzp8b0frj58qKytTu3btNGfOHIfzrzZwrl+/3uH/ER4erlmzZjl9PU/mKX3hp3JycjRy5Ej17t270uV69+6t559/3uE8R9v68h80fvoDUu/evRUVFSVJysjIcPj99+nTR3/6058kSW+++abdjx5HjhyRYRgOj7ACUDUEzlqgV69e5sCqpKREzZo108aNGyVJgYGB5orSmaysLBmGoa1bt9o8/te//lXdu3d3+JzTp08rPDxcL7zwgsP51xI4BwwYIH9/f/3617/W9u3btXLlSkVEROixxx5z+Drlg8efnjvyyiuv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9fzzz6tFixYKCgpSv3797C5CkpeXp8cff1whISEKDQ3VsGHDauVVal3dF2JjYx1+RxWv4rlz5071799foaGhCgoKUo8ePbRq1SpzflXWH862N+VXp5acr6sqLrNw4cIr9qlLly5p3LhxatKkiRo2bKhhw4bZBNLawtP6QkpKiu655x6FhobK399fN954o8aMGWNzb0xn2+nyq8tKP+6drmyZhIQEdejQQX5+fgoLC9PTTz9tF7ytVqtefPFFtWzZUv7+/urbt695hfRyo0aNUmhoqPz8/HTLLbfo/fffr85XAMABAicAAAAAoEYQOAEAAAAANYLACQAAAACoEQROAAAAAECNIHACAAAAAGoEgRMAAAAAUCMInAAAAACAGkHgBAAAAADUCAInAAAAAKBGEDgBAAAAADWCwAkAAAAAqBEETgAAAABAjSBwAgAAAABqBIETAAAAAFAjCJwAAAAAgBpB4AQAAAAA1AgCJwAAAACgRhA4AQAAAAA1gsAJAAAAAKgRBE4AAAAAQI0gcAIAAAAAagSBEwAAAABQIwicAAAAAIAaQeAEAAAAANQIAicAAAAAoEYQOAEAAAAANYLACQAAAACoEQROAAAAAECNIHACAAAAAGoEgRMAAAAAUCMInAAAAACAGkHgBAAAAADUiP8Pi+X4JXD0kn4AAAAASUVORK5CYII=\" width=\"924\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "<matplotlib.axes._subplots.AxesSubplot at 0x7efea82900f0>" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "c.time.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "c['time_ellapsed'] = c.time.diff(periods=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('<div/>');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", - " 'ui-helper-clearfix\"/>');\n", - " var titletext = $(\n", - " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", - " 'text-align: center; padding: 3px;\"/>');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('<div/>');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('<canvas/>');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('<canvas/>');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('<button/>');\n", - " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", - " 'ui-button-icon-only');\n", - " button.attr('role', 'button');\n", - " button.attr('aria-disabled', 'false');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - "\n", - " var icon_img = $('<span/>');\n", - " icon_img.addClass('ui-button-icon-primary ui-icon');\n", - " icon_img.addClass(image);\n", - " icon_img.addClass('ui-corner-all');\n", - "\n", - " var tooltip_span = $('<span/>');\n", - " tooltip_span.addClass('ui-button-text');\n", - " tooltip_span.html(tooltip);\n", - "\n", - " button.append(icon_img);\n", - " button.append(tooltip_span);\n", - "\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " var fmt_picker_span = $('<span/>');\n", - "\n", - " var fmt_picker = $('<select/>');\n", - " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", - " fmt_picker_span.append(fmt_picker);\n", - " nav_element.append(fmt_picker_span);\n", - " this.format_dropdown = fmt_picker[0];\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = $(\n", - " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", - " fmt_picker.append(option);\n", - " }\n", - "\n", - " // Add hover states to the ui-buttons\n", - " $( \".ui-button\" ).hover(\n", - " function() { $(this).addClass(\"ui-state-hover\");},\n", - " function() { $(this).removeClass(\"ui-state-hover\");}\n", - " );\n", - "\n", - " var status_bar = $('<span class=\"mpl-message\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "}\n", - "\n", - "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", - "}\n", - "\n", - "mpl.figure.prototype.send_message = function(type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "}\n", - "\n", - "mpl.figure.prototype.send_draw_message = function() {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", - " }\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1]);\n", - " fig.send_message(\"refresh\", {});\n", - " };\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", - " var x0 = msg['x0'] / mpl.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", - " var x1 = msg['x1'] / mpl.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", - " var cursor = msg['cursor'];\n", - " switch(cursor)\n", - " {\n", - " case 0:\n", - " cursor = 'pointer';\n", - " break;\n", - " case 1:\n", - " cursor = 'default';\n", - " break;\n", - " case 2:\n", - " cursor = 'crosshair';\n", - " break;\n", - " case 3:\n", - " cursor = 'move';\n", - " break;\n", - " }\n", - " fig.rubberband_canvas.style.cursor = cursor;\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_message = function(fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message(\"ack\", {});\n", - "}\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function(fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " evt.data.type = \"image/png\";\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src);\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " evt.data);\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig[\"handle_\" + msg_type];\n", - " } catch (e) {\n", - " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", - " }\n", - " }\n", - " };\n", - "}\n", - "\n", - "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function(e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e)\n", - " e = window.event;\n", - " if (e.target)\n", - " targ = e.target;\n", - " else if (e.srcElement)\n", - " targ = e.srcElement;\n", - " if (targ.nodeType == 3) // defeat Safari bug\n", - " targ = targ.parentNode;\n", - "\n", - " // jQuery normalizes the pageX and pageY\n", - " // pageX,Y are the mouse positions relative to the document\n", - " // offset() returns the position of the element relative to the document\n", - " var x = e.pageX - $(targ).offset().left;\n", - " var y = e.pageY - $(targ).offset().top;\n", - "\n", - " return {\"x\": x, \"y\": y};\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * http://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys (original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object')\n", - " obj[key] = original[key]\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function(event, name) {\n", - " var canvas_pos = mpl.findpos(event)\n", - "\n", - " if (name === 'button_press')\n", - " {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * mpl.ratio;\n", - " var y = canvas_pos.y * mpl.ratio;\n", - "\n", - " this.send_message(name, {x: x, y: y, button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event)});\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "}\n", - "\n", - "mpl.figure.prototype.key_event = function(event, name) {\n", - "\n", - " // Prevent repeat events\n", - " if (name == 'key_press')\n", - " {\n", - " if (event.which === this._key)\n", - " return;\n", - " else\n", - " this._key = event.which;\n", - " }\n", - " if (name == 'key_release')\n", - " this._key = null;\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.which != 17)\n", - " value += \"ctrl+\";\n", - " if (event.altKey && event.which != 18)\n", - " value += \"alt+\";\n", - " if (event.shiftKey && event.which != 16)\n", - " value += \"shift+\";\n", - "\n", - " value += 'k';\n", - " value += event.which.toString();\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, {key: value,\n", - " guiEvent: simpleKeys(event)});\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", - " if (name == 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message(\"toolbar_button\", {name: name});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.close = function() {\n", - " comm.close()\n", - " };\n", - " ws.send = function(m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function(msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(msg['content']['data'])\n", - " });\n", - " return ws;\n", - "}\n", - "\n", - "mpl.mpl_figure_comm = function(comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = $(\"#\" + id);\n", - " var ws_proxy = comm_websocket_adapter(comm)\n", - "\n", - " function ondownload(figure, format) {\n", - " window.open(figure.imageObj.src);\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy,\n", - " ondownload,\n", - " element.get(0));\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element.get(0);\n", - " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", - " if (!fig.cell_info) {\n", - " console.error(\"Failed to find cell for figure\", id, fig);\n", - " return;\n", - " }\n", - "\n", - " var output_index = fig.cell_info[2]\n", - " var cell = fig.cell_info[0];\n", - "\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function(fig, msg) {\n", - " var width = fig.canvas.width/mpl.ratio\n", - " fig.root.unbind('remove')\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable()\n", - " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", - " fig.close_ws(fig, msg);\n", - "}\n", - "\n", - "mpl.figure.prototype.close_ws = function(fig, msg){\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "}\n", - "\n", - "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width/mpl.ratio\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message(\"ack\", {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () { fig.push_to_output() }, 1000);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items){\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) { continue; };\n", - "\n", - " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", - " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i<ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code'){\n", - " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,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\" width=\"958\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "<matplotlib.axes._subplots.AxesSubplot at 0x7efea45f62b0>" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "c.time_ellapsed.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "c.time_ellapsed /= 1000000000" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('<div/>');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n", - " 'ui-helper-clearfix\"/>');\n", - " var titletext = $(\n", - " '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n", - " 'text-align: center; padding: 3px;\"/>');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('<div/>');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('<canvas/>');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('<canvas/>');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('<button/>');\n", - " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", - " 'ui-button-icon-only');\n", - " button.attr('role', 'button');\n", - " button.attr('aria-disabled', 'false');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - "\n", - " var icon_img = $('<span/>');\n", - " icon_img.addClass('ui-button-icon-primary ui-icon');\n", - " icon_img.addClass(image);\n", - " icon_img.addClass('ui-corner-all');\n", - "\n", - " var tooltip_span = $('<span/>');\n", - " tooltip_span.addClass('ui-button-text');\n", - " tooltip_span.html(tooltip);\n", - "\n", - " button.append(icon_img);\n", - " button.append(tooltip_span);\n", - "\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " var fmt_picker_span = $('<span/>');\n", - "\n", - " var fmt_picker = $('<select/>');\n", - " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", - " fmt_picker_span.append(fmt_picker);\n", - " nav_element.append(fmt_picker_span);\n", - " this.format_dropdown = fmt_picker[0];\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = $(\n", - " '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", - " fmt_picker.append(option);\n", - " }\n", - "\n", - " // Add hover states to the ui-buttons\n", - " $( \".ui-button\" ).hover(\n", - " function() { $(this).addClass(\"ui-state-hover\");},\n", - " function() { $(this).removeClass(\"ui-state-hover\");}\n", - " );\n", - "\n", - " var status_bar = $('<span class=\"mpl-message\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "}\n", - "\n", - "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", - "}\n", - "\n", - "mpl.figure.prototype.send_message = function(type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "}\n", - "\n", - "mpl.figure.prototype.send_draw_message = function() {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", - " }\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype.handle_resize = function(fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1]);\n", - " fig.send_message(\"refresh\", {});\n", - " };\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", - " var x0 = msg['x0'] / mpl.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", - " var x1 = msg['x1'] / mpl.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", - " var cursor = msg['cursor'];\n", - " switch(cursor)\n", - " {\n", - " case 0:\n", - " cursor = 'pointer';\n", - " break;\n", - " case 1:\n", - " cursor = 'default';\n", - " break;\n", - " case 2:\n", - " cursor = 'crosshair';\n", - " break;\n", - " case 3:\n", - " cursor = 'move';\n", - " break;\n", - " }\n", - " fig.rubberband_canvas.style.cursor = cursor;\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_message = function(fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_draw = function(fig, msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message(\"ack\", {});\n", - "}\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function(fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " evt.data.type = \"image/png\";\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src);\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " evt.data);\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig[\"handle_\" + msg_type];\n", - " } catch (e) {\n", - " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n", - " }\n", - " }\n", - " };\n", - "}\n", - "\n", - "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function(e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e)\n", - " e = window.event;\n", - " if (e.target)\n", - " targ = e.target;\n", - " else if (e.srcElement)\n", - " targ = e.srcElement;\n", - " if (targ.nodeType == 3) // defeat Safari bug\n", - " targ = targ.parentNode;\n", - "\n", - " // jQuery normalizes the pageX and pageY\n", - " // pageX,Y are the mouse positions relative to the document\n", - " // offset() returns the position of the element relative to the document\n", - " var x = e.pageX - $(targ).offset().left;\n", - " var y = e.pageY - $(targ).offset().top;\n", - "\n", - " return {\"x\": x, \"y\": y};\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * http://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys (original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object')\n", - " obj[key] = original[key]\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function(event, name) {\n", - " var canvas_pos = mpl.findpos(event)\n", - "\n", - " if (name === 'button_press')\n", - " {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * mpl.ratio;\n", - " var y = canvas_pos.y * mpl.ratio;\n", - "\n", - " this.send_message(name, {x: x, y: y, button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event)});\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "}\n", - "\n", - "mpl.figure.prototype.key_event = function(event, name) {\n", - "\n", - " // Prevent repeat events\n", - " if (name == 'key_press')\n", - " {\n", - " if (event.which === this._key)\n", - " return;\n", - " else\n", - " this._key = event.which;\n", - " }\n", - " if (name == 'key_release')\n", - " this._key = null;\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.which != 17)\n", - " value += \"ctrl+\";\n", - " if (event.altKey && event.which != 18)\n", - " value += \"alt+\";\n", - " if (event.shiftKey && event.which != 16)\n", - " value += \"shift+\";\n", - "\n", - " value += 'k';\n", - " value += event.which.toString();\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, {key: value,\n", - " guiEvent: simpleKeys(event)});\n", - " return false;\n", - "}\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", - " if (name == 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message(\"toolbar_button\", {name: name});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.close = function() {\n", - " comm.close()\n", - " };\n", - " ws.send = function(m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function(msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(msg['content']['data'])\n", - " });\n", - " return ws;\n", - "}\n", - "\n", - "mpl.mpl_figure_comm = function(comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = $(\"#\" + id);\n", - " var ws_proxy = comm_websocket_adapter(comm)\n", - "\n", - " function ondownload(figure, format) {\n", - " window.open(figure.imageObj.src);\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy,\n", - " ondownload,\n", - " element.get(0));\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element.get(0);\n", - " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", - " if (!fig.cell_info) {\n", - " console.error(\"Failed to find cell for figure\", id, fig);\n", - " return;\n", - " }\n", - "\n", - " var output_index = fig.cell_info[2]\n", - " var cell = fig.cell_info[0];\n", - "\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function(fig, msg) {\n", - " var width = fig.canvas.width/mpl.ratio\n", - " fig.root.unbind('remove')\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable()\n", - " $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n", - " fig.close_ws(fig, msg);\n", - "}\n", - "\n", - "mpl.figure.prototype.close_ws = function(fig, msg){\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "}\n", - "\n", - "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width/mpl.ratio\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n", - "}\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function() {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message(\"ack\", {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () { fig.push_to_output() }, 1000);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('<div/>');\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items){\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) { continue; };\n", - "\n", - " var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n", - " var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i<ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code'){\n", - " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA54AAAHgCAYAAADNOLJ/AAAgAElEQVR4nOzde3iU5Z3/8exFl7S7V1t2/9iDbr2tVu1vq2u39pe2tpba/dW2tsXutt3abZVtLexW2G21tXes1HgEUUQElFoUkIoGFUG9OR/CmYTzKQHCOSGQcEw4SAJkPr8/hhkYmZyZ3PPceb+ua669mHkmz7fd69v5fmae575zBAAAAABABuX4LgAAAAAAEDaCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4AkAAAAAyCiCJwAAAAAgowieAAAAAICMIngCAAAAADKK4BmQxsZGVVZWqra2VnV1dTx48ODBgwcPHjx48Hjfo7a2VpWVlWpsbPQ9vncpBM+AVFZWKicnhwcPHjx48ODBgwcPHi08KisrfY/vXQrBMyC1tbXJJvL9TRIPHjx48ODBgwcPHtn4SPxYU1tb63t871IIngGpq6tTTk6O6urqfJcCAAAAZCVmZj8IngGhiQAAAIDmMTP7QfAMCE0EAAAANI+Z2Q+CZ0BoIgAAAKB5zMx+EDwDQhMBAAAAzWNm9oPgGRCaCAAAAGgeM7MfBM+A0EQAAABA85iZ/SB4BoQmAgAAAJrHzOwHwTMgNBEAAADQPGZmPwieAaGJAAAAgOYxM/tB8AwITQQAAAA0j5nZD4JnQGgiAAAAoHnMzH4QPANCEwEAAADNY2b2g+AZEJoIAACEYNySnZq8eo/vMhAoZmY/CJ4BoYkAAEDUHT7eIGOdrnpgmmKxmO9yECBmZj8IngGhiQAAQNRVHj4hY52MdWo43ei7HASImdkPgmdAaCIAABB1Ow8cTwbPY/WnfZeDADEz+0HwDAhNBAAAom5rzdFk8Dx0vMF3OQgQM7MfBM+A0EQAACDqyvbWJYPnvtqTvstBgJiZ/SB4BoQmAgAAUbe+sjYZPHcfPOG7HASImdkPgmdAaCIAABB1q3YfTgbPrTVHfZeDADEz+0HwDAhNBAAAoq5kx6Fk8Nywp9Z3OQgQM7MfBM+A0EQAACDqFm89kAyeq3Yf9l0OAsTM7AfBMyA0EQAAiLqizTXJ4Lls+0Hf5SBAzMx+EDwDQhMBAICom11anQyeC7bs910OAsTM7AfBM4NGjhwpY4xyc3OVl5enkpKSZo9/5plndPXVV+uDH/yg/uEf/kG/+tWvdPJk65cRp4kAAEDUTd+wNxk8Z5dW+y4HAWJm9oPgmSGFhYXq3r27xowZo9LSUvXp00c9evRQTU1N2uMnTJig3NxcTZgwQTt37tTMmTP193//97rnnntafU6aCAAARN07a6uSwXPq+r2+y0GAmJn9IHhmSF5envr165f8d2Njoy655BINGjQo7fH9+vXTV7/61ZTn7r33Xn3xi19s9TlpIgAAEHVvra5MBs/Jq/f4LgcBYmb2g+CZAQ0NDerWrZsmT56c8vydd96pXr16pX3PhAkT9NGPfjR5Oe727dv1yU9+Uo8//niT56mvr1ddXV3yUVlZSRMBAIBIm7iiIhk8Jy6v8F0OAkTw9IPgmQFVVVXKycnR0qVLU56/7777lJeX1+T7nn32Wf35n/+5PvCBDygnJ0f//d//3ex5CgoKlJOTc8GDJgIAAFE1oXh3MniOX7bLdzkIEMHTD4JnBrQneBYVFelv//ZvNXr0aK1fv15vvfWWPvaxj+mRRx5p8jz84gkAAEIzbsnOZPB8cdEO3+UgQARPPwieGdCeS22/9KUv6Te/+U3Kc3/605/0oQ99SI2Nja06L00EAACibvTC7cng+XzRNt/lIEDMzH4QPDMkLy9P/fv3T/67sbFRl156aZOLC33mM5/Rb3/725TnXn31VX3oQx/SmTNnWnVOmggAAETdqPnbksHzmdlbfJeDADEz+0HwzJDCwkLl5uZq3LhxKisrU9++fdWjRw9VV8f3o7rjjjuUn5+fPL6goEAf/vCH9dprr2nHjh2aNWuWrrzySv37v/97q89JEwEAgKgbMbc8GTwHT9/kuxwEiJnZD4JnBo0YMUKXXXaZunfvrry8PBUXFydf69mzp3r37p389+nTp/XQQw/pyiuv1Ac/+EF97GMf0913360jR460+nw0EQAAiLqhs7Ykg+ej75b6LgcBYmb2g+AZEJoIAABE3ZMzNiWD5++nbPBdDgLEzOwHwTMgNBEAAIi6gVPLksHTvrnOdzkIEDOzHwTPgNBEAAAg6h56Z2MyeN5TuMZ3OQgQM7MfBM+A0EQAACDqBkzekAyed09Y5bscBIiZ2Q+CZ0BoIgAAEHX5k9Ylg+fPX17huxwEiJnZD4JnQGgiAAAQdb9+fW0yeN75UonvchAgZmY/CJ4BoYkAAEDU/fK11cngefsLy3yXgwAxM/tB8AwITQQAAKLu7gmrksHzX59b7LscBIiZ2Q+CZ0BoIgAAEHV9x69IBs9vDV/ouxwEiJnZD4JnQGgiAAAQdT8buzwZPL82dL7vchAgZmY/CJ4BoYkAAEDU/eTF4mTw7PnkPN/lIEDMzH4QPANCEwEAgKi7/YVlyeD5hYFzfJeDADEz+0HwDAhNBAAAou77o5Ykg+cNj87yXQ4CxMzsB8EzIDQRAACIuttGLk4Gz2sLZvguBwFiZvaD4BkQmggAAETdt4YvTAbPqx+Y5rscBIiZ2Q+CZ0BoIgAAEHVff2ZBMnhenu8Ui8V8l4TAMDP7QfAMCE0EAACi7qtDipLB01inU2cafZeEwDAz+0HwDAhNBAAAou7LT85LCZ7H60/7LgmBYWb2g+AZEJoIAABE3RcGzkkJnoeON/guCYFhZvaD4BkQmggAAETdZx+bnRI899We9F0SAsPM7AfBMyA0EQAAiLpPPzwzJXjuPnjCd0kIDDOzHwTPgNBEAAAg6q59cEZK8Nxac9R3SQgMM7MfBM+A0EQAACDqrhkwLSV4bqyq9V0SAsPM7AfBMyA0EQAAiLor758qY13y/67efdh3SQgMM7MfBM+A0EQAACDKYrFY8pfO6wril9wWbz/ouywEhpnZD4JnQGgiAAAQZafONCaDZ2JblYXl+32XhcAwM/tB8AwITQQAAKLsRMPpZPD8l6fny1inOWXVvstCYJiZ/SB4BoQmAgAAUVb73qlk8Ow1crGMdZq2fq/vshAYZmY/CJ4BoYkAAECUHTxWnwyet7+wTMY6TVmzx3dZCAwzsx8Ez4DQRAAAIMqq607KWKeP5zv955gSGes0cXmF77IQGGZmPwieAaGJAABAlFUePiFjna56YJr6jl8hY53GL9vluywEhpnZD4JnQGgiAAAQZTsPHJexTv/4++nq/+pqGev04qIdvstCYJiZ/SB4BoQmAgAAUba15qiMdbr+4Zm6d+JaGev0fNE232UhMMzMfhA8A0ITAQCAKCutqpOxTjc8Olv5k9bLWKdhs8t9l4XAMDP7QfAMCE0EAACibF3lERnr9PmBc1Tw9kYZ6/TkjE2+y0JgmJn9IHgGhCYCAABRtnLXYRnr9KXBc/X41DIZ6/SYK/VdFgLDzOwHwTMgNBEAAIiy4u0HZazTzU8VacjMzTLW6cEpG3yXhcAwM/tB8AwITQQAAKJs8dYDMtbpa0Pna/icchnrlD9pne+yEBhmZj8IngGhiQAAQJQVba6RsU7fHLZQf5i/TcY63TNxje+yEBhmZj8Inhk0cuRIGWOUm5urvLw8lZSUNHlsz549lZOTc8Hj1ltvbfX5aCIAABBls0urZaxTr5GLNWbxDhnrdPeEVb7LQmCYmf0geGZIYWGhunfvrjFjxqi0tFR9+vRRjx49VFNTk/b4Q4cOad++fcnHxo0b1a1bN40dO7bV56SJAABAlE3fsFfGOn3v+SV6pXiXjHX6+csrfJeFwDAz+0HwzJC8vDz169cv+e/GxkZdcsklGjRoUKve/8wzz+jDH/6wjh8/3upz0kQAACDK3l5bJWOdfvjCUr2+okLGOt35UtNXjAHtwczsB8EzAxoaGtStWzdNnjw55fk777xTvXr1atXfuPbaa9WnT582nZcmAgAAUTZpVaWMdfrJi8WasmaPjHW6/YVlvstCYJiZ/SB4ZkBVVZVycnK0dOnSlOfvu+8+5eXltfj+kpIS5eTkNHtPqCTV19errq4u+aisrKSJAABAZE1cHv+V8z/HlCQvu/2355f4LguBIXj6QfDMgI4Gz759++q6665r8biCgoK0CxLRRAAAIIrOv69z7qb4QkPfHr7Id1kIDMHTD4JnBnTkUtvjx4/rIx/5iIYNG9biefjFEwAAhGTckp0y1ukXr6zUovL4np63DF3guywEhuDpB8EzQ/Ly8tS/f//kvxsbG3XppZe2uLjQ2LFjlZubq4MHD7b5nDQRAACIstELt8tYp/95dbVKdhySsU5fearId1kIDDOzHwTPDCksLFRubq7GjRunsrIy9e3bVz169FB1dbUk6Y477lB+fv4F7/vSl76kH/7wh+06J00EAACibNT8bTLW6d6Ja7W24oiMdbpx0FzfZSEwzMx+EDwzaMSIEbrsssvUvXt35eXlqbi4OPlaz5491bt375TjN2/erJycHM2aNatd56OJAABAlI2YWy5jneyb61S2t07GOt3w6GzfZSEwzMx+EDwDQhMBAIAoe3rWFhnr9MDk9dq2/5iMdbquYIbvshAYZmY/CJ4BoYkAAECUDZ6+ScY6Fby9URWHTshYp6sfmOa7LASGmdkPgmdAaCIAABBlj08tk7FOj7lS1dSdlLFOl+c7xWIx36UhIMzMfhA8A0ITAQCAKHvonY0y1umJ6Zt05ESDjHUy1unUmUbfpSEgzMx+EDwDQhMBAIAoGzB5g4x1enrmZp1oOJ0MnsfrT/suDQFhZvaD4BkQmggAAERZ/qR1Mtbp2TnlOn2mMRk8Dx9v8F0aAsLM7AfBMyA0EQAAiLJfv75Wxjo9X7RNkvTx/HjwrK476bkyhISZ2Q+CZ0BoIgAAEGW/fG21jHUavXC7JOmaAdNkrFPFoROeK0NImJn9IHgGhCYCAABRdvcrq2Ss09jFOyRJ1xXMkLFOW2uOea4MIWFm9oPgGRCaCAAARFmfl1fIWKc/LdslSfrsY7NlrFNpFbMNLh5mZj8IngGhiQAAQJT9dOxyGetUuHy3JOnGQXNlrNOaiiOeK0NImJn9IHgGhCYCAABR9pMXi2Ws05srKyVJNz9VJGOdSnYc8lwZQsLM7AfBMyA0EQAAiLLbX1gmY52mrNkjSfr6MwtkrNPC8v2eK0NImJn9IHgGhCYCAABR9v1RS2Ss07T1eyVJ3xmxSMY6zSmr9lwZQsLM7AfBMyA0EQAAiLLbRi6WsU6zSuNB83vPpwZR4GJgZvaD4BkQmggAAETZrc8ulLFO8zbXSJJ+9MfUS2+Bi4GZ2Q+CZ0BoIgAAEGW3DI3f07mo/IAkqfeYEhnrNHFFhefKEBJmZj8IngGhiQAAQJTdPCS+iu2y7QclXbivJ3AxMDP7QfAMCE0EAACi7KbB82Ss08pd8e1T+k1YJWOdXlq0w3NlCAkzsx8Ez4DQRAAAIMq+MHCOjHVaW3FEknTvxLUy1mnU/G2eK0NImJn9IHgGhCYCAABR9tnHZstYp41VtZKk/EnrZazTs3PKPVeGkDAz+0HwDAhNBAAAouzTD8+UsU7l1UclSQVvb5SxTk/N2Oy5MoSEmdkPgmdAaCIAABBl1z44Q8Y67ThwXJL0+NQyGev0mCv1XBlCwszsB8EzIDQRAACIsqsfmCZjnSoOnZAkPTVjs4x1enDKBs+VISTMzH4QPANCEwEAgCi74v6pMtZpX+1JSdKzc8plrFP+pHWeK0NImJn9IHgGhCYCAABRFYvFZKyTsU4HjtVLkkbN3yZjne6ZuMZzdQgJM7MfBM+A0EQAACCqGk43JoNn7YlTkqSXFu2QsU79JqzyXB1CwszsB8EzIDQRAACIqhMNp5PB83j9aUnSn5btkrFOfV5e4bk6hISZ2Q+CZ0BoIgAAEFW1751KBs+G042SpIkrKmSsU+8xJZ6rQ0iYmf0geAaEJgIAAFF18Fh9MnjGYjFJ0pQ1e2Ss04/+uMxzdQgJM7MfBM+A0EQAACCqqutOylinK+6fmnxu+oa9Mtbpe88v8VgZQsPM7AfBMyA0EQAAiKqKQydkrNPVD0xLPjd3U7WMdfrOiEUeK0NomJn9IHgGhCYCAABRtePAcRnr9KkHZySfW1R+QMY6ff2ZBR4rQ2iYmf0geAaEJgIAAFFVXn1Uxjpd//DM5HMlOw7JWKevPFXkrzAEh5nZD4JnQGgiAAAQVaVVdTLW6YZHZyefW1NxRMY63ThorsfKEBpmZj8IngGhiQAAQFStq4yHzM8PnJN8Ll0YBTqKmdkPgmdAaCIAABBVK3cdlrFONw2el3xua80xGet0XcGMZt4JtA0zsx8Ez4DQRAAAIKqKtx+UsU43DylKPpdY6faaAdOafiPQRszMfhA8A0ITAQCAqFq8Nb6C7S1Dz61gm9jb8+P5zmNlCA0zsx8Ez4DQRAAAIKrmba6RsU63Prsw+dzh4w0y1slYp9NnGj1Wh5AwM/tB8MygkSNHyhij3Nxc5eXlqaSkpNnjjxw5orvvvlt/93d/p+7du+uqq67S1KlTW30+mggAAETVrNJqGevUa+Ti5HMnGk4ng+eJhtMeq0NImJn9IHhmSGFhobp3764xY8aotLRUffr0UY8ePVRTU5P2+IaGBn32s5/VrbfeqsWLF2vnzp2aP3++1q5d2+pz0kQAACCqpq3fK2Odvvf8kuRzp880JoPnkRMNHqtDSJiZ/SB4ZkheXp769euX/HdjY6MuueQSDRo0KO3xo0aN0hVXXKFTp061+5w0EQAAiKq311bJWKcfvrA05fmP58eDZ03dSU+VITTMzH4QPDOgoaFB3bp10+TJk1Oev/POO9WrV6+07/nmN7+pH//4x+rTp4/+5m/+Rp/61Kf0+OOP68yZM02ep76+XnV1dclHZWUlTQQAACJp0qpKGev0kxeLU56/ZsA0GetUceiEp8oQGoKnHwTPDKiqqlJOTo6WLk39xu6+++5TXl5e2vdcc801ys3N1c9+9jOtXLlShYWF+uu//ms99NBDTZ6noKBAOTk5FzxoIgAAEDUTl1fIWKefjl2e8vx1BTNkrNPWmmOeKkNoCJ5+EDwzoD3B86qrrtLHPvaxlF84n376af3d3/1dk+fhF08AABCKV4p3yVinPi+vSHn+hkdny1in0irmG1wcBE8/CJ4Z0J5Lbb/85S/rX/7lX1KemzZtmnJyctTQ0Lqb6WkiAAAQVWMX75CxTne/sirl+RsHzZWxTmsqjniqDKFhZvaD4JkheXl56t+/f/LfjY2NuvTSS5tcXOj++++XMUaNjef2qBo2bJj+/u//vtXnpIkAAEBUjV64XcY6/e9rq1Oe/8pTRTLWqWTHIU+VITTMzH4QPDOksLBQubm5GjdunMrKytS3b1/16NFD1dXVkqQ77rhD+fn5yeMrKir04Q9/WP3799eWLVvknNPf/M3f6LHHHmv1OWkiAAAQVc8XbZOxTvdOTN1K7pahC2Ss06LyA54qQ2iYmf0geGbQiBEjdNlll6l79+7Ky8tTcfG5Vdp69uyp3r17pxy/dOlSfe5zn1Nubq6uuOKKFle1fT+aCAAARNXwOeUy1sm+uS7l+W8PXyRjneZuqvZUGULDzOwHwTMgNBEAAIiqp2dtkbFOD0xen/L8vz2/RMY6Td+w11NlCA0zsx8Ez4DQRAAAIKoGT98kY50eemdjyvM/+uMyGes0Zc0eT5UhNMzMfhA8A0ITAQCAqHp8apmMdXp8alnK873HlMhYp9dXVHiqDKFhZvaD4BkQmggAAETVQ+9slLFOg6dvSnm+z8srZKzTK8W7PFWG0DAz+0HwDAhNBAAAouqByetlrNPTs7akPN9vwioZ6/TSoh2eKkNomJn9IHgGhCYCAABRZd9cJ2Odhs8pT3n+nolrZKzTqPnbPFWG0DAz+0HwDAhNBAAAoureiWtlrNPzRakBM39SPJA++75ACrQXM7MfBM+A0EQAACCq/ve11TLWafTC7SnPPzhlg4x1emrGZk+VITTMzH4QPANCEwEAgKi6+5X4vZxjF6fey/mYK0272i3QXszMfhA8A0ITAQCAqGpq9donZ8T39yx4e2MT7wTahpnZD4JnQGgiAAAQVT8du1zGOk1cnrpf57DZ5TLWKX/Sek+VITTMzH4QPANCEwEAgKj6yYvFMtZp0qrKlOefL9omY53unbjWU2UIDTOzHwTPgNBEAAAgqn74wlIZ6/T22qqU519atEPGOvV/dbWnyhAaZmY/CJ4BoYkAAEBUfe/5JTLWadr6vSnP/2nZLhnr1Hf8Ck+VITTMzH4QPANCEwEAgKjqNXKxjHWaVVqd8vzEFRUy1uk/x5R4qgyhYWb2g+AZEJoIAABE1a3PLpSxTvM216Q8P2XNHhnr9KM/LvNUGULDzOwHwTMgNBEAAIiqW4YukLFOi7ceSHl+2vq9Mtbpe88v8VQZQsPM7AfBMyA0EQAAiKqbhxTJWKfi7QdTnp9TVi1jnb4zYpGnyhAaZmY/CJ4BoYkAAEBU3TR4nox1WrnrcMrzC8v3y1inrz+zwFNlCA0zsx8Ez4DQRAAAIKq+MHCOjHVaV3kk5fni7QdlrNPNTxX5KQzBYWb2g+AZEJoIAABE1Q2PzpaxTqVVqXPM6t2HZazTjYPmeqoMoWFm9oPgGRCaCAAARNX1D8+UsU7l1UdTnt9YVStjnT772GxPlSE0zMx+EDwDQhMBAICo+tSDM2Ss044Dx1Oe31pzTMY6/dNDMz1VhtAwM/tB8AwITQQAAKLq6gemyVinikMnUp6vOHRCxjp9csB0T5UhNMzMfhA8A0ITAQCAqLri/qky1qm67mTK89V1J2Ws0xX3T/VUGULDzOwHwTMgNBEAAIiiWCwmY52MdTp4rD7ltcPHG5KvnT7T6KlChISZ2Q+CZ0BoIgAAEEUNpxuT4bL2vVMprx2vP5187UTDaU8VIiTMzH4QPANCEwEAgChqLlyeOnMulB450eCpQoSEmdkPgmdAaCIAABBFtSdOJcNlw+nUy2ljsZguz4+/VvO++z+B9mBm9oPgGRCaCAAARNGBY/XJ4BmLxS54vakVb4H2YGb2g+AZEJoIAABE0b7a5leuvbYgvsfntv3HOrkyhIiZ2Q+CZ0BoIgAAEEWJvTqvfmBa2tdveHSWjHUq28uMg45jZvaD4BkQmggAAETRjgPHZazTtQ/OSPv6FwbOkbFOayuOdHJlCBEzsx8Ez4DQRAAAIIrKq4/KWKdPPzwz7etfeapIxjot33mokytDiJiZ/SB4BoQmAgAAUVRaVSdjnT772Oy0r98ydIGMdVq89UAnV4YQMTP7QfAMCE0EAACiaG3FERnr9IWBc9K+/u3hi2Ss07xNNZ1cGULEzOwHwTMgNBEAAIiilbsOyVinmwbPS/v6vz2/RMY6Td+wt5MrQ4iYmf0geAaEJgIAAFG0bPtBGet085CitK/f/sIyGes0Zc2ezi0MQWJm9oPgGRCaCAAARNGi8gMy1umWoQvSvn7nSyUy1un1FRWdXBlCxMzsB8Ezg0aOHCljjHJzc5WXl6eSkpImjx07dqxycnJSHrm5uW06H00EAACiaN7mGhnr9K3hC9O+/vOXV8hYp1eKd3VyZQgRM7MfBM8MKSwsVPfu3TVmzBiVlpaqT58+6tGjh2pq0t8UP3bsWH3kIx/Rvn37ko/q6uo2nZMmAgAAUTSrtFrGOt02cnHa1++esErGOo1ZvKOTK0OImJn9IHhmSF5envr165f8d2Njoy655BINGjQo7fFjx47VRz/60Q6dkyYCAABRNG39Xhnr9P1RS9K+fk/hGhnr9If52zq5MoSImdkPgmcGNDQ0qFu3bpo8eXLK83feead69eqV9j1jx45Vt27ddNlll+kf/uEf1KtXL23cuLFN56WJAABAFL29tkrGOt3+wrK0r9s318lYp+Fzyju5MoSImdkPgmcGVFVVKScnR0uXLk15/r777lNeXl7a9yxdulQvv/yy1qxZo/nz5+vb3/62PvKRj6iysrLJ89TX16uuri75qKyspIkAAEDkvLmyUsY6/eTF4rSvPzhlg4x1GjJzcydXhhARPP0geGZAe4Ln+506dUpXXnmlBgwY0OQxBQUFFyxIRBMBAICoKVy+W8Y6/XTs8rSvP+ZKZazTwKllnVwZQkTw9IPgmQHtudQ2ne9///u6/fbbm3ydXzwBAEAI/rRsl4x16vPyirSvPzljk4x1Kni7bbchAekQPP0geGZIXl6e+vfvn/x3Y2OjLr300iYXF3q/M2fO6JprrtE999zT6nPSRAAAIIrGLt4hY53ufmVV2teHzS6XsU75k9Z3cmUIETOzHwTPDCksLFRubq7GjRunsrIy9e3bVz169EhukXLHHXcoPz8/efzDDz+smTNnavjpbyAAACAASURBVPv27Vq1apVuv/12ffCDH1RpaWmrz0kTAQCAKBq9cLuMdfrla6vTvv580TYZ63TvxLWdXBlCxMzsB8Ezg0aMGKHLLrtM3bt3V15enoqLz90w37NnT/Xu3Tv571/96lfJY//2b/9Wt956q1avTv8/vk2hiQAAQBQlguWvX08fLF9cFP9FtP+rbZuNgHSYmf0geAaEJgIAAFE0fE7iUtp1aV8ff/Ye0L7j098DCrQFM7MfBM+A0EQAACCKnp61RcY6DZi8Ie3rE5dXyFin/xxT0smVIUTMzH4QPANCEwEAgCh6Ynp81dqH3km/au3k1XtkrNN/jF7WyZUhRMzMfhA8A0ITAQCAKErs0/l4E/t0Tl2/V8Y6fX/Ukk6uDCFiZvaD4BkQmggAAERRwdsbZazT4Omb0r4+u7Raxjr1GrGokytDiJiZ/SB4BoQmAgAAUfTA5PUy1unpWVvSvr6wfL+Mdfr6Mws6uTKEiJnZD4JnQGgiAAAQRfbNdTLWacTc8rSvF28/KGOdbh5S1LmFIUjMzH4QPANCEwEAgCi6d+JaGes0av62tK+v3n1Yxjp98Ym5nVwZQsTM7AfBMyA0EQAAiKL/fW21jHUavXB72tc3VtXKWKfPPja7kytDiJiZ/SB4BoQmAgAAUfSLV1bKWKdxS3amfX1rzVEZ6/RPD83s3MIQJGZmPwieAaGJAABAFP385RUy1umV4l1pX9998ISMdfrkgOmdXBlCxMzsB8EzIDQRAACIov8cUyJjnSYur0j7+r7akzLW6Yr7p3ZyZQgRM7MfBM+A0EQAACCKfvJisYx1mrSqMu3rh443yFgnY53ONMY6uTqEhpnZD4JnQGgiAAAQRT98YamMdXpnbVXa14/Vn04Gz/caznRydQgNM7MfBM+A0EQAACCKvvf8EhnrNH3D3rSvN5xuTAbP2hOnOrk6hIaZ2Q+CZ0BoIgAAEEW9Ri6WsU6zS6vTvh6LxZLBs+boyU6uDqFhZvaD4BkQmggAAETRrc8ulLFORZtrmjzm6gemyVinysMnOrEyhIiZ2Q+CZ0BoIgAAEEVfGzpfxjot3nqgyWOuLZghY5227z/WiZUhRMzMfhA8A0ITAQCAKLr5qSIZ61S8/WCTx9zw6CwZ67RpH3MOOoaZ2Q+CZ0BoIgAAEEVfGjxXxjqt3HW4yWO+MHCOjHVaW3GkEytDiJiZ/SB4BoQmAgAAUfT5s6FyXWXTobLnk/NkrNPynYc6sTKEiJnZD4JnQGgiAAAQRTc8OlvGOpXtbXqGac19oEBrMDP7QfAMCE0EAACi6PqHZ8pYp601R5s85lvD4yvfztvU9Mq3QGswM/tB8AwITQQAAKLoUw/GV6zdeeB4k8f863PxvT6nb9jXiZUhRMzMfhA8A0ITAQCAKGrNHp0/fGGpjHV6e21VJ1aGEDEz+0HwDAhNBAAAoujj+U7GOlXXnWzymDteKpGxTm+srOzEyhAiZmY/CJ4BoYkAAEDUNDbGZGw8eB48Vt/kcT9/eYWMdZpQvLsTq0OImJn9IHgGhCYCAABRU3/6TDJ41r53qsnj7p6wSsY6jV28oxOrQ4iYmf0geAaEJgIAAFFzvP50Mni+13CmyePuKVwjY51eWLCtE6tDiJiZ/SB4BoQmAgAAUVN74lQyeJ4609jkcfbNdTLWafic8k6sDiFiZvaD4BkQmggAAETNgWP1yeAZi8WaPO73UzbIWKchMzd3YnUIETOzHwTPgNBEAAAgavbVnpSxTlfeP7XZ4x59t1TGOg2cWtZJlSFUzMx+EDwDQhMBAICoqTh0QsY6XTNgWrPHDZ6+ScY6Fby9sZMqQ6iYmf0geAaEJgIAAFGzff8xGet07YMzmj3umdlbZKzT/W+t76TKECpmZj8IngGhiQAAQNRsqT4qY50+/fDMZo97rmirjHX69etrO6kyhIqZ2Q+CZ0BoIgAAEDUbq2plrNNnH5vd7HGjF26XsU7/8+rqTqoMoWJm9oPgGRCaCAAARM3aiiMy1unGQXObPW780p0y1um/xq/spMoQKmZmPwieAaGJAABA1KzcdUjGOn35yXnNHjdxeYWMdfrp2OWdVBlCxczsB8EzIDQRAACImmXbD8pYp68OKWr2uMmr98hYpx+PLu6cwhAsZmY/CJ4ZNHLkSBljlJubq7y8PJWUlLTqfa+99ppycnJ02223tel8NBEAAIiaReUHZKzT159Z0OxxU9fvlbFOPxi1tJMqQ6iYmf0geGZIYWGhunfvrjFjxqi0tFR9+vRRjx49VFNT0+z7du7cqUsvvVQ33XQTwRMAAARv3qYaGev0reELmz1udmm1jHXqNWJRJ1WGUDEz+0HwzJC8vDz169cv+e/GxkZdcsklGjRoUJPvOXPmjG688Ua9+OKL6t27N8ETLdpb+57ue2OtSqv4/zkAIJpmbtwnY51uG7m42eMWbNnfql9G22JrzVH9YNRSLd564KL9TWQ/ZmY/CJ4Z0NDQoG7dumny5Mkpz995553q1atXk+978MEH9d3vfleSCJ5olZHz4nua3fcGe5oBAKIpcQnt90ctafa4xL2gN7dwL2hbDJ9TLmOdflW45qL9TWQ/ZmY/CJ4ZUFVVpZycHC1dmnoPwn333ae8vLy071m0aJEuvfRSHTgQ/8atNcGzvr5edXV1yUdlZSVN1MU8/E6pjHW6a9wK36UAANAuU9bEFw26/YVlzR63avdhGev0xSea33alLR59N/45+jNWyu1SCJ5+EDwzoK3B8+jRo7r88ss1bdq05HOtCZ4FBQXKycm54EETdR33TFzTqm+JAQDIVm+urJSxTne81PwijBv21MpYp//72OyLdu7fvL6Wz9EuiODpB8EzA9p6qe2aNWuUk5Ojbt26JR9/9md/pj/7sz9Tt27dtG3btrTn4RdP/Gzschnr9LWh832XAgBAuxQu392qXx3Lq4/KWKfrH5550c7dd/wKGet0y9CLd98osh/B0w+CZ4bk5eWpf//+yX83Njbq0ksvTbu40MmTJ7Vhw4aUx2233aavfvWr2rBhgxoaGlp1Tpqo6/m355dc9G9/AQDoTH9atkvGOvUd3/xtI7sOHpexTv/n99Mv2rl/+MJSGev0+YFzLtrfRPZjZvaD4JkhhYWFys3N1bhx41RWVqa+ffuqR48eqq6uliTdcccdys/Pb/L9LC6E1vjqkCIZ63T1A9NaPhgAgCw0dvEOGet094RVzR63r/akjHW68v6pF+3c3xy2UMY6/eNFDLPIfszMfhA8M2jEiBG67LLL1L17d+Xl5am4uDj5Ws+ePdW7d+8m30vwRGt85pFZMtbJWKeTp874LgcAgDb744LtMtbpl6+tbva4Q8cbkp95jY2xi3LuLz4xN/k3T59pvCh/E9mPmdkPgmdAaKKuJRaL6Yr7pyY/MKvrTvouCQCANnuuKL412K9fb35rsGP1py/6l63XFsxI/s0jJ1p3axOij5nZD4JnQGiiruXoyVPJD0tjnTbvO+q7JAAA2uzZs3tp5k9a1+xxDacbk595tSdOdfi8jY0xXZ5/7nN098ETHf6biAZmZj8IngGhibqWikMnUoJnyY5DvksCAKDNnp65WcY6/X7KhmaPi8Viyc+8mqMdv8qn9r3UL3A37Knt8N9ENDAz+0HwDAhN1LUk9jNLPGZu3Oe7JAAA2uyJ6ZtkrNPD75S2eOxVD0yTsU6Vhzv+6+T7v8BdsvVAh/8mooGZ2Q+CZ0B8N9EbKyuVP2m9Vu8+7OX8Xc2i8gMpH5ivr6jwXRIAAG32mCuVsU4Dp5a1eOy1D8bvydy+/1iHz/v+L3Cnb9jb4b+JaPA9M3dVBM+A+G6i/xq/UsY6jVuy08v5u5p311WlfGCOXrjdd0kAALRZwdsbZazTkzM2tXhsYjX3Tfs6Puss2Zr6Be7E5XyB21X4npm7KoJnQHw3UeIby0febflSGXRcYsPtxGPIzM2+SwIAoM0emLxexjoNnbWlxWM/P3COjHVaV3mkw+edvmEvX+B2Ub5n5q6K4BkQ3000fulOGev085dXeDl/VzNy3taUD8wBk5tflAEAgIQHp2zIms+N376xTsY6jZhb3uKxX35ynox1WrGz4wvqTVxekfI5+nQrgi/C4Htm7qoIngHx3URFm2tkrNPXn1ng5fxdzaPvxn9hvup38YUW/ufV5jfeBgBAkurO244rG/auvGfiGhnrNGr+thaP/X9Pz79oCwH9ccH2lOBZ8PbGDv9NRIPvmbmrIngGxHcTbd9/TMY6/ePvpysWi3mpoSv59etrZazTzUOKZKzTnS+V+C4JABAB56/mmg17V/7Pq6tbfanrt4YvlLFO8zbXdPi8Q85u45J43DNxTYf/JqLB98zcVRE8A+K7iepPn0luxHzwWL2XGrqSu8atkLFOPx27XMY69Rq52HdJAIAIOH8112zYu/IXr8QXJ3x56c4Wj/3X5xbLWKcZF2ELsd9P2SBjnW54NL5g0V3juFWoq/A9M3dVBM+AZEMTJW76Z0uVzPv+qCXJS4OMdfrKU0W+SwIARMD523Flw96VP385/kXqhOLdLR77wxeWylind9ZWdfi8v3wt/kvrbSPjYfYHf1ja4b+JaMiGmbkrIngGJBua6Ad/iH8gvH0RPhDQvMR9LmMX75CxTp9+eKbvkgAAEeDWnVvNNRv2rvzPMSXx7UxasR/1HS/Fj31jZWWHz5u4YqjfhFUy1ukbwxZ2+G8iGrJhZu6KCJ4ByYYmStx3OHLeVm81dBWffWx28j4XY50+nu/U2Mi9tQCA5k0o3p0MnoXLW/6VMdN+8mKxjHV6a3XLYTJxm0lrfh1tyb89H79yaNC0TTLW6cZBczv8NxEN2TAzd0UEz4BkQxM9O6dcxjr99o113mroCmKxWHI128SiTsY61Z085bs0AECWe75oW/Jz448L/O9d2ZbLZ+9+ZVXyap+OSlw5lNgX+9qCGR3+m4iGbJiZuyKCZ0CyoYneWl0pY51uf2GZtxq6ghMNp5NDw/H607pmQDyEVhzyvzohACC7JX7hM9ZpyMzNvstJ/vLYmst+f1UY33rlhQUtb73Skv979sqhxHZwl3PlUJeRDTNzV0TwDEg2NNHKXYdkrNMXn+BylUyqOvKejHX6xO+mKhaLKe/x2VmzOiEAILvlT1qfDJ4PTtnguxz1GrFIxjrNLq1u8djfvrFOxjqNmFve4fMmvrTdWnPuyqHa97hyqCvIhpm5KyJ4BiQbmqjm6Mnk/YanzjR6qyN0G6tqzy4BP1uSdMvQBTLWaXEWrE4IAMhuictVjXX65WurfZejbw6L7805f8v+Fo8dMDm+BcrTHfyltv70mZSwefUD8RBaeZgrh7qCbJiZuyKCZ0CyoYlisVjyG8RdB497qyN0S7bGl8L/l6fnS5J+MCp+f4xb5391QgBAdvvx6OJk6Prp2OW+y9HXhs5v9dYuj7xbKmOdBk4r69A59x+tT7m8NrFgX2kVQaQryIaZuSsieAYkW5oocbP+wvKWv7lE+0xdH18K/3vPL5HUtj3QAABd27eHL0oGz8TniE83P1UkY51Kdhxq8dgnpsfvT33onY0dOue2swvzXXd2QaGbh8RrWLb9YIf+LqIhW2bmrobgGZBsaaKfnd0X65XiXV7rCFliKfy7xsW/qU5sY/NcEdvYAACad9Pgecng+bWh832Xoy8NnitjnVbtPtzisc/M3iJjnX731voOnXPV7sMpa1LcNnKxjHWauXFfh/4uoiFbZuauhuAZkGxpooK3Nyb3xUJmPFe0VcY63TtxrSTp0Yt06REAIHz/9NDMZPD83ONzfJejzw+cI2Od1le2vEBe4vPvN6+v7dA5EyvZ3vrsQknSHS+VyFinN1a2vJcooi9bZuauhuAZkGxpopcW7ZCxTne/ssprHSEbOLVMxjo9+m6pJGn42f1T7ZvsnwoAaFpjY0yX57tk8PzkgOm+S9INj86SsU5le1ueX148O2P0f7VjiyK9vbYqZfu3fhPiCy69tKjj+4Mi+2XLzNzVEDwDki1NNKu0WsY6fXv4Iq91hOz9y8mPX7pTxjr9959Weq4MAJDNak+cSobOxKPhtN9V6BO/wG6tOdrisW+sjO8X/pMXizt0zvHLdslYp77jV0iS7n8rvsXMsNkd36YF2S9bZuauhuAZkGxpos37jspYp396aKbXOkLWd3x8MaHxy+L30U5Zs0fGOv3oj8s8VwYAyGa7D56QsU5Xnd0+xFing8fqvdb0j7+fLmOddh5oeTX8eZvil8h+a/jCDp1z5Lz4Jbv3vRG/ZHfQtPiiRY+cvZIIYcuWmbmrIXgGJFua6ETDaTZizrB//0N8+5R31lZJkuZv2S9jnb45rGMfxACAsK2vjO8Dnff4bF374AwZ67SjFYEvkxIheM+R91o8dk3FERnr9IWBHbs39f23rCSCaEfvHUU0ZMvM3NUQPAOSTU10w6Px/bA27Gl5oQC03S1DF6RsWZP4IL5x0FzPlQEAstmi8gPJ1WxvHBRfTXZNxRGvNX387D2nNXUnWzw28YvtNQOmdeic+ZPit6wMn3P2lpX3XXqLsGXTzNyVEDwDkk1N9K/PxZcln7Z+r+9SgpT3+OyUFQB3HDguY50+9eAMz5UBALKZWxffB/r7o5bo68/Ev8RcsMXfvtuNjbHkVVKHjje0ePyx+nNXVZ1oON3u8979SnwxoXFLdko6d8tKYrEhhC2bZuauhOAZkGxqov99bbWMdfrD/G2+SwnS1WcvS6o4dEKSdPh4Q/KD+NQZv4tEAACy1/n7QCdu23h3XZW3eupPn0l+ftWdbPn2nFgspqt+F/8MrDx8ot3n/fHoYhnr9Nbq+PYp8963vQrClk0zc1dC8AxINjXRkJmbL8oGz7jQyVMXfkifOe8bY9+LRAAAstfzRdtkrNM9E9fo5y/HF6qbULzbWz3Hz/sF872GM616z+ceb/2+n035zohFMtZp7qZqSdLKXYdlrNNNg+e1+28iOrJpZu5KCJ4ByaYmmriiQsY63fFSie9SgrOv9qSMdbri/qmKxWLJ568tiC8SsX3/MY/VAQCyWWL11ofe2ah7J66VsU6jPF6ddORE26/Y+cawhTLWqWhzTbvP++Un58lYpxU7D0mSyqvjK/Jf/zAr8ncF2TQzdyUEz4BkUxMt235Qxjp95aki36UEZ9O+Ohnr9JlHZqU8/8Un4otErNp92FNlAIBslz8pvl/lM7O36KF3NspYpyemb/JWz/6j9cngef6Xqc15/2Wy7fHph+N7h5ZXx/cOra6Lf6n78fzW14HoyqaZuSsheAYkm5poz5H3ZKzTJ343VWca+R/wiykR6m8eUpTy/LeGx78BnteBb4ABAGFLLKozZvEODZ21xfttMXtr4/PClfdPbfV7+r8aX0di9MLt7TpnLBbTFfdPlbFO1WdX0n2v4dxtLMfq279oEaIhm2bmroTgGZBsaqIzjTF94ndTW70vF1pv+oZ9MtbpX59bnPL8f4xeJmOdJq/e46kyAEC2S/xaOGlVpV5atEPGOvV/dbW3eioOxbdH+eSA6a1+T8Hb8V9qn5zRvl9qj6W5rzQWOze3VDG3BC+bZuauhOAZkGxroq88VSRjnZZtP+i7lKAULo+vSPjTsctTnn//0vAAALzft4fHF9WZU1atN1ZWylinOz2ux7B9/zEZ63RtQeu3Axs2u1zGOuVPWteuc1advSrrqt9NS7ms9jOPzJKxTpv2ZccchczJtpm5qyB4BiTbmuiOl0pkrNPEFRW+SwnKqPlnVyQsXJPyfOK+nWGzyz1VBgDIdl8aHF8PYOWuQ5q5MX4FzW0jF7f8xgzZcnZRn39+37oFzRm/dKeMdeo7fkW7zlm2N75Wwg2Ppp4z8YX58rMLDiFc2TYzdxUEz4BkWxM9MDkehIbM3Oy7lKCcvyLh+Z6YHn/+4XdKPVUGAMh2151dAX1rzdEm1wzoTBuramWs0/99bHar3+PW7ZWxTt8ftaRd5yxu4j93YouVOWXV7fq7iI5sm5m7CoJnQLKtif5w9pe5/33N370jIcqftC7tL5vJX0InrmninQCArqyxMabL8+P3NtYcPXneL3+tD30X29qKIzLW6cZBc1v9niXbDshYp6+2MzDPKq1O+0vvxVgtF9GQbTNzV0HwDEi2NdG09XvTLoKDjvnvP61Mey/nayXxez/vGrc8/RsBAF1a7YlTyUV16k+fSa5Af9UD07zVtGLnIRnr9OUn57X6PZv3tf3y3PMl7m19/17jv3gl/ecrwpNtM3NXQfAMSLY10YY9td6/SQ3R7S/EV6+dsiZ19dpE0G/vpUcAgLDtPhhfQfaaAfGgefTkuSB68tQZLzUt3Xawzb9e1hyN77l5eb5r15ZtTa3ma9+MX1E0fA5rJYQu22bmroLgmUEjR46UMUa5ubnKy8tTSUnTq8ZNmjRJN9xwgz760Y/qL/7iL3T99ddr/PjxbTpftjVR3XkfaCca2BPrYvnGsPh+nfO37E95fsnW+KVH/+/p+Z4qAwBks/WV8S+E8x6PfyHc2BjTxxOX3p7dz7KzLSzfL2Odvv7Mgla/59SZxuR8ceh4Q5vP2dT+pY9PLZOxTo851koIXbbNzF0FwTNDCgsL1b17d40ZM0alpaXq06ePevTooZqamrTHFxUV6a233lJZWZm2bdumYcOGqVu3bpoxo/XLi2djE/3TQzNlrNPmfUd9lxKMLwycI2Od1lYcSXm+PQs0AAC6jkXl8S8ovzb03BeU1z88M7nYkA/zNtXIWKdvD1/Upvedv0hSWz30Tnwf0MHTU/cBHTE3vk2LfbN927QgOrJxZu4KCJ4ZkpeXp379+iX/3djYqEsuuUSDBg1q9d/453/+Zw0YMKDVx2djEyX2C5tVygpxF8v/+f10Geu06+DxlOcrD5/wfq8OACB7pVsN9qbB885ur3LYS02JLV2+28b1IBJbn5TsaPvWJ/dOXCtjnUbN35by/Lgl8W1afvHKyjb/TURLNs7MXQHBMwMaGhrUrVs3TZ48OeX5O++8U7169Wrx/bFYTHPmzNFf/MVfaNaspm+cr6+vV11dXfJRWVmZdU109yurZKzTS4t2+C4lCPWnzyQvL6o9cSrltWP1p73fqwMAyF4Tii9chO5bw+O3b8zbnP6KrEybenZ9gh+MWtqm9/3rc4tlrNP0DXvbfM67xq2QsU4TinenPP/W6viiQz8eXdzmv4loIXj6QfDMgKqqKuXk5Gjp0tT/Eb3vvvuUl5fX5Ptqa2v1l3/5l/rABz6g3NxcvfTSS82ep6CgQDk5ORc8sqmJEntOFry9seWD0aLzF1RofN+CCrFYTFfcP1XGOu2r9XOvDgAgez1fdOG2Wz/6Y/oF6zrLlDV7ZKzTj/64rE3vayo8tsYP/rBUxjq5damhdU5ZfJuV74xo22W/iB6Cpx8Ezwxob/BsbGzU1q1btWbNGg0ZMkQf/ehHVVRU1OTxUfjF85XiXTLW6Wdj2eLjYthSHV9C/vqHZ6Z9/TOPzOKeWgBAWokvgx9+59ziOf81Pr6FyPilO73U9GYTW5u05L434pfLjpjb9hVov/7MAhnrtLA8dZG+5We3dunZhq1dEE0ETz8InhnQ0UttE+666y7dcsstrT4+G5sosVodK61eHCU7mv9QvPnsPS/F2w92cmUAgGyXP2m9jHUaNvtcWPvtG/EtREbO2+qlpsQe1G39gnrgtLILQnRrJRbpW1eZukhfR/cHRXRk48zcFRA8MyQvL0/9+/dP/ruxsVGXXnppmxYX+ulPf6qePXu2+vhsbKJdB48n9wyLxdq+1xZSJRZh6DUy/SIM3z17z8vMjfs6uTIAQLb7xSvxXzfHLj637sJjrlTGOg2cWualpvHL4ldG9R2/ok3ve2FB/LLhXxWuafng9/nUg/EVcXceSF2kr+rIezLW6RO/m8rMErhsnJm7AoJnhhQWFio3N1fjxo1TWVmZ+vbtqx49eqi6Or666x133KH8/Pzk8QMHDtSsWbO0fft2lZWVaciQIfrABz6g0aNHt/qc2dhEp840ntsj7Cj3HXbUxBUVMtap95j0lyT1HlMiY50mrqjo5MoAANnuP0bH7+d8a3Vl8rnhc/xuITJm8Q4Z69Rvwqo2ve/1s5+Hbb1E93Qze4Cev0jfew0s0heybJyZuwKCZwaNGDFCl112mbp37668vDwVF59bJa1nz57q3bt38t8PPPCAPvGJT+iDH/yg/uqv/kpf+MIXVFhY2KbzZWsTffGJuWeXam/7kudI9ccF22Ws0y9fW5329V++tlrGOo1euL2TKwMAZLvECrZzN53b4sz3FiKJz7W2/nI5d1N1u/b/PHy8IRkuT59pTHktFoslvyyvruPL8pBl68wcOoJnQLK1iW5/4cJvWNE+T85ofpXgB6dskLFOT83Y3MmVAQCy3ZcGX/hF8OTVe7xuIfJc0VYZ6/Sb19e26X2rdx+WsU43DprbpvftPBC/Begffz897evXPzxTxjqVV7NIX8iydWYOHcEzINnaRImFC56d0/aV55Dqd2/FF4YYOmtL2tefnrVFxjoNmLyhkysDAGS76wri9zZurTkXqhK/HPraQuTZs5f65k9a36b37T54QsY6fXJA+gDZlHWVR2Ss0+cHzkn7+k2D53GVVheQrTNz6AieAcnWJho5L/5t5q/b+G0mLnT3hFUy1mnMeQtDnO/FRfF7Zfq/mv5SXABA19TYGNPladZcWOF5C5GnZ26WsU6/n9K2L0yPnjzVrvsxF5UfkLFOX39mQdrXE5cjz9tU06Z6EC3ZOjOHjuAZkGxtorfXVslYpx/8YWnLB6NZPx5d3Oxly2+0cz80AEDYak+cC2r1p88FtcT+0J9uYn/oTEu3t2hrxGIxXfW7aTLWac+R91r9Prdub3wmGZV+JkncHjRlzZ421YNoydaZOXQEz4BkaxMl7sNo6rIWtN6tZcqN5QAAIABJREFUzzb/Tezs0vglU708XTIFAMhOiUtTrxkwLeX56rqTMtbpivv9bCHy6Lvt384l7/HZMtZpfWVtq9/z6tl9Q+8al377lr7jV8hYp/HLdrW5HkRHts7MoSN4BiRbm+jgsXoZ63R5fuq3rGi7GwfFF4ZYtftw2teXe75kCgCQndZX1spYp7zHZ6c8/17DmeQvocfrT3d6XQVvb2z3onjfGBb/Mnb+lv2tfs+o+fH9P++ZmH4V3d+8vlbGOo2ct7XN9SA6snVmDh3BMyDZ2kSxWEz/+PvpMtZp+/5jvsuJtMSm1zvet+l1QrnnS6YAANkpcW/jLUNT722MxWL6xO+mylinvbWtv2T1YkksmvfM7PSL5jUnsS/p5NWtvyx28PTmV4d/JPEL7LS2/wKL6MjWmTl0BM+AZHMTff2ZBTLWqWgzN+u316nzNr0+/L5NrxNqzl4y9fF8p8bGzr9kCgCQnZq7t/Ezj8ySsU6b9nX+/JBY+b49vzD2O7vg3ouL0i+4l84Dk5tfHX7Y7PatsotoyeaZOWQEz4BkcxP1efnsPRNLd/ouJbIOnL1k2VinM02EypOnzl0yVXfyVCdXCADIVhOKm7638StPFclYp5Idnb+FyD0T18hYpz/M39bm97Zn7+r+r65uNqyOWRxfHf7uCavaXA+iI5tn5pARPAOSzU2UWDzgMde2VetwztaaYzLW6bqCGc0ed82A+Cp/FYdOdFJlAIBs91xRfGuzeydeuLVZr5GLZazT7NLqTq/rf1oIgs15ZvaWNv86eedLJTLW6Y2VrA7flWXzzBwygmdAsrmJXl66U8Y69R2ffhU5tGzlrvjCQTcNbn7hoM89PkfGOm3Y0/pV/gAAYRs4razJbUt+8mJ8q65Jq9KHsUz6xSsrZazTy+24Imr82dniv8avbPV7bjsbsmdu3Jf29Zkb98lYp9tGLm5zPYiObJ6ZQ0bwDEg2N9G8zTUy1ukbwxb6LiWy5pTFt0r5TgtbpdwyNH4/7aLyA51UGQAg2+VPit9LOWx2+QWv3X32Xsmxi9v+q2NH3TUufivOhOLdbX7vu+uqmt2TM52bh8QvK162/WDa15dtPyhjnW4eUtTmehAd2Twzh4zgGZBsbqJt++OXiX7qwRle9gkLwZtnL//5yYvFzR73gz8slbFObt3eTqoMAJDtEr8spguX+ZPWNxlKM633mPilrxNXVLT5vUu2xVfq/Zen57f6PTc8Gt/7s2xv+lmptKpOxjrd8OjstK8jDNk8M4eM4BmQbG6ik6fO6PL8+KI3h5pYkRXNG71wu4x16v/q6maP+/nZhZxeKWbzawBAXGLrkbdWX3g57aBp8S1GHnm389dh+PHo4jZviZKwaV88JP7zI7NadXwsFtNVv4uvg7DnSPqtYyoPn5CxTlc9MK3N9SA6snlmDhnBMyDZ3kSfHxi/93BNxRHfpUTSkJmbZazTgMkbmj0usfn1c0Vsfg0AiPvW8IUy1mnupgsXEEosPPSb1y9ceCjT/v3sVTrvrqtq83trjp7bQqyp1d7Pd/7K78fqT6c9pva9U8ljTp460+aaEA3ZPjOHiuAZkGxvosQloG+vbfuHC6QBk+PLxj89s/ll4xMrCA+cyubXAIC4Lw2eK2OdVu66cMuUPy3b5W0BwH97fomMdZq+If1iP81pzf7W56s+b6/rpm77aWyMJa/Q2n+0vs01IRqyfWYOFcEzINneRPdOXNvuTaLR8t5jCcPnxDe/tm+u66TKAADZ7rqCGTLWaWvNsQtee3ttfJGeH77Q+kV6LpZeIxbJWKc5Ze3byqW5/1zvV159VMY6Xf/wzGaPu/bs39y2v+W/iWjK9pk5VATPgGR7Ew2bHQ9Ev32DQNQeieXu32xi77GE9iwvDwAIV0u/4s3fsl/GOn3Tw8rz3xwWvwR4/pb97Xp/zyfnyVin5Tsv/CX3/RLbkn35yea3JbtxUPzX4dW7D7erJmS/bJ+ZQ0XwDEi2N9Fbq+Orst7+wjLfpUTSd1r5rfCUNXv47xkAkFR74tx9iw2nGy94ffXuwzLW6YtPzO302r42dL6MdVqytX1bgH33ucWtvlR37qb4tmTfHt78tmTf6GAYRvbL9pk5VATPgGR7EyW+abxxUOd/sIXgpsHzmrw/53yJb67ZMxUAIEm7D8ZXav3kgOlpX09seXZdwYxOrkz6ylPxfTVLdrT8i2U6d41bLmOdXi1peR/QyavjX8z+eHTz25IlFjx6hzUpgpXtM3OoCJ4ByfYmOn/1uXTfuKJ5rb2PZU3FEQI+ACBpfWWtjHX63ONz0r6+/2i9jHW6PN+psRWrw15MX3wiflnrqnZe1ppYyb0160eMWxK/FeUXrzR/K8pd4+Lbkk0objnMIpqyfWYOFcEzINneRLFYTNcMiO+ftfPAcd/lRMqZxljyMqkDx5pfZW/ngeMy1ulTD3b+N9cAgOyzsDx+JcwtQxekfb3+9LltRmrfO9WptX3u8fhWaxv21Lbr/QOnlbV6D9LWLr53z8Q1MtZp1Pxt7aoJ2S/bZ+ZQETwDEoUmStzLsYD7Jtrk0PGG5FBw6kzzvxYfbsOxAIDwvbsuvmrtD0Y1vWpt4ovhikMnOrEy6YZHZ8lYp0372je7/GH+Nhnr9KvCNS0e+5hr3XZjBW9vlLFOg6dvaldNyH5RmJlDRPAMSBSaKHEvxp+W7fJdSqRsP3v/TWt+xTz/19GDLfw6Cvz/9u47PIpy+wP4EjQJXKkqICArIKAI4kWNFBX5gSIWvOCFa0Gxcil6saBLj9QkIEV6kdCF0MumkEqAJJDeewhJCIH0Xnfn+/tjdl6y2ZJJ2c3uej7PM88D2clmspnynrecQwixfEdv8HU6vz6ou07ny2u8IJXJEZvdvJHH5nr+t8uiy6FoczIkE1KZHJ/vv9novr+cEjctd6NnEqQyOZaei27WMRHTZw5tZktEgacFMYeL6LeLsaJ6G4m6sCZmHKQaZIQQQgQ7/FIglcnxk0ukzn0mbORnJAWm5hvxyIChy90hlclxO795S3C84/lMte9v05+pFgD+ezgUUpkchxvp/N53NQ1SmRzf/xXerGMips8c2syWiAJPC2IOF5Hz9VuiFvYTdb4J9yGVyfHuVnGZal91almyBkIIIZZDWAe58qLudZBTm1CWpDUNWspP8b1TVNms7xdKwYhJqPfRniBIZXKcj7ijdz8X1SjqLOfGR1Eb4jgOGfkVUBg5SRNpGnNoM1siCjwtiDlcRELPpNgAivCEGqiNpYAXvLuVr0Hmm3DfwEdGCCHE1C06EwWpTI4tXsk69/nC+SakMjlcQjKNeGRA/0X80pD7JVXN+v7b+XxCvWeXay8VU987f6iejYn6n43uMXchlckxbWdAk46lVqHETy6RjX7WpO2ZQ5vZElHgaUHM4SJKvlfaZrXCzJkwUjzvWJio/T/ddwNSmRznwvX36hJCCLF8c4/yU0wPBqTr3Od/x8Mhlcmx72qa0Y6rfk6CgvKaZr1HaVUte4+qWoXefcXOBgpIyYNUJsfEjVdEH0dljQJfHghmxzLGwcfopWmIeObQZrZEFHhaEHO4iCpr6qVsrzBuynZztkmV6GDJWXGJDuYdDYNUJseB67cMfGSEEEJM3Sf7ghrtjFx2LgZSmRwbPZOMdlxVtQ/aBKVVzWsTcByHp5e4QiqTI7uR6bpi62HH3OHrntqt9RJ1DEUVNZi2MwBSmRyDl7rhmWX8utXQ2wWifw9iXObQZrZEFHhaEHO5iITMedFZxs2cZ86E1O7rPcSldl90Jpqm+hBCCAEgbvnFeo8ESGVy2F+INdpxlVXXiR6t1EdoV+irBapUcnhKNa03t1R/xveM/ApIZXI8s6zx6bt3iytZqbjh9h4ISS/AjycijP5ZkqYxlzazpaHA04KYy0X0oapXUB51t60PxWwsUE2B2usvbgqUozvfgPjtomU99JLvlWL+sTDcymte9kNCiHgRmUU4FZoFjqPpguZOmGIaelv3FNM9/nw9zB9F1MNsLUUVD+pO17Wg7vSkzf6N1ggvrhQ/Jbf+cdXU6T6ulPtlGOPgw0ZHE3NKATxICPjiai9KMmSizKXNbGko8LQg5nIRCT2BO/1S2/pQzMbn+5uW9GGXqqD2jy7Ga0AYw8w/bxi9YUTI39VYR75BHZCS19aHQlpIzBTT4zczVLU+g412XLml1SzAa0kHx8d7G89Wm1lQwabCNqZOoWy0HnZEZhFeWMnXIB2/wQ9ZhRXstZo6JUaoXqPrxzSZS5vZ0lDgaUHM5SIS1isuOmP6hZnvl1Rh3tEwBKS27YNjynY+zb1n3D1R+wsNiK8OGK8BYWjC1CepTI4XVl6mXmRCDOh+SRW73mi6oHlTiJxi6hrNZ3KdvivQaMd2t7gSUpkcTy9xbdH7zD/G5zXYf013XoPYbH7d5strxK3bFOqLpmuZYZNXVo1hKzxY/VBtwamQSdgc2jp/R+bSZrY0FHhaEHO5iE6FNq00SFtaeTGOPagqaura7DjGrfeFVCZHcLq4RAVuqgbEh01MBW/KHNwSWEOYkjYQYlhC6SupTI5XnXxouq0ZEztt9Foyn8l10mZ/ox2bMAopZi2lPsvP84mRfr+cqHOfgFT+95sgMlPtqHXekMrkiMoq0nht39U09lmVVWtvGwiZcUesvIzaFkwjJoZhLm1mS0OBpwUxl4vo5q0CSGVyvObk29aHoledQomXVAkLpDI5/vBuu0Q9wpSd5HulovZv6gPW1NXUKfHiak+2jkYqk8PRXVyiJUJI0wkzU4RN7L2HmB6hzmVjwV1UVhGkMjlGrfM20pEBqbllkMrkGNbCEmubvfjzdbGezO/uMTlNqs351iZ+3ei1ZM0ZT8Ka0sNBt3V+v0LJ4cXVXqLqhhLjM5c2s6WhwNOCmMtFlFPMT+EasNi1RckEDM0/KZcdp1Qmx9Dl7o1mwjOE+pn47peKK7AtTCl6SeSUIlN3KSqbjTyfVo2Yv7XJeL3yhPzdCPUI+6vuPbQm33wJAeUra/UHlEKAOnR5y0YfmyIxh6/t/c9Vni16n0OB6ZDK5JhzJFTnPi7BmZDK5PjC+aao9/z3Lj4Romu0eiLEuOwSSGVyDFrihqIK/bVHhYz0lpZvwRKYS5vZ0lDgaUHM5SJSKjkMWuoGqUyOzIKKxr+hjfzowidBWnoumq2xFFtHszUVVzzIxFddJy7d/J0ift3MoKVuFjFF7qM9QWwaVVFFDesMaOn5k5pbhuXnYxqt/UbI3wnHPRipEZLB/XuX5Uzb/7u5mpwrqrOusLx1Msw2RVPrZeoidE5O3617faowPfZ/x8NFvedXqs6X4zcz1L6+6hK/BGfuUd1BriD0Nj/D67kVHi0qF0Nan7m0mS0NBZ4WxJwuov/73Q9SmRzXTTTbW2WNgiUWCL1dwKYHD1jsipT7xp1yFpFZ1OSpSPVro1XWmPfDLk01Fav/IjnuqALE6bsDIZXJcSgwvdnvq1ByeOcPvrbdjN2BFhGgG1tVrcLo1wMxPCHhy4DFrmrXX2G5/tEdYprEBGWAeiZXY/2thefbGAefFr2PsJ5yop7lJRsvJ0Iqk2P5+RhR7ymUMdvj/2C0v1bxYNmHl4hkf0olx8qtuMfkiPq5xDjMqc1sSSjwtCDmdBF94cyXB/mrQU+iqbgQma2RVOObQyFGTzUPPKjJKaZ3VcBxHAaqRgVzisVNzzVVa+R87/KX9TL07laVi/lsv7gpU9oI066E7XRoVmsc7t+K7DSftdE7Xly2ZWIePGL5tXBvb7kKAHh7C99BcyaMrhFzdPTGbUhlcnxzKKTRfYUO19v5xqmVHJLOd+qOW9+ynA8JOfz015F6puyuUCUg2uChOwFRfdoSFvkk3GM/R2zCoLWu8ZDK5Jh3LEzU/sQ4zKnNbEko8DSg7du3QyqVwsbGBnZ2drh5U3cjee/evXj11VfRtWtXdO3aFRMmTNC7vzbmdBEJDwBTTRAjrG+q/8BJzS1jUzyD0vKNchwcx7GMthcis5v0vSNX8b2yCTmmfz7oUlWrYHXS6vcup9wvY2tsynVkFNSnrLqOTSWcrGpUj1zlieKK2tY8fItWXfdgVgA1qCzLBg9+ZOiXU5Fq/6e/s3na4ZcCqUyOn09GNrrvaD2ZXA0hMDW/VRLhCeV/+i+SQ6mj1NYPqmnje/3TRL2ncN6vqDdCOu8oX7Zl5cU40ccWncVPJx6yrHnPK2IY5tRmtiQUeBrIiRMnYG1tDWdnZ8TFxeHbb79F165dcf++9sxmn3zyCXbs2IGIiAgkJCTgiy++QJcuXXDnju5iyA2Z00UkrLUwxYZMflk1Gy1sWGx72Tk+YH5/2zWdD7fWFH+3hK3V1JWyXZfxqunMbTkaVatQIiyjUPTa1IbOhd+BVCbH6HXeanU7OY7D66qA3CO26dOXhFHkcet9UV5dhwkbr7TZGl5z5Zt4n40WP7fCQ2+ZBmJePtt/Uy1jZ3hGIT/dn/7OZmmdGz/itupS48GSkK1VWyZXQxDWn7a0hEtN3YNpwroS/ggdyieCxc202uPPz6z54QSfGKi4ohaDlvD5KWKzi0UfW/0O5PMR4tt0xLDMqc1sSSjwNBA7OzvMnz+f/V+pVKJ3795wcHAQ9f0KhQKdOnXCoUOHRP9Mc7qILqumcr2/7VpbH4oGITvee1s1jy2vrBrPqYpGG+MBslFV0uDrg41PkWpIKF49YeOVNklqkJBTwtZQvrHBD1eScpv8HtN38Ws5t3hplrL57SKfLfDXU1FNes/MggrWePBUjaIKve5PLZIjItM4Pf3mbvHZaLWpyleTm/73JaaH4zg2yyBSdS0olRxb12aq6/KJbsKzQExJMOGe2zCTq6H4JtzX+bxtqmH2/LM5NbdM6+sf7uSz1LqJ/N2O38yAVCbHV6plHsKU5Umb/ZucE+B31frS5jzLiWGYU5vZklDgaQA1NTVo3749zp07p/b1zz//HFOmTBH1HqWlpbC1tcWlS5dE/1xzuoiE9RgjVl5u60PRMHUHn8H2z2u3tL6+zScZUpkcYx19mj2SJ9abm640e/1hYXkNm066zi3eAEenXZ1CiR1+KSy4q7/NPhyCrEJxmWiT75WyBCfa1qkKxc5fXO3VpNHnuUdDIZXJ8em+G2qNByF75zt/XDXpMj+mQKnkWI1boSd/hciEHcS0ZRVWQCqT4+klrmr3t4UnIyGVyfHbxdg2PDrSHMI972BAeqP7fn1QeyZXQxHWE/9rx/UWv5cwCyYkvUDr68LzNEBk54lr9F1IZQ8yOgttA7FTdetLUj3Pnl7iSks6TIQ5tZktCQWeBpCdnQ2JRILAQPUMcr/88gvs7OxEvcfcuXMxYMAAVFXpTgxTXV2NkpIStmVlZZnNRVReL+tqcaXp3ISFOmb9F+mumVlZo8Ara72b/QASSyisPXBx8x9Uwshy/0VyhGUUtvIRakrNLcMHqtIzQk9xam4ZVl2KY+tjhyxzw1bv5EZHYYURTV0JMWrqlGyNYaTIUcqgtHz2eTRc+5pXVo3hqh5z5+vaOx0IT5h6+dwKD8ij+MbZGAcf0aMAVbUKyiJsotxUje13t15V+7p7DH8vec3Jl/52ZuaTfXw5qnPhjc/SEcqI7b5inLqtwv2jsYy7YvxLFRjqWn5ht5bvLIu5I26abP0yNLfyGm8bNOatTfw0ZpeQzGZ9P2ldFHi2DQo8DaClgaeDgwO6deuGqCj9Uwjt7e0hkUg0NnO5iISpW2IfAsbwhzc/mjnzzxt693MJ4TOiDrf3MFja+e2+fEKIlmRuBR4kVPi/3/0MNuVWqeTw57VbGKyqzzpshQdOhmSqNVATckpYGRSpTI7X1/vCIzZHa2bAqloFCwL9ErWviwaAOUf4nvyNnkmNHmP98ilLz2lfy3kk6DYLqO6VmHc2YENyUq2RnXcsDJU1CvZ3j7/b+L3nRlo+nl7iCgc300ws9ncnrH9edEb9GimvrmOzGKiEjnl5dyt/3/NN0H0vFdhf4Dv81nsY5/o8H8Gv4/9kX1CL30tX3U3BM8v4jsqMfHGzbiJVpV5Gr/NmU2VnOTf/eSzMlmqsfUGMgwLPtkGBpwG0ZKrthg0b0KVLF4SENL4OwJxHPIEHvZNi11sYGsdxGL/BT9TUVoWSY0kYdAUxLSUESS2d8lRUUYOXVdMi17q2bMotx3EoqqhBZGYRLkZmY7tvCn49FcXKLQgP1WxVvU1t338+4g47HiF4X3A8HPKouyyB0qnQLDadWd80WmG/hqMz2pwI5tfrDLP3QH5ZtdZ9lEoOU1QjtvNNMPGVqZioSsYkrHMWpudtFbGGbOafN9jIN005Mz2f7uP/PtpKXQlJh3YZaTSMtI6xjnwdydDbjc96EfIKLDtnnKnzwj388xZ2sAIPpoNv903ReK1+8iGx9x1hlPPZ5e6sFufFJmaXry9d9X4DFrsit1T7M4gYDwWebYMCTwOxs7PDd999x/6vVCrRp08fvcmFnJyc0LlzZwQFNa/nz9wuov+pijMba0pPY6KyiliDWEwGWWHa5lOL5IjOat1R24z8CjatR1eQ1BTe8ffYsYbe1r7+RZ+wjELMPRrKkjdo255d7o4jQbdFTcMrrarFOrd4/FNV8kXYBi1xwyznm/g/VUZebQ2I+vLKqvHUIv579dUrLa2qZetd913VPz065k4x+i+ihDm6CI2xgYtd2TR5IQnHlEaShQnTx4VN1zpqSxJ/twTTdgbAV8/IvangOI7NNNA2E0VIvDZ9V8unRRLjEe7bDbO0ayNknP/f8XAjHNmDe0dr1Mdep6qXuVpL9t67xZXsvqMQmRMgv6xa7X41zN6jxbOGhA735bQmvs2ZW5vZUlDgaSAnTpyAjY0NDh48iPj4eMyePRtdu3bFvXt8Fs3PPvsMixYtYvs7OjrC2toap0+fRk5ODtvKyhp/UAjM7SISpq4YasSwqYQ1hd/9Jf6BKwTPU7Zfb9XyKkIa94/2tHz6keAnF743ePwGcVNulUoOnnH38O9dARpBpt1aL/x7VwB+dInAFq9knA3P0hv46aJQcrh5qwBr5HEsSY2wDVzsKmotjfAgP3ZD98iwMH3wjQ1+ospBCNPNXnPyRXqecQqpmwvh3Px034PpYvdLq9jfTd8UZeFzHabKDP3GBj+jlCVqKxzHsevnxdVeKK0y7RFeYY37oKVuWq8TIfFQ/0VynUsMQm8X4IcTEfjtYiyO3chAcHqBzvIWxPAUSo5dm2JG2YRlJF+0YEppUxxWLW/47+HQFr/X7iv8velHVfkTAcdxmH04hK3XFKv+KKm26efNEZCax0Y9k+7RlPW2ZG5tZktBgacBbdu2Df369YO1tTXs7Oxw48aDhtq4ceMwa9Ys9n+pVKp1vaa9vb3on2duF5HwgGvpGkYxyqrr8Oe1W/j1VBTcou9qNKrqFEo2IuaTIL7u5b2SKlZepTWzAArB1KHA9FZ7z+LKWpZcQVuPsKCqVoHjNzPYqKNUxmfi+/lkJCIzi1BZY5h1ohzHIfleKbb7puDjvUHY4y9uJFxYN6Orx/xCZDZbm+YVJ+5vW1pVyxJIDVnmhn1X00T3krcmjuNMruC4EEg1zJApJJXS1QFQVl3HrhX3mLvs35Y8quxXr9Zpa0x1N7SLkdmsI00XYYnB2XDN5QhHb9zG00tctc6IeHG1Fz7aE4SNlxNRUWNa57QlK6qoYX8DMZ1uQpbZqa2QZVYM5+u3Wm1pg9CmaLgOc/+1W+w5FpXVtHJZwrpQqUx3ttymEoLgmX/eoERdbcjc2syWggJPC2JuF5EwVfWNDX4G+xl3iyuxzjVeY4royFWeWH0pjvU4Xknis9f9c5Wn1mQ3+ghTk15YeblVevaFKUFPLdI/etQcQs20pxbJcSo0Cxcis7HvahrWusbjf8fD8Z89gRhZb/rrsBUeWOcW36zRTGOJyy5hAWL9kdziilp891c4+12+ORTSpId8ZkEFPt4bxL7/XzuuI9nIPdSbPJPQf5Ec23ySRR97UFo+Jm32N8gU9ryyajYN+U6DdbxCMqwvD2jvABCmaY7/nR/lXHE+BlKZHN/qyFps7jiOY0ldhGB94GJXnTUGTcFa1VRFfev71nskaAQKNXVKLKlX1/XbQyFYfSkOn++/ydbG1d8mbrxCoz1GIoxiP7vcXdT+Qk3jCRuvGPjIeHv9+efnDw1GKZtDWFJSf8p/RGYR6ww50Ixs5S/XKxvVWkFiRn5FkztDSesztzazpaDA04KY20WUXVTJeiFbezQpLrsEP56IwMDFD3rfx//uhxXnY9QS2wi9+8JoTXPWXdQqlCxN+pKzLZ+KI/QAf7gzoMXvpY2QgEHf9spab+z1TzP5qYEA38AfvY4fnRSyNl5LzmMjlgMWu2KTZ1KTOxSE9/7rZgYbnRu0xA3bfJKb9V5NVVRRg2eXP+htX3kxrtFpqa7Rd1mD5qlF8ib37jfGJZgfUXjnD81kTok5pWyaZsMRLY7j2Ai60PgT6rT2XyTXmYzKnAllSYYud0dBeQ3LuPn5/psmO8rxnz181ml95R5Cb/OldIbZe6BWoURuaTULrJ9aJMcOvxSN36+sug6RmUX462YGq/86ZJkbXBpkviatT8hdMGqdt6j9Y7OLIZXJ8fIaLwMfGU/osFp4MrLF7xWmKvM01tEHAN/5KHR8zDkS2qxzbYIqkdofIhKnNYWDW9OWf5DWZ25tZktBgacFMbeLSKHkWE9kw9GT5sorq2aZF4Vtxu5AeMffY432OoUSPgn3MPtwiFpgKpWJy/qnzY16iYZa2tgXSo40lgSnuUqqajF9dyDe2OCHGbsD8d1f4Vh9KQ57/FNxPuIObqTlm92DcOk5frTl55ORbB2h8FAPb4X6pXeLK/GlKnCQyuSYvOUqYrMNWwZoq6q0T/0ETD+6ROgMeg8GpLNESyNWXoZUxmf7rWvFIPnrg/wUsS1emo1CLVMRAAAgAElEQVQwjuPwqhPfyGtYR+9ach4Lwup3ZgiBzu+XE1vtGJurrLoOwekFOHD9FlZfikNgan6z30uh5FiDdaPqd7uVV87ud97xpjfKoVRyrIOlYY3b+hRKjs2K2OOfilGqTp9h9h6iynXkllazzMZSGb8ez9Smk1sSoRblpM3i1jZmFlSwjgFj2OLF3+cWt0KnrZA1duhyd3Ach28O8fer15x8UdLMTtQ/r93CtJ0BrZ6Ftqy6ji3vMWQ9cKKbubWZLQUFnhbEHC+iN1TlS1rSyBNwHMeCgwGLXfHdX+GNBoG5pdXY45+Kd/64innHwlrU+y7Uy5yy7VqzE6bklj7I0ppVKK7WGHkwhbj+tvRcdKuuJeM4DufC77Cg7uklrtjhl2KQtZ9VtQrWuD8fcQdnw7MwQNVJ8vXBYLUpxRzHsemPwu99r6SKZSd1bsb0Mm0qaxQYsowfTY3L1n6PWXkxTuvohRCwrmgwo0AoHv/iai+jd3ZEZhZhu28K5h0N00hsJWzzjoY1q1PsTBhfIuL53y6rNXiFUY7X1/uius4wa6WbS8g4PGSZW6OdFT83mDUx/ne/Jk0hVio5bPdNYdO2/+93P73BLmm+S1H8ut3pu8VlIi6pqmV/V2Oco0KSwYb3huaof+zCSOqgJW4mVSu8PmEGybAVHshrhez1pGnMsc1sCSjwtCDmeBEJo5Muwbqndol1UpVYYNASN4OPRmlzv7SKZevUVgNPjKM3bmusUSGNq6pVsCQQL63xMmjpitzSanyr6kmXyvjSEpkFrdtJcFi1HnKsow8LArzj72HwUjfWiCypqkWtQqkWBNRfCyqcS8+t8GiVNbqXVUlHxjj46OygETI2jlzlyQLyzIIK1pnSsJxDrULJpr63pD5eU5RX17ER8obbqHXe+OpAMBYcD2dB0ZBlbtjqnSy6jEJNnRKvOfGB7A4/9XJAZdV17Pfd6ad7DW7o7UL8a8d1vObki4/2BOEnl0hs9EyCS3Amrqfk4VZeOcqq61p1muq58DuQyuSYJmKKvzCNWCqT46sDwc0eTbp5q4BNiR+81A1nwvTXTyZNJ9wHvhG5llqp5Nj1aoxak0JnzCo9Ce/E4jhOI7nV4VZM0NfalMoH68D1ZczlOA5J90pxIy0fPgn3cCEyG8duZGCvfxo2eSbhcNBts5ulZArMsc1sCSjwtCDmeBEJDcANHi2bane3uJIFfW1Z3FzInjdi5WWd5Qb0EYq362uUEu3Ohmfht4uxKGjG595UHMfBJSQTQ1VrMJ9b4YHToVmtEgjUKZRsymrDzLE30vLZeT55y1XMcr7JRvhPBKt3diiVHMuOPOdIy0sVCAGu/YVYnfvUKpRspFWoFyvU1pv55w2t37NJVbBe7IhMS9xIy2dBoVTGJ8HZdSUVV5NzNerlxt8tYdPepTI5XnXyweXYnEb/xkdU5SFeXO2ldcRdGA19drm7RvKwqloF1rnGs6C3sW3wUjeMcfDBe1uvYZbzTfzkEomdfqnNmroqjFbr+/sKauqUWHiS/1ktLYdTUF7DzuOnFvEj/KT17PDjR/5+bsIaSuEaNkYirNWX+PNunVvrZHyun8Nh3tGWzWIyhpu3CiCV8WvdG84kETLMv7npSqP3ginbriEjv+1mSRmjk6K1mWOb2RJQ4GlBzPEiEmoCzvzzRrMbMBzH4XPVyOkH26+3SdkLQZ1CycoNzDkS2qSkKYXlNWw6JdWONA8Z+RX4cOeDOqdzj4Y2q8Ohvguqkhb/XOWptXRNbHYxXlz9YN3nkGVuOtcMxt8tYedUU8oENaRQcmytaUBKnt59hdq2Dm4JqKxR4Pnf+KnJurI35hRXsWNMzGl6ptOqWgU8YnMQkJqns9RPVa0Cqy7FsZGcMQ4+uN7I7wHw95YLkdlsVE4q48s/6TrOqloFK1mkK4Nm/Q6B+vUGIzKL1EoY/egSgaC0fJwNz8J23xQsOhONz/bfxP/97qdW4kHbNsbBB/5JTStTIyQIaotRR6WSw7JzfJbjgYtdW3SualNVq0BYRiGcr9/CDyci8P62a5iy/Tqm7wrEp/tu4KsDwZhzJBT/Ox6OzV5JzR7BNUXr3OKbPKI41pHv+GqN9fGNEdbkt7TzWSA8f19f72sWyfEAYN6xMEhlcvxnTyA4jsP90ipsvJyotr5/yDI3jN/gh/e3XcNHe4Lw9cEQ/HAiAovPRrN77LAVHnCNvmv041+l6jxwdE8w+s9uCXNsM1sCCjwtiDleROGqLHTCVKDm9NSfCM7gp9guddOYytcWhB5MoQf/k31BOBOW1eh6Q6EGmdgkEMQ0KFTr1YREVXZrvXApKrtZPe0cx2HyFn7qlbYEPoJbeeV4Y4MfXlzthbBGGodCiYyxjj7NrsEqnNPP/3a50Yy+Qi3ICRuvsGtzrKOP3g6hOUdCIZXx61Ob4m5xJaaoMlJLZfy623/tuI51rvHwiruH4opahGcUYny9gE52OqrJDdLy6jo4uSewjMH9F8nxy6lI3C1W71gSSiuNcfDRuz4uMrOIBcGBqflwdE9go5wvrfESVWKhoqYOmQUViMgsgnf8PbgEZ2K7b4pa+ZKfT0aiuKLx31Wh5Fgwm3K/bcqcKJUcFqg6LQYvdUNQmv51/1W1CmzxSsYXzjcx72gYFqoSizm5J2C7bwr2XU3DkrPReHfrVY0kco1tI1d54kRwRotHc42lvLoOGy8nwsEtAbuupOL4zQy4x+QgKC0f/z3MX1tNycr6zh/8PcjPgEsWBEIZns1eSa3yftt9U/D6et82WW7TXFmFFWwZxWf7b7L7jHAv2Xc1TW9nyJ2iSkyr1wG69Fy06KUBLeUek6N27ZzUkxHb1Jhjm9kSUOBpQcz1IjofcQeDVDfdyVuuajTm9LlTVMkyMZpSZjjPuHssY6ewPbvcHT+5RMI/KRe+Cfex/9otLDsXg5l/3sBYRx/W8GzttO3EOKKzitUCnOm7Apuc1MJfVU/2mWXujY6cKpScqHU9FTV1LBhxcGtej/QaOd+jLabWXklVLWvoCxlP9/jrnzoekKI9660+wekFLCvkcHsPtVHJ+psQ4Nmtbfna3/S8csw9Gqo21dXJPQElVbUoq65jIxQNpz1r88upSLXjk8rkWHA8vMW1gMur62B/IZa970trvOAeo38UJElV2ubZ5e5tOmOkVqHE1wf5BHHPrfDQmRzuanKu2pRpMduLqz3x1YFgbPFKhkdsDjzj7kEedRdnw7NwIjgDhwPTscc/Ve0afm/rNTZl3FRxHKdWr1jX1nDavj4f7eHrF18wwrrrX09FQSrjkwH9nQlJloRt6o7rkEfdFZ2VvFahhJP7gyRzkzb7G3yq9J2iSjbaKkwHHrTEDSHppn3NCMy1zWzuKPC0IOZ8EYXeLmBZPF9e4yWqJAnHcWxN5LSdAW3aYNIls6ACf3gn43UdWTMbbqPWebdaaRlifJU1Cmz2SmLZX59axGd4vV8qLrnPx3v5Bt9vFxtfZ9cUnnF8YfWBi12bPJ2V4zh2/oqdxiVcl8IUscaCKY7jWIO/sWQgHMfhSNBtFtxO2uyPzIIKcByHjPwKnArNwq+nojB+w4MA4ocTEaJG/sQKvV3IpqZKZXK8sPIyW6f4xgY/UY3F3NJqtl73xdWecI/JafR7mnaMBWpTd+ccCdV5Hp4KzWKdJW2tqlaBGaq1tS+svKw2AptXVs1GRaUyvt7w/mu3cOD6LWz3TcF6jwTYX4jFL6ciMf9YGNa5xsM1+i6yCitEz0CoqVNi39U09rcROgR0JejiOK5VSxY1lbCmeOBiVyw7F4MfXSLw5YFgTN1xHeM3+OGfqzwxap13k4KQ2Yf55GlHgm4b8Mh5P6qywe9uw9wMpqC8ug5zj/LTvVsyxflKUi5rSz273B2HAtMNMvpZp1Cye+CUbddQXadgM1dGrvJs9YR7hmDObWZzRoGnBTH3iyizoIL1mg1Z5ga3Rhq5Qra+wUvdkGaEJAgtwXEcQtILsOhMFF5Z641Jm/0x50goHN0T4BKSieD0AuSWVpt8IgQiTnZRpVoDeehyd2z3TdHbABAKvQ9c7GqQzgchE++HOwMQl12C5HuluJVXjsyCCuQUVyGvrBqZBRUITi/Axchs7LuahjXyODbCN2iJG8pEToU/cP0W+91lp6NEfY+z6nve3HRF53VQXaeA7HQUe+/5x8L0TmHPLa02WAOI4zhcjs1RGyGTypqWHCcoLR+bPJMMlhCrqlaBDR6JLEgfsfIyzkfc0fh8hXV2rZFZtDWUVtXi/W3XWHCZWVABl5BMVsroqUV8EiSx52Nz5JZW49dTUWzk+Nnl7vhg+3W8tckfrzr54MXVnmx68oDFrvhkXxAOB90W3cnUGmLuFLNpma0542ehKpFYw6zMhiCM1u6/1jplnwhwv6SKdWIKsx52+qW26trljaqkcM+t8GBJjSpq6tg07Umb/Q16fbYGc28zmysKPC2IJVxEpVW1bORAKuPXfURnFSOzoALl9coHZBZU4FlVRtE/6YFFTFRYRqHaGsQxDj44rKMHWgjwfhQxnbU5sosq2TXTnG32YXHlGIAHReilMt01PxsqrqxlDXm7tV6YsTsQi85EYfeVVHjE5iA8o5Al5em/iM9ebQodNXUKJY7dyMAYBx98tv+mSa4LjMsuYWUbhNHP+nUDp6o+V1PKKFtQXoOJG6+wzkXh2N/echWRmY3PiGkt0VnF7PMRsz21iO/c2Xc1zaCjPiVVtWy68TeHQlr1WhCSxTR3an5TCKNkplz2xBwplBwOBqSz5Q5SGZ98yNE9QaNzpLJGgaisIriEZGLVpTg4uifoLcEVlJbPlgY1vGdkF1WyJRBfHwwxyfuhwBLazOaIAk8LYikXUZ1CyXrgG26Dlrjh5TVebCrJ9F2BJn1jI0Sp5HA2PEttDeKLq72w60oqW8+YllvGRlaak9lVrNOhWXjVyQcvrfHCCysvY9gKDwxZ5sZGxAYtdcOrTj74964AzD8WhtWX4rDXPw0XI7Ob3Ft+IjijyfVsG65z0rYNt/fAlSZmbCX8GrAtXsnsbz1ylSfcovk1ZEJgZ2ozR3KKq1iG1WeWuWOPf2qbTGvlOA6BqfnwjLuH6yl5CMsoREJOCTLyK5BbWo203DLsvpKKD7ZrBqh2a73wylpv2K31wstrvPDSGi+8uJr/95Kz0c2aAs5xHEsaNNbRp1WnkQPAH97JkMr015ZsLV8f5GdiNLf2NdGvpk6JU6FZmLDxQUmWQUvd8MOJCMw+HIJx633V1pkL2+ClbljnFq9xbhWW17Bn2UIdJXrCMwpZ3g5jdF40l6W0mc0NBZ4WxNIuouM3M/DOH1fxylpvdhOrvz273J3KjhCzUVWrwKHAdLWso8PtPbDxciIrQfLlgeA2Oz6O40xiBLGoogbhGYU4G56FjZ5J+P6vcLy39RqG2Xvgw50BuJ1P13xLxNwpZiUnpDI5m5I3bIWHSXbiZRdVYqdfqlmsGQP443W+fgszdgeKqsf60hovuEbfbdK1J0xLf3qJq0FGf4Wp8qPXeWPF+RgcDEiHf1IusgorWv0cEWY4mVM2VHOkVHLwjLvHZo003Eau8sTHe4NgfyFWbf36cHsP7PBLQWWNAhzHseRf43/307vM4Vz4HfYex25kGC3LblNYWpvZXFDgaUEs+SLiOA4VNXW4U1SJmDvF8E/KpQYoMUu1Cr4HuuHaQKlMjmAzyQZIzFt1nQLrPRLUAqOP9gS19WFZnPyyakRlFSE6qxgxd/gtNrsYcdkl8E24r3YP+PpgiKiM7hGZRXh6CT9qratWbEtdV2WZ1rYNXuqGKduu4WJkdqsEoUIisnPhpjPN25JxHIcbaflY6xqPP6/dwvWUPLVp98I+3vH38NamBx1Udmu9WCKoQUvcRJWrqZ9lVyrjE0dO2xmABcfDsfFyIstv0VYsuc1syijwtCB0ERFiPhRKDm7Rd1kyho/3UsOfGFf9GqetVUeRiFdVq8DGy4kskHxuhQcOBqTrzNBeVFHDZkzMPRpq0BkKsdnFcAnOxDq3eHxzKAT/97sfO05he3frVVxLzmvW+xdX1mL1pTj2no2V/CHGp1ByOBOWpTZLpykdHkolh+XnY1jJO23buPW+Bv4tdKM2c9ugwNOC0EVEiPnhOA4JOSUmnwGQWKaqWgUCUvJMcirc30XSvVK1BEZvb7mKbw6F4MsDwZj55w18vDcI03cHsmRCr6/3bdUMpWLVKZRIzyvHH97JGFovUdmn+24gOktczeJahRIHA9LxgipDsVQmxxfON0XX7yXGV12ngPP1Wxjr6IOFJyOb3OHBcRwKy2sQmVmES1HZ2OmXisVnozHzzxs614kaA7WZ2wYFnhaELiJCCCHE/CiVHA4FpusdHZLK+FJjMXfEBXmGlF9Wjd8uxqqNgs47Fobg9AJkFlRodGRwHAffhPtqtWUnbrwCv8T7bfQbkL87ajO3DQo8LQhdRIQQQoj5yimuwvGbfEZol5BMnAnLwoXIbLhG34VHbI6odaDGlFlQgR9PRGjNjDrM3gPjN/hh+u5AtaQ2/1zlicNBt9skQzEhAmoztw0KPC0IXUSEEEIIMbb4uyX47+FQjHHw0ZqFXsjCu9Y1HsWVNK2WtD1qM7cNCjwtCF1EhBBCCGlLHMehuLIWKffLEJSWj4uR2Th64zYy8s2jJA75e6A2c9ugwNOC0EVECCGEEEKIftRmbhsUeFoQuogIIYQQQgjRj9rMbYMCTwtCFxEhhBBCCCH6UZu5bVDgaUHoIiKEEEIIIUQ/ajO3DQo8LQhdRIQQQgghhOhHbea2QYGnBaGLiBBCCCGEEP2ozdw2KPC0IHQREUIIIYQQoh+1mdsGBZ4WhC4iQgghhBBC9KM2c9ugwNOC0EVECCGEEEKIftRmbhsUeFoQuogIIYQQQgjRj9rMbYMCTwtCFxEhhBBCCCH6UZu5bVDgaUHoIiKEEEIIIUQ/ajO3DQo8LQhdRIQQQgghhOhHbea2QYGnBaGLiBBCCCGEEP2ozdw2KPC0IMXFxZBIJMjKykJJSQlttNFGG2200UYbbbTR1mDLysqCRCJBcXFxWzff/1Yo8LQgwkVEG2200UYbbbTRRhtttOnfsrKy2rr5/rdCgacFUSqVyMrKQnFxsVF6iWhklTZho3OCtoYbnRO0NdzonKCt4UbnBG0NN2OdE8XFxcjKyoJSqWzr5vvfCgWepMlKSmhePFFH5wRpiM4J0hCdE6QhOidIQ3ROWDYKPEmT0U2BNETnBGmIzgnSEJ0TpCE6J0hDdE5YNgo8SZPRTYE0ROcEaYjOCdIQnROkITonSEN0Tlg2CjxJk1VXV8Pe3h7V1dVtfSjERNA5QRqic4I0ROcEaYjOCdIQnROWjQJPQgghhBBCCCEGRYEnIYQQQgghhBCDosCTEEIIIYQQQohBUeBJCCGEEEIIIcSgKPAkhBBCCCGEEGJQFHiamMDAQFhZWeGdd97ReK2mpgZOTk54/vnn0aFDBzz66KMYM2YMnJ2dUVtby/bbvn07pFIpbGxsYGdnh5s3b7LXCgoK8N1332Hw4MGwtbXFk08+ie+//x7FxcVqP+v777/HyJEjYW1tjREjRmgcS1VVFWbNmoVhw4ahffv2+OCDD7T+PtXV1ViyZAn69esHa2trSKVS7N+/n70+btw4SCQSjU3b7w8A//3vfyGRSLB582a1r69ZswajR49Ghw4d0KVLF63fa65M4ZzIz8/HpEmT8MQTT8Da2hp9+/bF/Pnz1dKd+/n5af1b5uTksH0UCgWWLVuGp556Cra2thgwYABWrVoFjuPYPvfu3cOsWbPwxBNPoEOHDpg0aRKSk5O1fi7jx49Hx44d0alTJ7z22muorKzUeywSiQTBwcHN/EuYDkOfEwCQmpqKf/3rX3jsscfQqVMnTJ8+Hffu3WOvN/UzTklJwSOPPKJxfe7duxevvvoqunbtiq5du2LChAkax1KfrnsAAMjlctjZ2cHW1hZdu3bVel86cOAAhg8fDhsbGzz++OOYN2+ezp9lboxxXuzZswfjxo1Dp06dIJFIUFRUpPGzkpKSMGXKFDz66KPo1KkTxo4dC19fX/a6mPvJmTNnMHHiRHb+jRo1Ch4eHmo/x9/fH++99x6eeOIJSCQSnDt3TuNYzpw5gzfffBPdu3eHRCJBRESExj5VVVWYN28eunfvjn/84x+YNm2a2rluzkzlnHj//ffx5JNPwsbGBr169cLMmTORnZ3NXvfz88OUKVPQq1cvdOzYESNGjMDRo0fV3iM2NhbTpk2DVCrVeQ8oLS3FggUL0K9fP9ja2mL06NEa9yOO47B8+XL06tULtra2mDBhgsYzJiwsDBMnTkSXLl3QvXt3fPvttygrK9PzSRNCxKDA08R8/fXXWLBgAR555BG1m3JNTQ3eeOMNdOvWDdu3b0dERATS0tJw7Ngx/POf/2QP0xMnTsDa2hrOzs6Ii4vDt99+i65du+L+/fsAgJiYGEybNg0XL15EamoqfHx8MGjQIHz44Ydqx/H9999j+/bt+Oyzz7QGnuXl5ZgzZw727t2LSZMm6Qw8p0yZgldeeQVeXl5IT09HYGAgrl+/zl4vKChATk4O22JjY9G+fXscOHBA473Onj2LESNGoHfv3hoPnBUrVmDTpk346aefLC7wNIVzorCwEDt37kRISAhu374Nb29vDBkyBB9//DHbRwhEkpKS1P6mSqWS7bN27Vo8+uijkMvlSE9Px6lTp/DII4/gjz/+AMA3CEaNGoXXXnsNwcHBSExMxOzZs9GvXz+Ul5ez9wkMDETnzp3h4OCA2NhYJCYmwsXFhaVfr6mpUTuGnJwcfPPNN+jfv79akGuuDH1OlJeXY8CAAZg6dSqio6MRHR2NDz74AC+//DL7ezblM66trcVLL72EyZMna1yfn3zyCXbs2IGIiAgkJCTgiy++QJcuXXDnzh2N31vfPeD06dPo1q0bdu3ahaSkJMTFxcHFxUVtn40bN6J37944duwYUlNTERUVhQsXLjTzr2B6DH1eAMDmzZvh4OAABwcHnUHGoEGD8M477yAqKgrJycmYN28eOnbsyDqhxNxPFixYACcnJwQHByM5ORmLFy/Gww8/jPDwcLaPm5sbli5dirNnz+oMPA8fPoyVK1di3759OgPPOXPm4Mknn4SPjw9CQ0MxatQojBkzphl/AdNjKufEpk2bEBQUhNu3byMgIACjR4/G6NGj2etr167FsmXLEBAQgNTUVGzZsgVWVla4dOkS2yc4OBgLFy7E8ePH0atXL62B54wZMzB06FD4+/sjJSUF9vb26Ny5s9r9xNHREV26dMH58+cRFRWFKVOmoH///qiqqgIAZGdno1u3bpgzZw4SExMRHByMMWPGaLSTCCFNR4GnCSkrK8MjjzyCxMRE/Oc//8HatWvZa05OTrCyslJ76Apqa2tZo9zOzg7z589nrymVSvTu3RsODg46f+7JkydhbW2Nuro6jdfs7e21Bp71zZo1S2vg6e7uji5duqCgoEDv99e3efNmdOrUSS3IAIA7d+6gT58+iI2NhVQq1frAAfjRDEsKPE3xnBD88ccf6Nu3L/u/EHhqa3QI3n33XXz11VdqX5s2bRo+/fRTAPxIiUQiQWxsrNrxPv7449i3bx/72iuvvIJly5bp/DkN1dbW4vHHH8eqVatEf4+pMsY5cfnyZVhZWamNQBUXF6Ndu3bw8vLSelz6PuNff/0VM2fOFHV9KhQKdOrUCYcOHVL7ur57QF1dHfr06YM///xT5/sWFhaiQ4cO8Pb21vvzzZWx7xW6rve8vDxIJBJcvXqVfa20tBQSiUTnuQNo3k+0GTp0KFauXKn1NV2BpyA9PV1r4FlcXIyHH34Yp06dYl9LSEiARCJBUFCQ3uMxdaZyTmhz4cIFtGvXTm1ktaF33nkHX375pdbXtLUDKisr0b59e8jlcrWvjxw5EkuXLgXAd2726tULGzZsYK8XFxfDxsYGx48fB8CP4Pbo0UOt0zQ6OhoSiQQpKSmN/m6EEN0o8DQh+/fvx0svvQQAuHTpEgYOHMhGDp5//nm89dZber+/pqYG7du313j4fv7555gyZYrO79u3bx8ee+wxra+1JPCcO3cuJkyYAJlMht69e2PQoEH4+eef2XRIbYYNG4Zvv/1W7WtKpRLjx4/Hli1bAGh/4AgsLfA0xXMC4HuEx40bxwJG4EGjQyqVolevXpg4caLa6DbA92pLpVIkJSUBACIjI9GjRw82pUp4uKempqp9X9++fTFr1iwAwP379yGRSLB161aMHj0aPXr0wOuvv45r167pPN7Tp0/DysoKWVlZOvcxF8Y4Jy5evIj27durFfCurq5G+/btYW9vr/V9dX3GPj4+6N+/P0pKSkRdn6WlpbC1tVUb6WjsHnDz5k1IJBI4OzvjhRdeQK9evfD2228jJiaG7ePi4gIbGxscOnQIzzzzDPr06YPp06cjMzNT7/GYC2PfK3QFGRzHYciQIfjmm29QXl6Ouro6bNiwAT169EBhYaHWn63tftKQUqnEk08+iW3btml9vbmBp4+Pj9bfo1+/fti0aZPO9zMHpnJONFRQUIAZM2Zg7NixevcbO3Ysfv75Z62vaWsHCB0cDTuXxo4di3HjxgEA0tLStJ4Hr7/+Ov73v/8BALZu3arRCZKSkgKJRKJ1NhYhRDwKPE3ImDFjWMOqrq4Ojz32GPz8/AAAHTp0YDdFXbKzsyGRSBAYGKj29V9++QV2dnZavycvLw/9+vXDkiVLtL7eksBz0qRJsLGxwbvvvoubN2/C1dUVUqkUX3zxhdb3ERqPDdePrFu3Dm+++SZ7YP6dAk9TOyc++ugjdOjQARKJBO+//z6bmgQAiYmJ2L17N0JDQxEQEIAvv/wSDz30EMLCwtg+SqUSMpkM7dq1w0MPPYR27dph3bp17PXa2lr069cP06r9tMUAAAxaSURBVKdPR2FhIWpqauDo6AiJRMIaSUFBQZBIJOjevTucnZ0RHh6OH374AdbW1lrXggLA5MmTMXnyZL2flbkwxjmRm5uLzp07Y8GCBaioqEB5eTm+++47SCQSzJ49W+v7avuM8/Pz8eSTT8Lf3x+AuOtz7ty5GDBggNq51dg94Pjx45BIJOjXrx9Onz6N0NBQfPzxx3j00UfZjAsHBwc8/PDDGDJkCDw8PBAUFIQJEyZgyJAhqKmp0XtM5sDY9wp9QUZWVhZefPFFtGvXDu3bt8cTTzyhdWRN3/2kIScnJ3Tr1k1timd9zQ08jx07Bmtra439X375Zfz66686388cmNI5AfAzHzp27AiJRIJRo0YhPz9f5892cXGBtbW12uyX+nS1A0aPHo1x48YhOzsbCoUCR44cgZWVFQYPHgwACAgIgEQiwd27d9W+b/r06ZgxYwYAfi3pQw89hPXr16OmpgaFhYX48MMPIZFI1J5XhJCmo8DTRCQmJuKhhx5Se6jOnz8fM2fOBADY2tq2+kOipKQEdnZ2ePvtt3VOd2lJ4Pnmm2/C1tZWLUnNmTNn0K5dO62jnrNnz8bw4cPVvhYaGoqePXuqrU35uwSepnhO5OTkICEhARcuXMDQoUMxd+5cvT//9ddfZ8cL8AFC3759cfz4cURHR+Pw4cPo3r07Dh48yPYJDQ3FiBEjIJFI0L59e0yaNAmTJ0/G22+/DeBBw2Hx4sVqP2v48OFYtGiRxjFkZWXBysoKp0+f1nus5sCY58Tly5cxYMAAFjzMnDkTI0eOxJw5czTeU9dnPHXqVMhkMvb/xq5PBwcHdOvWDVFRUexrYu4Bx44dg0QiwZ49e9jXqqur8dhjj2H37t0A+NF2iUSCy5cvs31yc3NhZWWlkbTG3LTFvULfiOeUKVMwefJkXL9+HWFhYZg7dy769Omj0dgXez85duwYOnbsqHeqLgWe6kzpnBDk5eUhKSkJnp6eGDt2LN555x2ta+59fX3RsWNHjen29elqB6SmpuL1119nz4+XX34Zn376KZ555hkA4gJPgD8vevbsifbt28Pa2hoLFy5Ez5494ejoqPOYCCGNo8DTRPzyyy/sRilsVlZW6NChA4qLi1t9WkxpaSlGjx6NCRMm6O1lbkng+fnnn2PgwIFqX4uPj4dEItEYmSovL0fnzp1Z76xg8+bNrOErbBKJBFZWVpBKpRo/05ICT1M9JwTXrl3T+gCvb+HChRg1ahT7f9++fbF9+3a1fVavXo0hQ4ZofG9xcTFyc3MB8OuMhOyjt27dgkQiwZEjR9T2nzFjBj755BON91m1ahUef/xxvWuJzIWxzwmAbywKDcmePXti/fr1Gvvo+oy7dOmicazC8dfPbg0AGzZsQJcuXRASEqL2dTH3AF9fX0gkEo3p1nZ2dmzk3tnZGRKJRGMqcI8ePbB3715dH5dZaIvzQleQ4e3trbE+GACefvppvevKdd1Pjh8/jg4dOmis22uIptqqM6VzQpusrCytQe2VK1fwj3/8Q60TSRt9HdAA36YQzqUZM2awrL5iptrWd+/ePZSVlaG8vBxWVlY4efJko78bIUQ3CjxNQF1dHXr27ImNGzciJiZGbRs4cCB27doFR0dH0YkAvvvuO/aaUqlEnz591B74JSUlGDVqFMaNG4eKigq9x9aSwHPPnj3o0KGDWgry8+fPw8rKSmPE88CBA7CxsdGYepOfn6/xmfTu3RsymQyJiYkaP9NSAk9TPicE/v7+kEgkSE9P17nPxIkTMXXqVPb/7t27Y+fOnWr7rFu3DoMGDdL5HsnJybCysmIjVRzHoXfv3hrJhV544QWNUVCO49C/f3+d64TMibHPiYZ8fHzQrl07jetO32ccHx+vdpxr1qxBp06dEBMTo7bez8nJCZ07d9aazEXMPaCkpAQ2NjZqyYVqa2vRo0cP1oAVElfVX/9VUFCgdm6Zo7Y6L3QFGRcvXoSVlZVG6YnBgwerJbdpSNv95K+//oKtrS3Onz/f6OfQ0uRC9UfrExMTzTq5kKmdE9pkZGRAIpGwqb/C9//jH//Q6JzUprHAU1BYWIguXbqw+4CQXOj3339n+wj3DyG5kDb79+9Hx44dRf1uhBDdKPA0AefOnYO1tbVGLU2AXxPx0ksvobq6Gq+99hpLfR4ZGYm0tDS4uLhg5MiRaqnPbWxscPDgQcTHx2P27Nno2rUrq0lWUlKCV155BcOHD0dqaqpaKQSFQsF+bkpKCiIiIvDf//4XgwcPRkREBCIiItTWQsXFxSEiIgLvv/8+3njjDbaPoKysDH379sW///1vxMXFwd/fH4MGDcI333yj8Xu++uqr+M9//iPq89L2wMnIyEBERARWrlyJRx55hB2LudbdMrVzwtXVFc7OzoiJiUF6ejrkcjmeffZZteQQmzdvxvnz55GSkoKYmBgsWLAAVlZWag39WbNmoU+fPqycytmzZ/HYY4+pTWk7efIk/Pz8kJaWhvPnz0MqlWLatGlqn8HmzZvRuXNnnDp1CikpKVi2bBlsbW01khJ5e3tDIpEgISGhhX+RtmfMcwLgRwiDgoKQmpqKI0eOoHv37vjpp580fnZTPmNtHUOOjo6wtrbG6dOn1c49fdeutnvAggUL0KdPH1y+fBmJiYn4+uuvNRLafPDBB3juuecQEBCAmJgYvPfeexg6dKhZj4Yb+7zIyclBREQEK09y9epVREREsLW0eXl5ePTRRzFt2jRERkYiKSkJCxcuxMMPP4zIyEgA4u4nx44dw0MPPYQdO3aonRf1f8+ysjJ2r5dIJNi0aRMiIiKQkZHB9ikoKEBERARcXV0hkUhw4sQJREREqNUXnjNnDvr16wdfX1+EhoZqlPowN6Z2Tty4cQPbtm1DREQEbt++DR8fH4wZMwYDBw5kCcyE6bWLFy9W+3vXz4pfU1PD/t5PPPEEFi5ciIiICLVMsx4eHnB3d8etW7fg6emJESNG4JVXXlG7xh0dHdG1a1dcuHCBlYqqX04FALZt24awsDAkJSVh+/bt6NChAyv7RQhpPgo8TcB7772ntbgz8CDhTlRUFKqrq+Hg4IDhw4fD1tYW3bt3x9ixY3Hw4EG1shfbtm1Dv379YG1tDTs7O9y4cYO9pq/oe/2e5nHjxjW6j1DEueFWX0JCAiZOnIgOHTqgb9+++OmnnzRGO4XeZU9PT1Gfl7ZG56xZs7QeS/3eVHNiaueEr68vRo8ejS5dusDW1haDBg2CTCZT6/11cnLCwIED2XG88cYbakXjAc3i3gMGDMDSpUvVOjSEsgoPP/ww+vXrh2XLlmlN/uLg4IC+ffuiY8eOGD16tNasth9//LHF1OMz5jkBADKZDD179sTDDz+MQYMGYePGjVrXYzXlM9YWeOq6j+jKnit8T8N7QG1tLX7++Wf06NEDnTp1wsSJEzUSk5SUlOCrr75C165d0b17d0ydOtXss9oa+7ywt7fX+veqn+0zJCQEb731Frp3745OnTph1KhRcHNzY6+LuZ/oegYJ2a0B3feu+vscOHCg0fOrqqoK8+bNQ7du3dCxY0dMnTpVLTA1N6Z2TkRHR2P8+PHo3r07bGxs8NRTT2HOnDlqtTV1PcOFbLTAg1Frffu4uLhgwIABsLa2Rq9evTB//nyNAJzjOCxfvhw9e/aEjY0NJkyYwDKtCz777DN0794d1tbWeP7553H48OGm/AkIITpQ4EkIIYQQQgghxKAo8CSEEEIIIYQQYlAUeBJCCCGEEEIIMSgKPAkhhBBCCCGEGBQFnoQQQgghhBBCDIoCT0IIIYQQQgghBkWBJyGEEEIIIYQQg6LAkxBCCCGEEEKIQVHgSQghhBBCCCHEoCjwJIQQQgghhBBiUBR4EkIIIYQQQggxKAo8CSGEEEIIIYQYFAWehBBCCCGEEEIMigJPQgghhBBCCCEGRYEnIYQQQgghhBCDosCTEEIIIYQQQohBUeBJCCGEEEIIIcSgKPAkhBBCCCGEEGJQFHgSQgghhBBCCDEoCjwJIYQQQgghhBgUBZ6EEEIIIYQQQgyKAk9CCCGEEEIIIQZFgSchhBBCCCGEEIOiwJMQQgghhBBCiEFR4EkIIYQQQgghxKAo8CSEEEIIIYQQYlAUeBJCCCGEEEIIMSgKPAkhhBBCCCGEGBQFnoQQQgghhBBCDIoCT0IIIYQQQgghBkWBJyGEEEIIIYQQg6LAkxBCCCGEEEKIQf0/9kJ9O+nriO0AAAAASUVORK5CYII=\" width=\"926\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "<matplotlib.axes._subplots.AxesSubplot at 0x7efea2dbb278>" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "c.time_ellapsed.plot()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "ns = c.time[-1] - c.time[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "19458885120.0" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ns" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "s = ns/1000000000" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "19.45888512" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "s" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "ps = s/c.shape[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.19458885120000002" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ps" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "t = (ps*1000)/60" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.2431475200000004" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/comparenew-and-old-output.ipynb b/comparenew-and-old-output.ipynb deleted file mode 100644 index 42820fb590c0ebdc36e0b4977b31bc58810f5b7f..0000000000000000000000000000000000000000 --- a/comparenew-and-old-output.ipynb +++ /dev/null @@ -1,1430 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "compare the new and old output to find problems" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "old = pd.read_excel('./travelogues_extraction/script/old_output_for_comparision/TravelogueD18_script_output_2020-07-13-10 20 28_20200707.xlsx', types=str)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "old.index = old.Systemnummer" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Systemnummer</th>\n", - " <th>MMS-ID</th>\n", - " <th>Volltext</th>\n", - " <th>Barcode</th>\n", - " <th>Verfasser ; GND-ID</th>\n", - " <th>Werktitel</th>\n", - " <th>Reihentitel ; Bandzählung</th>\n", - " <th>Haupttitel ; Titelzusatz ; Verantwortlichkeitsangabe</th>\n", - " <th>Bandzählung ; Titel des Bandes</th>\n", - " <th>Ausgabe</th>\n", - " <th>...</th>\n", - " <th>Widmungsempfänger ; GND-ID</th>\n", - " <th>Art des Inhalts</th>\n", - " <th>Inhalt</th>\n", - " <th>Werke in Relation</th>\n", - " <th>Schlagworte</th>\n", - " <th>Marker</th>\n", - " <th>Zusammenstellung</th>\n", - " <th>Signatur</th>\n", - " <th>Standort</th>\n", - " <th>VD17</th>\n", - " </tr>\n", - " <tr>\n", - " <th>Systemnummer</th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>AC03114611</th>\n", - " <td>AC03114611</td>\n", - " <td>990004456580603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ42124907</td>\n", - " <td>Z42124907</td>\n", - " <td>Keate, George 100176542</td>\n", - " <td>Account of the Pelew islands; 1788; http://via...</td>\n", - " <td>Neuere Geschichte der See- und Land-Reisen; Er...</td>\n", - " <td>Nachrichten von den Pelew=Jnseln in der Westge...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>...</td>\n", - " <td>Friedrich Wilhelm; https://d-nb.info/gnd/11869...</td>\n", - " <td>Reisebericht</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>Palauinseln; Entdeckung; Reisebericht 1783; En...</td>\n", - " <td>TravelogueD18 Ozeanien</td>\n", - " <td>NaN</td>\n", - " <td>361949-B.1; MAG .- UNASSIGNED .- UNASSIGNED</td>\n", - " <td>ZKAR</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC03826205</th>\n", - " <td>AC03826205</td>\n", - " <td>990005906350603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ59423102;\\nhttp:...</td>\n", - " <td>Z59423102;\\nZ171040301</td>\n", - " <td>Phillip, Arthur https://d-nb.info/gnd/118982796</td>\n", - " <td><<The>> voyage of Governor Phillip to Botany B...</td>\n", - " <td>Magazin von merkwürdigen neuen Reisebeschreibu...</td>\n", - " <td>Gouverneur Phillips Reise nach Neu=Südwallis; ...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>...</td>\n", - " <td>NaN</td>\n", - " <td>Reisebericht</td>\n", - " <td>Shortlands, Watts und Marshalls Rückreisen von...</td>\n", - " <td>NaN</td>\n", - " <td>Phillip, Arthur; New South Wales; Reisebericht...</td>\n", - " <td>TravelogueD18 Ozeanien</td>\n", - " <td>Zusammenstellung: ohne übergeordnetem Titel vo...</td>\n", - " <td>303755-A.1; MAG .- 276879-A.1; MAG .- 276879-A...</td>\n", - " <td>ZFID; ZALT</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC09792500</th>\n", - " <td>AC09792500</td>\n", - " <td>990029473670603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ148207602</td>\n", - " <td>Z148207602</td>\n", - " <td>Cranz, David https://d-nb.info/gnd/116717548</td>\n", - " <td>NaN</td>\n", - " <td>Bibliothek der neuesten Reisebeschreibungen; E...</td>\n", - " <td><<David Cranz>> Historie von Grönland enthalte...</td>\n", - " <td>NaN</td>\n", - " <td>Zweite Ausgabe</td>\n", - " <td>...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>Grönland; Geschichte 1761-1762; Reise; Topografie</td>\n", - " <td>TravelogueD18 Arktis</td>\n", - " <td>NaN</td>\n", - " <td>251329-B.1; MAG</td>\n", - " <td>ZFID</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC09836279</th>\n", - " <td>AC09836279</td>\n", - " <td>990029921640603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ124931607</td>\n", - " <td>Z124931607</td>\n", - " <td>Ellis, Henry https://d-nb.info/gnd/119218666</td>\n", - " <td><<A>> voyage to Hudson's-Bay, by the Dobbs Gal...</td>\n", - " <td>Sammlung neuer und merkwürdiger Reisen zu Wass...</td>\n", - " <td>Reise nach Hudsons Meerbusen,; welche von zwey...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>...</td>\n", - " <td>Friedrich Ludwig; https://d-nb.info/gnd/120667886</td>\n", - " <td>Reisebericht</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>Forschungsreise; Hudson-Baygebiet; Moore, Will...</td>\n", - " <td>TravelogueD18 Nordamerika</td>\n", - " <td>NaN</td>\n", - " <td>251276-B.1; MAG .- 361.900-B.Kar-; UNASSIGNED</td>\n", - " <td>ZFID; ZKAR</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC07705435</th>\n", - " <td>AC07705435</td>\n", - " <td>990016481420603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ69824303</td>\n", - " <td>Z69824303</td>\n", - " <td>Le Gentil de la Galaisière, Guillaume J. https...</td>\n", - " <td>Voyage Dans Les Mers De L'Inde</td>\n", - " <td>Neue Sammlung von Reisebeschreibungen; Zweyter...</td>\n", - " <td><<Le Gentils>> Reisen in den indischen Meeren ...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>...</td>\n", - " <td>NaN</td>\n", - " <td>Reisebericht</td>\n", - " <td><<Chappe d'Auteroche>> Reise nach Mexiko und C...</td>\n", - " <td>Chappe D'Auteroche, Jean: Voyage en Californie...</td>\n", - " <td>Südostasien; Reise; Geschichte 1761-1769; Le G...</td>\n", - " <td>TravelogueD18 Nordamerika Asien</td>\n", - " <td>Zusammenstellung: ohne übergeordnetem Titel vo...</td>\n", - " <td>364251-B.2; MAG</td>\n", - " <td>ZKAR</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>5 rows × 48 columns</p>\n", - "</div>" - ], - "text/plain": [ - " Systemnummer MMS-ID \\\n", - "Systemnummer \n", - "AC03114611 AC03114611 990004456580603338 \n", - "AC03826205 AC03826205 990005906350603338 \n", - "AC09792500 AC09792500 990029473670603338 \n", - "AC09836279 AC09836279 990029921640603338 \n", - "AC07705435 AC07705435 990016481420603338 \n", - "\n", - " Volltext \\\n", - "Systemnummer \n", - "AC03114611 http://data.onb.ac.at/ABO/%2BZ42124907 \n", - "AC03826205 http://data.onb.ac.at/ABO/%2BZ59423102;\\nhttp:... \n", - "AC09792500 http://data.onb.ac.at/ABO/%2BZ148207602 \n", - "AC09836279 http://data.onb.ac.at/ABO/%2BZ124931607 \n", - "AC07705435 http://data.onb.ac.at/ABO/%2BZ69824303 \n", - "\n", - " Barcode \\\n", - "Systemnummer \n", - "AC03114611 Z42124907 \n", - "AC03826205 Z59423102;\\nZ171040301 \n", - "AC09792500 Z148207602 \n", - "AC09836279 Z124931607 \n", - "AC07705435 Z69824303 \n", - "\n", - " Verfasser ; GND-ID \\\n", - "Systemnummer \n", - "AC03114611 Keate, George 100176542 \n", - "AC03826205 Phillip, Arthur https://d-nb.info/gnd/118982796 \n", - "AC09792500 Cranz, David https://d-nb.info/gnd/116717548 \n", - "AC09836279 Ellis, Henry https://d-nb.info/gnd/119218666 \n", - "AC07705435 Le Gentil de la Galaisière, Guillaume J. https... \n", - "\n", - " Werktitel \\\n", - "Systemnummer \n", - "AC03114611 Account of the Pelew islands; 1788; http://via... \n", - "AC03826205 <<The>> voyage of Governor Phillip to Botany B... \n", - "AC09792500 NaN \n", - "AC09836279 <<A>> voyage to Hudson's-Bay, by the Dobbs Gal... \n", - "AC07705435 Voyage Dans Les Mers De L'Inde \n", - "\n", - " Reihentitel ; Bandzählung \\\n", - "Systemnummer \n", - "AC03114611 Neuere Geschichte der See- und Land-Reisen; Er... \n", - "AC03826205 Magazin von merkwürdigen neuen Reisebeschreibu... \n", - "AC09792500 Bibliothek der neuesten Reisebeschreibungen; E... \n", - "AC09836279 Sammlung neuer und merkwürdiger Reisen zu Wass... \n", - "AC07705435 Neue Sammlung von Reisebeschreibungen; Zweyter... \n", - "\n", - " Haupttitel ; Titelzusatz ; Verantwortlichkeitsangabe \\\n", - "Systemnummer \n", - "AC03114611 Nachrichten von den Pelew=Jnseln in der Westge... \n", - "AC03826205 Gouverneur Phillips Reise nach Neu=Südwallis; ... \n", - "AC09792500 <<David Cranz>> Historie von Grönland enthalte... \n", - "AC09836279 Reise nach Hudsons Meerbusen,; welche von zwey... \n", - "AC07705435 <<Le Gentils>> Reisen in den indischen Meeren ... \n", - "\n", - " Bandzählung ; Titel des Bandes Ausgabe ... \\\n", - "Systemnummer ... \n", - "AC03114611 NaN NaN ... \n", - "AC03826205 NaN NaN ... \n", - "AC09792500 NaN Zweite Ausgabe ... \n", - "AC09836279 NaN NaN ... \n", - "AC07705435 NaN NaN ... \n", - "\n", - " Widmungsempfänger ; GND-ID \\\n", - "Systemnummer \n", - "AC03114611 Friedrich Wilhelm; https://d-nb.info/gnd/11869... \n", - "AC03826205 NaN \n", - "AC09792500 NaN \n", - "AC09836279 Friedrich Ludwig; https://d-nb.info/gnd/120667886 \n", - "AC07705435 NaN \n", - "\n", - " Art des Inhalts \\\n", - "Systemnummer \n", - "AC03114611 Reisebericht \n", - "AC03826205 Reisebericht \n", - "AC09792500 NaN \n", - "AC09836279 Reisebericht \n", - "AC07705435 Reisebericht \n", - "\n", - " Inhalt \\\n", - "Systemnummer \n", - "AC03114611 NaN \n", - "AC03826205 Shortlands, Watts und Marshalls Rückreisen von... \n", - "AC09792500 NaN \n", - "AC09836279 NaN \n", - "AC07705435 <<Chappe d'Auteroche>> Reise nach Mexiko und C... \n", - "\n", - " Werke in Relation \\\n", - "Systemnummer \n", - "AC03114611 NaN \n", - "AC03826205 NaN \n", - "AC09792500 NaN \n", - "AC09836279 NaN \n", - "AC07705435 Chappe D'Auteroche, Jean: Voyage en Californie... \n", - "\n", - " Schlagworte \\\n", - "Systemnummer \n", - "AC03114611 Palauinseln; Entdeckung; Reisebericht 1783; En... \n", - "AC03826205 Phillip, Arthur; New South Wales; Reisebericht... \n", - "AC09792500 Grönland; Geschichte 1761-1762; Reise; Topografie \n", - "AC09836279 Forschungsreise; Hudson-Baygebiet; Moore, Will... \n", - "AC07705435 Südostasien; Reise; Geschichte 1761-1769; Le G... \n", - "\n", - " Marker \\\n", - "Systemnummer \n", - "AC03114611 TravelogueD18 Ozeanien \n", - "AC03826205 TravelogueD18 Ozeanien \n", - "AC09792500 TravelogueD18 Arktis \n", - "AC09836279 TravelogueD18 Nordamerika \n", - "AC07705435 TravelogueD18 Nordamerika Asien \n", - "\n", - " Zusammenstellung \\\n", - "Systemnummer \n", - "AC03114611 NaN \n", - "AC03826205 Zusammenstellung: ohne übergeordnetem Titel vo... \n", - "AC09792500 NaN \n", - "AC09836279 NaN \n", - "AC07705435 Zusammenstellung: ohne übergeordnetem Titel vo... \n", - "\n", - " Signatur Standort \\\n", - "Systemnummer \n", - "AC03114611 361949-B.1; MAG .- UNASSIGNED .- UNASSIGNED ZKAR \n", - "AC03826205 303755-A.1; MAG .- 276879-A.1; MAG .- 276879-A... ZFID; ZALT \n", - "AC09792500 251329-B.1; MAG ZFID \n", - "AC09836279 251276-B.1; MAG .- 361.900-B.Kar-; UNASSIGNED ZFID; ZKAR \n", - "AC07705435 364251-B.2; MAG ZKAR \n", - "\n", - " VD17 \n", - "Systemnummer \n", - "AC03114611 NaN \n", - "AC03826205 NaN \n", - "AC09792500 NaN \n", - "AC09836279 NaN \n", - "AC07705435 NaN \n", - "\n", - "[5 rows x 48 columns]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "old.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "new = pd.read_excel('./travelogues_extraction/script/output/TravelogueD18_script_output_2020-07-17-17:48:57_20200707.xlsx', index_col=0, dtype=str)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>Systemnummer</th>\n", - " <th>MMS-ID</th>\n", - " <th>Volltext</th>\n", - " <th>Barcode</th>\n", - " <th>VerfasserGND ; GND-ID</th>\n", - " <th>Werktitel</th>\n", - " <th>Reihentitel ; Bandzählung</th>\n", - " <th>Haupttitel ; Titelzusatz ; Verantwortlichkeitsangabe</th>\n", - " <th>Bandzählung ; Titel des Bandes</th>\n", - " <th>Ausgabe</th>\n", - " <th>...</th>\n", - " <th>Widmungsempfänger ; GND-ID</th>\n", - " <th>Art des Inhalts</th>\n", - " <th>Inhalt</th>\n", - " <th>Werke in Relation</th>\n", - " <th>Schlagworte</th>\n", - " <th>Marker</th>\n", - " <th>Zusammenstellung</th>\n", - " <th>Signatur</th>\n", - " <th>Standort</th>\n", - " <th>VD17</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>AC03114611</th>\n", - " <td>AC03114611</td>\n", - " <td>990004456580603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ42124907</td>\n", - " <td>Z42124907</td>\n", - " <td>Keate, George ; http://d-nb.info/gnd/124956432</td>\n", - " <td>Account of the Pelew islands ; 1788 ; http://v...</td>\n", - " <td>Neuere Geschichte der See- und Land-Reisen ; E...</td>\n", - " <td>Nachrichten von den Pelew=Jnseln in der Westge...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>...</td>\n", - " <td>Friedrich Wilhelm ; http://d-nb.info/gnd/11869...</td>\n", - " <td>Reisebericht</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>Palauinseln ; Entdeckung ; Reisebericht 1783 ;...</td>\n", - " <td>TravelogueD18 Ozeanien</td>\n", - " <td>NaN</td>\n", - " <td>361949-B.1 MAG .- UNASSIGNED .- UNASSIGNED</td>\n", - " <td>ZKAR ; ZKAR ; ZKAR</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC03826205</th>\n", - " <td>AC03826205</td>\n", - " <td>990005906350603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ59423102;\\nhttp:...</td>\n", - " <td>Z59423102;\\nZ171040301</td>\n", - " <td>Phillip, Arthur ; http://d-nb.info/gnd/118982796</td>\n", - " <td><<The>> voyage of Governor Phillip to Botany B...</td>\n", - " <td>Magazin von merkwürdigen neuen Reisebeschreibu...</td>\n", - " <td>Gouverneur Phillips Reise nach Neu=Südwallis ;...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>...</td>\n", - " <td>NaN</td>\n", - " <td>Reisebericht</td>\n", - " <td>Shortlands, Watts und Marshalls Rückreisen von...</td>\n", - " <td>NaN</td>\n", - " <td>Phillip, Arthur ; New South Wales ; Reiseberic...</td>\n", - " <td>TravelogueD18 Ozeanien ; Zusammenstellung: ohn...</td>\n", - " <td>Zusammenstellung: ohne übergeordnetem Titel vo...</td>\n", - " <td>303755-A.1 MAG .- 276879-A.1 MAG .- 276879-A,1...</td>\n", - " <td>ZALT ; ZFID ; ZFID</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC09792500</th>\n", - " <td>AC09792500</td>\n", - " <td>990029473670603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ148207602</td>\n", - " <td>Z148207602</td>\n", - " <td>Cranz, David ; http://d-nb.info/gnd/116717548</td>\n", - " <td>NaN</td>\n", - " <td>Bibliothek der neuesten Reisebeschreibungen ; ...</td>\n", - " <td><<David Cranz>> Historie von Grönland enthalte...</td>\n", - " <td>NaN</td>\n", - " <td>Zweite Ausgabe</td>\n", - " <td>...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>Grönland ; Geschichte 1761-1762 ; Reise ; Topo...</td>\n", - " <td>0 ; ONB-AK-RETRO ; TravelogueD18 Arktis</td>\n", - " <td>NaN</td>\n", - " <td>251329-B.1 MAG</td>\n", - " <td>ZFID</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC09836279</th>\n", - " <td>AC09836279</td>\n", - " <td>990029921640603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ124931607</td>\n", - " <td>Z124931607</td>\n", - " <td>Ellis, Henry ; http://d-nb.info/gnd/119218666</td>\n", - " <td><<A>> voyage to Hudson's-Bay, by the Dobbs Gal...</td>\n", - " <td>Sammlung neuer und merkwürdiger Reisen zu Wass...</td>\n", - " <td>Reise nach Hudsons Meerbusen, ; welche von zwe...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>...</td>\n", - " <td>Friedrich Ludwig ; http://d-nb.info/gnd/120667886</td>\n", - " <td>Reisebericht</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>Forschungsreise ; Hudson-Baygebiet ; Moore, Wi...</td>\n", - " <td>0 ; ONB-AK-RETRO ; TravelogueD18 Nordamerika</td>\n", - " <td>NaN</td>\n", - " <td>251276-B.1 MAG .- 361.900-B.Kar- UNASSIGNED</td>\n", - " <td>ZFID ; ZKAR</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC07705435</th>\n", - " <td>AC07705435</td>\n", - " <td>990016481420603338</td>\n", - " <td>http://data.onb.ac.at/ABO/%2BZ69824303</td>\n", - " <td>Z69824303</td>\n", - " <td>Le Gentil de la Galaisière, Guillaume J. ; htt...</td>\n", - " <td>Voyage Dans Les Mers De L'Inde</td>\n", - " <td>Neue Sammlung von Reisebeschreibungen ; Zweyte...</td>\n", - " <td><<Le Gentils>> Reisen in den indischen Meeren ...</td>\n", - " <td>NaN</td>\n", - " <td>NaN</td>\n", - " <td>...</td>\n", - " <td>NaN</td>\n", - " <td>Reisebericht</td>\n", - " <td><<Chappe d'Auteroche>> Reise nach Mexiko und C...</td>\n", - " <td>Chappe D'Auteroche, Jean ; Voyage en Californi...</td>\n", - " <td>Südostasien ; Reise ; Geschichte 1761-1769 ; L...</td>\n", - " <td>TravelogueD18 Nordamerika Asien ; Zusammenstel...</td>\n", - " <td>Zusammenstellung: ohne übergeordnetem Titel vo...</td>\n", - " <td>364251-B.2 MAG</td>\n", - " <td>ZKAR</td>\n", - " <td>NaN</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>5 rows × 48 columns</p>\n", - "</div>" - ], - "text/plain": [ - " Systemnummer MMS-ID \\\n", - "AC03114611 AC03114611 990004456580603338 \n", - "AC03826205 AC03826205 990005906350603338 \n", - "AC09792500 AC09792500 990029473670603338 \n", - "AC09836279 AC09836279 990029921640603338 \n", - "AC07705435 AC07705435 990016481420603338 \n", - "\n", - " Volltext \\\n", - "AC03114611 http://data.onb.ac.at/ABO/%2BZ42124907 \n", - "AC03826205 http://data.onb.ac.at/ABO/%2BZ59423102;\\nhttp:... \n", - "AC09792500 http://data.onb.ac.at/ABO/%2BZ148207602 \n", - "AC09836279 http://data.onb.ac.at/ABO/%2BZ124931607 \n", - "AC07705435 http://data.onb.ac.at/ABO/%2BZ69824303 \n", - "\n", - " Barcode \\\n", - "AC03114611 Z42124907 \n", - "AC03826205 Z59423102;\\nZ171040301 \n", - "AC09792500 Z148207602 \n", - "AC09836279 Z124931607 \n", - "AC07705435 Z69824303 \n", - "\n", - " VerfasserGND ; GND-ID \\\n", - "AC03114611 Keate, George ; http://d-nb.info/gnd/124956432 \n", - "AC03826205 Phillip, Arthur ; http://d-nb.info/gnd/118982796 \n", - "AC09792500 Cranz, David ; http://d-nb.info/gnd/116717548 \n", - "AC09836279 Ellis, Henry ; http://d-nb.info/gnd/119218666 \n", - "AC07705435 Le Gentil de la Galaisière, Guillaume J. ; htt... \n", - "\n", - " Werktitel \\\n", - "AC03114611 Account of the Pelew islands ; 1788 ; http://v... \n", - "AC03826205 <<The>> voyage of Governor Phillip to Botany B... \n", - "AC09792500 NaN \n", - "AC09836279 <<A>> voyage to Hudson's-Bay, by the Dobbs Gal... \n", - "AC07705435 Voyage Dans Les Mers De L'Inde \n", - "\n", - " Reihentitel ; Bandzählung \\\n", - "AC03114611 Neuere Geschichte der See- und Land-Reisen ; E... \n", - "AC03826205 Magazin von merkwürdigen neuen Reisebeschreibu... \n", - "AC09792500 Bibliothek der neuesten Reisebeschreibungen ; ... \n", - "AC09836279 Sammlung neuer und merkwürdiger Reisen zu Wass... \n", - "AC07705435 Neue Sammlung von Reisebeschreibungen ; Zweyte... \n", - "\n", - " Haupttitel ; Titelzusatz ; Verantwortlichkeitsangabe \\\n", - "AC03114611 Nachrichten von den Pelew=Jnseln in der Westge... \n", - "AC03826205 Gouverneur Phillips Reise nach Neu=Südwallis ;... \n", - "AC09792500 <<David Cranz>> Historie von Grönland enthalte... \n", - "AC09836279 Reise nach Hudsons Meerbusen, ; welche von zwe... \n", - "AC07705435 <<Le Gentils>> Reisen in den indischen Meeren ... \n", - "\n", - " Bandzählung ; Titel des Bandes Ausgabe ... \\\n", - "AC03114611 NaN NaN ... \n", - "AC03826205 NaN NaN ... \n", - "AC09792500 NaN Zweite Ausgabe ... \n", - "AC09836279 NaN NaN ... \n", - "AC07705435 NaN NaN ... \n", - "\n", - " Widmungsempfänger ; GND-ID Art des Inhalts \\\n", - "AC03114611 Friedrich Wilhelm ; http://d-nb.info/gnd/11869... Reisebericht \n", - "AC03826205 NaN Reisebericht \n", - "AC09792500 NaN NaN \n", - "AC09836279 Friedrich Ludwig ; http://d-nb.info/gnd/120667886 Reisebericht \n", - "AC07705435 NaN Reisebericht \n", - "\n", - " Inhalt \\\n", - "AC03114611 NaN \n", - "AC03826205 Shortlands, Watts und Marshalls Rückreisen von... \n", - "AC09792500 NaN \n", - "AC09836279 NaN \n", - "AC07705435 <<Chappe d'Auteroche>> Reise nach Mexiko und C... \n", - "\n", - " Werke in Relation \\\n", - "AC03114611 NaN \n", - "AC03826205 NaN \n", - "AC09792500 NaN \n", - "AC09836279 NaN \n", - "AC07705435 Chappe D'Auteroche, Jean ; Voyage en Californi... \n", - "\n", - " Schlagworte \\\n", - "AC03114611 Palauinseln ; Entdeckung ; Reisebericht 1783 ;... \n", - "AC03826205 Phillip, Arthur ; New South Wales ; Reiseberic... \n", - "AC09792500 Grönland ; Geschichte 1761-1762 ; Reise ; Topo... \n", - "AC09836279 Forschungsreise ; Hudson-Baygebiet ; Moore, Wi... \n", - "AC07705435 Südostasien ; Reise ; Geschichte 1761-1769 ; L... \n", - "\n", - " Marker \\\n", - "AC03114611 TravelogueD18 Ozeanien \n", - "AC03826205 TravelogueD18 Ozeanien ; Zusammenstellung: ohn... \n", - "AC09792500 0 ; ONB-AK-RETRO ; TravelogueD18 Arktis \n", - "AC09836279 0 ; ONB-AK-RETRO ; TravelogueD18 Nordamerika \n", - "AC07705435 TravelogueD18 Nordamerika Asien ; Zusammenstel... \n", - "\n", - " Zusammenstellung \\\n", - "AC03114611 NaN \n", - "AC03826205 Zusammenstellung: ohne übergeordnetem Titel vo... \n", - "AC09792500 NaN \n", - "AC09836279 NaN \n", - "AC07705435 Zusammenstellung: ohne übergeordnetem Titel vo... \n", - "\n", - " Signatur \\\n", - "AC03114611 361949-B.1 MAG .- UNASSIGNED .- UNASSIGNED \n", - "AC03826205 303755-A.1 MAG .- 276879-A.1 MAG .- 276879-A,1... \n", - "AC09792500 251329-B.1 MAG \n", - "AC09836279 251276-B.1 MAG .- 361.900-B.Kar- UNASSIGNED \n", - "AC07705435 364251-B.2 MAG \n", - "\n", - " Standort VD17 \n", - "AC03114611 ZKAR ; ZKAR ; ZKAR NaN \n", - "AC03826205 ZALT ; ZFID ; ZFID NaN \n", - "AC09792500 ZFID NaN \n", - "AC09836279 ZFID ; ZKAR NaN \n", - "AC07705435 ZKAR NaN \n", - "\n", - "[5 rows x 48 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Basic size etc" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(800, 48) (800, 48)\n" - ] - } - ], - "source": [ - "print(new.shape, old.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "800" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.sum(new.index == old.index)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "old.Systemnummer.isna().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "37" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new.Systemnummer.isna().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "800" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.sum(new.index == old.index)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compare only those, that have been scraped in new" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "new_worked = new[~new.Systemnummer.isna()]" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "old_comparision = old[old.Systemnummer.isin(new_worked.Systemnummer)]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "assert new_worked.shape == old_comparision.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(763, 48)" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new_worked.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "assert np.sum(new_worked.index == old_comparision.index) == new_worked.shape[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Actual data" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "47" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.sum(new_worked.columns == old_comparision.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(48,)" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new_worked.columns.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(48,)" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "old_comparision.columns.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['Verfasser ; GND-ID'], dtype='object')" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "old_comparision.columns.difference(new_worked.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['VerfasserGND ; GND-ID'], dtype='object')" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new_worked.columns.difference(old_comparision.columns)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ups" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "new_worked = new_worked.rename(columns={'VerfasserGND ; GND-ID': 'Verfasser ; GND-ID'})" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index([], dtype='object')" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "old_comparision.columns.difference(new_worked.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index([], dtype='object')" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "new_worked.columns.difference(old_comparision.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def compare(column: str, left: pd.DataFrame, right: pd.DataFrame) -> pd.DataFrame:\n", - " left = left[column].astype(str)\n", - " right = right[column].astype(str)\n", - " ok = left != right\n", - " left = left[ok]\n", - " right = right[ok]\n", - " left.name = 'old-' + column\n", - " right.name = 'new-' + column\n", - " df = pd.concat([left, right], axis=1)\n", - " return df.astype(str)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "old_comparision = old_comparision.astype(str)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "for c in old_comparision.columns:\n", - " old_comparision[c] = old_comparision[c].str.replace('https:', 'http:')" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "comparision_by_columns = {\n", - " column: compare(column, old_comparision, new_worked)\n", - " for column in old_comparision.columns\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "comparision_sizes = {\n", - " column: df.shape[0]\n", - " for column, df in comparision_by_columns.items()\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "not_the_same = {\n", - " c: s for c, s in comparision_sizes.items() if s > 0\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'Volltext': 2,\n", - " 'Verfasser ; GND-ID': 668,\n", - " 'Werktitel': 441,\n", - " 'Reihentitel ; Bandzählung': 82,\n", - " 'Haupttitel ; Titelzusatz ; Verantwortlichkeitsangabe': 677,\n", - " 'Bandzählung ; Titel des Bandes': 153,\n", - " 'Verlagsort': 3,\n", - " 'Verlagsort normiert ; GND-ID': 740,\n", - " 'Druckort normiert ; GND-ID': 330,\n", - " 'Verleger und Drucker': 66,\n", - " 'Verleger normiert ; GND-ID': 694,\n", - " 'Drucker ; GND-ID': 324,\n", - " 'Erscheinungsjahr': 8,\n", - " 'Kollation': 1,\n", - " 'Illustrationen': 9,\n", - " 'Anzahl Illustrationen': 411,\n", - " 'Anzahl Karten': 186,\n", - " 'Anm. zu Illustrationen': 12,\n", - " 'Bibliografie': 1,\n", - " 'Anmerkungen': 1,\n", - " 'Anm. zu Kollation': 6,\n", - " 'Sprache': 2,\n", - " 'Originalsprache': 29,\n", - " 'Bemerkung zur Sprache': 10,\n", - " 'Standardnummer': 6,\n", - " 'Weitere Verfasser ; GND-ID': 90,\n", - " 'Herausgeber ; GND-ID': 129,\n", - " 'Übersetzer ; GND-ID': 172,\n", - " 'Beiträger ; GND-ID': 57,\n", - " 'Weitere Beteiligte ; GND-ID': 17,\n", - " 'Illustratoren ; GND-ID': 202,\n", - " 'Widmender ; GND-ID': 70,\n", - " 'Widmungsempfänger ; GND-ID': 92,\n", - " 'Art des Inhalts': 136,\n", - " 'Inhalt': 12,\n", - " 'Werke in Relation': 98,\n", - " 'Schlagworte': 744,\n", - " 'Marker': 570,\n", - " 'Zusammenstellung': 1,\n", - " 'Signatur': 758,\n", - " 'Standort': 244,\n", - " 'VD17': 7}" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "not_the_same" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [], - "source": [ - "ci = iter(not_the_same.keys())" - ] - }, - { - "cell_type": "code", - "execution_count": 168, - "metadata": {}, - "outputs": [ - { - "ename": "StopIteration", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-168-04271bbf06e2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcd\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcomparision_by_columns\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mci\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;31mStopIteration\u001b[0m: " - ] - } - ], - "source": [ - "cd = comparision_by_columns[next(ci)]" - ] - }, - { - "cell_type": "code", - "execution_count": 166, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>old-VD17</th>\n", - " <th>new-VD17</th>\n", - " </tr>\n", - " <tr>\n", - " <th>Systemnummer</th>\n", - " <th></th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>AC13781336</th>\n", - " <td>VD18 90245792; vd18</td>\n", - " <td>VD18 90245792 ; vd18</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC13690893</th>\n", - " <td>VD18 90266536; urn:nbn:de:bvb:12-bsb10469449-5</td>\n", - " <td>urn:nbn:de:bvb:12-bsb10469449-5 ; VD18 90266536</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC13690886</th>\n", - " <td>urn:nbn:de:bvb:12-bsb10469448-5; VD18 90266528</td>\n", - " <td>urn:nbn:de:bvb:12-bsb10469448-5 ; VD18 90266528</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC03125444</th>\n", - " <td>urn:nbn:at:at-moz:2-68173; VD18 10196951</td>\n", - " <td>VD18 10196951 ; urn:nbn:at:at-moz:2-68173</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC03125437</th>\n", - " <td>VD18 10196951; urn:nbn:at:at-moz:2-68134</td>\n", - " <td>VD18 10196951 ; urn:nbn:at:at-moz:2-68134</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC15034985</th>\n", - " <td>NDSLARCHBUE0139703; VD18 11290722-001; FSLHB00...</td>\n", - " <td>VD18 11290722-001 ; FSLHB000037286 ; NDSLARCHB...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AC08513325</th>\n", - " <td>VD18 1057364X; urn:nbn:de:bvb:12-bsb10302394-3</td>\n", - " <td>urn:nbn:de:bvb:12-bsb10302394-3 ; VD18 1057364X</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " old-VD17 \\\n", - "Systemnummer \n", - "AC13781336 VD18 90245792; vd18 \n", - "AC13690893 VD18 90266536; urn:nbn:de:bvb:12-bsb10469449-5 \n", - "AC13690886 urn:nbn:de:bvb:12-bsb10469448-5; VD18 90266528 \n", - "AC03125444 urn:nbn:at:at-moz:2-68173; VD18 10196951 \n", - "AC03125437 VD18 10196951; urn:nbn:at:at-moz:2-68134 \n", - "AC15034985 NDSLARCHBUE0139703; VD18 11290722-001; FSLHB00... \n", - "AC08513325 VD18 1057364X; urn:nbn:de:bvb:12-bsb10302394-3 \n", - "\n", - " new-VD17 \n", - "Systemnummer \n", - "AC13781336 VD18 90245792 ; vd18 \n", - "AC13690893 urn:nbn:de:bvb:12-bsb10469449-5 ; VD18 90266536 \n", - "AC13690886 urn:nbn:de:bvb:12-bsb10469448-5 ; VD18 90266528 \n", - "AC03125444 VD18 10196951 ; urn:nbn:at:at-moz:2-68173 \n", - "AC03125437 VD18 10196951 ; urn:nbn:at:at-moz:2-68134 \n", - "AC15034985 VD18 11290722-001 ; FSLHB000037286 ; NDSLARCHB... \n", - "AC08513325 urn:nbn:de:bvb:12-bsb10302394-3 ; VD18 1057364X " - ] - }, - "execution_count": 166, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cd" - ] - }, - { - "cell_type": "code", - "execution_count": 167, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 ~~~~~~~\n", - "VD18 90245792; vd18\n", - "-----------\n", - "VD18 90245792 ; vd18\n", - "-----------\n", - "xxxxxxxxxxxxxxxxx\n", - "1 ~~~~~~~\n", - "VD18 90266536; urn:nbn:de:bvb:12-bsb10469449-5\n", - "-----------\n", - "urn:nbn:de:bvb:12-bsb10469449-5 ; VD18 90266536\n", - "-----------\n", - "xxxxxxxxxxxxxxxxx\n", - "2 ~~~~~~~\n", - "urn:nbn:de:bvb:12-bsb10469448-5; VD18 90266528\n", - "-----------\n", - "urn:nbn:de:bvb:12-bsb10469448-5 ; VD18 90266528\n", - "-----------\n", - "xxxxxxxxxxxxxxxxx\n" - ] - } - ], - "source": [ - "for i in range(3):\n", - " print(i, '~~~~~~~')\n", - " for v in cd.iloc[i]:\n", - " print(v)\n", - " print('-----------')\n", - " print('xxxxxxxxxxxxxxxxx')" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Zweytes Abtheilung; Des Grafen Beniowski Reise aus Kamtschatka über Kanton nach Europa\n", - "Zweytes Abtheilung ; Des Grafen Beniowski Reise aus Kamtschatka über Kanton nach Europa\n" - ] - } - ], - "source": [ - "for v in c.iloc[0]:\n", - " print(v)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "diff = compare('MMS-ID', old_comparision, new_worked)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Volltext" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "volltext_diff = compare('Volltext')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "volltext_diff.old_value.is" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/travelogues_extraction/dataextractors/abstract.py b/travelogues_extraction/dataextractors/abstract.py index 32e14daacf980f2d2d4dcb9740b4ffcdb77136de..97108253ab9fdd7f80e8c5aa902dbe41a5f74bee 100644 --- a/travelogues_extraction/dataextractors/abstract.py +++ b/travelogues_extraction/dataextractors/abstract.py @@ -4,7 +4,6 @@ from dataclasses import dataclass import re as regex import typing -import httpcore import httpx from pandas import DataFrame @@ -66,7 +65,6 @@ class AbstractXpathJoinDirectlyToColumn(AbstractSingleDataExtractor): return result - class AbstractMultifield(AbstractDataExtractor): column: str diff --git a/travelogues_extraction/script/input/.gitkeep b/travelogues_extraction/script/input/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/travelogues_extraction/script/input/TravelogueD18_ALMAoutput_24082020.xlsx b/travelogues_extraction/script/input/TravelogueD18_ALMAoutput_24082020.xlsx deleted file mode 100644 index 1e67c94aa9028aaded1126d414d1b78fa38e1dd1..0000000000000000000000000000000000000000 Binary files a/travelogues_extraction/script/input/TravelogueD18_ALMAoutput_24082020.xlsx and /dev/null differ diff --git a/travelogues_extraction/script/output/.gitkeep b/travelogues_extraction/script/output/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/travelogues_extraction/script/output/.platzhalter b/travelogues_extraction/script/output/.platzhalter deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/travelogues_extraction/script/output/log/.gitignore b/travelogues_extraction/script/output/log/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/travelogues_extraction/visualizeMassDownlaod.ipynb b/travelogues_extraction/visualizeMassDownlaod.ipynb deleted file mode 100644 index 991acc8e96253dac7e4a8aef4ac5631ac7f290d6..0000000000000000000000000000000000000000 --- a/travelogues_extraction/visualizeMassDownlaod.ipynb +++ /dev/null @@ -1,91 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import time" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: httpx in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (0.13.3)\r\n", - "Requirement already satisfied: certifi in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from httpx) (2020.6.20)\r\n", - "Requirement already satisfied: rfc3986<2,>=1.3 in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from httpx) (1.4.0)\r\n", - "Requirement already satisfied: httpcore==0.9.* in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from httpx) (0.9.1)\r\n", - "Requirement already satisfied: hstspreload in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from httpx) (2020.7.14)\r\n", - "Requirement already satisfied: chardet==3.* in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from httpx) (3.0.4)\r\n", - "Requirement already satisfied: sniffio in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from httpx) (1.1.0)\r\n", - "Requirement already satisfied: idna==2.* in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from httpx) (2.10)\r\n", - "Requirement already satisfied: h11<0.10,>=0.8 in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from httpcore==0.9.*->httpx) (0.9.0)\r\n", - "Requirement already satisfied: h2==3.* in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from httpcore==0.9.*->httpx) (3.2.0)\r\n", - "Requirement already satisfied: hpack<4,>=3.0 in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from h2==3.*->httpcore==0.9.*->httpx) (3.0.0)\r\n", - "Requirement already satisfied: hyperframe<6,>=5.2.0 in /home/phylogram/Documents/onb-homeoffice-local/TraveloguesExtraktion/venv/lib/python3.7/site-packages (from h2==3.*->httpcore==0.9.*->httpx) (5.2.0)\r\n" - ] - } - ], - "source": [ - "!pip install httpx" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'httpx'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m<ipython-input-4-c0104c72085e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mcontroller\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmain\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mFromAlmaOutputToExcel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/Documents/onb-homeoffice-local/TraveloguesExtraktion/travelogues_extraction/controller/main.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mhttpx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTYPE_CHECKING\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'httpx'" - ] - } - ], - "source": [ - "from controller.main import FromAlmaOutputToExcel" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}