Skip to content

Instantly share code, notes, and snippets.

@ev-br
Created November 15, 2020 10:49
Show Gist options
  • Save ev-br/e87f8d9e1a72e9f858f7c2d19b5e2062 to your computer and use it in GitHub Desktop.
Save ev-br/e87f8d9e1a72e9f858f7c2d19b5e2062 to your computer and use it in GitHub Desktop.
1D Hubbard chain binding energy vs U
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Two-body energy eigenstate, $E$, satisfies\n",
"\n",
"$$\n",
"\\frac{1}{U} = \\frac{1}{L} \\sum_k \\frac{1}{2\\epsilon_k - E}\n",
"$$\n",
"\n",
"where the sum over $k$ runs over the 1st Brillouin zone and $\\epsilon_k = 2(1 - \\cos{k})$ is the single-particle dispersion for a single Hubbard chain. Here we set $t=1$ to fix the energy scale and shift the bottom of the single-particle band so that $\\epsilon_{k=0} = 0$ for convenience.\n",
"\n",
"Note that the *binding* energy, $E^{b}$, is counted from the bottom of the band, so that \n",
"\n",
"$$\n",
"\\mathrm{binding\\ energy} = -E\n",
"$$\n",
"\n",
"For a single chain, the binding energy is (see, e.g. Orso et al, arXiv:1010.3105, just below Eq. (8)).\n",
"\n",
"$$\n",
"E^b = \\sqrt{U^2 + 16} - 4\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"def U1(E, L):\n",
" \"\"\" R.h.s. of the two-body energy equation.\n",
" \"\"\"\n",
" k = 2*np.pi * np.arange(-L//2, L//2) / L\n",
" ene = 2*(1 - np.cos(k))\n",
" denom = 2*ene - E\n",
" return np.sum( 1./denom ) / L"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.9 , 1.72952205, 2.30336981, 2.78438463, 3.21451435,\n",
" 3.61198375, 3.98657373, 4.34420683, 4.68876479, 5.02293907,\n",
" 5.34867628, 5.66743138, 5.98032091, 6.28822053, 6.59182949,\n",
" 6.89171489, 7.18834275, 7.48210052, 7.77331361, 8.06225775])"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# binding energies\n",
"Es = np.linspace(0.1, 5, 20)\n",
"\n",
"UU = np.asarray([1./U1(-e, 100) for e in Es])\n",
"UU"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [],
"source": [
"def Eb(U):\n",
" return np.sqrt(UU**2 + 16) - 4"
]
},
{
"cell_type": "code",
"execution_count": 66,
"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 (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 = 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",
" mpl.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",
" var resizeObserver = new 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 * mpl.ratio);\n",
" canvas.setAttribute('height', height * mpl.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 (width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" resizeObserver.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'] / 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,\n",
" 0,\n",
" fig.canvas.width / mpl.ratio,\n",
" fig.canvas.height / mpl.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 * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.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",
"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",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / mpl.ratio;\n",
" fig.root.removeEventListener('remove', this._remove_fig_handler);\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 / mpl.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 () {\n",
" this.close_ws(this, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
" el.addEventListener('remove', this._remove_fig_handler);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydCXhU1fnG38lGWKMgSERQxBURI1ULihuVv1RF3A2CS2up4kbdilsFrIqItaVq0eIuAtYNxAUXqCIKasVQEDdwx7gAEtlClpn/893phKxkkjOZzMz93eexDZn73XPO77x3vjfn3HNuIBQKhcQBAQhAAAIQgAAEIOAbAgEMoG/6moZCAAIQgAAEIAABjwAGECFAAAIQgAAEIAABnxHAAPqsw2kuBCAAAQhAAAIQwACiAQhAAAIQgAAEIOAzAhhAn3U4zYUABCAAAQhAAAIYQDQAAQhAAAIQgAAEfEYAA+izDqe5EIAABCAAAQhAAAOIBiAAAQhAAAIQgIDPCGAAfdbhNBcCEIAABCAAAQhgANEABCAAAQhAAAIQ8BkBDKDPOpzmQgACEIAABCAAAQwgGoAABCAAAQhAAAI+I4AB9FmH01wIQAACEIAABCCAAUQDEIAABCAAAQhAwGcEMIA+63CaCwEIQAACEIAABDCAaAACEIAABCAAAQj4jAAG0GcdTnMhAAEIQAACEIAABhANQAACEIAABCAAAZ8RwAD6rMNpLgQgAAEIQAACEMAAogEIQAACEIAABCDgMwIYQJ91OM2FAAQgAAEIQAACGEA0AAEIQAACEIAABHxGAAPosw6nuRCAAAQgAAEIQAADiAYgAAEIQAACEICAzwhgAH3W4TQXAhCAAAQgAAEIYADRAAQgAAEIQAACEPAZAQygzzqc5kIAAhCAAAQgAAEMIBqAAAQgAAEIQAACPiOAAfRZh9NcCEAAAhCAAAQggAFEAxCAAAQgAAEIQMBnBDCAPutwmgsBCEAAAhCAAAQwgGgAAhCAAAQgAAEI+IwABtBnHU5zIQABCEAAAhCAAAYQDUAAAhCAAAQgAAGfEcAA+qzDU7G5Dz30kH7zm9/o888/16677hqTJo4dO1bjxo1TKBSquF5TlBOTynKRpCTw7rvvatSoUVqyZIk2bdqk999/X3l5eUnZFqt0PO6PeJRRWwdEvg9+/PFH7bDDDs591FztcK44F0gpAhjAlOrO1GlM5Auycos6duyofffdV3/84x/161//ukmNGQYwdbQUTUv+9Kc/6aabbqrzj4idd97Z++NiwYIFFZcLBoPacccdddVVV3matMP+YPjzn/+so446SocddlidRZeWlmqPPfZQdna2Lr/8crVq1UrHHXectt9++2iqm5DnxMPUxKMMDGBCyotKNQEBDGATQOWS7gQiX/Q33nijunfv7iXW77//3htl+OCDDzR79mwdf/zxXkHl5eWyhNqiRQsFAgH3wiXVZgCbopyYVJaLOBM44YQT9MYbb+inn36qca01a9Z4oz4XXXSR7rrrrorPFy1apH79+mnZsmXeHyZ2fPzxx9p77731+OOP6/TTT6+zXh999JH22WcfTZkyRb/73e+c658IF4jH/ZEqBjAerBJBE9QhsQlgABO7f3xbu8gXvU2THXjggRUcLEHbqMtpp52mxx57rMn41GYAm6ywJLzwxo0b1bp16ySsee1V3mWXXbwRvtdff73GCfPmzdOvfvUr/fOf/9SIESMqPr/hhhv0yCOP6Isvvqj43bRp0zRs2DB9+umn2n333evkM3/+fB1xxBF64okndOqpp8aEY6r1SW1QUsUAxqTDuQgEHAlgAB0BEt40BOoygDYSuN122+nEE0/Uww8/7BVeW1KIGDhLxDa1N3PmTG8U8eSTT9bdd9/tTblFDpvWu+yyy7R06VJ16dLFm84rLCys9xnAhpRhZb322mu68sorvRGjbZVTF9FVq1bJpiqff/55rVu3zjMYV1xxhX77299WhDSkTtFczy4cuaaNvBrLF1980TNL9sxaNG3697//rQEDBujpp5/WSSedVKV5EcP01ltveaNp1Y8nn3zSM/tWjhmmyse9996rCy64wOu3Xr16af369R4f62vrv5ycHO2///6aMGGC+vTpU6dQjaVNvV5yySX6+9//XuO8v/71r9407dtvv62DDz644vNf/OIX6tu3r6cnO+wz+4Ol8mF1sOtXPs4999wK7UZ+b22zNtphXK+99lq9+eabsmnmX/7yl7r55pu9siLHtvqkroZ++eWXHou5c+fqq6++8u4B65eJEyfW++xsNGyr34cN0WK090ddBjBaLW/r3jJDb9q2Ed+ddtpJgwYN0qRJk5SVlVVxD9T3fRItY9fvrKb51uWqfiOAAfRbjydJeyNfkK+++qqXxM28/fDDD7rzzju9abM5c+Zo4MCBXmu29WV6wAEHeFPIRx99tBYvXqz77rvPM3iWCO0w82AJ1p4vHDlypMrKyrxpPhtl/O9//7vNRSCRBFdfGZGkbgYnNzfXMy02BWTGwcq1RQCVF5vU1kU2/W0joTbFbaNQFmfJ6tlnn5UZlD/84Q9eWLR1ivZ6la/Zs2dP77m1Y445xquvtSeaNtm5NsJmBskMXeXDnnuzadMVK1bUqszNmzerU6dOOvvssyuMVuREMy+mCTPUdtjIm13/4osvltXVErmZ+zPOOMP7rK4jMhpn2jjvvPNqnGaG7dFHH/UMZuQPh++++84zCfYogrXBjqeeesrjv2XLFpmZsMP+WIk8qhC58MKFC/Xcc8/plltu0aWXXqqDDjrI05vp2Uy26bFdu3a68MILlZmZKTO63377rTc6aZ9tq08spq7D2JiBHzJkiOyZRhu5nDx5slfW8uXLq/xRVP0a0bCtywDG8v6o7V5viJZrY2NsrQ/MqP/+97/3pvDNUBov+8PE+jDa+ypaxi7fWUnyFU41k4AABjAJOsmPVaxtEYhxsOf8LCGec845FVi29WVqo2P3339/xbk2AmgJf/Xq1d7vbETKzKSZkG7dunm/+/DDD7Xffvt5Jm1bq4AjSaG+Muya9oyZjbzYCIIZBzvM9NhzYGY66zOA9pzYCy+84BnWDh06VLRn6NChnhG0Ea+WLVtWJKr66hTt9SqbDSvLRuwiR0PaZCNad9xxh/ccp42K2WErKo3Fdddd59W7ruPMM8/02FmiTk9P904zA2ajqBZno352WKIePnx4lef0orl37I8KM2LVHzeIxJqBMSNqz+1FjgceeMAzmmYyjXvkMKNrxvTBBx/cZtE22mcLRapPAZserZ9Ng7vttpt3DevbvfbaS1aPyBR1RHvV+2RbhVobKtfVzo08x2hT2WeddVad4dGwrcsA1qfFhtwftd3rDdFybQ2075KpU6d6I7yVHzexc+2+tD+6or3Xo2Xs8p0VjaY5BwLREMAARkOJc+JOIPIFaaNke+65p1e+mQf7orZRQXvI3sycHdv6Mn3nnXe8v+4jR2Q6r6ioyHuGrW3btt6IyPTp06u00UZ1LBFHYwC3VYaNrpiRtHIsuVd/btFMlI0ibcsA2mft27f3FhXYVGDlw0aSbAscG+k69NBDKxLVtupkdYn2elZWJPmZ+Tj88MO94hvapsiih8qjbDbSatOu9T0vN2vWLG/K3/rdnsWzIxJrxj2iD5uWtpFROz9isqMRrhkI09CGDRu8VbmVD1tc1KZNG6/vZsyYUfGRPbdnyd6m4yOHacqMkhlde6RgW0dtBtCYml5sxND0XfmwUWMb+bZnYO2c2vokmrZGzrF2/fzzz57ubFTXRjnt3qjriIZtXQYwlvdH9TIacm/U1jabYrfpfzPj9uhAXUeEd31tqa6duhg39jvL+p4DArEigAGMFUmuE1MCdT0DaF/YNhJio0c2hWXP52zry9RGimx6LXJEzrVYG020KVkbQbLVxpUPe+bLEmI0BnBbZdiIkI3gmCGxaUHbW7C+cqqDtGnOym2oDXTk+bpIotpWnWwUKNrrWVmRa9pzY127dvWKb0ybbArYzJQtqrAj8syfTYlu67ApVauvGWBbiGGHbbFihs2el4sc//rXv7yR4ZKSEtnzeccee6w3dRwZSaurDKuXXcumQasfNuLau3dvb7r2mmuu8T4282SrgsePH+9N00YOW0VsBrmyUa2rzNoMoPVZXXq0Z9Fsmj+y4ri2PqnvBjTDanW20Umb4qysbfsjwkY16zqiYVuXAYzl/VG9jIbcG7W1zf6o7Ny5szcKbdPjdR3R3Fd2r0fLuLHfWVYGBwRiRQADGCuSXCemBOoygFaIJUJLiJFkuK0v0+obt1Y+10Z7YmEAt1WGjZw0xixVhhkxBja9WXnqu/I5ZlLsWbm6Nqytrd3RXM/KqO2ajWmTjdrZxsf2oLyZOlvEYr+z7VXqO2yEykbbrFxL2mZEzZRdffXVVULt82eeeUYvv/yyXnnlFW8RhZnjyvtGVi/LTKk912jP8FU/IgtNbArapnbtiCxqqb7xuI1W27RwNJsFx8oARlNWpE020mnmz+4fM982FW/Tm/n5+d6oo2lkW0d9bOsygLG8P6qX0ZB7IxYGsL62RMu4sd9Zsdrovr77jc/9QQAD6I9+TrpWbssAWpK1ZGvPL9lD8Y39MjUTEYsp4PqSgk3tmcmwKevGTAFbvE1TWZKu/AxebZ0ajQG0dkd7vboMYGPaZM9d2kioTWPbSImNuNhzfdG8WcGec7QRPXte056PsynWzz77zFvgU9dho0O2+rf6Bs6Vz7fnL22hxSmnnFJjgYqdZ1ODtkjHzI+NGNthK7mtPrZgo/Jx/vnne9P51qb6joZOAdsCJRv9rD4F3BADaNPTpsHKI33FxcWeNu2PgfoMYOU21ca2sQawIVqqXkZD7o3a+qShU8D13evRMm7sdxYGsL47i88bQgAD2BBanBs3AnUZQJt+s013bRTJvoztmRiXL9NYLAKpLykYtMGDB3tTn41dBGJTdGb+3nvvPW/Lk8qHlW/PvtVl1uz31RlFe71tXbMxbbLnLW363YyHLWywVczRHNbvNlVn8WYALXHbQ/uRw4yATeNGFphEfm/TuzbVWX17lspl2uIfmzb+5JNPPD1FDhstswUM1R8RsBXGZsZvu+22KlW3UUZbFGLPidV3bGsRiJlLe2YykuxtxNOec7TXxFVfBNIQA2iLh+yZ08oLVGwLGFsVbyPLdRnAaNk21gA25P6o7V5viJZr65eGLAKp716PlrHLd1Z92uJzCERLAAMYLSnOiyuByBdk5E0gVriNOkRMkE392fNMtZmbhhgh2+rFRhFt+tSe57IRIVsV2pBtYOpLClYfM26HHHKINwJmozmWVG3608otKCiodxWwmQCrp5Vl28CYCVm7dq23tY09c2Y/N6Td0V5vW9dsTJtsmjWy8XF9b8uoLjhrty3EsA2Pb7/9dm9vvshhW3jY1iZ2bds2yEa1jIs9u/aXv/ylyrnVrxuZurXFELaq1kYEbQ8+G220/fns/yOLQ2za154prG1fQtOPrTi3V8FZP9sKb3sWsbajLgMY2QbGRpLsehkZGd6qd3tmr7ZtYBpiAM3o2Ah0ZJsce/bSGNlo7LamgKNl62IAo9VSbcapIVqurS+Mra3+tQUbtg2M9ZuN+NoKbVtcVXkbmPru9WgZYwDjmk4orA4CGECkkZAEIl+QlStnSdj26LKpNvsv8to31y9T2xbGzIQ98G8moqEbQdeXFCJtsBFAmz60JG/TsLaowEazzIBYEq7vMANshthGzezZJxttsNFQ2+cu8oaKaKaAIyNL0VxvWwbQPmtom2ykzUbybATP2lB91e22GJhZsb3yrN9tQYr1VeSw615//fXes382NWzXt2cMTSdmuOs77DlBGw2zhSA22mg6MzNoz8uZIYwc1le2YMCms82cVT5s6tdGDM082mikbSptq5wbYgDtXFvYYtqovhF05Y2y6+rnbbXTjJzp3KapbQTWVo3bs7T2/OORRx5Z5whgtGxdDGC0WqrtXrfYaLVcFx/Tk4302uirGUHbYshGdG1Fd+WNoOu716Nl7PqdVZ+e+RwC0RDAAEZDiXMg0EQEbHsTM4Q2NZwqx7baZCOsNjpm08eV92dMlrbbc4g2umgjixxNTyAV74+mp0YJEIiOAAYwOk6cBQFnAtU3iTXTZyN4Nm1ke7wl49HQNm3r1W7J0H577s+2oKnttXXJUP9ErmNDtZTIbaFuEEgGAhjAZOgl6pgSBGzLGdvOxJ4hs0Us9hou2w7Fpvzs+bNkPKJtky3YsOct7fk4W/Vrzy5yQKAygWi1BDUIQCA2BDCAseHIVSBQLwFbrWh7yNmzb7aliI0i2V52tlVJsh7RtsmMr73FxVay2vNP1VcyJ2v7qXfsCESrpdiVyJUg4G8CGEB/9z+thwAEIAABCEDAhwQwgD7sdJoMAQhAAAIQgIC/CWAA/d3/tB4CEIAABCAAAR8SwAD6sNNpMgQgAAEIQAAC/iaAAXTof9ts1jZ/tffJRjYldrgcoRCAAAQgAAEIxIGAvSJy/fr13r6kaWlpcSgx8YrAADr0yTfffOO90YEDAhCAAAQgAIHkI/D1119XeatQ8rWg8TXGADaenYqKirz3RJqAKr9E3uGShEIAAhCAAAQg0MQE7JV/NoBjr+/Lyclp4tIS8/IYQId+MQGZcMwIYgAdQBIKAQhAAAIQiCMB8reEAXQQHAJygEcoBCAAAQhAoJkIkL8xgE7SQ0BO+AiGAAQgAAEINAsB8jcG0El4CMgJH8EQgAAEIACBZiFA/sYAOgkPATnhIxgCEIAABCDQLATI3xhAJ+EhICd8BEMAAhCAAASahQD5GwPoJDwE5ISPYAhAAAIQgECzECB/YwCdhIeAnPARDAEIQAACEGgWAuRvDKCT8BCQEz6CIQABCEAAAs1CgPyNAXQSHgJywkcwBCAAAQhAoFYC5cGQ3vl8rX5YX6xObbN1cPf2Sk8LxIwW+dvnBnDs2LEaN25cFUHttdde+uijj6ISGQKKChMnQQACEIAABKImMGdZocbNXq7CouKKmNycbI0Z3FODeuVGfZ1tnUj+xgDqySef1Kuvvlqhk4yMDO2www5RCQwBRYWJkyAAAQhAAAJRETDzN3LqYoWqnR0Z+5s8vE9MTCD5GwOomTNnqqCgICphVj8JATUKG0EQgAAEIACBGgRs2rf/hHlVRv4qn2QmsHNOthaMHuA8HUz+xgBq4sSJysnJUXZ2tvr166fx48erW7dutd6aW7Zskf0XOUxAXbt2VVFRkdq1a8ftDAEIQAACEIBAIwksXLlGQ6csqojuoh+1SjYjV/XZv+kj+qpfjw6NLCUchgH0uQF88cUXtWHDBtlzf4WFhd7zgKtWrdKyZcvUtm3bGuKq7ZlBOwkD6HQfEgwBCEAAAhDQrIJVGjUjPCOXF1ihR7Ju1ePlR+rmsmFVTOCk/DwNyeviRAwD6HMDWF0969at0y677KI77rhD5513Xg1xMQLodL8RDAEIQAACEKiTQGQE8MDAR3owa6LaBjbr3eCeGl5yrbYoqyKOEcDYiCgQCoWqP2sZmysn6VUOOuggHX300d5UcH0Hf0HUR4jPIQABCEAAAtERsGcAfzv+Pv2j5Dq1DmzRW+U99bvSK7VJ2d4FeAYwOo7RnoUBrETKpoPt+T+b6r300kvrZYgBrBcRJ0AAAhCAAASiJvDyki+U/eRw7/zfl16uYrWoMH/2A6uAo0ZZ74m+NoBXXnmlBg8e7E37fvvttxozZoy3Inj58uXq2LFjvfAwgPUi4gQIQAACEIBAgwi8XPCZbn7hY335c7Aijn0AG4QwqpN9bQDz8/M1f/58rVmzxjN8/fv3180336wePXpEBQ8DGBUmToIABCAAAQjUTeDD2dKq96RfjZEC4RW/vAmk6QXjawPoihcD6EqQeAhAAAIQ8DWBZU9JT42QQuXSqQ9IvU6JCw7yN6uAnYSGgJzwEQwBCEAAAn4msGSGNHOkFApKvfOlE/8hpaXHhQj5GwPoJDQE5ISPYAhAAAIQ8CuBxY9Iz9piy5B0wFnS4ElxM3+GnPyNAXS69RCQEz6CIQABCEDAjwTemSK9cGW45QeeJx17u5SWFlcS5G8MoJPgEJATPoIhAAEIQMBvBFZ/Kt19cHjat++F0jG3VCz8iCcK8jcG0ElvCMgJH8EQgAAEIOBHAosfldaurLLqN94YyN8YQCfNISAnfARDAAIQgIAfCNgLx0o2SC3aJkxryd8YQCcxIiAnfARDAAIQgECKEaixf9+u2yv9tZukD5+Tzn1ealP/SxbigYT8jQF00hkCcsJHMAQgAAEIpBCBOcsKNW72chUWFf+vVSHd0vpxnVn+bPjfJ06W8s5MiBaTvzGATkJEQE74CIYABCAAgRQhYOZv5NTFtqmLdwQU1JiMR3Ruxsvev5fnXa+eJ16VMK0lf2MAncSIgJzwEQwBCEAAAilAwKZ9+0+YVzHyZ+bv5oz7dWbGvxUMBXR92W/17zbHacHoAUpPC7/qrbkP8jcG0EmDCMgJH8EQgAAEIJACBBauXKOhUxZ5LUlTULdl/lOnps9XeSigP5aer6eCh3ufTR/RV/16dEiIFpO/MYBOQkRATvgIhgAEIACBFCAwq2CVRs0o8FrSXj/rmawb1CWwWpeXXqhng4dUtHBSfp6G5HVJiBaTvzGATkJEQE74CIYABCAAgRQgUHkE0JrTRT9q77SvNDf4iyqtYwQwsTo7EArZBj0cjSGAAWwMNWIgAAEIQCCVCJRv2aRRt/9Tz6/fo2IRSOX22VN/nXOyeQYwwTodA+jQIRhAB3iEQgACEIBA8hMo2ShNz1fwizc1csulejl4UBUTGFnyMXl4Hw3qlZsw7SV/MwXsJEYE5ISPYAhAAAIQSGYCxT9Lj50mfb1Iymqrt/tN1h8Wtaq0D6CUm5OtMYN7JpT5M+Tkbwyg062HgJzwEQwBCEAAAslKYNNaaeop0reLpewcafjT0s4HqsabQLq3T5itXyqjJn9jAJ1uPQTkhI9gCEAAAhBIRgIbV0uPnCh9v1Rq2V46e6aUu39StYT8jQF0EiwCcsJHMAQgAAEIJBuBzeukB46RfvxIat1JOudZqdM+ydYKpoDtbS2sAm68bjGAjWdHJAQgAAEIJCEB2zjk+culT16Szn5W2mH3JGwEzwBap2EAHaSLAXSARygEIAABCCQngWBQ2vij1HbH5Kw/i0C8fsMAOsgXA+gAj1AIQAACEEgOAqtXSAvvlI69XUrPTI4611NL8jcG0EnICMgJH8EQgAAEIJDoBL5fLj0yRNr4g3ToKGngjYle46jqR/7GAEYllLpOQkBO+AiGAAQgAIFEJlC4JLzad/Naacf9wqt9W++QyDWOum7kbwxg1GKp7UQE5ISPYAhAAAIQSBACNfbvy/xM6Y+dIm0pknbqIw1/SmrVPkFq614N8jcG0ElFCMgJH8EQgAAEIJAABOYsK9S42csr3uBxcOBDPdhiolqrWOraVxr2hJTdLgFqGrsqkL8xgE5qQkBO+AiGAAQgAIFmJmDmb+TUxRXv722pYs1v8Qd1DPyst8p7auMpj2pgXnJu9bIttORvDKDTrYeAnPARDAEIQAACzUjApn37T5hX5d29Vp1+aR/o7PSXdVnpRdo+p50WjB6QkK9zc0FH/sYAuuiHncSd6BEMAQhAAALNSWDhyjUaOmWRV4VWKtYmZddanekj+qpfjw7NWdWYl40BxAA6iQoBOeEjGAIQgAAEmpHArIJVGjWjQCelvaFrM6fpzJLr9Glo5xo1mpSfpyF5XZqxprEvmvyNAXRSFQJywkcwBCAAAQg0IwEbAZz9wM26KeMBpQVCurfsOI0vG1ajRowANmMnNWHRvAnEAS4G0AEeoRCAAAQg0KwEgm/dpbSXr/Pq8FDZ/2lc2dkKKa2iTgFJnXOyeQawWXup6QrHADqwxQA6wCMUAhCAAASah0AoJM2/Xfr3TV75k8sG67ayfIVkli98RH6aPLyPBvXKbZ56NmGp5G+mgJ3khYCc8BEMAQhAAALxJmDmb+44acFfwyUfdb3mtB+mcc99WGU1cG5OtsYM7pmS5s+aTf7GADrdegjICR/BEIAABCAQbwJlW8Lv9v1qofR/N0uHXOzVoMabQLq3T7mtXyqjJn9jAJ1uPQTkhI9gCEAAAhBoDgLFP0sr50r7ntQcpSdEmeRvDKCTEBGQEz6CIQABCEAgHgTKS6WPX5B6DolHaUlRBvkbA+gkVATkhI9gCEAAAhBoagI25fvEb6SPn5cG/lk69NKmLjEprk/+xgA6CRUBOeEjGAIQgAAEmpJAySbp8WHSynlSegvp9EekvQY1ZYlJc23yNwbQSawIyAkfwRCAAAQg0FQEtqyXpp0hffmmlNlKGjpd2u3Ipiot6a5L/sYAOokWATnhIxgCEIAABJqCwOafpKmnSKvek1q0k4Y9IXXr2xQlJe01yd8YQCfxIiAnfARDAAIQgIADgVq3bgmWSvcNkL5bKrXcXjrrGWmnAxxKSc1Q8jcG0EnZCMgJH8EQgAAEINBIAnOWFWrc7OW1b968YWZ4o+ezZko79mxkCakdRv7GADopHAE54SMYAhCAAAQaQcDM38ipixWqFlvl9W09ssMjgBy1EiB/YwCdbg0E5ISPYAhAAAIQaCABm/btP2FelZG/7oFCXZvxmK4ovUDr1Uadc7K1YPSAlH6TRwOx1Tid/I0BdNIQAnLCRzAEIAABCDSQwMKVazR0yqKKqD0DX+uxrFvUMVCkp8r764rSC73Ppo/oq349OjTw6v45nfyNAXRSOwJywkcwBCAAAQg0kMCsglUaNaPAi+odWKmHsyZo+8AGfRDcRWeVXKO1aud9Nik/T0PyujTw6v45nfyNAXRSOwJywkcwBCAAAQg0kEBkBPDgwIe6P+t2tQ1s1uLg7jq35I/6WW0qrsYI4LbBkr8xgA289aqejoCc8BEMAQhAAAINJGDPAF45/naNL5mg7ECp3izfVyNKr9AmZXtXsoUgPANYP1TyNwawfpVs4wwE5ISPYAhAAAIQaCiBshJt+msftdr4teaWH6ALS0dpi7IqzJ/9MHl4Hw3qldvQK/vqfPI3BjxYKLQAACAASURBVNBJ8AjICR/BEIAABCDQGAKrP9VXL/xFZ35zkr75uaziCrk52RozuCfmLwqm5G8MYBQyqfsUBOSEj2AIQAACEIiWwE9fStvvUuXsWt8EkhbZDTDaC/vzPPI3BtBJ+QjICR/BEIAABCAQDYE37pBeGy8NnSHt/qtoIjinHgLkbwyg002CgJzwEQwBCEAAAtsiEApJc2+UFtwRPuuo66UjroJZDAiQvzGATjJCQE74CIYABCAAgboIBIPSnNHSO/8MnzHwRunQUfCKEQHyNwbQSUoIyAkfwRCAAAQgUBuB8jLp2UukJdPCG7scf4d04G9hFUMC5G8MoJOcEJATPoIhAAEIQKA6gbIS6anzpA+flQLp0omTpf3PgFOMCZC/MYAVkrr11lt1zTXXaNSoUfrb3/4WldQQUFSYOAkCEIAABKIlYFO/M0dKHzwtnfqAtM/gaCM5rwEEyN8YQE8u7777rk4//XS1a9dORx11FAawATcRp0IAAhCAQIwJ2BTw90ulnQ6I8YW5XIQABhADqA0bNqhPnz76xz/+oZtuukl5eXkYQL4jIAABCECgyQjU2L9vRyn93XulI0ZLaelNVi4X3koAA4gB1DnnnKP27dvrr3/9q4488kgMIN8QEIAABCDQZATmLCvUuNnLVVhU7JXRUT9pRssJ6hH6Sup3sXTMzU1WNhfGAFbWQCAUso2G/HnMmDFDN998szcFnJ2dXa8B3LJli+y/ykPIXbt2VVFRkTd9zAEBCEAAAhCoi4CZv5FTFyuSdLvoR03NukXd077X96Ht9MkxU3XYIYcBMA4EGAH08Qjg119/rQMPPFCvvPKKevfu7cmtvhHAsWPHaty4cTWkiQGMw91KERCAAASSmIBN+/afMK9i5K97oNAzf10Ca/R1sKOGlV6r0na7aMHoAUrndW5N3tMYQB8bwJkzZ+qkk05SevrW5y3Ky8sVCASUlpbmjfRV/szUyAhgk9+TFAABCEAgJQksXLlGQ6cs8tq2d+ArPZo1Xh0DRVoR3EnDSq7V92rvfTZ9RF/169EhJRkkUqMwgD42gOvXr9eXX35ZRY+/+c1vtPfee2v06NHq1atXvVpFQPUi4gQIQAACEJA0q2CVRs0oUAuVaH6LP2jHwDp9ENxFZ5dcrTXKqWA0KT9PQ/K6wKyJCZC/fWwAa9NWfVPA1WMQUBPfoVweAhCAQIoQqDwCOCBtsUakv6DzSy/Tz2pdpYWMAManw8nfGMAqSsMAxufGoxQIQAACfiNQvmWj+t+xSN8VFf9vEYgtBQlUYLCfOudk8wxgnISBAcQAOkkNATnhIxgCEICAPwgUTJPm3aTXD3lQ585c7bW58vYbERs4eXgfDeqV6w8mzdxK8jcG0EmCCMgJH8EQgAAEUp/AonukOaPD7ex/ueZ0/n2VfQDt17k52RozuCfmL45qIH9jAJ3khoCc8BEMAQhAIHUJ2Ba7r98mvXZLuI19L5L+7yYpLU013gTSvT1bv8RZCeRvDKCT5BCQEz6CIQABCKQmATN/L10nLbo73L6jrpMOv0oKbH3mLzUbnjytIn9jAJ3UioCc8BEMAQhAIPUIBMul2ZdK708Nt23QBKnvBanXziRvEfkbA+gkYQTkhI9gCEAAAqlHYMsG6eHjpcIl0pB/SHlDU6+NKdAi8jcG0EnGCMgJH8EQgAAEUpPAxjXSt4ulPQamZvtSoFXkbwygk4wRkBM+giEAAQikBoHN66RPX5Z6n54a7fFBK8jfGEAnmSMgJ3wEQwACEEh+Aht+kB49Wfp+qTT479Ivzkn+NvmgBeRvDKCTzBGQEz6CIQABCCQ3gXVfS48MkdaulFp3ks56Rupc/3vkk7vRqVF78jcG0EnJCMgJH8EQgAAEkoZAjb372q5R+tSTpJ+/kXK6SWfPlDr0SJr2+L2i5G8MoNM9gICc8BEMAQhAICkIzFlWWOXtHfsGvtCjLW5Ve/0s7bCndNZMKadLUrSFSoYJkL8xgE73AgJywkcwBCAAgYQnYOZv5NTFFe/u3UFFmtfiCrULbNLS4K76Ycg0/eoX+yZ8O6hgVQLkbwyg0z2BgJzwEQwBCEAgoQnYtG//CfNUWFRcpZ4Xpc/U4en/1YiSK9U6p70WjB7Aq9wSuidrVo78jQF0kiwCcsJHMAQgAIGEJrBw5RoNnbLIq2Oaggoq7X/1DSlT5SpVhvfv6SP6ql+PDgndFirHCGB1DQRCIXtpIUdjCGAAG0ONGAhAAALJQWBWwSqNmlGgM9Pn6pT0+Tqr5BptUnaNyk/Kz9OQPJ4BTI5eDdeS/M0IoJNeEZATPoIhAAEIJDSBhStW640Hr9UfMx/36nlD6Tl6pPyYGnVmBDChu7HWypG/MYBOqkVATvgIhgAEIJC4BEIhBV+6XmmL7vLqeGfZifpL2WmSAhV1tp8652TzDGDi9mKdNSN/YwCdZIuAnPARDAEIQCAxCZSXSbMvlQoe8+r359LheqD82IqVwPa7iA2cPLyPBvXKTcx2UCsM4DY0wDOADjcIBtABHqEQgAAEEpFAabH05G+lj5+XAunSkLs0J+OoKvsAWrVzc7I1ZnBPzF8i9mEUdSJ/MwIYhUzqPgUBOeEjGAIQgEDiEfjpS+m+o6XiIum0B6W9j/PqWONNIN3bs/VL4vVe1DUif2MAoxZLbSciICd8BEMAAhBITALfLZU2r5O6H5aY9aNWzgTI3xhAJxEhICd8BEMAAhBIDALrvpbWrpR2OzIx6kMtmpwA+RsD6CQyBOSEj2AIQAACzU/gx0+kR0+UNq2Vzp4ldftl89eJGjQ5AfI3BtBJZAjICR/BEIAABJqXwKrF0mOnSpvWSDvsKZ31jJSzc/PWidLjQoD8jQF0EhoCcsJHMAQgAIHmI/D5fGn6UKlkg7TTAdKwp6TWvM6t+TokviWTvzGATopDQE74CIYABCDQPAQ+fC681Uv5FmnXw6Sh06UWbZunLpTaLATI3xhAJ+EhICd8BEMAAhCIP4EvF0oPHSuFgtLex0un3C9l1ny/b/wrRonxJED+xgA66Q0BOeEjGAIQgECTEqh1775QufTEOVL2dtLgSVJ6RpPWgYsnJgHyNwbQSZkIyAkfwRCAAASajMCcZYWV3t4RUppC2jGnVfjtHXt3kNIzpcDW9/o2WUW4cEISIH9jAJ2EiYCc8BEMAQhAoEkImPkbOXWx9+7eNAX154wHlakyjS77vfcWX97f2yTYk+qi5G8MoJNgEZATPoIhAAEIxJyATfv2nzBPhUXFylKp7sicrOPTFykYCujUkjF6P7SnOudka8HoAbzKLeb0k+eC5G8MoJNaEZATPoIhAAEIxJzAwpVrNHTKIrXWZt2T+Vcdlr5MJaF0/aH0Ir0Q7FtR3vQRfdWvB9u+xLwDkuSC5G8MoJNUEZATPoIhAAEIxJzArIJVGjdjvh7Muk37p32mjaEWuqD0Mr0R7F2lrEn5eRqS1yXm5XPB5CBA/sYAOikVATnhIxgCEIBAzAksXrJEOU+doR5phVobaqPflPxRS0K71yiHEcCYo0+qC5K/MYBOgkVATvgIhgAEIBBzAuUrXlNw6in6IbSdziq5Wp+FdqpShq375RnAmGNPuguSvzGATqJFQE74CIYABCDQJATee/kxXTQvqO/V3lsJHDkim76wCrhJsCfVRcnfGEAnwSIgJ3wEQwACEIgNgU9eltp3l3bYo+J6VfcBDP86Nyc7vA9gr9zYlMtVkpYA+RsD6CReBOSEj2AIQAAC7gQKpkmzLpbadZFGzJXadKq4Zq1vAklj82d36Ml/BfI3BtBJxQjICR/BEIAABNwIvDlJeuWG8DX2HyqdcGf4DR8cEKiHAPkbA+h0kyAgJ3wEQwACEGgcgVBIeuVP0lt3huMPuUQ6+kYpLa1x1yPKdwTI3xhAJ9EjICd8BEMAAhBoOIHyUunZS6Ul08KxA2+UDh3V8OsQ4WsC5G8MoNMNgICc8BEMAQhAoOEE5t4ovfEXKZAenvI9YFjDr0GE7wmQvzGATjcBAnLCRzAEIACBhhPYtFaaerJ0xGhpr183PJ4ICEgif2MAnW4EBOSEj2AIQAAC0RHYskFq0WbrucEgz/tFR46z6iBA/sYAOt0cCMgJH8EQgAAEqhCodduWtSukR0+WDr1UOngExCAQEwLkbwygk5AQkBM+giEAAQhUEKht4+YBbb/WPYFblVXyk9RhD+mCBVJmNtQg4EyA/I0BdBIRAnLCRzAEIAABj4CZv5FTF1d5bVv/tKW6N/MOtQ5sUdH2+yrnvFlSm44Qg0BMCJC/MYBOQkJATvgIhgAEICCb9u0/YZ4Ki4oraByftlB3ZP5DWYFyLSjvpTEtr9HLVx+ndN7igWJiRID8jQF0khICcsJHMAQgAAEtXLlGQ6csqiBxdvpLGpvxiNICIc0u76srSkeqRJmaPqKv+vXoADEIxIQA+RsD6CQkBOSEj2AIQAACmlWwSqNmFFSQ+H36bF2bOV0Plw3UuLJzFFT47R6T8vM0JK8LxCAQEwLkbwygk5AQkBM+giEAAQjUGAGUQjosbaneCO4nKVBBiBFAxBJLAuRvDKCTnhCQEz6CIQABCKi8eIOemHi+bt54otarVQ0iZgE752RrwegBPAOIXmJGgPyNAXQSEwJywkcwBCDgdwIbV0uPnSZ9u1ivlvfRiNIrq6wEjoz/TR7eR4N65fqdFu2PIQHyNwbQSU4IyAkfwRCAgJ8JrP1cmnqKtHal1LK9Fvb9hy5/K6vKauDcnGyNGdwT8+dnnTRR28nfGEAnaSEgJ3wEQwACfiVQuESaeqq08Qcpp5t01tPSDnt4W8K88/la/bC+WJ3aZuvg7u2Z9vWrRpq43eRvDKCTxBCQEz6CIQABPxJY+W/p8bOkkvXSjvtJw56Q2jG960cpNGebyd8YQCf9ISAnfARDAAJ+I1BWIt11oLTuS2nXw6T8x6TsHL9RoL0JQID8jQF0kiECcsJHMAQg4EcC338gvX2PdOztUkYLPxKgzQlAgPztcwM4efJk2X9ffPGFJ8d9991XN9xwg379619HJU8EFBUmToIABPxMIBiUfvhA6mz7+nFAIDEIkL99bgBnz56t9PR07bHHHgqFQnr44Yc1ceJEvf/++54ZrO9AQPUR4nMIQMDXBGzKd9aF0vJnpbOekXY91Nc4aHziECB/+9wA1ibF9u3beybwvPPOq1epCKheRJwAAQj4lcCW9dLjw6XPXpPSMqQT75F6n+ZXGrQ7wQiQvzGAFZIsLy/XE088oXPOOccbAezZs2e9ckVA9SLiBAhAwI8ENvwgPXaqZNu9ZLaWznhE2v1oP5KgzQlKgPyNAdTSpUvVr18/FRcXq02bNpo2bZqOPfbYWiW7ZcsW2X+RwwTUtWtXFRUVqV27dgkqc6oFAQhAoOkI1Ni7r91PSp92ivTTF1KrHcLbvHTp03QV4MoQaAQBDCAGUCUlJfrqq688E/fkk0/qvvvu0+uvv17rCODYsWM1bty4GlLDADbi7iMEAhBIegJzlhVq3OzlFW/v2Dnwg55tcYPa62dp+12l4U9LHXokfTtpQOoRwABiAGuo+uijj1aPHj1077331viMEcDU+xKgRRCAQOMImPkbOXVxtXf3BnVn5l3qFvheq094VAMOZOVv4+gS1dQEMIAYwBoaGzBggLp166aHHnqoXv0hoHoRcQIEIJCCBGzat/+EeZXe2xuSFPBamqVSZalMbXO214LRA3iVWwr2fyo0ifztcwN4zTXXeHv+meFbv3699/zfhAkT9NJLL2ngwIH1ahwB1YuIEyAAgRQksHDlGg2dskhSSBemz9Kead/ostILFVJaldZOH9FX/Xp0SEECNCnZCZC/fW4AbauXuXPnqrCwUDk5Oerdu7dGjx4dlfkz8SOgZP8KoP4QgEBjCMwqWKXLZ7ynGzMe0rCMud4lfltypeYFqy72mJSfpyF5XRpTBDEQaFIC5G+fG0BXdSEgV4LEQwACyUjg7Y++1vrHztLR6e8rGApoXNnZerj8mBpNYQQwGXvXH3Umf2MAnZSOgJzwEQwBCCQjgQ0/KDTtDAW+XaziUKZGlV6sl4IHVWmJPQ3YOSebZwCTsX99UmfyNwbQSeoIyAkfwRCAQLIRWL1Ceiy8x19J1nbKX/8HvR/as9pK4HCjJg/vo0G9cpOthdTXJwTI3xhAJ6kjICd8BEMAAslG4Is3pUdPlNrtJA17SnO+a11lH0BrTm5OtsYM7on5S7a+9Vl9yd8YQCfJIyAnfARDAALJSODTV6Xc3lKbTl7ta7wJpHt7tn5Jxn71WZ3J3xhAJ8kjICd8BEMAAslA4N37pG6HSDvW/370ZGgOdYSAESB/YwCd7gQE5ISPYAhAIJEJBIPSqzdIb90ptesijXxTarl9IteYukEgagLkbwxg1GKp7UQE5ISPYAhAIFEJlBZLM0dKHzwdruGvxkj9L5MC4bd9cEAg2QmQvzGAThpGQE74CIYABBKRwOafpBnDpC/flNIypSF3S/ufkYg1pU4QaDQB8jcGsNHisUAE5ISPYAhAINEIrPtKmnqqtPpjqUU76YxHpd2OTLRaUh8IOBMgf2MAnUSEgJzwEQwBCCQagSfPk5Y9KbXdSRr+pLTjvolWQ+oDgZgQIH9jAJ2EhICc8BEMAQgkGoHiIum5y6SBf5ZyeIdvonUP9YkdAfI3BtBJTQjICR/BEIBAMxCosW9f1udK73pgM9SEIiHQfATI3xhAJ/UhICd8BEMAAnEmMGdZYaU3d4Q0Kv1pXZb5lD7sfbX2OfmaONeG4iDQfATI3xhAJ/UhICd8BEMAAnEkYOZv5NTF3nt7M1SmmzMe0BkZr3k1uLtsiHrkT+D1bXHsD4pqXgLkbwygkwIRkBM+giEAgTgRsGnf/hPmqbCoWK21WXdn/l1Hpi9ReSigG8p+o2nlR6tzTrYWjB7Aa9zi1CcU07wEyN8YQCcFIiAnfARDAAJxIrBw5RoNnbJIO2qtHsiaqH3TvtSmUAtdUnqx5gZ/UVGL6SP6ql+PDnGqFcVAoPkIkL8xgE7qQ0BO+AiGAATiRGBWwSqNnvG2Xm1xlXYOrNaPoXb6XcmVWhLavUoNJuXnaUgeq3/j1C0U04wEyN8YQCf5ISAnfARDAAJxIhAZATw3fY6Gpc/Vb0r/qG9CHWuUzghgnDqEYpqdAPkbA+gkQgTkhI9gCEAgHgS2bFB5ZmvvGcDviorVQltk/1v5sDf88gxgPDqDMhKFAPk7iQ3gJ598ookTJ2rNmjXq3bu3LrnkEnXoEN9nVxBQotzK1AMCEKhBIBiUXvmT9Okr0nkva87Kzd4qYDtsJXDkMPNnx+ThfVgFjIx8Q4D8ncQGsFevXho1apTy8vK0ePFi3X///br11ls1YMCAuAkYAcUNNQVBAAINIVCySXp6hPTRc+Gok++Tep+mqvsAhj/KzcnWmME9MX8N4cu5SU+A/J3EBvDAAw/Uf/7znwoR/vDDDxo4cKCWLFkSN2EioLihpiAIQCBaAht+kKbnS6vek9KzpBMnS/udWhFd400g3duz9Uu0bDkvZQiQv5PQAF566aXeqN+HH36oXXbZRRdffLEnyPLycpkpfP/99+MmUAQUN9QUBAEIREPgh4+kaadJ676SWm4v5U+TdjkkmkjOgYCvCJC/k9AAvvDCC/rvf/9b8d/mzZu1zz77aOXKlTr++OO95wLjdSCgeJGmHAhAoF4CX78jTT1V2lIktd9NOvMJaYeq27zUew1OgIBPCJC/k8AAnnvuufrHP/6hVq1a1SrLkpISLV++vMIQ3n777XGTLwKKG2oKggAE6iOw/jvpvqOldl3CI3+t47sorr7q8TkEEokA+TsJDGB6eroKCwvVqVMnTzsjR47U+PHjtd1221VoqaysTBkZGXHXFgKKO3IKhAAEKhMIhaRAZB2vpLWfS21zpcxsOEEAAtsgQP5OAgOYlpam7777rsIAtmvXTgUFBdptt928rv3+++/VvXt3bdq0Ke5iR0BxR06BEIBAhEDZFmnWxdIeA6Xep8MFAhBoAAHydxIawLZt23orfSsbwNzcXAVtz6s4HwgozsApDgIQCBPYtFaaMUz66i0ps7X0h6VM+aINCDSAAPk7RQzgTjvt5K0CjveBgOJNnPIg4C8CtW7Z8tNn0mOnSWtXSi3aSac/IvU4yl9gaC0EHAmQv5PEAN5xxx06/PDDtd9++6l9+/Y1RgAxgI53AuEQgEDCEaht0+Zj2n6uOwMTlVWyTsrpKg17Quq0T8LVnQpBINEJYACTwAAeccQR3jN/69evV2ZmpmzBx5lnnqlDDz3U2w+wY8eO2nPPPRkBTPS7jfpBAAJREzDzZ69tq/zKtuPTFuovmfeoRaBURdv3Us5vn5ba7hj1NTkRAhDYSgADmAQGMNJdn376qd577z3vtW+R/9atW6fA/1bAMQXMrQ0BCKQCAZv27T9hngqLiqs058qMx3Vxxiy9XP4LjW95hV69+lje4JEKHU4bmoUABjCJDGBtCvn888+918HZ2z9uueWWuIsIAcUdOQVCIOUJLFy5RkOnLKrRzoCCOjHtTc0KHqqg0jR9RF/168FefykvCBrYJATI30luAJtEFQ24KAJqACxOhQAEoiIwq2CVRs0o0HZar1EZT+vWsqHaoqwasZPy8zQkr0tU1+QkCECgKgHyNwbQ6Z5AQE74CIYABGohYCOA19/3lO7PvF27pn2vGWVH6uqy39c4kxFA5AOBxhMgf2MAG68eSQjICR/BEIBALQTKV/xbm6aeqbbapK+DHXVe6ZX6JNS14kx770fnnGwtGD2AZwBREAQaSYD8jQFspHTCYQjICR/BEIBAdQLv3i+9cJUUKte7wT01suQyrVZOFfNn/5g8vI8G9cqFHwQg0EgC5G8MYCOlgwF0AkcwBCBQlUB5mfTyddLb94R/3ztfL/W4VmNfWFFlNXBuTrbGDO6J+UM/EHAkgAHEADpJCAE54SMYAhCIEChaJd17mLRpjTTgT9JhV0iBgGp9E0iaTQJzQAACLgTI3xhAF/0wBexEj2AIQKAKgS/fkjb+KPUcAhgIQKCJCWAAMYBOEkNATvgIhoC/CXy5UCrZKO1xtL850HoINAMB8jcG0El2CMgJH8EQ8C+BgunS7Eul9BbSiLlSx738y4KWQ6AZCJC/MYBOskNATvgIhoD/CASD0rw/SwvuCLd9n8HSSfdKWa39x4IWQ6AZCZC/MYBO8kNATvgIhoC/CNh07zPnSx/ODrfbFnocdb2UluYvDrQWAglAgPyNAXSSIQJywkcwBPxD4Odvpen5UuESKT1LOuFOaf98/7SflkIgwQiQvzGATpJEQE74CIaAfwi8OlZa8FepVQcpf5rUra9/2k5LIZCABMjfGEAnWSIgJ3wEQyClCGxzz77yUunF0dKhl0rb75pS7aYxEEhGAuRvDKCTbhGQEz6CIZAyBOYsK9S42csrvbUjpHPavKNDThihY3pvfY9vyjSYhkAgyQmQvzGAThJGQE74CIZAShAw8zdy6mKF/teaFirR+Mz7dHL6Aj1SNlCd8u/k1W0p0dM0IpUIkL8xgE56RkBO+AiGQNITsGnf/hPmVYz8dVCR7s36qw5M+0RloTSNKTtX89ocrwWjByidV7glfX/TgNQhQP7GADqpGQE54SMYAklPYOHKNRo6ZZHXjn0CX2pK1l+0c2C1ikKtdGHpKL0Z3M/7bPqIvurXo0PSt5cGQCBVCJC/MYBOWkZATvgIhkDSE5hVsEqjZhTo12lv6y+Z96hVYIs+D+6o80qv0mehnSraNyk/T0PyuiR9e2kABFKFAPkbA+ikZQTkhI9gCCQ9ARsBvHDKy5rf4jK1DWzW/PL9dHHpJfpZbaq0jRHApO9qGpBiBMjfGEAnSSMgJ3wEQyDpCUSeAdxv/QIdlPaRbi0bqnKlV7QrIKlzTjbPACZ9T9OAVCNA/sYAOmkaATnhIxgCyUtg7WfSxjVS14MUWQVsjYmsBLafzfzZMXl4H1YBJ29PU/MUJUD+xgA6SRsBOeEjGALJSWDlv6UnzpXSMqTf/1varptnAqvuAyjl5mRrzOCemL/k7GVqneIEyN8YQCeJIyAnfARDILkIhELS2/dIL10nhcqlLgdKZ0yV2uV67djmm0CSq6XUFgIpT4D8jQF0EjkCcsJHMASSh0DZFum5y6WCqeE673+mdPxfpczs5GkDNYUABCoIkL99bgDHjx+vp59+Wh999JFatmypQw45RBMmTNBee+0V1W2CgKLCxEkQSG4C67+THh8uffOuFEiT/u9mqe9IKRB5yi+5m0ftIeBHAuRvnxvAQYMGKT8/XwcddJDKysp07bXXatmyZVq+fLlat25d7z2BgOpFxAkQSH4CL1wlvfNPKTtHOvVBafdfJX+baAEEfE6A/O1zA1hd/z/++KM6deqk119/XYcffni9twcCqhcRJ0Ag+QmUbJKevUQ66lqpQ4/kbw8tgAAERP7GAFa5DVasWKE99thDS5cuVa9evWrcIlu2bJH9FzlMQF27dlVRUZHatWvHLQUBCKQCgWC59N9/Sb3PkNLSUqFFtAECEKhGAAOIAayQRDAY1AknnKB169ZpwYIFtd4sY8eO1bhx42p8hgHkuwUCKUJg80/Sk+dJK+dKR14rHTk6RRpGMyAAgcoEMIAYwAo9jBw5Ui+++KJn/nbeeeda7xRGAPkCgUAKE/jxE2l6vrR2pZTRUjrxH1Kvk1O4wTQNAv4lgAHEAHrqv/jiizVr1izNnz9f3bt3j/qOQEBRo+JECCQMgVr361vxivTUedKWn6WcrlL+NCm3d8LUmYpAAAKxJUD+9rkBDIVCuuSSS/TMM8/otdde857/a8iBgBpCi3Mh0PwEar6xI6SrWr+oC8sfU8Be5NbtEOn0R6Q2HZu/stQAAhBoMgLkb58bwAsvvFDTpk3zRv8q7/2X3ZETRQAAIABJREFUk5Pj7QtY34GA6iPE5xBIHAKRd/ZWfl/vboFv9WLW1WoRKNNXu52hbmfeJWVkJU6lqQkEINAkBMjfPjeAgTo2cn3wwQd17rnn1is6BFQvIk6AQEIQsGnf/hPmqbCouEZ9Tk1/Xdkq0dw2g7Vg9AClp7HBc0J0GpWAQBMSIH/73AC6agsBuRIkHgLxIbBw5RoNnbLIK6xf2gf6OdRaH4R2rVH49BF91a9Hh/hUilIgAIFmI0D+xgA6iQ8BOeEjGAJxIzCrYJVGzXhfI9Kf19UZ0/VtaAcNLrlJ69S2Sh0m5edpSF6XuNWLgiAAgeYhQP7GADopDwE54SMYAnEj8PZHX+rHx0bo+PS3vTKfKDtc15f9VltU9Xk/RgDj1iUUBIFmJUD+xgA6CRABOeEjGALxIbD6U4VmDFNg9ccqCaVrXNk5eqzc3ue79Vk/+6lzTjbPAManRygFAs1OgPyNAXQSIQJywkcwBJqewIezpWdGSiXrVdxyRw1dd6EKQnvYhi8VR8QGTh7eR4N65TZ9nSgBAhBodgLkbwygkwgRkBM+giHQtARCIWna6dKnL0u79JdOe1BzvijXuNnLq6wGzs3J1pjBPTF/TdsbXB0CCUWA/I0BdBIkAnLCRzAEmp7AprXSu/dL/S+T0jO88mp9EwhbvzR9X1ACBBKIAPkbA+gkRwTkhI9gCMSewKrFkk37/uoGqY59PmNfKFeEAASSjQD5GwPopFkE5ISPYAjElsDiR6Tnr5TKt0gn3Svtnx/b63M1CEAgZQiQvzGATmJGQE74CIZAbAiUbZFeuEpa/HD4ensdJ500WcrOic31uQoEIJByBMjfGEAnUSMgJ3wEQ8CdQNE30uNnSd8uDm/rMuB6qf/lUlqa+7W5AgQgkLIEyN8YQCdxIyAnfARDwI3A5/OlJ86VNq2RWm4vnXKftPvRbtckGgIQ8AUB8jcG0EnoCMgJH8EQcCOwYq409RSp837SGVOl7Xdxux7REICAbwiQvzGATmJHQE74CIbANgnUul2L7dpceXXvx3Ok3Y6QMltCEwIQgEDUBMjfGMCoxVLbiQjICR/BEKiTwJxlhTU2bO7bdrUmt31A2w97QOrQA3oQgAAEGk2A/I0BbLR4LBABOeEjGAK1EjDzN3Lq4iqvaxuU9o5uz7xHbQLF+rHz4ep4wWzoQQACEGg0AfI3BrDR4sEAOqEjGAK1ErBp3/4T5lW8qi1d5boq41+6ICNs+BaW99SfW16p2VefrHTe3oGKIACBRhLAAGIAGymdcBgCcsJHMARqEFi4co2GTlnk/X4HFelvmXepf/oH3r//WXacJpTlq1zpmj6ir/r16ABBCEAAAo0iQP7GADZKOJEgBOSEj2AI1CAwq2CVRs0o0G6BbzUj6yZ1CqzTxlALjS79vZ4L9qs4f1J+nobkdYEgBCAAgUYRIH9jABslHAygEzaCIVAngcgIYKbK9ETWOLVSsS4sHaUVoZ2rxDACiIggAAEXAhhADKCLfpgCdqJHMASqEdi4WuVZ7dT/9jf0XVGxdtBP2qCW2qzsihNtF5jOOdlaMHoAzwAiIAhAoNEEMIAYwEaLxwIRkBM+giGwlcDnb0hPnSftP1Rzci/wVgHbEarEyMyfHZOH99GgXrnQgwAEINBoAuRvDGCjxYMBdEJHMATCBILl0ht3SK/dIoWCUqee0oh5mvPxuhr7AObmZGvM4J6YP7QDAQg4E8AAYgCdRISAnPAR7HcCG36Qnh4hffZamETecOnY26Ss1t4/a30TCFu/+F01tB8CMSFA/sYAOgkJATnhI9jPBCJTvhu+lzJbScfdIeUN9TMR2g4BCMSRAPkbA+gkNwTkhI9gvxLYvE76237Slp+ljntLpz0sddrbrzRoNwQg0AwEyN8YQCfZISAnfAT7mcB//xWe+j12YsWUr59x0HYIQCC+BMjfGEAnxSEgJ3wE+4nA5/OltExpl62bOfup+bQVAhBILALkbwygkyIRkBM+gv1AwFvl+xfptfFS607SBQukNh390HLaCAEIJDAB8jcG0EmeCMgJH8GpTqD6Kt8Dhku/tinfVqnectoHAQgkOAHyNwbQSaIIyAkfwalMwKZ8n/qdxCrfVO5l2gaBpCVA/sYAOokXATnhIzjJCdS6T5+9u+ON28NTvraxc8d9pNMfljruleStpfoQgEAqESB/YwCd9IyAnPARnMQE5iwrrP1NHcfvo0EfXSd98LTElG8S9zBVh0BqEyB/YwCdFI6AnPARnKQEzPzZu3orv6fX3tobUPhtvf88Y08NzFwq9To5SVtItSEAgVQnQP7GADppHAE54SM4CQnYtG//CfNUWFTs1T5NQV2cPlN7pX2li0pHeSawc062FoweoHRe25aEPUyVIeAPAuRvDKCT0hGQEz6Ck5DAwpVrNHTKIq/muVqjv2RO1iHpy71/Dy+5RguC+3k/Tx/RV/16dEjCFlJlCEDADwTI3xhAJ50jICd8BCchgVkFqzRqRoGOS1ukWzLvU05gkzaFWuj60t/o6eDhFS2alJ+nIXldkrCFVBkCEPADAfI3BtBJ5wjICR/BSUjgnQ+/0NfTLtYp6W94tS8I7qY/lF6kL0K5VVrDCGASdi5VhoCPCJC/MYBOckdATvgITkICoYdPUODz11UeCuju8iH6e9nJKlNGRUtsGQjPACZhx1JlCPiMAPkbA+gkeQTkhI/gZCTw1SJtfHyEzl17rv4T2rvKSuDwGmBp8vA+GtSr6ohgMjaVOkMAAqlLgPyNAXRSNwJywkdwMhBYs1L6/gOp5wlba1tepjkf/lj7PoCDe2L+kqFfqSMEfE6A/I0BdLoFEJATPoITmUAoJC1+RJpzTfiNHufPlzruWaXGtb4JhK1fErlXqRsEIPA/AuRvDKDTzYCAnPARnKgENq6RZl8qffRcuIa7HiaddI+Us3Oi1ph6QQACEGgQAfI3BrBBgql+MgJywkdwIhJYMVeaeaG04TspLVMacL10yCVSWnoi1pY6QQACEGgUAfI3BrBRwokEISAnfAQnGoGXrpMW3hWu1Q57SadMkXL3T7RaUh8IQAACzgTI3xhAJxEhICd8BCcagX+Pl16/VTpohDTwRimrVaLVkPpAAAIQiAkB8jcG0ElICMgJH8HNTSAYlDavlVrvEK5JeZn09SJp1/7NXTPKhwAEINCkBMjfGEAngSEgJ3wENyeBnwulmRdItuBjxFwpo0Vz1oayIQABCMSVAPkbA+gkOATkhI/g5iKw/NnwKt/NP0kZLaWzZ0ndftlctaFcCEAAAnEnQP7GADqJDgE54SO4CQnUukdf6QZpztXS+1PDJdsCj5Pvq7G/XxNWi0tDAAIQSAgC5G8MoJMQEZATPoKbiMCcZYU13tJxdNsvNSlrslpv/EpSQOr/B+nIa6WMrCaqBZeFAAQgkLgEyN8YQCd1IiAnfAQ3AQEzfyOnLq7yjl4ppBlZN6lv2ofa3GontTx9Cgs9moA9l4QABJKHAPkbA+ikVgTkhI/gGBOwad/+E+apsKi4xpV3DvygS9Jn6r5W52nO1YOVzivbYkyfy0EAAslEgPyNAXTSKwJywkdwjAksXLlGQ6csUpqCOif9Je0Y+Em3lp1Zo5TpI/qqX48OMS6dy0EAAhBIHgLkbwygk1oRkBM+gmNMYFbBKv398ed1W+Y/9Yu0T72rH7flZn0Q6l6lpEn5eRqS1yXGpXM5CEAAAslDgPyNAXRSKwJywkdwLAmUl+qr2eO14/uT1CJQpvWhlrql7EzNKD9KIaVVKYkRwFiC51oQgEAyEiB/YwCddIuAnPARHCsChUukWRdJ3y31rjivPE/XlZ6nQlWd5g1I6pyTrQWjB/AMYKzYcx0IQCApCZC/MYBOwkVATvgIjgWB0mLpb/tJG3+QWm6vJb2u0Ylv2PRuoMpKYDN/dkwe3keDeuXGomSuAQEIQCBpCZC/fW4A58+fr4kTJ+q9995TYWGhnnnmGZ144olRCxoBRY2KE5uSwJIZ0scvSsdOlNp0Um37AObmZGvM4J6Yv6bsB64NAQgkDQHyt88N4Isvvqg333xTv/jFL3TyySdjAJPm1vVxRUs2SvNuknY5VNrn+DCIUEgKRMb4wr+q9U0gbP3iY+HQdAhAoDIBDKDPDWBlMQQCAQwg3w+JTeCz18Pv8P3pC6lNZ+nS96WsVoldZ2oHAQhAIAEJYAAxgBWyxAAm4B1KlcIEioukl/8kLX44/O92O0uD/ybtMRBCEIAABCDQCAIYQAxggwzgli1bZP9FDhNQ165dVVRUpHbt2jVCgoRAoB4CH8+RnrtMWv9t+MQDz5OOHitloze0AwEIQKCxBDCAGMAGGcCxY8dq3LhxNfSGAWzsLUjcNgkU/le697DwKe13k064k3f4IhkIQAACMSCAAcQANsgAMgIYg7uOSzSMwDMjpdYdpCOv5Xm/hpHjbAhAAAJ1EsAAYgAbZACrKwkB8e0SUwLrv5NeGSMdPUZqt1P40rWs8I1pmVwMAhCAgA8JkL99bgA3bNigFStWeNI/4IADdMcdd+ioo45S+/bt1a1bt3pvCQRULyJOqESgzq1ZzOQVTJNeuia84GPv46X8x2AHAQhAAAJNRID87XMD+Nprr3mGr/pxzjnn6KGHHqpXdgioXkSc8D8CdW3OPH5Ajo785BZp5dzwmbl50pC7pc69YAcBCEAAAk1EgPztcwPoqisE5ErQH/Fm/kZOXVzt1WxBnZX+qv6YMUNtAsVSegvpqGulfhdL6Rn+AEMrIQABCDQTAfI3BtBJegjICZ8vgm3at/+EeSosKq7S3nPT52hs5iPe7woC+2i/Cx9Vesc9fMGERkIAAhBobgLkbwygkwYRkBM+XwQvXLlGQ6csqtHWlirWU1njNKP8SD1aPlDTRhyifj06+IIJjYQABCDQ3ATI3xhAJw0iICd8vgieVbBKo2a8r1+lLdbJ6W/oktJLFVSa1/Y0BSt+npSfpyF5XXzBhEZCAAIQaG4C5G8MoJMGEZATPl8Ev7/4XRU9c4WOTF/itfeq0t/rifIja7R9+oi+jAD6QhE0EgIQSAQC5G8MoJMOEZATvtQOLv5Zmn+bQosmKxAsU0koXfeXH6u7yk7URrWsaHtAUuecbC0YPUDpafYvDghAAAIQaGoC5G8MoJPGEJATvtQMDgalJdOlV8dKG3/w2vhD7pE644vB+iKUW20lcBjB5OF9NKhXbmryoFUQgAAEEpAA+RsD6CRLBOSELzWDzQDeP1Ba9R+pw+7SoFulPQaqrn0AxwzuiflLTSXQKghAIIEJkL8xgE7yREBO+FIn2F7hltVGatEm3KZV70lfviUdfL6UkVXRzjrfBJI6JGgJBCAAgaQgQP7GADoJFQE54Uv+4LIS6e3J0uu3SQePkI4em/xtogUQgAAEfECA/I0BdJI5AnLCl9zBn7wszblaWrsy3I5uh0jnPi+lhbd44YAABCAAgcQlQP7GADqpEwE54UvO4NUrpJeukT59OVz/1p2kgeOk3vmYv+TsUWoNAQj4kAD5GwPoJHsE5IQv+YKXPik9c4EULJXSMqW+I6XDr5Ky2yVfW6gxBCAAAR8TIH9jAJ3kj4Cc8CVfcNE30l0HSbscGl7du8PuydcGagwBCEAAAiJ/YwCdbgME5IQv8YO/eU9a8Yp05NVb67r2c6l998SvOzWEAAQgAIE6CZC/MYBOtwcCcsKXuMHrv5fm3igVTA3X0RZ37No/cetLzSAAAQhAoEEEyN8YwAYJpvrJCMgJX7MF17kfn7etyz3hbV1K1ofrt//Q8PYubTs3W30pGAIQgAAEYkuA/I0BdFIUAnLC1yzBdb2R484DV+vAj26T1qwI12unA6RfT5S6HtQs9aRQCEAAAhBoOgLkbwygk7oQkBO+uAeb+Rs5dXGV9/FaJVqoRK+1uFy5gbVS647hEb/9z2Rbl7j3EAVCAAIQiA8B8jcG0ElpCMgJX1yDbdq3/4R5Kiwq9sptpWJtVpZCCm/cfHzaQh3S8gudccVdSm+1XVzrRmEQgAAEIBBfAuRvDKCT4hCQE764Bi9cuUZDpyxSSxVrWPpcnZ/xnCaU5evJ8iOq1GP6iL7q16NDXOtGYRCAAAQgEF8C5G8MoJPiEJATvrgGP//uJ1o28y/6Xcbz6hAIL/B4N7inTisZIylQUZdJ+XkaktclrnWjMAhAAAIQiC8B8jcG0ElxCMgJX3yCN6+T3r5XZW/drYySIq/ML4OddFf5iXqmvL/KlMEIYHx6glIgAAEIJAwB8jcG0EmMCMgJX3yCHx8ufTg7bPwCXTRpywmaFTxE5UqvUr6NAXbOydaC0QOUnrZ1RDA+laQUCEAAAhCIJwHyNwbQSW8IyAlf0wRv+FFKS5datQ9f/6tF0nOXSYdfqTmhX2rkY0u8X4cqlR6xe5OH99GgXrlNUy+uCgEIQAACCUOA/I0BdBIjAnLCF9vg9d9Jb/5d+s8D0kHnScfcvPX6oZAUCNu8uvYBHDO4J+Yvtj3C1SAAAQgkLAHyNwbQSZwIyAlfbIKLvpHenCS997BUviV8zV36S+c+V2H6qhdU55tAYlMjrgIBCEAAAglOgPyNAXSSKAJywucW/NOX0oI7pPcfk4Kl4Wt1/aV0+B+l3X9Vp/lzK5RoCEAAAhBIBQLkbwygk44RkBM+t+AXr5benhy+xq6HSYdfJXU/HOPnRpVoCEAAAr4gQP7GADoJHQE54WtY8I8fh/fr67hnOO7nb6XZo6T+l0m7HNKwa3E2BCAAAQj4mgD5GwPodAMgICd80QV//4E0f6L0wUxpj/+Thv0rujjOggAEIAABCNRBgPyNAXS6ORCQE75tBxcukV6/Tfroua3n7X28dOqDUkZWExbMpSEAAQhAINUJkL8xgE4aR0BO+GoP/rZAem289Mmc/30ekHoOCT/j17lXExTIJSEAAQhAwG8EyN8YQCfNIyAnfLUHvzNFeuFKKZAm9TpVOuwKqdPeTVAQl4QABCAAAb8SIH9jAJ20j4Ciw1fnvnu2QfMXC6TykvDWLXaUFkuv3CD98nypQ4/oCuAsCEAAAhCAQAMIkL8xgA2QS81TEVD9+Gp980a7Fvr7wT/poK/ul75aKHXYXbronfAr3DggAAEIQAACTUyA/I0BdJIYAto2PjN/I6curvTe3ZCOSivQpRnP6IC0FeHg9BZSn7Olo8dILdo69QfBEIAABCAAgWgIkL8xgNHopM5zEFDd+Gzat/+EeSosKvZOOijwkW7IfET7pX3h/XtzKEuzMv5Pp106Uek5Ozn1A8EQgAAEIACBhhAgf2MAG6KXGucioLrxLfr0O51//+sqUhvvpEPSlmla1i3aGGqhR8sH6r6y47RaOZo+oq/69ejg1A8EQwACEIAABBpCgPyNAWyIXjCA9dEqL5O+eEP64GmVLJ2lJzYfqOvKzvtfVEjD01/V8+W/1E9qV3GlSfl5GpLXpb4r8zkEIAABCEAgZgQwgBhAJzEhIEnBcunLtzzTp+XPSptWVzD9OLizjimZEH6FWx0HI4BOEiQYAhCAAAQaQYD8jQFshGy2hiAgSfcNlL55ZyuUlu2lfQarvOfJOuJfJVr1c2mlRSBbTzNL2DknWwtGD1B6Wt0G0amDCIYABCAAAQjUQoD8jQF0ujF8JSDbs++b/0gfzZaOun7r69hsz773HpL2Hiz1OknqfoSUnulxjawCtp9DlUhH7N7k4X00qFeuUx8QDAEIQAACEGgoAV/l7zrgBEIhy+wcjSGQ8gIyaXz7vvTBM9IHM6Wir8KYhj0p7TEw/HNxkZTRss7389a6D2BOtsYM7on5a4zoiIEABCAAAWcCKZ+/oyCEAYwCUl2npKyAilZJ794XNn4/fb61+VltpL1+LfW7SNrpgKjJ1fkmkKivwIkQgAAEIACB2BFI2fzdAEQYwAbAqn5qSgmodLOU2TLcxO8/kCYfEv45s5W05zHSvieHR/0i5zhwIxQCEIAABCDQnARSKn83EiQGsJHgLCzpBbT6U2nZ0+GRvs69pFPuC9Owqd8X/yh16yvtOUjKau1AiVAIQAACEIBAYhFI+vwdA5wYQAeISSmgtZ/9z/TNlL5furX1tnr3yk+l9AwHIoRCAAIQgAAEEp9AUubvGGPFADoATToBPTVCWvqvrS1Oy5B2O0rqdbK017FSy+0caBAKAQhAAAIQSA4CSZe/mwArBtABakILqOgbafksqc85Uovw69g0f6L07/FS98PDpm/v46VW7R0IEAoBCEAAAhBIPgIJnb/jhBMD6AA64QT0c2HY9NlbOb5+O9yyU+6X9js1/POmtVIoKLXewaHVhEIAAhCAAASSm0DC5e9mwIkBdIDeVAJq0LYpm9dJS58IL+SwV7JVbLkckLr1kw67fOuefQ5tJRQCEIAABCCQKgSaKn8nEx8MoENvNYWAoto4ORiU0tLCNf/pS2lS762t2Png8PRuzyFSu50cWkcoBCAAAQhAIDUJNEX+TjZSGECHHou1gCKvTqv+ahZ7dVo7bdDUQ3/Ufuvmhffiy39sa81nXSx13EvqeaK0XVeHFhEKAQhAAAIQSH0Csc7fyUgMA+jQa7EUkE379p8wT4VFxRU1aqtNGpj2Hx2X/rYOS/uvsgLl4c/SMqU/fiZlt3OoPaEQgAAEIAABfxKIZf5OVoIYQIeei6WAFq5co6FTFlXU5vKMf+n89OfUIlBW8bsPg13Vus/p6tb/TGmH3R1qTigEIAABCEDAvwRimb+TlSIG0KHnYimgWQWrNGpGQUVtzkl/SeMyH9aK4E56LthXs8v7aWWoiybl52lIXheHWhMKAQhAAAIQ8DeBWObvZCWJAXTouVgKqPoIYI42qHNgrT4O2TN99hRg+Jg+oq/69ejgUGtCIQABCEAAAv4mEMv8nawkMYAOPRdLAUWeAfyuqLhiI5fKVTML2DknWwtGD1B62lZD6FB9QiEAAQhAAAK+JBDL/J2sAH1vAO+++25NnDhR3333nfbff3/deeedOvjgg6Pqz1gLKLIK2AqvvBI4YvcmD++jQb1yo6obJ0EAAhCAAAQgUDuBWOfvZOTsawP4+OOP6+yzz9Y999yjX/7yl/rb3/6mJ554Qh9//LE6depUb382hYCi2gew3ppxAgQgAAEIQAACdRFoivydbLR9bQDN9B100EG66667vH4LBoPq2rWrLrnkEl199dX19mVTCahBbwKpt5acAAEIQAACEIBAZQJNlb+TibJvDWDJ/7d3J7BZFG8cx3+CIMhRELSGHiKXBowBFE2RELxAEDmDyhE5VCICCoZDQaFERYEEUKOIkaAJMQqEI2AMItFyVCuoEI2iEBSL1SBGsIYIgvzzTNKGgv4pfbu77+58J2lIy7u7M5+ZfffZ2ZnZ48d18cUXa+XKlerXr195nQ0fPlyHDx/W2rVrz6rHY8eOyX7KkjUgCxiPHDmihg1Zky9ODZ+8IoAAAgj4K0AAKHkbAJaUlCgrK0uFhYXKy8srPwumTJmigoICFRUVnXVm5Ofna9asWWf9nQDQ3y8RSo4AAgggED8BAkACwPMKAOkBjN9JTo4RQAABBBA4U4AA0OMAsCqPgGlAfIkggAACCCAQfwECQI8DQGu+NgnElnyxpV8s2SSQ3NxcjRs3LtJJIPE/tSgBAggggAAC6StAAOh5AGjLwNikj8WLF7tA0JaBWb58uXbv3q3MzMxztlwa0DmJ+AACCCCAAAJpJ8D12/MA0FqkLQFTthB0+/bt9eKLL7qewcokGlBllPgMAggggAAC6SXA9ZsAMKUWSQNKiY+NEUAAAQQQiESA6zcBYEoNjwaUEh8bI4AAAgggEIkA128CwJQaHg0oJT42RgABBBBAIBIBrt8EgCk1PFsAulGjRiouLuZNIClJsjECCCCAAALhCZS9ycve/JWRkRHegdPoSN6+CaQ66uDAgQPuVXAkBBBAAAEEEIifgHXgZGdnxy/j1ZBjAsAUEG3dQHulXIMGDXTBBReksKfKb1p21+JjryNlz/Gyt5l6p959e9c6bT74Nn/q1CmVlpaqWbNmqlGjRuUvwgn6JAFgzCrT53ELlD1DPr53mnqn3n0MAO2xJOd7w5hdoeOVXQLAeNWXuBjypcjFMGYnbQrZ5XznfOd8T+EEYtP/K0AAGLMGwgWBCwIXhJidtClkl/Od853zPYUTiE0JAJPUBo4dO6bnnntOTzzxhC666KIkFe2cZaHs1Dtt/pynSWI+wPnO+e7b+R72yUsPYNjiHA8BBBBAAAEEEIhYgAAw4grg8AgggAACCCCAQNgCBIBhi3M8BBBAAAEEEEAgYgECwIgrgMMjgAACCCCAAAJhCxAAhi3O8RBAAAEEEEAAgYgFCAAjroDKHn7z5s2aN2+ePvvsM/38889avXq1+vXrV9nNY/s5m/G8atUq7d69W3Xr1lXnzp01Z84cXXXVVbEtU2UzvmjRItnPDz/84DZp166dZsyYoZ49e1Z2F4n53PPPP+9mvj/66KNauHBhYsr1bwXJz8/XrFmzKvyXtXc7B3xIP/30k6ZOnar33ntPR48eVatWrbR06VJdf/31iS5+8+bNtX///rPK+PDDD+vll19OdNlPnjwpa/fLli3TL7/84t7OMWLECD355JOhvWUr0cD/UTgCwJjUun0Zbtu2Tdddd50GDBjgTQB4xx136N5771WnTp104sQJTZs2TV999ZW+/vpr1atXLya1V7Vsrlu3TjVr1lTr1q1lry1688033U3AF1984YJBX9L27dt19913y9ZDu/nmm70IAFeuXKkPPvigvIovvPBCNW3aNPFV/vvvv6tDhw6unseMGaNLL71Ue/bsUcuWLd1PktOvv/4qC4TKkn3P3X777frwww/VrVu3JBdds2fP1vz58913nH237dixQyNHjtSzzz6rRx55JNFlj7JwBIBR6lfx2PbeYV96AM8ksi8pRPOwAAAI7ElEQVTJyy67TAUFBeratWsVBeO72SWXXOKCwPvvvz++hTiPnP/555/q2LGjXnnlFT3zzDNq3769FwHgmjVrtHPnzvOQSsZHH3/8cXeju2XLlmQUKIVSTJgwQevXr3cBcFjvmk8huylt2rt3b2VmZmrJkiXl+xk4cKB76mO9gqRgBAgAg3ENdK8+B4B79+51PWJffvmlrrnmmkCd02nn1jOwYsUKDR8+3PUAtm3bNp2yF1herLwW9C5YsMD1gvgSAFqQb++CrVOnjvLy8tzi77m5uYE5p8uOrV336NFDBw4ccDd5WVlZskegDz74YLpkMZR8HD9+3D0Gfeyxx9xTj6Qn6wF87bXX9P7776tNmzbatWuXunfv7noFhw4dmvTiR1Y+AsDI6Kt+YF8DwH/++Ud9+vTR4cOHtXXr1qoDxmhLC3QtAPjrr79Uv359vfXWW+rVq1eMSlD1rL799tvuEZA9ArZAyJcA0IZ7WM+njfuz8b42HtDGxdkjwQYNGlQdNAZbWj1bssBn0KBBru5t3Oerr77qbn58ScuXL9eQIUP0448/ukAw6cm+2y3QnTt3rhv2Yje8du7buF9ScAIEgMHZBrZnXwNAGxNkF0cL/rKzswPzTacdW0+AXQSOHDkiGxf2+uuvu56RpPcAFhcXu0H/Gzdu1LXXXuuqxJcA8Mz2Zzc8V1xxhesNSfqj/9q1a7t6LywsLGewMWAWCH788cfpdGoGmhfrBTULGwfsQ7KbvcmTJ7vhLTYG0IY/2CNwa/M+Bf5h1zUBYNji1XA8HwPAcePGae3atbLZ0FdeeWU1KMZzF7fddpsbDL948eJ4FqCSubYxcP3793e9AWXJegWs7deoUUP2ntjT/6+Su43tx2wSlNW9PQpOcrJA1yY+2I1OWbKZ8Db+03pBfUg2E7hFixZu9YO+ffv6UGTl5OTIxn+OHTu2vLxW5zb+z5fZ71FUNAFgFOopHtOnANBmv44fP95Nevnoo4/c+D+f0y233OLGgr3xxhuJZigtLT1rSQybFXj11Ve7JUJ8Gv9pj4Otzm2ZjKTPiLTHntb7e/okkIkTJ6qoqKhCr2CSG7/Vs93gmYPN/vYhNWnSxAX59pSnLNnNji3/89133/lAEEkZCQAjYT//g9pFwCZAWLJlEqxr3JZKsAHySR4cbgPAbdyb9f6dvvafDZC3GWJJTjb+xdb8s/q1gMgcbA3EDRs2uF4S35Ivj4AnTZqku+66yz32LSkp0cyZM90jMVv6yJZFSXKyR7221qeNe7Slfz799FM3AcQmCPgwGcDGwtkTjsGDB8vWvvQl2Zp/tuyRBb72CNgmuo0ePVqjRo1y33mkYAQIAINxrfa9Wu+XBXxnJhsfkeTeoP9a/sDuDO1LI8nJxntt2rTJTQSwgNfGwlnvl4/Bn9WzLwGgrXtpQx1+++03F/B16dLFDYhP+jp4ZeeyLX1iNz+2/IkFQzYhxJdZwDYL1sb/ffvtt242rC/JbnCfeuop96Tn4MGDbuKLBcG28L2NhSQFI0AAGIwre0UAAQQQQAABBNJWgAAwbauGjCGAAAIIIIAAAsEIEAAG48peEUAAAQQQQACBtBUgAEzbqiFjCCCAAAIIIIBAMAIEgMG4slcEEEAAAQQQQCBtBQgA07ZqyBgCCCCAAAIIIBCMAAFgMK7sFQEEEEAAAQQQSFsBAsC0rRoyhgACCCCAAAIIBCNAABiMK3tFAAEEEEAAAQTSVoAAMG2rhowhgAACCCCAAALBCBAABuPKXhFAIM0FTp06pcaNG+vpp5/W+PHjK+TW3kG9Y8cO9y7asjRy5EhlZWW5l9ZPnDhR+/fv16pVq9K8lGQPAQQQ+HcBAkBaBgIIeCmwd+9etW7dWoWFhcrLy6tgcOONN6pjx45atGiR+/vJkyd1+eWX691339UNN9ygm266SXfeeaemTZvmpR2FRgCB+AsQAMa/DikBAghUQeCdd97RsGHD9Mcff6hu3brle/j777/VsGFDvfTSS3rggQfc37ds2aJ77rlH33//verXr68TJ06Uf96CxU8++aQKOWATBBBAIDoBAsDo7DkyAghEKDBlyhRt2LBBu3btqpCLnTt3qkOHDvr888/dv5YmT57sAkXrEbRHwxb02ecyMzNVp04dNWrUKMKScGgEEEDg/AUIAM/fjC0QQCABArfeequaN2+uJUuWVCiN/T527FiVlpaqVq1a7v/atGmjBQsWuMe+a9ascT2Dhw4dSoACRUAAAV8FCAB9rXnKjYDnAjYBZPbs2RozZkwFCZsAsn37dvdj6ZtvvlGnTp1cwGe9fTNnztTWrVu1adMmzwUpPgIIxFmAADDOtUfeEUCgSgLFxcXKzc1VQUGBunbtWmEf1tvXs2dPvfDCC+7vc+bMcWP8Vq9e7X7v27evWrZsqfnz51fp2GyEAAIIpIMAAWA61AJ5QACBUAX27dvngjib1durV6/yY2/cuFHdu3fXtm3b1LlzZ/d3+3f06NEaMWKE+71FixbKz8/XfffdF2qeORgCCCBQnQIEgNWpyb4QQCAWArYGYNu2bVW7dm3Xk9e0aVMVFRVp+vTp6t27t5YuXerKcfDgQWVnZ6ukpMR9xpKNGxw6dKgbJ1ivXj1lZGTEosxkEgEEEDhdgACQ9oAAAl4KWC/gpEmTtHnzZtnSL61atdJDDz2kUaNGqWbNms7EJoRYMGhj/srSsmXLNHXqVBcU2vbz5s3z0o9CI4BAvAUIAONdf+QeAQQCFOjTp4+6dOkiWzKGhAACCCRJgAAwSbVJWRBAoFoF5s6dq8GDBysnJ6da98vOEEAAgagFCACjrgGOjwACCCCAAAIIhCxAABgyOIdDAAEEEEAAAQSiFiAAjLoGOD4CCCCAAAIIIBCyAAFgyOAcDgEEEEAAAQQQiFqAADDqGuD4CCCAAAIIIIBAyAIEgCGDczgEEEAAAQQQQCBqAQLAqGuA4yOAAAIIIIAAAiELEACGDM7hEEAAAQQQQACBqAUIAKOuAY6PAAIIIIAAAgiELEAAGDI4h0MAAQQQQAABBKIW+B+bGBPlHqfaagAAAABJRU5ErkJggg==\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot(UU, Es, 'o')\n",
"plt.plot(UU, Eb(UU), '--')\n",
"\n",
"plt.ylabel(r\"$E_b$\")\n",
"plt.xlabel(r\"$U/t$\")\n",
"plt.title(r\"Binding energy vs $U/t$ for a single chain\")\n",
"\n",
"plt.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.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment