Page MenuHomeHEPForge

No OneTemporary

diff --git a/Examples/JupyterNotebooks/AnharmonicFactor.ipynb b/Examples/JupyterNotebooks/AnharmonicFactor.ipynb
index 2f22c8b..9375b41 100644
--- a/Examples/JupyterNotebooks/AnharmonicFactor.ipynb
+++ b/Examples/JupyterNotebooks/AnharmonicFactor.ipynb
@@ -1,1096 +1,1091 @@
{
"cells": [
{
- "cell_type": "markdown",
- "metadata": {},
- "source": []
- },
- {
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np#you usually need numpy\n",
"\n",
"#---these are for plots---#\n",
"import matplotlib\n",
"matplotlib.use('nbAgg')\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.rcParams['font.size']=16\n",
"plt.rcParams['font.family']='dejavu sans'\n",
"\n",
"plt.rcParams['mathtext.fontset']='stix'\n",
"plt.rcParams['mathtext.rm']='custom'\n",
"plt.rcParams['mathtext.it']='stix:italic'\n",
"plt.rcParams['mathtext.bf']='stix:bold'\n",
"#-------------------------#"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"#load the module\n",
"from sys import path as sysPath\n",
"from os import path as osPath\n",
"sysPath.append(osPath.join(osPath.dirname('./'), '../../src'))\n",
"\n",
"from interfacePy.AnharmonicFactor import anharmonicFactor #load the anharmonicFactor function form the AnharmonicFactor module\n",
"from interfacePy.FT import FT #easy tick formatting\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" '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",
"\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 = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(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 (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.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 = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\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 toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\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",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\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",
"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",
"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], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.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,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\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",
" 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.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\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",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\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(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\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(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\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",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\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",
" }\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",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\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",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\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, 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",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\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\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"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\";/* global mpl */\n",
"\n",
"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 = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\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;\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",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\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.innerHTML =\n",
" '<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 / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<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 () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\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",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('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",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\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",
"\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",
"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(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4QAAAGQCAYAAAD2lq6fAAAgAElEQVR4nOzde5yNhd7//2sOmGGcTzHlkJFTzodhZ0tlME455FQKEbpLbpKotkElIu7KDrddKIdipHaUBqFBcTtGzoShIgwZc1xrvX9/7J/13WvPZcxgrmsdXs/H4/pjrzVr+cze+6P3u3Wt6zIEAAAAAAhIht0DAAAAAADsQSEEAAAAgABFIQQAAACAAEUhBAAAAIAARSEEAAAAgABFIQQAAACAAEUhBAAAAIAARSEEAAAAgABFIQQAAACAAEUhBAAAAIAARSEEAAAAgABFIQQAAACAAEUhBAAAAIAARSEEAAAAgABFIQQAAACAAEUhBAAAAIAARSH0c06nU0uXLtW0adPsHgUAAACAl6EQ+imXy6XPPvtMtWvXlmEY6t+/v90jAQAAAPAyFEI/tW/fPh09elT/+Mc/bqkQOp1OJSUl6fLly7py5QoHBwcHBwcHBweHZcfly5eVlJQkp9OZP2EZbhRCP7dhw4ZbKoRJSUkyDIODg4ODg4ODg4PDtiMpKSl/QjLcKIR+7lYL4eXLl2UYhlavXq3Nmzfrxx9/1M6dO7Vnzx7t379fhw4d0vHjx3Xy5EmdOXNG586d08WLF/lEkYODg4ODg4OD47aP6x9OXL58OX9CMtwohH4ut4UwPT3ddAlv5ShQoIAiIiJUqlQpVahQQVWqVFGNGjVUt25dNWnSRA888IAeeughtW/fXo8++qh69eqlJ598UsOGDdOLL76ouLg4vf322/rggw/08ccfa8WKFfr222+1efNm7dmzR8eOHdNvv/2mq1evchoBAACAH7py5YoMw9CVK1fsHsXvUQj9XG4LYVxcnO2nBNzKERQUpJIlS+ree+9VkyZNFBMTo969e+vZZ5/VK6+8ounTp+vDDz/UypUrtWnTJv300086c+aM0tLSrPkfAAAAAHlGIbQOhdDP3e4nhIMHD9aQIUP09NNP68knn1Tfvn3Vs2dPdevWTZ07d1b79u3Vpk0btW7dWi1btlR0dLQaNmyo2rVrq1q1arrnnntUrlw5FS9eXGFhYQoKCrK9RF4/ihUrpurVq6tly5bq0aOHnn32WU2YMEGzZ8/W559/ri1btujYsWO6evWqNf9jAQAAQBKF0EoUQj93q98hzM8lzMrKUkpKii5evKjffvtNJ0+e1KFDh7Rr1y59//33+uabb7R8+XLNnz9fs2bN0pQpU/S3v/1NI0eO1JAhQ/T444+rS5cueuSRR9S0aVNFRUWpdOnSCg4OzrfyWLhwYVWtWlUPPPCAevfurRdffFEzZszQsmXLtHXrVp0+fVpZWVl3/L8rAACAQEQhtA6F0M95YyHML06nU8nJyTpx4oR27NihtWvX6rPPPtPs2bM1efJkjR49WoMGDVLXrl3VsmVLVa9eXcWKFbtjpTE4OFgVK1ZU06ZN1a1bNw0fPlxTp07V4sWLlZiYqDNnzvCdRwAAgFzwxSzqqyiEfi6QCuGtSktL08mTJ7Vt2zb985//1Lx58/TGG29o+PDh6t27t1q3bq1atWqpZMmSt10aCxYsqOrVq6tt27YaOnSo3nrrLX366af68ccfde7cOblcLrv/6wAAALBdIGVRu1EI/RyF8M5KTU3V0aNHtXHjRi1atEhTpkzR888/r27duqlp06aqUKHCbX1PsnDhwqpdu7Y6duyo559/Xu+++66+/vprHTt2jFNSAQBAwCCLWodC6OcohNbLzMzUqVOntHXrVi1btkzvvPOOhg8frs6dO+v+++9XkSJFbqksFihQQDVq1FDnzp01atQozZkzR+vXr1dSUhKnogIAAL9CFrUOhdDPLV26VIZhqGfPnnl6HUuYf1wul/744w9t375dn332maZOnaphw4apXbt2qlGjhgoVKnRLnyzWq1dPjz32mF555RUtWrRIu3fv5vYaAADAJ5FFrUMh9FMnTpzQjBkzVLlyZRmGobCwMMXFxSkhISFXr2cJ7eN0OnX27FklJibqo48+0tixY9WjRw/VrVtX4eHheb7QTVRUlB599FGNGzfOXRRTU1Pt/jUBAABuiCxqHQohTLGE3snpdOr06dNav369Zs+erVGjRqlTp06qUaOGQkND81wUu3Tp4i6Ke/bsUUZGht2/IgAAAFnUQhRCmGIJfU9WVpaOHj2qr776SlOnTtVTTz2lxo0bq3Dhwnn6nmL9+vX11FNPacaMGVq/fr0uXLhg968GAAACDFnUOhRCmGIJ/YfT6dSJEye0atUqd1Fs0qRJnori3XffrU6dOunVV1/V8uXLdeTIES5kAwAA8g1Z1DoUQphiCf2f0+nUL7/84i6KTzzxhOrUqaOQkJBclcSIiAi1aNFCzz33nBYsWKD9+/fL4XDY/WsBAAA/QBa1DoUQpljCwJWWlqYdO3boww8/1PDhw9WqVSsVK1Ys1yWxVatWGjVqlJYuXaqjR4/K5XLZ/SsBAAAfQxa1DoUQplhC/DuXy6UTJ05o5cqViouLU9euXVWlSpVclcQSJUqoTZs2GjdunFasWKHTp09TEgEAQI7IotahEMIUS4jcSE5O1rp16zRlyhT16NFDlSpVylVJLF++vLp06aIpU6Zo06ZNunbtmt2/CgAA8CJkUetQCGGKJcStOnfunFavXq2JEyeqU6dOKl++/E0LYmhoqJo0aaLhw4dr6dKlOnnyJJ8iAgAQwMii1qEQwhRLiDvF5XIpKSlJK1eu1CuvvKK2bduqZMmSNy2JFSpUUI8ePTR9+nRt2bJFaWlpdv8qAADAImRR61AIYYolRH5yOp06ePCgPvzwQw0ePFi1a9e+aUEsWLCgWrRooTFjxmjVqlW6fPmy3b8GAADIJ2RR61AIYYolhNWSk5O1Zs0ajR8/XjExMTe9smlQUJAaNmyoESNGaMWKFTp//rzdvwIAALhDyKLWoRDCFEsIuzkcDv3000+aO3eu+vfvr/vuu++mnyLWrl1bw4YN05IlS3TmzBm7fwUAAHCLyKLWoRDCFEsIb3Tu3DnFx8frhRdeUIMGDRQUFJRjQaxWrZoGDhyoBQsW6PTp03aPDwAAcoksah0KIUyxhPAFycnJ+uqrr/TSSy8pOjpaISEhORbE++67T88++6zi4+N18eJFu8cHAAA3QBa1DoUQplhC+KKrV68qISFBr732mlq1aqVChQrl+B3ERo0a6aWXXtKaNWu4FyIAAF6ELGodCiFMsYTwB2lpadq0aZPi4uLUsmVLhYaG3rAgFihQQK1atdKkSZO0ZcsWZWZm2j0+AAABiyxqHQohTLGE8EdXr17V119/rVGjRql+/fo5nl4aERGhTp06adasWTp27JjdowMAEFDIotahEMIUS4hAcP78eX322WcaMmSIqlWrlmNBjIqK0vPPP6/Vq1crJSXF7tEBAPBrZFHrUAhhiiVEIDp58qQ+/PBDPf744ypfvvwNy2GhQoXUpk0bTZ8+Xfv375fL5bJ7dAAA/ApZ1DoUQphiCRHonE6ndu/erbfeeksPPvhgjt8/vPvuuzV48GDFx8crOTnZ7tEBAPB5ZFHrUAhhiiUEPF25ckUrV67U0KFDValSpRuWw5CQELVq1UrTpk3TwYMH+fQQAIBbQBa1DoUQplhC4MZcLpcOHjyomTNnql27djne3iIqKkojR47Ud999x5VLAQDIJbKodSiEMMUSArl37do1ffPNNxoxYoSqV69+w3JYvHhx9e7dW4sWLdKFCxfsHhsAAK9FFrUOhRCmWELg1h0+fFjTp0/Xgw8+qJCQENNyGBwcrL/+9a96++23deDAAU4tBQDg35BFrUMhhCmWELgzLl26pCVLlqhv374qUaLEDT89rFatml588UVt2bJFTqfT7rEBALAVWdQ6FEKYYgmBOy8rK0sbN27Uiy++qPvuu++G5fCuu+7S0KFD9e233yojI8PusQEAsBxZ1DoUQphiCYH8d/jwYb3zzjtq3br1DU8tLV68uPr166cVK1YoJSXF7pEBALAEWdQ6FEKYYgkBa124cEELFixQly5dFBYWZloOw8PD1bVrV3388ce6dOmS3SMDAJBvyKLWoRDCFEsI2Ofq1auKj4/X448/rmLFipmWw9DQULVp00YffPCBfv/9d7tHBgDgjiKLWodCCFMsIeAdMjIy9M0332jIkCEqV67cDa9Y+vDDD2vOnDk6f/683SMDAHDbyKLWoRDCFEsIeB+Hw6HExESNHDlSVapUMS2HISEhiomJ0bx587jXIQDAZ5FFrUMhhCmWEPBuLpdLu3bt0iuvvKJq1ard8LTSdu3a6aOPPuI7hwAAn0IWtQ6FEKZYQsB3uFwu7dy5Uy+//LKqVq1qWg4LFCigDh06aMGCBUpOTrZ7ZAAAckQWtQ6FEKZYQsA3uVwubd++XaNHj1alSpVMy2HBggXVpUsXffrpp7p27ZrdIwMAkA1Z1DoUQphiCQHf53K59OOPP2rUqFG6++67TcthRESEnnzySa1Zs0ZZWVl2jwwAgCSyqJUohDDFEgL+xel0asuWLRoxYoQqVqxoWg7Lly+vF154Qdu2bZPL5bJ7ZABAACOLWodCCFMsIeC/HA6H1q9fr6efflrFixc3LYdRUVEaP368Dh8+bPe4AIAARBa1DoUQplhCIDCkpaVpxYoV6t69uwoWLGhaDps0aaKZM2fqt99+s3tcAECAIItah0IIUywhEHiSk5P1j3/8Qw899JCCgoKyFcPg4GC1bdtWixcv5mI0AIB8RRa1DoUQplhCILAlJSVp2rRpatCggemnhsWKFdMzzzyjzZs3831DAMAdRxa1DoUQplhCANf9/PPPevXVV1WlSpUbft/w9ddf16lTp+weFQDgJ8ii1qEQwhRLCOA/OZ1ObdiwQQMGDFCRIkWyFcOgoCA9/PDD+vjjj5WSkmL3uAAAH0YWtQ6FEKZYQgA5uXr1qhYuXKiHH374hvc3HDhwoDZu3Cin02n3uAAAH0MWtQ6FEKZYQgC5dfLkSb3++uuqVq2aaTmsWrWqJk2apKSkJLtHBQD4CLKodSiEMMUSAsgrl8ulzZs365lnnlGxYsVMr1LaoUMHrVy5UpmZmXaPCwDwYmRR61AIYYolBHA7UlNTtWTJErVt29b0Fhbly5fXyy+/rCNHjtg9KgDAC5FFrUMhhCmWEMCdcurUKU2cOFGVKlUyPaX0wQcf1KJFi5Sammr3qAAAL0EWtQ6FEKZYQgB3msPh0Jo1a/TYY4+pQIEC2YphiRIl9Pzzz2vPnj12jwoAsBlZ1DoUQphiCQHkp3Pnzmn69OmqUaOG6aeGTZo00Zw5c/Tnn3/aPSoAwAZkUetQCL1IRkaGpk2bpl69emnEiBFq27atJkyYkOuLL/z6668aNGiQnnjiCT3++ONq1aqVli9ffkuzsIQArOByuZSYmKj+/fsrPDzc9PYVw4YN0969e+0eFQBgIbKodSiEXiIzM1MxMTGKjo5Wenq6JOnatWtq2LChYmNj5XA4cnz9mTNnVKlSJc2ZM8f92O7duxUeHq6pU6fmeR6WEIDVLl++rA8++ECNGjUy/dSwRYsW+vjjj5WWlmb3qACAfEYWtQ6F0EtMmDBBhmEoISHB4/FVq1bJMAzNnDkzx9d36dJFpUuXzlYchw8frpCQEO3atStP87CEAOy0c+dODR06VEWKFMlWDEuXLq3Ro0fr6NGjdo8JAMgnZFHrUAi9QHp6ukqUKKEiRYpkK3SZmZkKDw9XZGSknE6n6evPnj2roKAgtWrVKttza9askWEY6tevX55mYgkBeIMrV67o73//u+6//37TTw1jYmL0+eefKysry+5RAQB3EFnUOhRCL5CYmCjDMNSsWTPT5xs3bizDMLRt2zbT5//5z3/KMAz16dMn23OnTp2SYRgqW7ZsnmZiCQF4k+s3vX/iiSdUsGDBbMWwYsWKiouL05kzZ+weFQBwB5BFrUMh9AJz5syRYRjq1q2b6fNdunSRYRiaN2+e6fOLFi2SYRhq3759tufS0tLcgSk5OfmGM6Snp+vKlSvuIykpiSUE4JXOnz+vt99+W/fee2+2YhgSEqKuXbtq/fr1crlcdo8KALhFFELrUAi9wOTJk3M8rbNv374yDENTpkwxfX7dunUyDENVq1Y1ff56UDp79uwNZ4iLizM9HYslBOCtnE6n1qxZo65duyo4ODjb31916tTR7NmzlZKSYveoAIA8ohBah0LoBWbMmJFjIezXr58Mw9DkyZNNn7927ZqKFy8uwzC0ceNGj+cuXbrkDkc5XZmPTwgB+LKkpCTFxcWpYsWKpje8HzVqlI4fP273mACAXKIQWodC6AWWLl0qwzDUvXt30+e7d++e4ymjkjR79mwZhqHq1atr7969cjqd2rdvn3r16iXDMFShQoU8zcQSAvBFmZmZ+vTTT/XAAw9kK4ZBQUHq3LmzEhISOJ0UALwcWdQ6FEIvsG3bNvc9tsw0b948x4vKXLdkyRI1atRIRYsWVeXKlfX000/r/fffl2EYeuqpp/I0E0sIwNft2rVLAwcOVKFChbKVw5o1a2rWrFn6888/7R4TAGCCLGodCqEXcDgcKlu2rIoVK5bt31o7HA5FRESobNmyN7ztRE46d+4swzC0YcOGPL2OJQTgL/744w9NnjxZd999d7ZiWKxYMY0YMUJHjhyxe0wAwL8hi1qHQuglxo8fL8MwtGnTJo/HExISZBiGxo8f737M4XAoPj7+pgFm48aNCgoKUseOHfM8D0sIwN9kZWUpPj5erVq1Mr2IVocOHbRu3TpOJwUAL0AWtQ6F0EukpqaqUaNGatmypTIyMiT965YRTZs2VaNGjZSamur+2blz58owDEVGRt7w/U6fPq177rlHNWvW1KVLl/I8D0sIwJ/t2bNHgwcPVlhYWLZiWK9ePc2fP1/p6el2jwkAAYssah0KoRdJSUnR2LFj1bFjRw0fPlyxsbEaM2ZMtkumb968WSVLllSvXr1M32fXrl2qUqWK2rRpo/Pnz9/SLCwhgEBw4cIFTZ06VZUqVcpWDMuXL69Jkybd8t+jAIBbRxa1DoXQT7hcLu3cuVNDhgxRw4YN9fHHH9/Sdw6vYwkBBJKsrCwtW7ZM0dHR2YphWFiYhgwZogMHDtg9JgAEDLKodSiEfmLRokVavHixTpw4cUfejyUEEKi2bt2qxx57zPRm97GxsVq7di3fMwSAfEYWtQ6FEKZYQgCB7pdfftHIkSNVtGjRbMWwbt26+uijj/ieIQDkE7KodSiEMMUSAsC/XLlyRTNmzFDlypVNv2f4+uuv6+LFi3aPCQB+hSxqHQohTLGEAODp+vcMW7Roka0YFilSRCNGjNCpU6fsHhMA/AJZ1DoUQphiCQHgxrZu3aqePXtm+55hSEiI+vXrp71799o9IgD4NLKodSiEMMUSAsDNnThxQs8995zCw8OzfWrYvn17fffdd1yABgBuAVnUOhRCmGIJASD3zp8/r7i4OJUuXTpbMWzSpImWLVsmh8Nh95gA4DPIotahEMIUSwgAeZeSkqL3339fVapUyVYMq1WrptmzZys1NdXuMQHA65FFrUMhhCmWEABuXVZWlpYsWaIGDRpkK4Zly5blyqQAcBNkUetQCGGKJQSA2+dyuZSQkKA2bdpkK4YREREaM2aMfvvtN7vHBACvQxa1DoUQplhCALizdu7cqT59+mS7MmlYWJiee+45nTx50u4RAcBrkEWtQyGEKZYQAPLH8ePHNWzYMBUsWNCjGIaGhmrAgAE6dOiQ3SMCgO3IotahEMIUSwgA+evs2bN68cUXVaRIEY9iGBQUpJ49e2r37t12jwgAtiGLWodCCFMsIQBY48KFCxo/frxKlCiR7XuGHTp00JYtW+weEQAsRxa1DoUQplhCALDWlStXNHXqVJUrVy5bMWzdurUSEhK4yT2AgEEWtQ6FEKZYQgCwR2pqqmbNmqVKlSplK4ZNmzbVV199RTEE4PfIotahEMIUSwgA9srIyNBHH32k++67L1sxbNy4sb788kuKIQC/RRa1DoUQplhCAPAODodDn332merXr5+tGDZs2FArV66kGALwO2RR61AIYYolBADv4nK59MUXX6hhw4bZimH9+vW1YsUKOZ1Ou8cEgDuCLGodCiFMsYQA4J1cLpf++c9/qnHjxtmKYd26dbVs2TKKIQCfRxa1DoUQplhCAPBuLpdLq1atUtOmTbMVwzp16ujTTz+Vw+Gwe0wAuCVkUetQCGGKJQQA3+ByufT1118rOjo6WzGsVauWlixZQjEE4HPIotahEMIUSwgAvsXlcmnNmjVq0aJFtmJYs2ZNffrpp5xKCsBnkEWtQyGEKZYQAHyTy+VSQkKCHnjggWzFsF69elyVFIBPIItah0IIUywhAPg2l8uldevWqWXLlqb3Mfz6668phgC8FlnUOhRCmGIJAcA/uFwuffvtt2rWrFm2YtiiRQutX7/e7hEBIBuyqHUohDDFEgKAf7l+u4oGDRpkK4atW7dWYmKi3SMCgBtZ1DoUQphiCQHAPzmdTsXHx6t27drZimHbtm21bds2u0cEALKohSiEMMUSAoB/czgcWrx4sapXr56tGHbu3Fm7d++2e0QAAYwsah0KIUyxhAAQGLKysjR//nxVqVIlWzF87LHHdOjQIbtHBBCAyKLWoRDCFEsIAIElIyNDc+bM0d133+1RCkNCQjRo0CCdPn3a7hEBBBCyqHUohDDFEgJAYEpLS9O7776r8uXLexTDQoUKadSoUfrjjz/sHhFAACCLWodCCFMsIQAEtpSUFL355psqVqyYRzEsWrSoJk2apKtXr9o9IgA/Rha1DoUQplhCAIAkXbx4UWPGjFFYWJhHMSxbtqzeffddpaen2z0iAD9EFrUOhRCmWEIAwL87c+aMhgwZopCQEI9iWLlyZS1YsEAOh8PuEQH4EbKodSiEMMUSAgDMHDlyRL179852RdLatWtr5cqVcrlcdo8IwA+QRa1DIYQplhAAkJNdu3apffv22YphdHS0Nm7caPd4AHwcWdQ6FEKYYgkBALmxceNGtWjRIlsx7NSpk/bv32/3eAB8FFnUOhRCmGIJAQC55XK59OWXX+r+++/3KIXBwcEaPHiwzp49a/eIAHwMWdQ6FEKYYgkBAHnlcDi0YMGCbDe3Dw8P16uvvso/UwDkGlnUOhRCmGIJAQC3KjU1VVOmTMl2D8MyZcro/fffV0ZGht0jAvByZFHrUAhhiiUEANyuP/74Q//93/+tAgUKeBTDqKgoLV++nCuSArghsqh1KIQwxRICAO6U48ePq0+fPqZXJP3+++/tHg+AFyKLWodCCFMsIQDgTtu+fbtat26drRg++uijOnDggN3jAfAiZFHrUAhhiiUEAOQHl8ul1atXq06dOh6lMCQkRM8++6zOnTtn94gAvABZ1DoUQphiCQEA+cnhcOjDDz9UxYoVPYphsWLFNHXqVKWlpdk9IgAbkUWtQyGEKZYQAGCFa9eu6Y033lBERIRHMaxSpYo+++wzLjwDBCiyqHUohDDFEgIArPTbb7/pmWeeUXBwsEcxbNGihX788Ue7xwNgMbKodSiEMMUSAgDssHfvXrVp0ybbhWf69u2rkydP2j0eAIuQRa1DIfQyGRkZmjZtmnr16qURI0aobdu2mjBhgjIzM3P1+rNnz2rEiBEaMGCABg0apPbt22vYsGH6/fff8zQHSwgAsMv1C8/UrFnToxQWKlRI48aN459NQAAgi1qHQuhFMjMzFRMTo+joaKWnp0v613crGjZsqNjYWDkcjhxff/r0aZUtW1YffPCB+zGn06knn3xS1apV07Vr13I9C0sIALBbZmam/v73v6tMmTIexbBcuXKaO3eusrKy7B4RQD4hi1qHQuhFJkyYIMMwlJCQ4PH4qlWrZBiGZs6cmePrX3nlFRmGoatXr3o8vmPHDhmGoZUrV+Z6FpYQAOAtkpOT9dJLL6lgwYIexfD+++/Xt99+a/d4APIBWdQ6FEIvkZ6erhIlSqhIkSLZPgnMzMxUeHi4IiMj5XQ6b/gezz//vAzD0A8//ODx+Pbt22UYhtasWZPreVhCAIC3OX78uHr27Jnt+4WdO3fWkSNH7B4PwB1EFrUOhdBLJCYmyjAMNWvWzPT5xo0byzAMbdu27YbvsXLlShmGoXr16nnc2HfAgAG6//77lZGRccPXpqen68qVK+4jKSmJJQQAeKXNmzeradOmHqWwQIECeumll/jnFuAnKITW8btCmJmZqQMHDmjr1q3avXu3Lly4YPdIuTJnzhwZhqFu3bqZPt+lSxcZhqF58+bl+D5PP/20DMNQxYoV9cknn2jgwIEaMGCALl26lOPr4uLisv0bV5YQAOCtnE6nPvnkk2w3ti9fvrw++uijHM+oAeD9KITW8YtC6HA4NH/+fD300EMqVKiQgoODPY5q1app7NixOnv2rN2j3tDkyZNlGIb69etn+nzfvn1lGIamTJmS4/u4XC6NHz9eQUFBMgxD9evX17Fjx2765/MJIQDAF129elWvvvqqChUq5FEMmzRpoq1bt9o9HoBbRCG0js8XwoSEBFWtWlXBwcGqXr262rRpo969e+upp55S37591blzZzVq1Ejh4eEKDw/X22+/bffIpmbMmJFjIezXr58Mw9DkyZNzfJ+0tDQNGzZMTz31lKpVqybDMBQREaHPP/88T/OwhAAAX3LixAn16NEj25kuTzzxhJKSkuweD0AekUWt49OFcOLEiWrUqJEWLVqky5cv5/izWVlZSkhIULt27dSnT5+b3sLBakuXLpVhGOrevbvp8927d7/pKaNXr15V8+bN9fTTT0v6VzkcOXKkDMNQaGhojt8//E8sIQDAF61fv15169b1KIWFCxfWG2+8odTUVLvHA5BLZFHr+GwhfP311xUXF3dL3xGYN2+ehg4dmg9T3bpt27bJMAy1aNHC9PnmzZvf9KIykyZNkmEY2a60dv12Fi9A8RUAACAASURBVDcqm2ZYQgCAr8rKytIHH3ygUqVKeRTDKlWqKD4+Xi6Xy+4RAdwEWdQ6PlkI165dq3ffffe23mPlypVavHjxHZro9jkcDpUtW1bFihXL9g8qh8OhiIgIlS1bNscCHBsbK8MwlJaW5vF4enq6wsLCVLNmzVzPwxICAHzdxYsXNXz4cIWEhHgUw4ceekh79+61ezwAOSCLWscnC+HBgwe96n3ulPHjx8swDG3atMnj8YSEBBmGofHjx7sfczgcio+P9/g0cODAgTIMQ/v378/23sWLF1dMTEyuZ2EJAQD+Yv/+/WrTpo1HKQwODtbw4cOVnJxs93gATJBFreOThdBfpaamqlGjRmrZsqX7noFpaWlq2rSpGjVq5PHdh7lz58owDEVGRrofO3DggIoXL64uXbooPT3d/fiSJUtUsGBBff/997mehSUEAPgTl8ulL774Qvfee69HMSxbtiy3qQC8EFnUOgFbCL31imMpKSkaO3asOnbsqOHDhys2NlZjxoxRSkqKx89t3rxZJUuWVK9evTwe/+WXXzR48GA98sgjGjRokJ555hn17dtX+/bty9McLCEAwB+lp6dr8uTJKly4sEcxbN68uXbs2GH3eAD+f2RR6/h9Idy5c2e2x1JTUxUbG2vDNL6DJQQA+LNTp06pZ8+eHqUwKChIw4YN04ULF+weDwh4ZFHr+H0h/Mtf/qI//vjD/Z83btyoqKgoBQcH2ziV92MJAQCBYN26dapVq5ZHMSxVqpTmzJnjdbeoAgIJWdQ6fl8I//GPf2jgwIFavHixhgwZotDQUA0dOlQrVqywezSvxhICAAJFRkaGpk+froiICI9i2LhxY/344492jwcEJLKodfy+EB47dkxLly5VWFiYwsLCFB8fb/dIPoElBAAEmrNnz+qJJ57wKIWGYejpp5/W+fPn7R4PCChkUev4fSEMDw9X4cKFNWXKFF26dEmjRo3SwoULdfLkSbtH82osIQAgUG3atEl169b1KIUlSpTQ+++/r6ysLLvHAwICWdQ6fl8IGzZsqMOHD3s8dv2y07gxlhAAEMiysrL03nvvqXjx4h7FsEGDBvrhhx/sHg/we2RR6/h9Idy1a5fp42vWrLF4Et/CEgIAIP3+++8aMGBAtquRDhkyRBcvXrR7PMBvkUWt4/eF0IzD4dArr7xi9xhejSUEAOD/2bp1qxo0aOBRDMuUKaP58+fL5XLZPR7gd8ii1vH7Qnjw4EE99thjevjhh/XQQw/poYceUoMGDVS8eHG7R/NqLCEAAJ6ysrL0P//zPypatKhHMfzrX/+qffv22T0e4FfIotbx+0LYoUMHjRkzRj169FBcXJwmTJigTp06admyZXaP5tVYQgAAzJ09e1a9e/f2KIWhoaF66aWXdPXqVbvHA/wCWdQ6fl8I582bJ0n65ZdftH79eklSZmamnn76aTvH8nosIQAAOfv2228VFRXlUQzvueceff7555xGCtwmsqh1/L4Qvvzyy9q0aZOysrI0evRoHTp0SD///LNKly5t92hejSUEAODm0tLSNHHiRBUqVMijGHbs2FEnTpywezzAZ5FFreP3hXDJkiUqVKiQtm/froMHD6p48eIKDg5WkyZN7B7Nq7GEAADk3tGjR9WuXTuPUhgWFqY33nhD6enpdo8H+ByyqHX8vhBK/7qq6HWnT5/W8uXLde7cORsn8n4sIQAAeeNyubR8+XJFRkZ6FMMaNWrou+++s3s8wKeQRa0TEIXQzPz58+0ewauxhAAA3Jo///xTo0aNUkhIiEcxHDBggC5cuGD3eIBPIItax+8LYXx8vGrXrq2wsDAFBwd7HLgxlhAAgNuzZ88etWjRItu9CxcuXMhFZ4CbIItax+8L4V133aX33ntP69ev18aNG7Vx40Z99913evbZZ+0ezauxhAAA3D6n06k5c+aoePHiHsXwkUce0ZEjR+weD/BaZFHr+H0h7NSpk+njycnJFk/iW1hCAADunF9//VW9evXyKIWFChXSG2+8oYyMDLvHA7wOWdQ6fl8IP/74Y9N/A7dixQobpvEdLCEAAHfe6tWrVblyZY9iWLt2bW3evNnu0QCvQha1jt8Xwg0bNqhixYqqWrWq+6hcubIKFixo92hejSUEACB/pKSkaPTo0dkuOjNkyBBdunTJ7vEAr0AWtY7fF8LIyEiNGjVKH374oRYsWOA+nnjiCbtH82osIQAA+Wv37t1q2rSpRyksX768Pv30Uy46g4BHFrWO3xfCmJgY08dPnTpl8SS+hSUEACD/ORwOvffee4qIiPAohu3bt9eJEyfsHg+wDVnUOn5fCF977TXT0y92795twzS+gyUEAMA6SUlJ6tq1q0cpDA8P1zvvvCOHw2H3eIDlyKLW8ftCOHr0aDVv3lwDBw70OBo1amT3aF6NJQQAwHorV65UZGSkRzFs2rSp9u7da/dogKXIotbx+0LYpUsXde/eXQMGDHAf/fv3V61atewezauxhAAA2OPKlSt6/vnnFRQU5C6FoaGheu2115SWlmb3eIAlyKLW8ftCuGXLFtPHd+7cafEkvoUlBADAXlu3blWtWrU8Pi2sWbOmEhMT7R4NyHdkUev4ZCG8du2axo4dqxo1aqho0aKqUKGC6tWrp969e2vevHk6c+aM3SP6PJYQAAD7paena/z48SpQoIBHMfyv//ov/hkNv0YWtY5PFsKnnnpKoaGhKleunIoWLaqgoCD3ERwcrNDQUPXs2VPbt2+3e1SfxRICAOA99u3bp+joaI9SePfdd2vVqlV2jwbkC7KodXyyEPbs2dPj/xyZmZn66aefNGfOHEVGRuquu+5SUFCQQkJCNHToUP6PdAtYQgAAvIvD4dDMmTNVuHBhj2L4+OOP6/z583aPB9xRZFHr+GQhnDZt2g2fa9++vZxOp9atW6cuXbooODhY1atX1y+//GLdgH6AJQQAwDudOHFCMTExHqWwdOnS+uSTT7ihPfwGWdQ6PlkIR44cqbVr15o+Fxsb6/GfDxw4oPbt2ysqKkopKSlWjOcXWEIAALyXy+XSggULVLJkSY9iGBsbq5MnT9o9HnDbyKLW8clC+Ouvv6pixYp68803s/2bsP8shNeNHz9er732mhXj+QWWEAAA7/f777+rd+/eHqUwIiJCH3zwgZxOp93jAbeMLGodnyyEkvTDDz+oRIkSql+/vlavXu1+/EaFUJKeffZZK0bzCywhAAC+48svv8x2Q/vWrVvr+PHjdo8G3BKyqHV8thBK0t69e1W9enUFBwerZs2amjx5slq2bHnDnx81apSF0/k2lhAAAN9y+fJlDRkyxKMUFi5cWO+++y6fFsLnkEWt49OFUJJSUlI0evRoFSpUSMHBwQoODla5cuXUu3dvvfTSS3rzzTc1btw4tW3bVn/5y1/sHtdnsIQAAPimdevWqUqVKh7FsGXLljpy5IjdowG5Rha1js8XwuvOnj2rcePGqXr16h73Jbx+VKlSRfv27bN7TJ/BEgIA4LuuXr2q5557zqMUhoWF6Z133pHD4bB7POCmyKLW8ZtC+O+SkpK0Zs0affzxx1q4cKE2bdrEX355xBICAOD7NmzYoHvvvdejGDZv3lwHDx60ezQgR2RR6/hkIVy+fLmSk5Nv6z0cDoc++uijOzSR/2EJAQDwDykpKRoxYoSCgoLcpbBQoUKaMmWKsrKy7B4PMEUWtY5PFsILFy7o0Ucf1aVLl27p9enp6erdu7d27dp1hyfzHywhAAD+ZfPmzapevbrHp4VNmzblKzXwSmRR6/hkIZT+dduJevXq6YcffsjT63bv3q0mTZpo0aJF+TSZf2AJAQDwP6mpqRo9erSCg4PdpbBAgQJ6/fXXlZmZafd4gBtZ1Do+WQjPnDmjVatWKTExUWXKlFG7du00d+5c7dixQ+fPn3f/hZaRkaHff/9dP/74o2bNmqW2bduqePHiio+Pt/k38H4sIQAA/uvHH39UrVq1PD4tbNiwoX766Se7RwMkkUWt5JOFsFmzZipQoIDS0tL066+/qk+fPgoJCXHfdsLsCAkJUZ8+fXTq1Cm7x/cJLCEAAP4tLS1NY8eO9fi0sGDBgnrrrbf4biFsRxa1jk8Wwueee07bt2/3eOz48eOaMmWKHn30UdWvX19RUVFq0KCBunfvrhkzZlAE84glBAAgMPzf//2f6tSp4/FpYXR0tA4dOmT3aAhgZFHr+GQhfOqpp5Senu7xWKdOnWyaxj+xhAAABI60tDSNGTPG49PCsLAwzZw5U06n0+7xEIDIotbxyUK4YsUK1apVS/Pnz9fly5clSe3bt7d5Kv/CEgIAEHi2bt2a7UqkrVq10vHjx+0eDQGGLGodnyyEkrR48WKVKlVKBQoUUJMmTVS9enUtXrxYhw8ftns0v8ASAgAQmK5du6YXXnjBoxQWKVJEs2fPlsvlsns8BAiyqHV8thBK//o/yvTp01WnTh0FBQW5LyBTsmRJxcTE6NVXX9UXX3yhX3/91e5RfQ5LCABAYNuwYYOqVKniUQzbtm2r06dP2z0aAgBZ1Do+XQj/XXR0tBYsWKDhw4erZcuWKlq0qEdJrFSpkvr166elS5fq6tWrdo/r9VhCAADw559/asiQIR6lsFixYpo/fz6fFiJfkUWt4zeF8D+/Q+hyuXTo0CEtWbJEL774oh566CGVLFlSQUFBKlq0qEaOHKlLly7ZNK33YwkBAMB1a9asUWRkpEcx7Ny5s3777Te7R4OfIotax28KYW5vK3H8+HF99NFH6tWrl6KionT06NF8nixvMjIyNG3aNPXq1UsjRoxQ27ZtNWHCBGVmZt70tbNmzfL4i/o/j1KlSuV6DpYQAAD8u+TkZPXv3z9btvj000/tHg1+iCxqHb8phLfixIkTeuaZZ+wewy0zM1MxMTGKjo5231bj2rVratiwoWJjY+VwOHJ8fa1atdSyZUsNHDhQgwYN8jhKliypIUOG5HoWlhAAAJj58ssvVb58eY9i+Pjjj3PmFe4osqh1ArYQpqWlafny5Ro8eLDdo7hNmDBBhmEoISHB4/FVq1bJMAzNnDnzhq9du3atXn/9ddPnzp8/r9DQUH333Xe5noUlBAAAN/LHH3+oV69eHqUwMjJSa9eutXs0+AmyqHUCthB+8cUXCgoKUseOHe0eRZKUnp6uEiVKqEiRItk+CczMzFR4eLgiIyNveHPYpKSkG365+/3331eFChXydGNZlhAAANzMkiVLVKJECY9i+MILLyg1NdXu0eDjyKLWCdhCKEl79uxxn5ppt8TERBmGoWbNmpk+37hxYxmGoW3btuX5vZs3b64XXnghx59JT0/XlStX3EdSUhJLCAAAbiopKUlt2rTxKIU1a9bUjh077B4NPoxCaJ2ALoTeZM6cOTIMQ926dTN9vkuXLjIMQ/PmzcvT+x47dkyGYWjr1q05/lxcXJzphWhYQgAAcDNOp1PvvfeewsLC3BkiNDRUkyZNUlZWlt3jwQdRCK1DIfQSkydPlmEY6tevn+nzffv2lWEYmjJlSp7ed9KkSapcufJNf45PCAEAwO06cOCA+6ym60d0dLSOHDli92jwMRRC61AIvcSMGTNyLIT9+vWTYRiaPHlynt63Ro0aevnll/M8D0sIAABuRWZmpv72t78pODjYXQoLFy6s2bNnczN75BpZ1DoUQi+xdOlSGYah7t27mz7fvXv3PJ8yumPHDhmGod27d+d5HpYQAADcjh9++EFRUVEenxbGxsbq119/tXs0+ACyqHUohF5i27ZtMgxDLVq0MH2+efPmeb6ozMiRI1WjRo1bmoclBAAAtyslJUXDhg3zKIWlS5fW8uXL7R4NXo4sah0KoZdwOBwqW7asihUrlu10CofDoYiICJUtWzbXt45wOp2qUKGC4uLibmkelhAAANwpq1ev1l133eVRDPv370/OwA2RRa1DIfQi48ePl2EY2rRpk8fjCQkJMgxD48ePdz/mcDgUHx9/wy9pr127VoZh6ODBg7c0C0sIAADupD/++EM9evTwKIX33nvvTa+EjsBEFrUOhdCLpKamqlGjRmrZsqUyMjIkSWlpaWratKkaNWrkcZPXuXPnyjAMRUZGmr7XgAEDVL9+/VuehSUEAAB3msvl0sKFC1W0aFF3KQwJCdGECRO4PQU8kEWtQyH0MikpKRo7dqw6duyo4cOHKzY2VmPGjFFKSorHz23evFklS5ZUr169sr1HWlqaihUrprfeeuuW52AJAQBAfjlx4oT+8pe/eHxa2KJFCx0/ftzu0eAlyKLWoRDCFEsIAADyU1ZWliZOnKiQkBB3KSxatKgWLlzI7SlAFrUQhRCmWEIAAGCFrVu36t577/X4tLB37966dOmS3aPBRmRR61AIYYolBAAAVvnzzz/Vv39/j1J4zz33aOPGjXaPBpuQRa1DIYQplhAAAFjts88+U4kSJdylMCgoSOPGjXNfbA+BgyxqHQohTLGEAADADqdPn1br1q09Pi1s0qSJDh8+bPdosBBZ1DoUQphiCQEAgF0cDoemTp2q0NBQdyksXLiw/vd//5cLzgQIsqh1KIQwxRICAAC77dixQzVq1PD4tPCxxx7jgjMBgCxqHQohTLGEAADAG6SkpGjo0KEepbBSpUravHmz3aMhH5FFrUMhhCmWEAAAeJOVK1eqZMmS7lIYHBysSZMmyeFw2D0a8gFZ1DoUQphiCQEAgLc5ffq0WrVq5fFp4YMPPqikpCS7R8MdRha1DoUQplhCAADgjRwOhyZOnKjg4GB3KSxVqpS++OILu0fDHUQWtQ6FEKZYQgAA4M0SExN1zz33eHxa+Nxzzyk1NdXu0XAHkEWtQyGEKZYQAAB4u4sXL6p79+4epbBu3br6+eef7R4Nt4ksah0KIUyxhAAAwBe4XC7NmTNHYWFh7lIYHh6uuXPncs9CH0YWtQ6FEKZYQgAA4Ev279+vOnXqcM9CP0EWtQ6FEKZYQgAA4GtSU1P17LPPcs9CP0AWtQ6FEKZYQgAA4Ks+//xzj3sWhoSE6K233pLT6bR7NOQSWdQ6FEKYYgkBAIAvO3XqlP761796fFrYrl07nTt3zu7RkAtkUetQCGGKJQQAAL4uKytLf/vb3xQUFOQuhRUqVNDGjRvtHg03QRa1DoUQplhCAADgL9auXavy5cu7S2FwcLAmTZokh8Nh92i4AbKodSiEMMUSAgAAf/Lbb7/p4Ycf9jiF9JFHHtHvv/9u92gwQRa1DoUQplhCAADgbxwOhyZOnKjg4GB3KSxfvrzWr19v92j4D2RR61AIYYolBAAA/mrDhg2666673KUwKChI48eP5xRSL0IWtQ6FEKZYQgAA4M/OnTunmJgYj1NIW7durV9//dXu0SCyqJUohDDFEgIAAH/ndDr15ptvepxCWq5cOSUkJNg9WsAji1qHQghTLCEAAAgUmzZtUsWKFT1OIX311VeVlZVl92gBiyxqHQohTLGEAAAgkJw/f17t27f3OIW0VatWnEJqE7KodSiEMMUSAgCAQON0OjVlyhSFhIR4XIX0u+++s3u0gEMWtQ6FEKZYQgAAEKg2b96syMhIjxvZT548WU6n0+7RAgZZ1DoUQphiCQEAQCA7f/58tquQdujQQRcvXrR7tIBAFrUOhRCmWEIAABDoHA6HJkyYoKCgIHcprFy5srZv3273aH6PLGodCiFMsYQAAAD/8u2336pMmTLuUligQAHNmjVLLpfL7tH8FlnUOhRCmGIJAQAA/p+kpCS1aNHC4xTSPn366M8//7R7NL9EFrUOhRCmWEIAAABPmZmZGjlypEcprFmzpvbv32/3aH6HLGodCiFMsYQAAADm4uPjVaxYMXcpLFy4sD755BO7x/IrZFHrUAhhiiUEAAC4sSNHjqhevXoenxYOHTpUaWlpdo/mF8ii1qEQwhRLCAAAkLPU1FQNGjTIoxQ2atRIx48ft3s0n0cWtQ6FEKZYQgAAgNyZP3++wsPD3aWwZMmS+vrrr+0ey6eRRa1DIYQplhAAACD3fvrpJ1WvXt1dCoOCgjRhwgQ5nU67R/NJZFHrUAhhiiUEAADIm8uXL6tr164ep5B26NBBFy9etHs0n0MWtQ6FEKZYQgAAgLxzuVyaMmWKgoOD3aWwatWq2rVrl92j+RSyqHUohDDFEgIAANy6devWqUyZMu5SGBYWpgULFtg9ls8gi1qHQghTLCEAAMDtOX36tJo1a+ZxCumwYcOUnp5u92hejyxqHQohTLGEAAAAty89PV3Dhg3zKIXNmjXT6dOn7R7Nq5FFrUMhhCmWEAAA4M6ZP3++wsLC3KWwTJkyWrdund1jeS2yqHUohDDFEgIAANxZu3btUtWqVd2lMDg4WFOmTJHL5bJ7NK9DFrUOhRCmWEIAAIA77+LFi4qNjfU4hbRbt25krv9AFrUOhRCmWEIAAID84XQ6FRcXp6CgIHcpvO+++/Tzzz/bPZrXIItah0Lo537++WctWbJEy5Yty9PrWEIAAID8tXr1apUoUcJdCiMiIvT555/bPZZXIItah0Loh65du6Y333xTNWvW1NixY3XixIk8vwdLCAAAkP+OHz+u+vXre5xC+tprr8npdNo9mq3IotahEHqRjIwMTZs2Tb169dKIESPUtm1bTZgwQZmZmbl+j8OHDysqKkp16tTRsWPHbnkWlhAAAMAa165dU9++fT1KYceOHZWcnGz3aLYhi1qHQuglMjMzFRMTo+joaPfNSq9du6aGDRsqNjZWDofjpu9x+PBhlSpVStWqVdP58+dvax6WEAAAwDoul0vTp09XcHCwuxRWr149YL9XSBa1DoXQS0yYMEGGYSghIcHj8VWrVskwDM2cOTPH12dkZKh27doyDEOJiYm3PQ9LCAAAYL21a9eqVKlSHt8rXLlypd1jWY4sah0KoRdIT09XiRIlVKRIkWyfBGZmZio8PFyRkZE5nks+e/ZsGYah1q1b35GZWEIAAAB7nDhxItv3Cv/2t78F1PcKyaLWoRB6gcTERBmGoWbNmpk+37hxYxmGoW3btt3wPRo1aiTDMDR8+HD169dPd999t8LDw9W4ceNcXWE0PT1dV65ccR9JSUksIQAAgE1SUlLUp08fj1LYqVMnXb582e7RLEEhtA6F0AvMmTPHfVNSM126dJFhGJo3b57p85cuXXLfx6ZHjx46fPiw0tPT9f333ysqKkqGYWjOnDk5zhAXF+fxF871gyUEAACwh8vl0rRp0zy+V3jffffpwIEDdo+W7yiE1qEQeoHJkyfLMAz169fP9PnrV52aMmWK6fN79+6VYRgqUaKEUlNTPZ7bs2ePDMNQyZIlsz337/iEEAAAwDslJCR4fK+waNGifv+9QgqhdSiEXmDGjBk5FsJ+/frJMAxNnjzZ9Pnrp5xGR0ebPn/9YjMbNmzI9UwsIQAAgPc4ceKE6tWrFzDfKySLWodC6AWWLl0qwzDUvXt30+e7d++e4ymjP/30U46F8PrrFy9enOuZWEIAAADvkpKSot69e2f7XqE/5jWyqHUohF5g27ZtMgxDLVq0MH2+efPmOV5UJj09XQUKFFDlypVNn3/88cdlGIY+//zzXM/EEgIAAHgfl8ult99+2+N7hbVr19bx48ftHu2OIotah0LoBRwOh8qWLatixYrJ5XJley4iIkJly5bN8ZSAtm3bKigoSBcuXMj2XJs2bWQYho4ePZrrmVhCAAAA75WQkKCSJUu6S2Hp0qXz9PUgb0cWtQ6F0EuMHz9ehmFo06ZNHo8nJCTIMAyNHz/e/ZjD4VB8fLyOHDnifuz6Dexnz57t8frMzEyVLl1aDzzwQJ7mYQkBAAC825EjR1SjRg13KQwNDdXcuXPtHuuOIItah0LoJVJTU9WoUSO1bNlSGRkZkqS0tDQ1bdpUjRo18rhC6Ny5c2UYhiIjIz3e48knn1T58uX1yy+/uB+bPXu2SpcunefLE7OEAAAA3i85OVnt2rXz+F7h8OHDlZWVZfdot4Usah0KoRdJSUnR2LFj1bFjRw0fPlyxsbEaM2aMUlJSPH5u8+bNKlmypHr16uXxuNPp1DvvvKPo6Gj1799fAwcOVL9+/W7pnHKWEAAAwDdkZWVp5MiRHqWwTZs2unTpkt2j3TKyqHUohDDFEgIAAPiWDz/8UAUKFHCXwurVq+vQoUN2j3VLyKLWoRDCFEsIAADgexITE1WmTBl3KSxevLi+/fZbu8fKM7KodSiEMMUSAgAA+KZffvlFdevWdZfC4OBgvfvuu9muZu/NyKLWoRDCFEsIAADgu/7880916dLF43uFzzzzjPvihd6OLGodCiFMsYQAAAC+zel0aty4cR6lsFWrVvrjjz/sHu2myKLWoRDCFEsIAADgHxYvXqxChQq5S2HVqlW1b98+u8fKEVnUOhRCmGIJAQAA/Me2bdt01113uUth0aJFvfpiM2RR61AIYYolBAAA8C9JSUlq3LixuxSGhITof//3f+0eyxRZ1DoUQphiCQEAAPzPtWvX1K1bN4/vFY4dO1ZOp9Pu0TyQRa1DIYQplhAAAMA/ORwOjRw50qMU9u7dW2lpaXaP5kYWtQ6FEKZYQgAAAP82a9YsBQcHu0vhAw884DVXICWLWodCCFMsIQAAgP/76quvVLhwYXcpjIqK0pEjR+weiyxqIQohTLGEAAAAgWHnzp2qUKGCuxSWLl1aiYmJts5EFrUOhRCmWEIAAIDAcerUKd1///3uUliwYEEtXbrUtnnIotahEMIUSwgAABBYLl++rJiYGI+LzUyePFkul8vyWcii1qEQwhRLCAAAEHgyMzM1ePBgj1I4aNAgZWZmWjoHWdQ6FEKYYgkBAAACk8vl0uTJkz1KYUxMjC5fvmzZDGRR61AIYYolBAAACGxLly5VwYIF3aXw/vvv1+nTpy35s8mi1qEQwhRLCAAAgMTERJUqVcpdCiMjI/XT5P3UxAAAE3NJREFUTz/l+59LFrUOhRCmWEIAAABI0pEjRxQVFeUuhcWLF9fGjRvz9c8ki1qHQghTLCEAAACuO3/+vJo2bepxW4rly5fn259HFrUOhRCmWEIAAAD8u5SUFHXo0MFdCoOCgvT+++/ny59FFrUOhRCmWEIAAAD8p8zMTA0YMMDjCqTjxo274/cqJItah0IIUywhAAAAzLhcLr366qsepbB///539F6FZFHrUAhhiiUEAABATmbNmqWgoCB3KYyNjdXVq1fvyHuTRa1DIYQplhAAAAA3Ex8fr0KFCrlLYdOmTXX+/Pnbfl+yqHUohDDFEgIAACA3Nm3apOLFi7tLYVRUlI4fP35b70kWtQ6FEKZYQgAAAOTWvn37FBkZ6S6F5cqV086dO2/5/cii1qEQwhRLCAAAgLw4ffq0atWq5S6FERERSkhIuKX3Iotah0IIUywhAAAA8urixYt64IEH3KUwNDRUixYtyvP7kEWtQyGEKZYQAAAAtyI1NVVdu3b1uC3F9OnT8/QeZFHrUAhhiiUEAADArXI4HBo2bJhHKRwzZkyub2BPFrUOhRCmWEIAAADcDpfLpYkTJ3qUwoEDByorK+umryWLWodCCFMsIQAAAO6E2bNne9zAvnPnzkpNTc3xNWRR61AIYYolBAAAwJ2yfPlyFSxY0F0KW7ZsqUuXLt3w58mi1qEQwhRLCAAAgDtp/fr1ioiIcJfCunXr6uzZs6Y/Sxa1DoUQplhCAAAA3Gk7duxQ2bJl3aWwSpUqOnLkSLafI4tah0IIUywhAAAA8sORI0dUpUoVdyksW7asduzY4fEzZFHrUAhhiiUEAABAfjl79qzq1q3rLoURERFav369+3myqHUohDDFEgIAACA/JScnq2XLlu5SWLBgQS1fvlwSWdRKFEKYYgkBAACQ31JTU9W5c2d3KQwKCtIHH3xAFrUQhRCmWEIAAABYISsrSwMGDPC4gf24cePIohahEMIUhRAAAABWcblcGjNmjEcpJItag0IIUxRCAAAAWG369OkUQotRCGGKQggAAAA7LFy4UMHBwWRRi1AIYYpCCAAAALssW7aMLGoRCiFMUQgBAABgF7KodSiEMMUSAgAAwC5kUetQCANEZmamtmzZkuufZwkBAABgF7KodSiEXiYjI0PTpk1Tr169NGLECLVt21YTJkxQZmZmrt/jiy++yHbJXsMwtHDhwly/B0sIAAAAu5BFrUMh9CKZmZmKiYlRdHS00tPTJUnXrl1Tw4YNFRsbK4fDkav3adq0qWJiYtSuXTv30bt3b/d75gZLCAAAALuQRa1DIfQiEyZMkGEYSkhI8Hh81apVMgxDM2fOvOl7fPPNN+rcufNtz8ISAgAAwC5kUetQCL1Eenq6SpQoof+vvfuPibKO4wD+wQQ09BQXomDRUFs0Z4hy4Y+WbRoRAxMRwxGX0xp/xNQw1NzAWcNfSysrFW0GbmJEzX5MGDnU1AmiNbWUoN2UH2pbJgJycNzx7o/q8gQR8Ll7nvN5v7bvH/d9juf7uX321XvfPXfn5+fX5Z1Aq9WKwYMHIzg4GHa7vcfzTJ8+HYsWLUJpaSmam5v7XQ83IRERERGphc9F3YeBUCOOHTsGEYHRaOz2+OTJkyEiqKiouOs5ysrKnD4z6OPjg8TERJjN5nuu39bWhps3bzpGbW0tRAR1dXVO8xwcHBwcHBwcHByuHnV1dRARNDY29vv5NfUOA6FG7NixAyKCuXPndns8Pj4eIoJdu3bd9Rz19fU4ePAgtm/fjqSkJPj6+kJEYDAYcOrUqR7Xz87O7vaLaDg4ODg4ODg4ODjUGnV1dff1HJvujYFQI3JyciAiSElJ6fZ4cnIyRAQbNmzo9TkbGhowZ84ciAiCgoJgsVjuet873yG8fPkyRAS1tbWqv0LE0btX0PhurmcM9stzBnvlWYP98pzBXnnWUKtfjY2NGDt27D0/LkX3j4FQI7Zs2dJjIExJSYGIICcnp0/ntdvtiIuLg4igqKio13938yav2/YU7JVnYb88B3vlWdgvz8FeeRY1+xUWFub2NfWIgVAjCgoKICJISEjo9nhCQgJEer5k9G4qKyshIti0aVOv/4b/WHsO9sqzsF+eg73yLOyX52CvPIua/fr444/dvqYeMRBqREVFBUQEU6dO7fZ4VFQURHr+Upm7sVgsEBFs27at13/Df6w9B3vlWdgvz8FeeRb2y3OwV56F/XrwMRBqhM1mQ0BAAAwGAzo7O7scGzJkCAICAvp1HXVNTQ1EBOXl5b3+m7a2NmRnZ/fpx+xJHeyVZ2G/PAd75VnYL8/BXnkW9uvBx0CoIVlZWRARHD161Gm+tLQUIoKsrCzHnM1mQ1FREaqrqx1zFoulS5gEgBUrVmDmzJmuK5yIiIiIiDwSA6GGtLa2IiIiAjNmzEB7ezuAf0JeZGQkIiIi0Nra6rjvzp07ISIIDg4GAJjNZnh7eyMwMBC5ubmOdxLz8/NhNBpx9epV9z8gIiIiIiLSNAZCjWlpacGqVasQGxuL9PR0xMTEIDMzEy0tLU73O378OPz9/ZGUlAQAaG9vR1paGkaNGgVvb29MmTIFJpMJeXl5jnBJRERERER0OwZCIiIiIiIinWIgJCIiIiIi0ikGQiIiIiIiIp1iICQiIiIiItIpBkIinbFarThx4oTaZeiW3W5HQUEBNm/erHYpuqd0L7i3iFyDe4vItRgIyUl7ezs2b96MpKQkLF26FC+88ALWrl0Lq9Wqdmm6o0QvDhw4ABHpMvLy8lxYOXWns7MTX3zxBZ566imICEwmk9ol6ZYSveDe0oaLFy8iMTERI0aMgLe3N5544gls2LABHR0dapemS0r0g3tLOxoaGrBkyRI89thjePjhhxEeHo69e/eqXRa5AAMhOVitVsyePRvPPPMM2traAAC3bt3CpEmTEBMTA5vNpnKF+qFULyIjIzF79mxER0c7xoIFCxznJPc5f/48ampqsHv3bgZClSnRC+4t9V26dAn+/v549tlnsXDhQkRGRjrCQ0pKitrl6Y5S/eDe0oYrV65g4sSJyMzMxL59+7Bp0yYEBwdDRLB//36XrdvZ2YmPPvoITz/9NPz8/Lp9cWD69OkuW1+vGAjJYe3atRARlJaWOs1///33EBFs3bpVpcr0R4leFBcXIy4uzlUlUj8dPnyYgVAj+tsL7i1tiI2NxXfffec099VXX8HLywsigrNnz6pUmT4p0Q/uLe3IyMhAVVWV01x5eTlEBAkJCS5bd/HixXj++ecxbtw4jBkzBvPmzcPLL78MEUFMTAzmzZuH/Px8l62vVwyEBABoa2vD8OHD4efn1+XdJ6vVisGDByM4OBh2u12lCvVDqV5Mnz4dixYtQmlpKZqbm11ZMvUBA6F29LcX3Fvqu3btGpYuXdrtsTlz5kBEUFBQ4Oaq9EupfnBvaccvv/zSZe7WrVsQEbz++usuWbO4uBi//fYbAGDSpEl4//33AQAlJSUYMWIEr1RzIQZCAgAcO3YMIgKj0djt8cmTJ0NEUFFR4ebK9EeJXpSVlTldXuHj44PExESYzWZXlU29xECoHf3pBfeWNjQ1NaGxsbHbY5mZmRAR/Pjjj26uSr+U6Af3lvaVlJRg5MiRLu/J6dOnISKOcJiamopXXnnFpWvqHQMhAQB27NgBEcHcuXO7PR4fHw8Rwa5du9xcmf4o0Yv6+nocPHgQ27dvR1JSEnx9fSEiMBgMOHXqlKtKp15gINSO/vSCe0v7UlNTMWbMGH6xjEb0th/cW9pWWVmJsLAwnDt3zuVrpaWlYezYsQAAi8UCg8HALxVyMQZCAgDk5OT0+MHv5ORkiAg2bNjg5sr0xxW9aGhocFy2ExQUBIvFolS51EcMhNqhRC+4t7TFarVi5MiRfPKoEffTD+4tbThy5AjmzJmDAQMGQEQwbNgwHDhwwGXrtba2YtiwYXjrrbcAAIWFhfDy8sK1a9dctiYxENK/tmzZ0mMISUlJgYggJyfHzZXpj6t6YbfbERcXBxFBUVGREqVSPzAQaodSveDe0o6tW7ciOTlZ7TLoX/fbD+4t9dntdjQ1NeHUqVNYvHgxRARDhw5FQ0ODS9b75JNPICKO352cN28eJkyYAOCfn+O6ceOGS9bVOwZCAgAUFBT0+M1RCQkJvGTUTVzZi8rKSogINm3adL9lUj8xEGqHkr3g3lLfzz//jPj4eLS3t6tdCkG5fnBvacubb77pst+F/OabbzB8+HCEhYU55gwGA6ZNmwYAWLduHa5fv674usRASP+qqKiAiGDq1KndHo+KiuKXyriJK3thsVggIti2bdv9lkn9xECoHUr2gntLXdXV1UhOTkZra6vapRCU7Qf3lrb89xxl/fr1ip73008/dXyh0H/vBnd0dDh+tiQgIAArV65UdE36HwMhAQBsNhsCAgJgMBjQ2dnZ5diQIUMQEBDAn51wA1f2oqamBiKC8vJypcqlPmIg1A4le8G9pZ7q6mqYTCaGQY1Quh/cW9ry008/QUTw9ddfK3regoIC+Pn5YfXq1U7zKSkp8Pf3R3p6OqxWq6Jr0v8YCMkhKysLIoKjR486zZeWlkJEkJWVpVJl+tOXXthsNhQVFaG6utoxZ7FYuoRJAFixYgVmzpzpusLpnhgIteNeveDe0r6qqiqkpqZ2Gz5OnDjh0i+/oK562w/uLc+1ceNGhIaG8tLsBwwDITm0trYiIiICM2bMcGx0i8WCyMhIRERE8NVXN+pLL3bu3AkRQXBwMADAbDbD29sbgYGByM3NdbyTmJ+fD6PRiKtXr7r/AZHDf58RnT9/vtql6N69esG9pW0XL17E6NGjER8fjwULFjiNl156CSEhIXxHwY360g/uLW1rampCUFAQjEYjysrKHPMlJSUICwvr9kfrybMxEJKTlpYWrFq1CrGxsUhPT0dMTAwyMzPR0tKidmm609teHD9+HP7+/khKSgLwz7dwpaWlYdSoUfD29saUKVNgMpmQl5fHV/RUZDabsWXLFoSEhEBEMGjQIGRnZ6O0tFTt0nSnt73g3tIus9mMwMBApx8yv3OsWbNG7TJ1o6/94N7Sts7OTqSmpmL48OEYOHAgjEYjFi9ejA8++IDPBx9QDIREREREREQ6xUBIRERERESkUwyEREREREREOsVASEREREREpFMMhERERERERDrFQEhERERERKRTDIREREREREQ6xUBIRER0D1euXMGyZcuwceNGJCYm4tVXX0Vzc7PaZREREd03BkIiIqIenDx5EqNHj0ZJSQkAoLGxEQ899BAyMzNVroyIiOj+MRASERHdxdmzZzFs2DCsW7fOaT4gIADjx49XqSoiIiLlMBASERF1o7m5GePHj8eECRNgs9mcjg0ZMgR+fn4qVUZERKQcBkIiIqJurFixAiKCb7/91mm+vb0dIoLAwECVKiMiIlIOAyEREdEd6uvr4ePjg/Hjx6Ozs9Pp2NmzZyEimDBhgkrVERERKYeBkIiI6A6rV6+GiOC9997rcmzHjh0QEcyfP1+FyoiIiJTFQEhERHSHcePGQUQwbdo0REdHO42goCCICHbu3Kl2mURERPeNgZCIiOg2tbW1EBE88sgjsNvtTsdsNhsCAwMxYMAA1NbWqlQhERGRchgIiYiIblNcXHzXS0IPHToEEUFCQoIKlRERESmPgZCIiOg2eXl5EBFkZGR0ORYfHw8vLy+cPHlShcqIiIiUx0BIRER0m88//xwignfffddp/sKFC/Dy8sKSJUsAAMePH0dcXBwyMjKwZs0azJo1C0FBQSgrK0NeXh5iY2MRGBiIwsJCxzn27duHzMxM5ObmIiYmBr/++isA4MyZMwgPD8egQYNQXV2N3bt3IyoqCpWVle574EREpEsMhERERLc5cuQIRAQrV650mn/xxRcRGhqKGzduOObmzp0Lo9GIP//8EwCwfPlyjB49GlVVVQCADz/8EGFhYQCAjo4O+Pj4oKysDADw9ttvO116WlVVhUGDBmHfvn0wmUz4448/XPo4iYiIAAZCIiIiJx0dHQgJCcGsWbMcc1lZWQgNDcXvv//udF+TyQSTyeS4vXv3boSEhDhuHzp0CD4+Po7b5eXlsFqtMJvNSEhIwMyZM53Ot379evj6+mLv3r3KPigiIqK7YCAkIiK6w7lz5xAVFYVly5YhLS0N77zzDpqamrrc785AuGfPHqdAePjwYYj8/1/thQsXkJGRgR9++AFZWVl47rnnnM53/fp1+Pj4OC5LJSIicjUGQiIion7qSyCsra2FwWBwfG4wOzu7SyBcvnw5CgsLMWDAAMelpURERK7EQEhERNRPqampXQLho48+6rhdVlbmCISFhYUQEZw/fx7t7e2IjY3FxIkTYbVaAQAHDhzAnj17AABvvPEGxo4di1u3brntsRARkT4xEBIREfXD6dOn8eSTTyI8PBxnzpzBpUuXsHDhQgwcOBBffvkl/vrrL6SlpUFE8Nlnn+HatWuIiIiAv78/XnvtNezfvx9Dhw7FqlWrUFxcjMcffxxmsxkAUFRUBBFBdHQ0Ll++rPIjJSKiBxkDIRERERERkU4xEBIREREREekUAyEREREREZFOMRASERERERHpFAMhERERERGRTjEQEhERERER6RQDIRERERERkU79DS5feMKV1JQOAAAAAElFTkSuQmCC\" width=\"900\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot data alongsode the interpolation (if there are large differences there is something wrong)\n",
"if True:\n",
" fig=plt.figure(figsize=(9,4))\n",
" fig.subplots_adjust(bottom=0.15, left=0.15, top = 0.95, right=0.9,wspace=0.0,hspace=0.0)\n",
" sub = fig.add_subplot(1,1,1)\n",
" \n",
" \n",
" Y=[]\n",
" T=np.linspace(0,np.pi,50)\n",
" for t in T:\n",
" Y.append(anharmonicFactor(t))\n",
" sub.plot(T,Y,linestyle='-',linewidth=2,alpha=1,c='xkcd:black')\n",
" \n",
" \n",
" sub.set_xlabel(r'$\\theta_{\\rm max}$')\n",
" sub.xaxis.set_label_coords(0.5, -0.1) \n",
"# sub.set_ylabel(r'$ \\dfrac{2\\sqrt{2}}{\\pi \\ \\theta_{\\rm max}^2} \\ \\int_{-\\theta_{\\rm max}}^{\\theta_{\\rm max}} d\\theta \\ \\sqrt{ \\cos(\\theta) - \\cos(\\theta_{\\rm max}) }$')\n",
" sub.set_ylabel(r'$ f\\left( \\theta_{\\rm max} \\right)$')\n",
" sub.yaxis.set_label_coords(-0.1,0.5) \n",
" #set major ticks\n",
" _M_xticks=[ 0,0.5,1,1.5,2,2.5,3]\n",
" _M_yticks=[ 0.5,0.6,0.7,0.8,0.9,1 ]\n",
"\n",
" #set major ticks that will not have a label\n",
" _M_xticks_exception=[]\n",
" _M_yticks_exception=[]\n",
"\n",
" _m_xticks=[np.pi]\n",
" _m_yticks=[] \n",
" ft=FT(_M_xticks,_M_yticks,\n",
" _M_xticks_exception,_M_yticks_exception,\n",
" _m_xticks,_m_yticks,\n",
" xmin=0,xmax=np.pi,ymin=0.5,ymax=1.005,xscale='linear',yscale='linear')\n",
"\n",
" ft.format_ticks(plt,sub) \n",
" \n",
" sub.text(np.pi*0.99,0.46,r'$\\pi$')\n",
"\n",
" \n",
"# fig.savefig('anharmonic_factor.pdf',bbox_inches='tight')\n",
" fig.show()"
]
},
{
"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.9.1"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

File Metadata

Mime Type
text/x-diff
Expires
Tue, Nov 19, 2:34 PM (1 d, 11 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3804758
Default Alt Text
(76 KB)

Event Timeline