{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Nuke\n",
    "\n",
    "Sometimes matplotlib just doesn't give us the tools we need to animate stuff. This block is a way to work around that.\n",
    "\n",
    "Matplotlib.axes.Axes.quiver does not have a way to dynamically set the location of arrows, only the angle. In this example, we work around that."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib notebook\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import animatplot as amp"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets first construct our data. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "E0 = np.array([1, 2])\n",
    "E0 = E0 / np.linalg.norm(E0)\n",
    "\n",
    "phi = np.array([0, np.pi/7])\n",
    "\n",
    "f = 3\n",
    "t = np.linspace(0,2*np.pi,100)\n",
    "\n",
    "ES = E0[:, np.newaxis]*np.exp(1j*(t+phi[:, np.newaxis])) # fancy array boardcasting"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, we animate the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydB3QV1bvF900hIZBC7x2UKr33KghSbFiwIEVsIKAg2LCACkhTpIoUFSmKiIDSQ0dAeug99FASQki997/OhPAnEMgtM3PPzOy7luv55JTv+33n7bc5M+eMzeFwOMAfCZAACZAACZAACZCAZQjYaAAtU2smSgIkQAIkQAIkQAIKARpALgQSIAESIAESIAESsBgBGkCLFZzpkgAJkAAJkAAJkAANINcACZAACZAACZAACViMAA2gxQrOdEmABEiABEiABEiABpBrgARIgARIgARIgAQsRoAG0GIFZ7okQAIkQAIkQAIkQAPINUACJEACJEACJEACFiNAA2ixgjNdEiABEiABEiABEqAB5BogARIgARIgARIgAYsRoAG0WMGZLgmQAAmQAAmQAAnQAHINkAAJkAAJkAAJkIDFCNAAWqzgTJcESIAESIAESIAEaAC5BkiABEiABEiABEjAYgRoAC1WcKZLAiRAAiRAAiRAAjSAXAMkQAIkQAIkQAIkYDECNIAWKzjTJQESIAESIAESIAEaQK4BEiABEiABEiABErAYARpAixWc6ZIACZAACZAACZAADSDXAAmQAAmQAAmQAAlYjAANoMUKznRJgARIgARIgARIgAaQa4AESIAESIAESIAELEaABtBiBWe6JEACJEACJEACJEADyDVAAiRAAiRAAiRAAhYjQANosYIzXRIgARIgARIgARKgAeQaIAESIAESIAESIAGLEaABtFjBmS4JkAAJkAAJkAAJ0AByDZAACZAACZAACZCAxQjQAFqs4EyXBEiABEiABEiABGgAuQZIgARIgARIgARIwGIEaAAtVnCmSwIkQAIkQAIkQAI0gFwDJEACJEACJEACJGAxAjSAFis40yUBEiABEiABEiABGkCuARIgARIgARIgARKwGAEaQIsVnOmSAAmQAAmQAAmQAA0g1wAJkAAJkAAJkAAJWIwADaDFCs50SUBvAtOnT0fXrl1vT+vr64v8+fOjZcuW+OKLL1CoUCGnQzpx4gRKlCiBH3/8Ea+88orT/TJruGbNGjRt2hSrV69GkyZNMmvu8p9v3LgRy5YtwzvvvIOwsLB0/dPmEzHwRwIkQAJ6EaAB1Is05yEBixJIM4DCtJUtWxY3b97E2rVr8eWXX6JgwYLYs2cPsmXL5hQdrQxgTEwMIiIiUL58eYSEhDgViyuNRo4ciffeew/Hjx9H8eLF03UV84qfmJs/EiABEtCLAA2gXqQ5DwlYlECaAdy6dStq1Khxm8LHH3+Mzz//HD/99BNeeOEFp+iobQCTkpJgs9ng5+fn1PzuNnqQAXR3TPYjARIgAU8I0AB6Qo99SYAEMiVwPwO4ZMkStG3bFkOHDsXgwYOxd+9efPDBB8ruoNglFLuFffv2xcsvv3x7jowM4JEjR5Qx1q9fjzNnziBHjhyoVq0ahg0bhkqVKt3um/aYd+bMmdi5cyd+/fVXnDt3Ttn5O3/+fLpHwGnz3C85h8Oh/NHy5cvx3XffYfv27YiKikLhwoXRvHlzJZ7cuXMrbYYMGYJPP/30nqHSHjdn9Aj4ypUr+PDDD7Fw4UJcunRJGfe5556DMM0BAQG3xxLm9c0330Tt2rWVfE+ePIkyZcoo87dr1y7T2rABCZCAdQnQAFq39sycBHQhcD8DOG7cOPTp0weTJ09Go0aNULNmTeTNmxeffPIJcuXKpewMzp49G19//TUGDBigxJqRARSG8c8//0TdunWRJ08eCPM0Y8YM/PPPP9ixYwcefvhhpW+aARTvHIq2L730Enx8fJR/3717dzoDmJCQoPS98yeMWJcuXZR3FtMe206cOBHXrl1DhQoVEBoaqsQ3atQoxMfHK4+2/f39ERkZieHDh+Pbb7/F77//jgIFCijDpj1uvtsAir7C0B09elQxjo888gjWrVunPDJv1aoVFi9enM4AikfKgtu7776L7NmzK3MJM3zw4EGULFlSlxpzEhIgAeMRoAE0Xs0YMQkYikCaAdy8eTOqV6+umKPw8HDlYIj498OHDyuHIxYsWKD8e5EiRW7n99hjjyltz549e9tgZXYIJCUlBXa7XTFlYhdMGLI7DaAwm2LMO3+ZHQKJi4tTDOLp06exadMmFCtW7J4aiF1BMbeIVfy52L1r37690u5Bj4DvNoCTJk1Cr169MHfuXDz99NO35xHGbuDAgcphEnGARvzEDmC+fPkUbsHBwcp/u3DhgvJupdgFfP/99w21VhgsCZCAfgRoAPVjzZlIwJIE7j4FnAZBPJ6dMGEC6tevr5gY8X7gnbtbop0wQZ07d8bSpUvRunXrDHcAk5OTlV0vsWMoHgeL9/rSfqKP6HunARw7dix69+7ttAEUpq5jx46KaRS7jVWqVLnd9+LFi8pjWRG3MH7CeKb9vvrqK8WwuWoARb5ivOvXrysGL+0n5hKcxJhi7DQD+Oyzzyo7pXf+xC6jiFnw5Y8ESIAEMiJAA8h1QQIkoCmBNAMo3r0rV66ccuBCGJm0R6FicvHfxLUuU6dOTReLeJTZsGHD2wdFMnoELMzc+PHjFWPUuHFj5R1A8Wi3e/fuypUraderpO3y3b2zdqc5zOgamB49ekDkIEyZeASb9hNmT7xrKIzfRx99pLxvKE4zi/9ep04d5VG2eP/PVQPYokULxegKM3v3TzxSFpymTJly2wCKdwDFe4h3/sRjYbGzKOLmjwRIgARoALkGSIAEdCdwv3cA7wwksx3Av//+G48++miGO4A5c+ZEhw4dlLsB7/yJgxOlS5e+xwDOmzcPTz31VLq293sEnHaAI6N7B8V7g5UrV1ZM1p0HVYRxEwcx3DWAYgdQHJARV9NktAMoHuuK9wHFL+0QCA2g7suaE5KA4QlwB9DwJWQCJCA3AWcM4PPPP6+8AygOPoj319J+4h0+sSv3oHcAxYER8a6cOJCR9hO7daKv2BG8ewfQWQP4ww8/KLuIn332mbLDd/dPHPIQBzTE41fxGDbtJ+77E+/83WkAxQEQsVMpDo+IXdA7f3e/AygOxbz22mvKgZFOnTrdbpr2HqE4eSx2CWkA5V73jI4EZCdAAyh7hRgfCRicgDMGUJxYFaeAxWNh8U6d2NX7+eeflX/E+33CVIlfRo+Axe7bnDlzlPfihCETV7KMGDFCuS6lVKlSbhlAcdBDHBYRp3GF8br7Jx7xincNhZkT7yCKHTkR86JFi5SrYQ4dOpTOAKbtMApjJ+IVj3LF6WRxcON+p4DFpdHiFLB4tCwehYtrXsThj7tPAfMRsMH/D4Thk4CXCNAAegk8pyUBqxBwxgAKFuIeQHEfYNo9gMJcidPBd37yLSMDKK5hEVegCPMVGxurvJcnDJm4R0/83NkBvN/BlbSapd0DuH//fuUqG3HCWbzHKHbmvvnmGxQtWjSdART9RG7iehpx56B4TzCzewDFnYhp9wCKq2fELqnYVczoHkA+ArbK/zUxTxJQjwANoHosORIJkAAJkAAJkAAJGIIADaAhysQgSYAESIAESIAESEA9AjSA6rHkSCRAAiRAAiRAAiRgCAI0gIYoE4MkARIgARIgARIgAfUI0ACqx5IjkQAJkAAJkAAJkIAhCNAAGqJMDJIESIAESIAESIAE1CNAA6geS45EAiRAAiRAAiRAAoYgQANoiDIxSBIgARIgARIgARJQjwANoHosOZIKBMQFueKzX+ILCXd+B1WFoTkECZAACRiSgLh4/Pr168pnEn18fAyZA4OWjwANoHw1sXREkZGRKFKkiKUZMHkSIAESyIjA6dOnUbhwYcIhAVUI0ACqgpGDqEUgOjoaYWFhEEIXEhKi1rAchwRIgAQMSyAmJkb5i7H47GFoaKhh82DgchGgAZSrHpaPRgidEDhhBGkALb8cCIAESAAAdZHLQAsCNIBaUOWYbhOg0LmNjh1JgARMSoC6aNLCejktGkAvF4DTpydAoeOKIAESIAHqIteA9gRoALVnzBlcIEAD6AIsNiUBErAEAeqiJcqse5I0gLoj54QPIkCh4/ogARIgAe4Acg1oT4AGUHvGnMEFAjSALsBiUxIgAUsQoC5aosy6J0kDqDtyTsgdQK4BEiABEnCeAA2g86zY0nkCNIDOs2JLHQhQ6HSAzClIgAQMRYC6aKhyGSZYGkDDlMoagVLorFFnZkkCJOA8Aeqi86zY0nkCNIDOs2JLHQhQ6HSAzClIgAQMRYC6aKhyGSZYGkDDlMoagVLorFFnZkkCJOA8Aeqi86zY0nkCNIDOs2JLHQhQ6HSAzClIgAQMRYC6aKhyGSZYGkDDlMoagVLorFFnZkkCJOA8Aeqi86zY0nkCNIDOs2JLHQhQ6HSAzClIgAQMRYC6aKhyGSZYGkDDlMoagVLorFFnZkkCJOA8Aeqi86zY0nkCNIDOs2JLHQhQ6HSAzClIgAQMRYC6aKhyGSZYGkDDlMoagVLorFFnZkkCJOA8Aeqi86zY0nkCNIDOs2JLHQhQ6HSAzClIgAQMRYC6aKhyGSZYGkDDlMoagVLorFFnZkkCJOA8Aeqi86zY0nkCNIDOs2JLHQhQ6HSAzClIgAQMRYC6aKhyGSZYGkDDlEr/QNeuXYsRI0Zg+/btOHfuHBYsWICOHTs+MJDw8HD069cP+/btQ8GCBTFgwAD06tXL6eApdE6jYkMSIAGLEKAuWqTQOqdJA6gzcCNNt3TpUmzYsAHVqlXDk08+makBPH78OCpWrIgePXrgtddeU/q+8cYbmD17ttLfmR+FzhlKbEMCJGAlAtRFK1Vbv1xpAPVjbeiZbDZbpgZw4MCB+PPPP7F///7buYrdv127dmHTpk1O5U+hcwoTG5EACViIAHXRQsXWMVUaQB1hG3kqZwxgo0aNULVqVYwdO/Z2quKx8TPPPIO4uDj4+/tnioBClykiNiABErAYAeqixQquU7o0gDqBNvo0zhjAhx56CK+88goGDx58O92NGzeifv36OHv2LAoUKHAPhoSEBIh/0n5C6IoUKYLo6GiEhIQYHRvjJwESIAGPCdAAeoyQA2RAgAaQy8IpAs4awK5du2LQoEG3xxTvATZo0EA5RJI/f/575hoyZAg+/fTTe/47DaBTZWEjEiABCxCgAbRAkb2QIg2gF6AbcUpnDKA7j4C5A2jE1cCYSYAE9CRAA6gnbevMRQNonVp7lKkzBlAcAlm0aBEiIiJuz/X6669j586dPATiEX12JgESsDIBGkArV1+73GkAtWNr+JFjY2Nx5MgRJQ9xuGPUqFFo2rQpcubMiaJFiyqPes+cOYOZM2cqbdKugRFXwIirYMTJX3EKmNfAGH4pMAESIAEvEqAB9CJ8E09NA2ji4nqa2po1axTDd/fv5ZdfxvTp05UDHydOnIBol/YTF0H37dv39kXQYleQF0F7Wgn2JwESsDIBGkArV1+73GkAtWPLkd0gQKFzAxq7kAAJmJoAddHU5fVacjSAXkPPiTMiQKHjuiABEiCB9ASoi1wRWhCgAdSCKsd0mwCFzm107EgCJGBSAtRFkxbWy2nRAHq5AJyef9PlGiABEiCBBxGgAeT60IIADaAWVDmm2wQodG6jY0cSIAGTEqAumrSwXk6LBtDLBeD03AHkGiABEiAB7gByDehNgAZQb+Kc74EE+DddLhASIAES4F+MuQa0J0ADqD1jzuACARpAF2CxKQmQgCUIUBctUWbdk6QB1B05J+SjDq4BEtCfwJGLsfhz5xnsOH0NZ6/dRFAWP1QoGIKX6xVHuQIh+gfEGZ0mQAPoNCo2dIEADaALsNhUewIUOu0ZcwZrEdh+8iqG/30AW45fyTBxHxvQp/lD6NOijLXAGChb6qKBimWgUGkADVQsK4RKobNClZmjHgQuxybg4z/3YfHuc8p0fj42NHooD1qWz4eiOYNwPT4Jf+46iyV7zit//nmHCnixbnE9QuMcLhKgLroIjM2dIkAD6BQmNtKLAIVOL9Kcx8wEVh24gAHzdyMqNhFih+/p6kXwTssyKBCa9Z60x68+ghH/HESAnw/WD2yGPMEBZkZjyNyoi4Ysm/RB0wBKXyJrBUihs1a9ma26BFLsDsXMTQw/qgz8UL7sGN25CioUDL3vRA6HA52+34idp6/htcYlMahNOXWD4mgeE6AueoyQA2RAgAaQy0IqAhQ6qcrBYAxEIDYhGe/8ugMr9l9Uon61fgkMaP0wAv19M83in33n8dqs7SgQGoiN7zeDzWbLtA8b6EeAuqgfayvNRANopWobIFcKnQGKxBClI3DxejxenrYV+8/FIIufD4Y/+Qg6Vi3kdJw3E1NQ+bNlSEy2Y0W/RiidN9jpvmyoPQHqovaMrTgDDaAVqy5xzhQ6iYvD0KQkcObaTXSZugXHo24gd/YATHmpOqoWzeFyrC9M3YwNRy7jyycq4blaRV3uzw7aEaAuasfWyiPTAFq5+hLmTqGTsCgMSVoCwvQJ8ydMYKGwrPi5e20Uz53NrXg/WbgXMzadRK/GpfB+m7JujcFO2hCgLmrD1eqj0gBafQVIlj+FTrKCMBxpCZy+EoenJ27C+Zh4lMydDT91r42CYfee8nU2gWnrj+OzvyLQpmJ+TOhS3dlubKcDAeqiDpAtOAUNoAWLLnPKFDqZq8PYZCFwPjoez0zahFNX4lA6b3bM7lHH4+tbxH2Bb/7yH2oVz4m5verKkirjAEBd5DLQggANoBZUOabbBCh0bqNjR4sQEBc8C/N39NIN5ULneb3qIl9IoMfZrz5wEV2nb8UjhUPx51sNPB6PA6hHgLqoHkuO9H8CNIBcDVIRoNBJVQ4GIxmBuMRkPDt5M3ZHRitXtsx9rS6K5AxSJcrpG45jyKIIZawTX7VVZUwOog4B6qI6HDlKegI0gFwRUhGg0ElVDgYjEYHkFLtyV9/KAxeRI8gf81+vh1J5sqsW4dR1x/DF4v00gKoRVW8g6qJ6LDkSdwC5BiQlQKGTtDAMy6sExNc6Plq4Fz9tPqV8su2XHnVQvZjrV73cLwkx/tJtU/HGbwVpAL1a6Ywnpy5KWBQThMQdQBMU0UwpUOjMVE3mohaBSeFH8eXSAxAf6JjwQjW0rlhAraEhzJ8jdgRW7tmEHn92R8EgX2z8uLVq43MgzwlQFz1nyBHuJUADyFUhFQEKnVTlYDASEFi5/wK6z9wGhwP4uF15vNqghGpRKebv+jAgbgYWH6qCt5e8jFAkYddXHVWbgwN5ToC66DlDjkADyDUgOQEKneQFYni6Ejhy8To6jt8I8Z3f52sXxbBOlVSb3+GwwxHzGXDzF2XMqdtbYdi6NgiMu47wTx5Dvlwhqs3FgTwjQF30jB97Z0yAO4BcGVIRoNBJVQ4G40UC0XFJ6DB+PU5cjkOtEjnxU7faynd+1filmr8PgZvzbw/33uIX8dvhagi6fhVfdKyIJ1pWUWMqjqECAeqiChA5xD0EaAC5KKQiQKGTqhwMxksEUuwO5U6+tYcuKZ94+/Ot+siVPUCVaByOFDiiBwHxf6Qbr/0Pb2Hv9VLIfu0SHi0Zgm8GPKHKfBzEcwLURc8ZcoR7CdAAclVIRYBCJ1U5GIyXCIxafgjjVh5GVn9fzH+9LioUDFUlEocjGY7o94D4xfeMV2vMB4hCboRcOY8cCdfx96Q3kTXQX5V5OYhnBKiLnvFj74wJ0AByZUhFgEInVTkYjBcIrDmY+kUOcehjTOcq6Fi1kCpROByJcFzrDyT8c894ySm+qDDqCyT5ByLHxdMIjL+Br/t1QKMapVWZm4N4RoC66Bk/9qYB5BowAAEKnQGKxBA1IxB5NQ7tvl2Pa3FJeKF2UQxV9dBHPJASCThuphrBlBO389h/Ki/azh8I+Pggz9mj8EtOwuNNKmJwz0c1y5UDO0+Auug8K7Z0ngB3AJ1nxZY6EKDQ6QCZU0hJICE5Bc9M2oxdp68p3+MV3/gN8PNVPVZH/Go4rr2WOq5fBSB5H35YWQtD9zwHse2Y//RB2ADkDA3CovG94OMj/jf+vEmAuuhN+uadmwbQvLU1ZGYUOkOWjUGrQODzvyLww/rjCM3qj7/ebqDaN37vDE15BzDqcSDlKOCTG7bcy3A8ogt+3FAbs44/At+kROQ9dww9n66Pef/swMj3OqF8qfwqZMchPCFAXfSEHvvejwANINeGVAQodFKVg8HoRGD1gdT3/sRvyks10LJ8Pk1mdsT9CkfMx8rYtpDPYQvqjJOR+7H+dDI+WHgKATdjkfNSJFZOexs22HA1Jg4F86pzAEWThCwyKHXRIoXWOU0aQJ2Bc7oHE6DQcYVYjcDFmHi0GbsOl28k4pV6xTGkfQVNEDjssXBEtQTslwG/MrDlWgibzU+Z65OFezFj00lki7mMkGuXFAMYFJhFkzg4qOsEqIuuM2OPzAnQAGbOiC10JECh0xE2p/I6AbvdgRenbcGGI5dRrkAIFrxRD4H+6r/3JxK1Xx8N3JiQuvuXYwpsAY1v5//MpE349/gVhF4+i6AbMTSAXl8Z6QOgLkpWEJOEQwNokkKaJQ0KnVkqyTycITBhzVF8/fcB5b6/v3o3QKk82Z3p5nIbR8p5OC61BJAAZKkHW44fYbOlHu4Q3wOu8tlyRN9MQu5zx+GflEAD6DJhbTtQF7Xla9XRaQCtWnlJ86bQSVoYhqU6gb1notFx/AYk2x0Y/uQjeKZmEdXnSBvQfm0gEL9A7P3BlmsBbP7lb891Pjoedb5cCXHYN+9JcQLYQQOoWSXcG5i66B439nowARpArhCpCFDopCoHg9GIQHxSCh7/dj0OX4xFm4r58f0L1W7vyKk9pSMpAo7LncReH5D1CfiEfpVuimX7zqPnrO0okN0PiNir/BnfAVS7Cp6NR130jB97Z0yABpArQyoCFDqpysFgNCLw2aIITNtwHHmCA/DPO42QM5s2By7E413H1ZeBxM0AAmHLsww23/TXuoz85yC+W30EtQsG4dTm/2gANaq5J8NSFz2hx773I0ADyLUhFQEKnVTlYDAaEFh/OApdftiijPxj15po+nBeDWZJHdKRsAaOqz1T/5dsb8An+J175nrxhy1YdzgKT5cLw/p/hFHkDqBmBXFzYOqim+DY7YEEaAC5QKQiQKGTqhwMRmUC0XFJeHTMWpyPiUeXOkXxRcdKKs/w/+GUS58vtweSjwA+uWDLvRw2n/SHTMQOYeVPlyEmPhn9a+fFL/PW0gBqVhH3B6Yuus+OPe9PgAaQq0MqAhQ6qcrBYFQm0G/uTvz+3xmUyJ0Ni3s3QFCW1Hv4tPilv/T5M9iCnr1nmuNRN9B05BoE+PlgaOMC+ObHlTSAWhTDwzGpix4CZPcMCdAAcmFIRYBCJ1U5GIyKBFbuv4BuM7ZB3L4yv1c9VC+WQ8XR0w+VeulzK8AeBfiWgi33otuXPt/Zct6203hv/m4lli4PZcPwH1bQAGpWFfcHpi66z449uQPINWAQAhQ6gxSKYbpEQDz6bTUmHBdiEtCjYQl80Pb/17C4NJCTje3XxwI3xiutbWGTYAtsmmHPAfN3Ye62SPRqXAoPZ0mgAXSSr97NqIt6E7fGfNwBtEadDZMlhc4wpWKgLhDoP3cXfvsvEiVzZ8OSPg01+9qHCCn10udWAOKBLHVgyzHjvlfMiMe/4jHwtFdqIPrMeRpAF2qqZ1Pqop60rTMXDaB1am2ITCl0higTg3SBwKoDF/Dq9LRHv3VRvVhOF3q73tQePQi4+VuGlz7fOdrF6/GoNXSl8kh658etsGpjBA2g67h16UFd1AWz5SahAbRcyeVOmEInd30YnWsEYuKT0HKUfo9+HUn74bjcMfXS58BO8An7+r4BL959Dm/+8p/yDeKlfRpiwcpdNICulVe31tRF3VBbaiIaQEuVW/5kKXTy14gROk/ggwV78POWU8qpX2GyAv19ne/sYsvUS5+7AokbAQTAlmf5PZc+3znkJwv3Ysamk3i5bjF82qEiDaCLvPVsTl3Uk7Z15qIBtE6tDZEphc4QZWKQThD49/gVPDNpk9Ly1551UKdkLid6ud/EkbAWjqvdUwfI9jp8gvs+cLAWo8Jx5GIsJnaphtYVC9AAuo9e857URc0RW3ICGkBLll3epCl08taGkTlPQHzr97Fx63Ds0g08W7MIvnryEec7u9Ey9dLnDkDy4fte+nznsBdi4lF72K33/z5qhdAgfxpAN7jr1YW6qBdpa81DA2itekufLYVO+hIxQCcIfLPsIL5ddUT51u+Kvo0Vg6XlzxE3B46Yj5QpbCGfwhb03AOn+/2/SPSbuwuPFA7Fn281UNryHUAtK+TZ2NRFz/ixd8YEaAC5MqQiQKGTqhwMxg0CB87HoN249Ui2OzDhhWpoU6mAG6M438VhvwFHVMtblz6XhC33Xxle+nzniGnX0rzepBQGti5LA+g8bq+0pC56BbvpJ6UBNH2JjZUghc5Y9WK06QnY7Q48OXEjdpy6hpbl82Hyi9XvewefWuycvfQ5bT5xWKTul6uU7xH/1K02GpTJTQOoVjE0Goe6qBFYiw9LA2jxBSBb+hQ62SrCeFwh8MuWUxi8YA+yZfHFiv6NUSA0qyvdXW7ryqXPaYMfuXgdLUatRRY/H+z+pNXtk8l8BOwyft06UBd1Q22piWgALVVu+ZOl0MlfI0aYMYGo2AQ0G7kGMfHJ+LhdebzaoITmqOzRg4Gb85V5bLkWwOZfIdM5p6w9hqFL9qNhmdyY1a327fY0gJmi81oD6qLX0Jt6YhpAU5fXeMlR6IxXM0acSqDfnJ34fccZVCgYgoVv1oefr4+maBxJB1JP/iqXPneAT9gIp+Z7YepmbDhy+R6TSgPoFD6vNKIuegW76SelATR9iY2VIIXOWPVitKkENh6NwvNTtiifVVvwRn1UKRKmORr7lVeBxPW3Ln3+BzbfgpnOGZuQjKqfLUNSigOr+jdGyTzZuQOYKTXvN6Auer8GZoyABtCMVVUxp++//3uqyhkAACAASURBVB4jRozAuXPnUKFCBYwZMwYNGzbMcIbp06eja9eu9/zZzZs3ERgY6FRUFDqnMLGRRAQSklPQZmzqnX8v1imGzztW1Dw6R8I6OK52S50n22vwCe7v1JzL9p1Hz1nbUSxXENa82yTdARXuADqF0CuNqItewW76SWkATV9i9xOcM2cOXnzxRQgTWL9+fUyaNAlTp05FREQEihYtes/AwgD26dMHBw8eTPdn+fPndzoICp3TqNhQEgLfrTqMkcsOIXf2AKzs3xihWTW+88+RcuvS50OAT07Ycq+Azef/O3kPwjLo9z2Y/e+p259/u7MtDaAkCyqDMKiL8tbGyJHRABq5ehrHXrt2bVSrVg0TJky4PVO5cuXQsWNHfPnllxkawHfeeQfXrl1zOzIKndvo2NELBCKvxkF8Ui0+yY4xnaugY9VCmkfhiJsHR8wHyjy2kE9gC3rBqTnF9S/1vlqFc9Hx+PGVmmhaNm+6fjSATmH0SiPqolewm35SGkDTl9i9BBMTExEUFIR58+ahU6dOtwcRO3w7d+5EeHh4hgawe/fuKFSoEFJSUlClShV8/vnnqFq1qtNBUOicRsWGEhB4/aftWLr3PGqVyIk5Petofudf6qXPjwL2i4CvuPR5EWw253Yc956JRrtv1yOrvy92fNzy9vUvaRhpACVYUPcJgboob22MHBkNoJGrp2HsZ8+eVYzchg0bUK9evdszDRs2DDNmzLjnMa9osHnzZhw5cgSVKlWCEKyxY8diyZIl2LVrF8qUKZNhtAkJCRD/pP1EvyJFiiA6OhohISEaZsihScAzAusOX8KLP/wLXx8bFvdugLL5tV+vjthvIf5Rdv/CJsIW2MzpJEYtP4RxKw+jlbig+qUa9/SjAXQape4NaQB1R26JCWkALVFm15NMM4AbN25E3bp1bw8wdOhQzJo1CwcOHMh0ULvdrjxCbtSoEcaNG5dh+yFDhuDTTz+9589oADPFywZeJJCYbEfrsWuVgx9d6xfHJ49nfv+ep+E6Ui6mfvLNcRPIUhu2HDNd2nF8bOw6RJyLwYinHsHTNYrQAHpaEB370wDqCNtCU9EAWqjYrqTqziPgjMbv0aMHIiMjsXTp0gyn5w6gK1VhW1kITAw/iq+WHkDu7Fmwsn8TzQ9+iLzTX/r8O2z+zp82Fu8qNvh6NXxswNYPWiBX9gAaQFkWkxNx0AA6AYlNXCZAA+gyMut0EIdAqlevrpwCTvuVL18eHTp0yPAQyN1kxEvntWrVUh4JT5s2zSlwFDqnMLGRFwmcj45Hs2/WIC4xBSOfroynqhfWPJr0lz63h0/YSJfmnL7hOIYsikDN4jkwr9f/X+m4cxA+AnYJqa6NqYu64rbMZDSAlim164mmXQMzceJE5THw5MmTMWXKFOzbtw/FihXDSy+9pLwnmHYiWDzKrVOnjvK+nxAs8dhXPC4W7xEKI+jMj0LnDCW28SaBvnN2YsGOM6hWNAzze9WDj9hW0/hnv9INSFwHIAtseZY5denznSGlff1j8GNl0bNRqQyjpQHUuIgeDE9d9AAeu96XAA0gF8cDCYjdv+HDhysXQVesWBGjR49W3ukTvyZNmqB48eIQ9/+JX9++ffH777/j/PnzCA0NVU7/inf87nyHMDPcFLrMCPHPvUlg+8mreHLCRuWLH3++2QCVCodqHk76S597wif4XZfmvHojETWGrkCK3YHV7zZBidzZaABdIuj9xtRF79fAjBHQAJqxqgbOiUJn4OKZPHS73YFO32/ArshoPF29MEY8XVnzjB3Kpc8dgeSDgC0HbHnEpc/BLs07d9tpDJi/G2XzB+Pvd1L/8pbRjzuALmHVtTF1UVfclpmMBtAypTZGohQ6Y9TJilH+tj0S/eftQrYsvlj9XhPkDXbu84aesHLEzYcjZrAyhC34Y9iydXF5uK4//ovVBy+hX8uH0Lt5xtcxiUFpAF1Gq1sH6qJuqC01EQ2gpcotf7IUOvlrZMUIYxOS0WzkGly8noD325RFr8YZv0enJhuHPQ6OqFa3Ln0uAVvuv5y+9Dktjpj4JFT/fDmSUhxY3rcRyuS7/+4hDaCa1VN3LOqiujw5WioBGkCuBKkIUOikKgeDuUVg+N8H8P2aoyiWKwjL+jZCgJ+v5mwcsd/BEZt6f6Yt7HvYAlu4POeCHZHoO2cXSufNjhX9Gj+wPw2gy3h160Bd1A21pSaiAbRUueVPlkInf42sFuHpK3Fo/k04ElPsmPxidbSqkF9zBKmXPrcCHHGAf03Ycv7k0qXPaQH2nLkNyyIuoHez0ujX6mEaQM0rp80E1EVtuFp9VBpAq68AyfKn0ElWEIaDt375D3/tPod6pXLh5+613TJirmK0R38I3JybuvuXaz5s/o+4OgTEY2vx+Dch2Y4lvRuifMEHf6qOO4AuI9atA3VRN9SWmogG0FLllj9ZCp38NbJShHde+7L47cxNlBpsHEmH4LjcXnz7Awh8HD5h37g17B87zuCdOTuVa19W9W+cqXGlAXQLsy6dqIu6YLbcJDSAliu53AlT6OSuj5WiE1+yeWLCRuw4dU23a18EX/uV7kDi2luXPv8Dm28ht7B3m74VKw9cVE7+ihPAmf1oADMj5L0/py56j72ZZ6YBNHN1DZgbhc6ARTNpyH/tPou3ftmBrP6+WPNeE+QL0eHal4QNcFztmko0Ww/4BL/nFt1rcYmoOXSFU6d/0yagAXQLtS6dqIu6YLbcJDSAliu53AlT6OSuj1WiS0hOQYtR4Th95SbeaVEG77TIfAfNUzbpL30Ogy3PSpcvfU6LYc7WUxj4255ML3++M2YaQE8rqF1/6qJ2bK08Mg2glasvYe4UOgmLYsGQJq89imFLDiBfSIDy+bSgLH6aU3DE/QZHzCBlHlvwR7Ble9HtObtM3YL1R6Lw3qMP482mpZ0ahwbQKUxeaURd9Ap2009KA2j6EhsrQQqdseplxmjFt3MbjViN6/HJGP7UI3imRhHN00x/6XNx2HIvdvnS57QgL11PQO1hK2B3AGvfa4qiuYKcip8G0ClMXmlEXfQKdtNPSgNo+hIbK0EKnbHqZcZov/grAlPXH1ceny7u3RC+PjbN03TEjocjdmzq7l/YeNgCW7o954yNJ/DJn/tQuUgYFr5Z3+lxaACdRqV7Q+qi7sgtMSENoCXKbJwkKXTGqZUZI73z0ufpXWuiycN5NU/TkXIJjqiWty59rgFbzp8zvbLlQUF1HL8BO09fw0ftyqNbgxJOx08D6DQq3RtSF3VHbokJaQAtUWbjJEmhM06tzBhp3zk7sWDHGZ0vff4IuDkndfcv5zzYslR2G+3xqBtoOnKNsmu5eVBz5AkOcHosGkCnUenekLqoO3JLTEgDaIkyGydJCp1xamW2SPedjUa7b9fD4QAWvdUAlQqHap6iI+kwHJcfv3Xpczv4hI3yaM5Ryw9h3MrDaPxQHsx4tZZLY9EAuoRL18bURV1xW2YyGkDLlNoYiVLojFEnM0b54g9bsO5wFB6vXBDfPldVlxTtV3sACeEA/GHL/Q9sfoXdnldcXN14xBqcuhKHsc9WQYcqrl0gTQPoNnrNO1IXNUdsyQloAC1ZdnmTptDJWxszR7b+cBS6/LAF/r42rOzXxOmTs54wcaS79Lk7fIIHeDIctp+8gicnbEJQFl9s+7CFy1fX0AB6hF/TztRFTfFadnAaQMuWXs7EKXRy1sXMUdntDnQYvwF7zkTjlXrFMaR9Bc3TTb30uROQfEAc+4UtzwrYfEI8mvfDP/bgp82n8ES1Qhj1TBWXx6IBdBmZbh2oi7qhttRENICWKrf8yVLo5K+R2SJcvPsc3vzlP2TL4ou1A5oiV3bnD064y8Jx83c4ot9XutuCP4Qt20vuDqX0E18uqT1sJa7FJWFWt1poWCaPy+PRALqMTLcO1EXdUFtqIhpAS5Vb/mQpdPLXyEwRJqfY0WrMWhy7dAN9mpdB35Z6fPLtJhyXWgH2C4BvsVuXPmfxCOvSPefw+s//KV8u2fh+c7fuLqQB9KgEmnamLmqK17KD0wBatvRyJk6hk7MuZo0q7Zu5OYL8ld2/4EB/zVN1xE6AI3Z06u5f2HewBbbyeM5u07di5YGLeL1JKQxsXdat8WgA3cKmSyfqoi6YLTcJDaDlSi53whQ6uetjpujik1LQbOQanI2Ox4dty6F7w5Kap+dIibp16fMNwL86bDl/8ejSZxHwxevxqPvlKqTYHVjZvzFK5cnuVh40gG5h06UTdVEXzJabhAbQciWXO2EKndz1MVN0P6w/js//ikD+kECsea8JAv19NU/PHv0JcHN26u6fh5c+pwU7ee1RDFtyANWKhuH3N5z/9NvdydIAal5+tyegLrqNjh0fQIAGkMtDKgIUOqnKYdpgYhOS0Wj4aly5kYgvn6iE52oV1TxXR/IROKLEpc8pQGBb+ISlPgb25Cfu/nt0zFocuhCLYZ0q4fna7udBA+hJJbTtS13Ulq9VR6cBtGrlJc2bQidpYUwW1tgVhzF6xSGUyJ0Ny/s2gp+vj+YZ2q/2BBLW3Lr0+W/Y/Ip4POfuyGto/90GBPj5YOuHLRDiwTuMNIAel0OzAaiLmqG19MA0gJYuv3zJU+jkq4nZIroWl4iGX6/G9YRkjHuuKtpXLqh5io6EjXBcfSV1nqBu8AkZqMqcHy/ci5mbTqJDlYIY+6xnXy+hAVSlJJoMQl3UBKvlB6UBtPwSkAsAhU6uepgxmhH/HMD41UdRNn8wlvRuCB8fm6ZpOhz2W5c+77916fNy2Hw8/86wOMRSa+gKxMQnu333352J0wBqugw8Gpy66BE+dr4PARpALg2pCFDopCqH6YK5HJuAhsNXIy4xBRO7VEfrivk1z9FxcwEc0ak7frbgD2DL9rIqcy7YEYm+c3ahUFhWrBvQ1GMjSwOoSlk0GYS6qAlWyw9KA2j5JSAXAAqdXPUwWzRfLtmPSWuPoWKhECx6q4HHV7BkxsfhEJc+PwrYzwO+RWHLvQQ2m2eXPqfN2XnSJmw5fgX9Wj6E3s3LZBZKpn9OA5gpIq81oC56Db2pJ6YBNHV5jZcchc54NTNKxOK+PHHyNz7Jjmmv1ECzsvk0Dz39pc/fwhb4qCpzHrsUi2bfhEM8vd7wfjMUCM3q8bg0gB4j1GwA6qJmaC09MA2gpcsvX/IUOvlqYpaIPl20Dz9uOIEqRcKw4I162u/+pbv0uRpsOWerNudXSw9gYvhRNCubF9NeqalKiWgAVcGoySDURU2wWn5QGkDLLwG5AFDo5KqHWaI5F30TjUesQWKyXZUDE85wsUcPAW7+ojS15ZwLW5YqznTLtE1Sil358kdUbAImvVgdj1ZQ5z1GGsBM0XutAXXRa+hNPTENoKnLa7zkKHTGq5kRIk67LqVW8ZyY81od1Xbi7pd7+kuf28AnbKxqmP7eex69ftqO3NkDsGlQM/irdIchDaBqJVJ9IOqi6kg5oPiLqUNcJc8fCUhCgEInSSFMFIay+zd8DRJT7Jjdow7qlsqleXb2q72AhFW3Ln1eCpuf+1/ouDvYV378F2sOXkKvxqXwfpuyquVCA6gaStUHoi6qjpQD0gByDchGgEInW0WMH88nC/dixqaTqFUiJ+a+VlfzhBwJm+G4+lLqPEFd4RMySLU5T1+JQ6MRqyH+2r7m3SYonjubamPTAKqGUvWBqIuqI+WANIBcA7IRoNDJVhFjx3M+Ol4xTOLdv1+610a90rk1TSj10ucngeR9gC0UtjwrVLn0OS3o4X8fwPdrjqJhmdyY1a22qrnQAKqKU9XBqIuq4uRgtwjwETCXglQEKHRSlcPwwQz5cx+mbzyBmsVzKLt/NpvGX/24uRCO6PcUbrbgwbBlu/X5NxVIChNb76uViIpNxMQu1dC6YgEVRv3/EDSAquJUdTDqoqo4ORgNINeAjAQodDJWxZgxXYiJV776IYzTz91ro77mu3/xty59Pqf6pc+iAn/tPou3ftmBvMEByt1/ah3+SKsuDaC865y6KG9tjBwZdwCNXD0Txk6hM2FRvZRS2r1/NYrlwLxeOuz+xU6EI3ZU6u5f2DjYAlurmvlzkzdj07HL6N2sNPq1eljVscVgNICqI1VtQOqiaig50B0EaAC5HKQiQKGTqhyGDebird2/BJ3u/XOkXIYjqgXguAH4V4Ut56+qPm4+cjEWLUalfvlj3cBmyvd/1f7RAKpNVL3xqIvqseRI/ydAA8jVIBUBCp1U5TBsMEMXR2DKuuOoVjQMv72u/Vc/7DFDgLi0S5/nwJalqqrsPv8rAj+sP44W5fJi6svqfPnj7gBpAFUtmaqDURdVxcnBbhGgAeRSkIoAhU6qchgymCs3EtHg61WIS0zBj6/URNOyeTXNw5F8FI6odgBSgEB1L30Wgd9MTEHtYSsQE5+saT40gJouE48Gpy56hI+d70OABpBLQyoCFDqpymHIYL5ZdhDfrjqCCgVD8NfbDVR9FJsREPvV14GElZpc+izm+/XfU3j/9z0omjNIufvPRzwH1uBHA6gBVJWGpC6qBJLDpCNAA8gFIRUBCp1U5TBcMDHxSaj/1Spcj0/GhBeqoU0lda9KuRuII2ELHFdfTP3PQa/AJ2SwqszEh5oeG7ce+8/F4IPHyqFHo5Kqjn/nYDSAmqH1eGDqoscIOUAGBGgAuSykIkChk6ochgtm/OojGPHPQZTOmx3L3mmk2W6ZAJN66fNTQPJewBZy69LnMFWZbTtxBU9N3IRAfx9sHtQcYUFZVB2fBlAznKoOTF1UFScHu0WABpBLQSoCFDqpymGoYOISk9Hg69UQ7wCO7lwZnaoW1jR+x80/4Yh+V5nDFvw+bNleVX2+t2fvwKJdZ9G5RhF8/dQjqo9PA6gpUtUGpy6qhpID3UGABpDLQSoCFDqpymGoYMQpWXFaVrwrt6p/Y/j5+mgWv8MhLn1uDdjPAr6FYcv9N2w2dXfnxFU29b5ahWS7Q3mXsWKhUM3yEQPzEbCmeD0anLroET52vg8BGkAuDakIUOikKodhgklITkGj4atxISYBXz5RCc/VKqpp7I7YyXDEjkzd/QsdA1vWx1Sfb+yKwxi94hCqF8uhXGWj9Y8GUGvC7o9PXXSfHXvenwANIFeHVAQodFKVwzDBzNl6CgN/24P8IYEIH9AEAX6+msXusF+B45K49DkW8K8CW845qp80TkqxK1fZCEM79tkq6FClkGb5pA1MA6g5YrcnoC66jY4dH0CABpDLQyoCFDqpymGIYFLsDrQcFY5jUTfwYdty6N5Qu5OyAog95jMg7qfU3T/xxY8s1VTntHDnGfT5dSfyiO/+DmyGLH7aPc6mAVS9fKoPSF1UHSkHFPrlEPcM8EcCkhCg0ElSCAOFsXTPObz+838IzeqPDe83Q/YAP82idyQfu3XpczIQ0Bo+OcZpMlfH8Ruw8/Q19G3xEPq0KKPJHHcPyh1AXTC7NQl10S1s7JQJARpALhGpCFDopCqH9MGIv792GL8BuyOj0btZafRr9bCmMduvvgEkrLh16fMS2PyKqT7ff6eu4onvNyKLrw82DmqG3NkDVJ8jowFpAHXB7NYk1EW3sLETDSDXgJEIUOiMVC3vx7r+cBS6/LBFuSdPPCrNpaFZciT+C8eVLqlJa3DpcxrNtKtfnqpeGCOfrqwbZBpA3VC7PBF10WVk7OAEAe4AOgGJTfQjQKHTj7UZZnph6mZsOHIZr9QrjiHtK2iW0r2XPi+HzSeH6vOdj45XDn+Iq18W926ACgW1vfrlzgRoAFUvp2oDUhdVQ8mB7iBAA8jlIBUBCp1U5ZA6mF2nrymPf319bAh/rwkK5wjSLF7HzUVwRPdXxrcFD4QtWzdN5hrxzwGMX30UtUrkxNzX6moyx/0GpQHUFbdLk1EXXcLFxk4SoAF0EhSb6UOAQqcPZzPM8ubP/2HxnnPoVLUQRneuollKDkcCHJce1fTSZxF8fFIK6n65ElfjkjCxSzW0rqjtd4zvBkYDqNkS8nhg6qLHCDlABgRoALkspCJAoZOqHNIGc+pyHJqMXA27A1japyHKFQjRLFZH7BQ4Ykek7v6FjoYta1tN5pr97ykM+n0PCoVlVXY0tfySSUYJ0ABqUlZVBqUuqoKRg9xFgAaQS+KBBL7//nuMGDEC586dQ4UKFTBmzBg0bNjwvn1+++03fPTRRzh69ChKlSqFoUOHolOnTk5TptA5jcrSDT9ZuBczNp1Eo4fyYOartTRjkf7S58qw5Zyr+qXPIni7uMtwdDiOXtLnLkMaQM2WjCYDUxc1wWr5QWkALb8E7g9gzpw5ePHFFyFMYP369TFp0iRMnToVERERKFr03k9tbdq0STGHn3/+uWL6FixYgI8//hjr169H7dq1nSJNoXMKk6UbXb2RqHwj92ZSCn7qVhsNyuTWjIc95nMgblbq7l/OX2DLUkOTuVYfuIiu07ciOMBPufolONBflXlOHzyD30b9hdrtqqNq80oIDLr/lTLcAVQFuSaDUBc1wWr5QWkALb8E7g9AmLZq1aphwoQJtxuVK1cOHTt2xJdffnlPx86dO0MI1dKlS2//WevWrZEjRw7Mnj3bKdIUOqcwWbrRtysP45vlh1C+QIhyUtZms2nCw5F8HI4o8bhXXPrcCj45vtNkHjHo81M2Y+PRy+jRsAQ+aFte1XkGtPwMO1buQUDWLIoJrNOuumIIcxfMmW4eGkBVsas6GHVRVZwc7BYBGkAuhQwJJCYmIigoCPPmzUv3CLdPnz7YuXMnwsPD7+kndgX79u2r/JP2Gz16tPLY+OTJk06RptA5hcmyjcRBCXFNSlRsIsZ0roKOVbX7Rq796ptAwnLY7T5Y/c8g3IjNqwn3yEQHRl5yQHzs7aN8NuTwU9fQHt5xDMumr7kn9jLVS6JO2+qo83h1lKlWEn+s2o3hP4hLroGV095GUGAWTfLloK4ToC66zow9MidAA5g5I0u2OHv2LAoVKoQNGzagXr16txkMGzYMM2bMwMGDB+/hkiVLFkyfPh3PP//87T/75Zdf0LVrVyQkJGTIUfz3O/9MCF2RIkUQHR2NkBDtXuy3ZFFNkHTaQYmCoYEIH9AU/r7afCNXufcvdjQSoiZjyc+5MPFj7Yzm+cca4HrF0si+/xgKLFrrlSrlKpgDhVpVxpmQAOUx8cRPnkVggDqPob2SkMkmpQE0WUElSYcGUJJCyBZGmgHcuHEj6tb9/31k4lDHrFmzcODAgQwNoDCHzz333O0/+/nnn9GtWzfEx8dnmOKQIUPw6aef3vNnNICyrQjvxyMOSrQYHY5jOh6UeL5IB8Tf8MH1a9p8Xzg5exCOv/YU4OuDIjMXIfD8Zd1Bi53Auu1qKDuBpauW0OyRuu6JmWhCGkATFVOiVGgAJSqGTKHo9QiYO4AyVV3uWFYduIBXp29TDkpsGtwc2QO0MWV3UkhKTNIUyohlhzB5/QnUKBaG2d20Oc38x7ilmDwg9SCL+CnvAraopJi+Wm2r3fMuoKYJc3C3CNAAuoWNnTIhQAPIJXJfAuIQSPXq1ZVTwGm/8uXLo0OHDvc9BHL9+nUsWbLkdvs2bdogLCyMh0C4zjwmkPbZNy0OSngcnBsDxCYkKxc/X49PxuQXq6NVhfxujPLgLgk3E/BSqbdg87Hdet+vBqo0q/jA08CqB8EBPSZAA+gxQg6QAQEaQC6L+xJIuwZm4sSJymPgyZMnY8qUKdi3bx+KFSuGl156SXlPMO1EsHhc3KhRI+XuP2ESFy5ciA8//JDXwHCNeUxg/7kYtBm7Dj42YO2Appp+9s3jYJ0cYMraYxi6ZD9K5smGFX0bw0ckp/Lv4qlLiI66zke7KnPVezgaQL2JW2M+GkBr1NntLMXu3/Dhw5WLoCtWrAhxqleYPPFr0qQJihcvrhz8SPvNnz9fMX3Hjh27fRH0E0884fT8FDqnUVmq4XvzdmHe9ki0rVQA41+oZvjcE5PtaDR8Nc7HxOPrJyuhc81779U0fJJMQDUC1EXVUHKgOwjQAHI5SEWAQidVOaQI5tL1BNT/ahUSU+z47fV6qF4shxRxeRLE/O2ReHfeLuQJDsD6gU0R4OfryXDsa3IC1EWTF9hL6dEAegk8p82YAIWOK+NuAqOXH8LYlYdRpUgY/nizvuEBidPMrceuxaELsRjYuixeb1LK8DkxAW0JUBe15WvV0WkArVp5SfOm0ElaGC+FJS5+Frt/l28kYtxzVdG+ckEvRaLetCv3X0C3GduUU8zis28hKn32Tb0IOZJsBKiLslXEHPHQAJqjjqbJgkJnmlKqksjcbacxYP5uFAgNVA5/aHXxsyrBOjnIMxM34d8TV/Bao5IY9Fg5J3uxmZUJUBetXH3tcqcB1I4tR3aDAIXODWgm7eJwONB23HpEnIsxzaPS7Sev4skJG+Hva8O6Ac2QPzTQpNVjWmoSoC6qSZNjpRGgAeRakIoAhU6qcng1mK0nruDpiZsQ4OeDzYOaI0c243+btvuMrVix/yKerl4YI56u7FW+nNw4BKiLxqmVkSKlATRStSwQK4XOAkV2MsU3f/kPi3efw7M1i+CrJx9xspe8zQ6cj0HrMetgswEr+jVGqTzZ5Q2WkUlFgLooVTlMEwwNoGlKaY5EKHTmqKOnWZyLvokGX69Git2BpX0aolyBEE+H9Hr/Pr/uwMKdZ01zl6HXgVooAOqihYqtY6o0gDrC5lSZE6DQZc7ICi1G/nMQ360+gtolcmLOa3UNn/LJyzfQdOQa2B3AX283QMVCoYbPiQnoR4C6qB9rK81EA2ilahsgVwqdAYqkcYh3Xv0y4YVqaFOpgMYzaj/8oN/3YPa/p9Dk4TyY3rWW9hNyBlMRoC6aqpzSJEMDKE0pGIggQKHjOkj7SkbBW1e/+Pn6GBrKhZh4NPx6tfIlk3m96qJm8ZyGzofB60+Auqg/cyvMSANohSobbw9s8gAAIABJREFUKEcKnYGKpVGo7b9bj92R0Xjv0YfxZtPSGs2i37BDF0dgyrrjqFk8B+b1qqffxJzJNASoi6YppVSJ0ABKVQ4GQ6Gz9hrYdfoaOozfgCy+Ptg0qBlyZQ8wNJArNxLR4OtViEtMwY9da6Lpw3kNnQ+D9w4B6qJ3uJt9VhpAs1fYYPlR6AxWMJXDfW/eLszbHolOVQthdOcqKo+u/3Bph1kqFAxRDn/YxB0w/JGAiwSoiy4CY3OnCNAAOoWJjfQiQKHTi7R881yLS0TtYSuRkGzHb6/XQ/ViOeQL0oWIouOSUP/rVYhNSMbELtXRumJ+F3qzKQn8nwB1katBCwI0gFpQ5ZhuE6DQuY3O8B2nrjuGLxbvR/kCIVjc2/i7ZWNWHMKYFYdRNn8wlvRuCB8f7v4ZfpF6KQHqopfAm3xaGkCTF9ho6VHojFYxdeK12x1o9s0anLgch2GdKuH52kXVGdhLo1yPT0L9r1YhJj4Z3z1fFe0eKeilSDitGQhQF81QRflyoAGUryaWjohCZ83yrz10CS9N+xfBAX7YPLg5sgX4GRrE+NVHMOKfgyiVJxuW9W0MX+7+Gbqe3g6euujtCphzfhpAc9bVsFlR6AxbOo8C7zFzG5ZHXMAr9YpjSPsKHo3l7c43EpKVk79X45IwpnMVdKxayNshcX6DE6AuGryAkoZPAyhpYawaFoXOepU/Hx2Pel+tVD6TtrxvI5TJF2xoCJPCj+LLpQdQPFcQVvRrDKNfZG3oYpgkeOqiSQopWRo0gJIVxOrhUOistwLGrTyMUcsPoVbxnJjby9jf/Y1LTFa++nH5RiKGP/UInqlRxHoFZcaqE6Auqo6UAwKgAeQykIoAhU6qcmgeTIrdgUbDV+PMtZsY3bkyOlUtrPmcWk4wMfwovlp6AEVzBmFl/8bwN/hn7LRkxbGdJ0BddJ4VWzpPgAbQeVZsqQMBCp0OkCWaYvXBi+j641aEZvXHlsHNEejvK1F0roUi3v1rOHw1xNc/Rj5dGU9VN7aZdS17ttaSAHVRS7rWHZsG0Lq1lzJzCp2UZdEsqJ4zt2FZxAV0rV8cnzxu7MMf3685guF/H0SJ3NmUdxn57p9my8ZyA1MXLVdyXRKmAdQFMydxlgCFzllSxm93IUYc/lgF8RjY6Ic/xNc+xMnfa3FJGPVMZTxRjbt/xl+h8mRAXZSnFmaKhAbQTNU0QS4UOhMU0ckUvlt1GCOXHULN4jkwr1c9J3vJ2Szt3r+SucW9f9z9k7NKxo2Kumjc2skcOQ2gzNWxYGwUOmsUXXz5o9GI1Yi8etPwO2Yx8UnKyd/om7z3zxqrV/8sqYv6M7fCjDSAVqiygXKk0BmoWB6EuuFIFF6YugXBgX7Y+kELQx/+SLvGhl/98GBBsOsDCVAXuUC0IEADqAVVjuk2AQqd2+gM1bH37B34c9dZdKlTFF90rGSo2O8M9lpcorL7dz0hGeOeq4r2lfnNX8MWU+LAqYsSF8fAodEAGrh4ZgydQmfGqqbPKTouCTWHrUBish1/vlUfjxQOM2zSX/99ABPWHEXZ/MFY0rshfPjNX8PWUubAqYsyV8e4sdEAGrd2poycQmfKsqZLatamE/ho4T7FNC3t0xA2m82QSV+8Ho/Gw9fgZlIKprxUAy3L5zNkHgxafgLURflrZMQIaQCNWDUTx0yhM3Fxb6XW7tt12HsmBh+3K49XG5QwbMJD/tyH6RtPoHKRMPzxRj3DGlnDFsBCgVMXLVRsHVOlAdQRNqfKnACFLnNGRm6x72w02o5bD39fG7YMboGc2bIYMp2z126iyYg1SEyx46dutdGgTG5D5sGgjUGAumiMOhktShpAo1XM5PFS6Mxd4LRds7aVCmD8C9UMm+yg33dj9r+nUadkTszuUYe7f4atpDECpy4ao05Gi5IG0GgVM3m8FDrzFlgc+qg9bAWuxiXhx6410fThvIZM9kTUDTQfFa58wWR+r7qoUTynIfNg0MYhQF00Tq2MFCkNoJGqZYFYKXTmLfKyfefRc9Z25AkOwKb3mxn2W7lvz96BRbvOosnDeTC9ay3zFoyZSUOAuihNKUwVCA2gqcpp/GQodMav4f0y6DVrO/4WJrBRSQx+rJwhE917Jhrtvl0PcXB58dsNUb5giCHzYNDGIkBdNFa9jBItDaBRKmWROCl05iz01RuJqDVsBZJSHPj7nYYom9+YxunFH7Zg3eEodKxSEGOerWrOYjEr6QhQF6UriSkCogE0RRnNkwSFzjy1vDOTtLv/yhcIwZI+DQ2Z5MYjUXh+6hblBPPKfk1QNFeQIfNg0MYjQF00Xs2MEDENoBGqZKEYKXTmLHbH8Ruw8/Q1fNi2HLo3LGm4JB0OB0QOuyKj8XLdYvi0Q0XD5cCAjUuAumjc2skcOQ2gzNWxYGwUOvMV/eilWDT/Jhy+PjZsHtRcOQRitN+SPefwxs//ISiLL8Lfa2rIHIzGnPH+nwB1katBCwI0gFpQ5ZhuE6DQuY1O2o7fLDuIb1cdQdOH8+BHA56aTU6xo9XotTgWdQO9m5dBv5YPScuagZmTAHXRnHX1dlY0gN6uAOdPR4BCZ64FIR6dNh6xBqeuxGHss1XQoUohwyX40+aT+PCPvcpXS8Lfa4LgQH/D5cCAjU2Aumjs+skaPQ2grJWxaFwUOnMVfsepq+j0/Ubl0em2D1sgKIufoRKMTUhGkxGrERWbiE/bV8DL9YobKn4Gaw4C1EVz1FG2LGgAZauIxeOh0JlrAaR9+s2o16akPb4unisIy/o2RhY/H3MViNkYggB10RBlMlyQNICGK5m5A6bQmae+4t25Ol+uVHbPfnylJpqWNdan385Hx6PJyNWIT7JjwgvV0KZSAfMUh5kYigB10VDlMkywNICGKZU1AqXQmafOaw9dwkvT/lXendsyuDn8fY21ezZg/i7M3RaJ6sVyKN/8tYnPf/BHAl4gQF30AnQLTEkDaIEiGylFCp2RqvXgWPvP3YXf/ovEi3WK4fOOxro378D5GLQZuw4OB/Db63VRvVhO8xSGmRiOAHXRcCUzRMA0gIYok3WCpNCZo9bxSSmo+cUKXE9IxrxedVGzuLEM1MvT/kX4oUtoUzE/JnSpbo6iMAvDEqAuGrZ0UgdOAyh1eawXHIXOHDVfHnEBPWZuQ/6QQGx8vxl8fIzz+FQYP2EA/XxsWN6vMUrkzmaOojALwxKgLhq2dFIHTgModXmsFxyFzhw1f+fXHfhj51m8Wr8EPn68vGGSEgdXxKPfwxdjDRe7YSAzUJcJUBddRsYOThCgAXQCEpvoR4BCpx9rrWYSj39rfLEC4g69316vpxyiMMpv1uaT+OiPvQgL8kf4u00RGsRLn41SOzPHSV00c3W9lxsNoPfYc+YMCFDojL8slu07j56ztqNgaCDWDzTO49/om0loOnINrtzgpc/GX4XmyoC6aK56ypINDaAslWAcCgEKnfEXQp9fd2DhzrPo3qAEPmxnnMe/QxdHYMq64yidNzuW9mlouGtrjL9ymMH9CFAXuTa0IEADqAVVjuk2AQqd2+ik6Cge/1b/fDluJKZgwRv1ULWoMR7/noi6gZajw5GU4sCPXWui6cPGurRaiuIzCM0IUBc1Q2vpgWkALV1++ZKn0MlXE1ciSjv9Kx7/bni/mWEuT+45cxuWRVxA44fyYMartVxJmW1JQHMC1EXNEVtyAhpAS5Zd3qQpdPLWxpnI3p23C/O3R+KVesUxpH0FZ7p4vc26w5fw4g//wtfHhr/7NESZfMFej4kBkMCdBKiLXA9aEKAB1IIqx3SbAIXObXRe7yiuUKkxdAWuxSVhdo86qFsql9djyiyApFvXvhy5GIuu9Yvjk8eNYVozy4t/bi4C1EVz1VOWbGgAZamEZHFcvXoVvXv3xp9//qlE1r59e3z77bcICwu7b6RNmjRBeHh4uj/v3Lkzfv31V6ezo9A5jUq6hhuPROH5qVuUb//+O7g5/Azw7d8f1h/H539FKDGvfrcJQrPy2hfpFhYD4uE4rgFNCNAAaoLV+IO2adMGkZGRmDx5spJMz549Ubx4cSxatOiBBvChhx7CZ599drtN1qxZERoa6jQQGkCnUUnX8JOFezFj00k8U6Mwhj9VWbr47g4oKjYBTUesUT5X99UTlfBsraLSx8wArUmAumjNumudNQ2g1oQNOP7+/ftRvnx5bN68GbVr11YyEP9et25dHDhwAA8//HCGWYkdwCpVqmDMmDFuZ02hcxudVzva7Q7U+2oVzsfE44eXa6B5uXxejceZyQfM34W52yJRqVAo/nizvvIOIH8kICMB6qKMVTF+TDSAxq+h6hlMmzYN/fr1w7Vr19KNLR7/jh49Gl27dr2vAdy3bx8cDgfy5csHsYv4ySefIDjY+ZfqKXSql1OXAXedvoYO4zcgWxZfbP+oJQL9fXWZ191Jdp6+ho7jNyjdjfa1EndzZj/jEqAuGrd2MkdOAyhzdbwU27BhwzB9+nQcOnQoXQTi8a4wf4MGDcowsilTpqBEiRLInz8/9u7dq7QrXbo0li9fft9MEhISIP5J+wmhK1KkCKKjoxESEuIlApzWVQKjlh/CuJWH0aZifkzoUt3V7rq2F7uVnSZshDCtT1QrhFHPVNF1fk5GAq4SoAF0lRjbO0OABtAZSiZpM2TIEHz66acPzGbr1q1YtmwZZsyYgYMHD6ZrW6ZMGXTr1g3vv/++U0S2b9+OGjVqQPzPatWqZdjnfjHRADqFWJpG7b5dh71nYjDy6cp4qnphaeLKKJBftpzC4AV7kD3AD6v6N0bekECp42VwJEADyDWgBQEaQC2oSjpmVFQUxD8P+omDHr/88otbj4DvHlc8Cg4ICMCsWbMgTgNn9OMOoKSLxYWwzkfHo86XK2GzAVs/aIHc2QNc6K1v08uxCWj2TTjEd38/blcerzYooW8AnI0E3CBAA+gGNHbJlAANYKaIrNcg7RDIli1bUKtW6lcRxL/XqVPngYdA7iYlHgNXqlRJuRqmUaNGToGk0DmFSapGaTtqVYuGYcEb9aWK7e5g0g5+lCsQgkVv1TfEVTVSA2VwuhCgLuqC2XKT0ABaruTOJSwOcJw9exaTJk1SOohrYIoVK3b7GpgzZ86gefPmmDlzpmISjx49ip9//hmPPfYYcufOjYiICPTv3x/iGhjxWNnX17lDARQ65+ojU6vuM7Zixf6LeLfVQ3irWRmZQksXy/aTV/DkhE3Kf/vt9bqoXiyntLEyMBK4kwB1ketBCwI0gFpQNcGYV65cueci6O++++72RdAnTpxQDnysXr0a4vqX06dPo0uXLsrhj9jYWOUgR9u2bZVTwDlzOv//aCl0xlo88UkpqPLZMsQn2bGkd0OULyjnwR3xlZLHv9uA/ediDHNPobFWAqPVkgB1UUu61h2bBtC6tZcycwqdlGW5b1BrD13CS9P+Rf6QQGwa1Aw28SKghL+0L36IL32Igx+5JH5PUUJ8DMnLBKiLXi6ASaenATRpYY2aFoXOWJX74q8ITF1/XOpdtTPXbqLlqHDEJaZgWKdKeL42v/hhrFXGaKmLXANaEKAB1IIqx3SbAIXObXRe6dhqdDgOXYjFt89VxeOVC3olhgdNKk6i95i5TXlHsUaxHJj7Wl348Isf0tWJAT2YAHWRK0QLAjSAWlDlmG4ToNC5jU73jnde//Lfhy2RI1sW3WPIbMK/955Dr5/+g7+vDYt7N8RD+Zz/Kk1mY/PPSUAvAtRFvUhbax4aQGvVW/psKXTSl+h2gHO3ncaA+btRuUgYFr4p3/UvMfFJyqPfCzEJeKtpabz7aMbfsDYOcUZqVQLURatWXtu8aQC15cvRXSRAoXMRmBebvz17BxbtOou3m5VG/1bymauPF+7FzE0nUTxXEP5+p5H03yf2Yik5teQEqIuSF8ig4dEAGrRwZg2bQmeMyop362oOXYGo2ETM6VkHtUvmkirw7Sev4qmJG+FwAD93r436pXNLFR+DIQFXCFAXXaHFts4SoAF0lhTb6UKAQqcLZo8nOXzhOlqOXosAPx/sHtIKAX7OXfTt8cRODJCQnIK249bjyMVYPFGtEEY9U8WJXmxCAvISoC7KWxsjR0YDaOTqmTB2Cp0xijpz0wl8vHAf6pfOhZ+715Eq6JH/HMR3q48o3yRe0a8RwoLkO5wiFTAGIz0B6qL0JTJkgDSAhiybeYOm0Bmjtm/8vB1L9pxH/5YP4e3m8nz+bd/ZaLT/bgNS7A5MeKEa2lQqYAygjJIEHkCAusjloQUBGkAtqHJMtwlQ6NxGp1tHu92BGkNX4MqNRMzvVRc1ijv/qT8tg0xKsaPj+A3YdzYGj1XKj+9fqK7ldBybBHQjQF3UDbWlJqIBtFS55U+WQid/jQ5duI5Wo9ci0N8Huz95FFn8fKQIevzqIxjxz0GEBfljed/GyBMcIEVcDIIEPCVAXfSUIPtnRIAGkOtCKgIUOqnKkWEwv2w5hcEL9qBuyVyY3VOO9/+EKW03bj0SU+wY9UxlPFGtsPwgGSEJOEmAuugkKDZziQANoEu42FhrAhQ6rQl7Pv6783Zh/vZIaS5XFo9+O32/AXvPxKB52byY+nIN2Gw2zxPlCCQgCQHqoiSFMFkYNIAmK6jR06HQyV/BZiPX4FjUDUx7pQaalc3n9YBHLz+EsSsPK49+l/VthLzBgV6PiQGQgJoEqItq0uRYaQRoALkWpCJAoZOqHPcEIw5+VPt8ufLfd3zk/e//7omMRsfvU0/9fvd8VbR7pKDcABkdCbhBgLroBjR2yZQADWCmiNhATwIUOj1puz7Xyv0X0G3GNpTMkw2r+jdxfQAVe8QnpeDxb9fj8MVYtHukAL57vpqKo3MoEpCHAHVRnlqYKRIaQDNV0wS5UOjkLuKo5YcwbuVhKb6w8cVfEZi6/rhy4fPyvo2QIxsvfJZ79TA6dwlQF90lx34PIkADyPUhFQEKnVTluCeY7jO2YsX+i/jk8fLoWr+E14Jdd/gSXvzhX2X+H16ugeblvP8uotdgcGLTE6Aumr7EXkmQBtAr2Dnp/QhQ6OReG3WGrcT5mHjM61UXNb10AbR4D7H1mLW4eD0BXeoUxRcdK8kNjdGRgIcEqIseAmT3DAnQAHJhSEWAQidVOdIFExWbgBpfrIC4YWXPkEeRPcBP92AdDgd6ztqO5REXUDpvdix6qwGyZvHVPQ5OSAJ6EqAu6knbOnPRAFqn1obIlEInb5nCD13Cy9P+9eoBkNn/nsKg3/fA39eGP96sjwoFQ+UFxshIQCUC1EWVQHKYdARoALkgpCJAoZOqHOmCmbL2GIYu2Y+2lQpg/Av6n7g9fOE62n+3ATeTUvDBY+XQo1FJeWExMhJQkQB1UUWYHOo2ARpALgapCFDopCpHumAGzt+NOdtOo0/zMujb8iFdA72ZmIIO49fj0IVYNCyTGzO61oKPD7/2oWsROJnXCFAXvYbe1BPTAJq6vMZLjkInb82enLAR209exbjnqqJ9ZX0vXB4wfxfmbotEnuAALOndUPmf/JGAVQhQF61SaX3zpAHUlzdny4QAhU7OJSIOX1T5bDmibyYpBqx8wRDdAv39v0j0m7sLYsPvp+61Ua9Ubt3m5kQkIAMB6qIMVTBfDDSA5qupoTOi0MlZvsuxCah+6wRwxKetdTt5e+Ri6nt/cYkp6NviIfRpUUZOQIyKBDQkQF3UEK6Fh6YBtHDxZUydQidjVYDdkdcUI5YvJABbBrfQJcjr8UnoMH4Djl26gfqlc2Hmq7Xhy/f+dGHPSeQiQF2Uqx5miYYG0CyVNEkeFDo5C/n33nPo9dN/qFo0DAveqK95kHa7A71+2o5lERdQIDQQi95uoHzyjT8SsCIB6qIVq659zjSA2jPmDC4QoNC5AEvHptPWH8dnf0XodgXM+NVHMOKfg8ji64O5veqiSpEwHbPlVCQgFwHqolz1MEs0NIBmqaRJ8qDQyVnIL/6KwNT1x9G9QQl82K68pkGuOXgRXadvhcMBfPVEJTxbq6im83FwEpCdAHVR9goZMz4aQGPWzbRRU+jkLG2/OTvx+44zGNSmLF5rXEqzIMVlz098vxHXE5LxXK2i+PIJfudXM9gc2DAEqIuGKZWhAqUBNFS5zB8shU7OGnefsRUr9l/UdEdOnDTu+P0GnL5yEzWL51CufAnw43d+5VwRjEpPAtRFPWlbZy4aQOvU2hCZUujkLNPTEzdi64mr+P6FanisUgHVg0xITsELU7Zg28mrKJozSPnOb85sWVSfhwOSgBEJUBeNWDX5Y6YBlL9GloqQQidnuVuPWYsD56/jp2610aCMuhcxixO//ebuxB87zyI40A8L3qiH0nmD5QTBqEjACwSoi16AboEpaQAtUGQjpUihk7NaLUeF4/DFWMzuUQd1S+VSNcihiyMwZd1x5Y6/6V1romGZPKqOz8FIwOgEqItGr6Cc8dMAylkXy0ZFoZOz9FoZwEnhR/Hl0gNK0t88XRlPVi8sJwBGRQJeJEBd9CJ8E09NA2ji4hoxNQqdnFXTwgDO23Ya783frSQ8+LGy6NlIu9PFclJlVCTgHAHqonOc2Mo1AjSArvFia40JUOg0Buzm8I9/ux57zkRj2is10KxsPjdH+X+3BTsi0X/uLtgdQM9GJTH4sXIej8kBSMCsBKiLZq2sd/OiAfQuf85+FwEKnZxL4pUf/8Wag5cw/KlH8EyNIh4Feaf5E3f9De1YET78xq9HTNnZ3ASoi+aur7eyowH0FnnOmyEBCp2cC0Oc0v39vzMY0PphvNGktNtBzt8eiQHzU3f+aP7cxsiOFiNAXbRYwXVKlwZQJ9CcxjkCFDrnOOndauyKwxi94hCeqFoIozpXcXl6h8OBCeFHMfzvg0pfmj+XEbKDhQlQFy1cfA1TpwHUEC6Hdp0Ahc51Znr0WHXgAl6dvg2l82bHin6NXZoyxe7AZ4v2Ycamk0q/1xqVxMDWZfnY1yWKbGxlAtRFK1dfu9xpALVjy5HdIEChcwOaDl0uXU9AzaErYLMB6wc2Q6GwrE7NGhWbgN6zd2Dj0ctK34/alserDUo41ZeNSIAEUglQF7kStCBAA6gFVY7pNgEKndvoNO/YedImbDl+Be+2eghvNSuT6Xybj11Gn1934EJMAoKy+GLk05U1+YxcpoGwAQkYnAB10eAFlDR8GkBJC2PVsCh08lZeHOB4d94uhAT6YUX/xsgbHJhhsNfiEvHV0gP4detp5c/FY+OJXarx827ylpaRSU6Auih5gQwaHg2gQQtn1rApdPJWNjnFjk7fb1TuA6xcOBRTXqqBvCH/N4EXr8dj1qaTmLX5JK7FJSmJPFuzCD5qVx7ZAvzkTYyRkYDkBKiLkhfIoOHRABq0cGYNm0Ind2UPnr+OzpM3KQYvi68P6pTKheAAPxyLuoED52PgcKTGXyZvdgx7ohJqFs8pd0KMjgQMQIC6aIAiGTBEGkADFs3MIVPo5K/u8agbyrt9uyOj7wm2WtEw9GhYEq0q5IcvL3eWv5iM0BAEqIuGKJPhgqQBNFzJzB0whc4Y9RX3+kWci8HO09eQmGxX3gesWSLHfd8LNEZWjJIE5CRAXZSzLkaPigbQ6BU0WfwUOpMVlOmQAAl4TIC66DFCDpABARpALgupCFDopCoHgyEBEpCAAHVRgiKYMAQaQBMW1cgpUeiMXD3GTgIkoAUB6qIWVDkmDSDXgFQEKHRSlYPBkAAJSECAuihBEUwYAg2gCYtq5JQodEauHmMnARLQggB1UQuqHJMGkGtAKgIUOqnKwWBIgAQkIEBdlKAIJgyBBtCERTVyShQ6I1ePsZMACWhBgLqoBVWOSQPINSAVAQqdVOVgMCRAAhIQ+F97ZwKt1RT28aeQUClDKaWSEmVIiAYVlnlJWCyWDEuDWRnK2ECDZMgQilQs0ypFlJKlblGIZCpZidy6plaDErWob/2377zfvW93OO/53vd0znt+e6273Ny9z9nP79lnn//ez9770C9GwAl5WAUEYB46NRsmDRkyxKZNm2aLFy+2KlWq2Pr16yu8rA4HHjRokI0ZM8bWrVtnbdq0sVGjRlmLFi0qLOtloKPzjYqMEIBAQgjQLybE0SGbiQAMGXhcbjdgwACrWbOmrVq1ysaOHetLAA4fPtwkHMePH2/NmjWzwYMH29y5c23ZsmVWvXp1X6bT0fnCRCYIQCBBBOgXE+TsEE1FAIYIO463kpjr3bt3hQJQs3/16tVzefv16+dM3bJli9WpU8ckDHv16uXLfDo6X5jIBAEIJIgA/WKCnB2iqQjAEGHH8VZ+BeCKFSusSZMmtmjRImvVqlXK1C5duriZxAkTJvgyn47OFyYyQQACCSJAv5ggZ4doKgIwRNhxvJVfATh//nxr166drV692s0Eeqlnz562cuVKmzlzZqnma5ZQP15SR9egQQPbsGGD1ahRI47IqDMEIACBrBJAAGYVJxf7XwIIwAQ1hYEDB7pNGuWlhQsX2rHHHpvKkqkALCoqsrp166bK9+jRwwoLC23GjBml3rasOiEAE9QwMRUCECiXAAKQBpILAgjAXFCN6DXXrFlj+ikvNWrUyKpWrZqxAAwaAmYGMKKNhWpBAAKRIYAAjIwr8qoiCMC8cmf2jfE7A+htAunTp4/17dvXVWTr1q1Wu3ZtNoFk3y1cEQIQSBABBGCCnB2iqQjAEGHH6VY//fSTrV271qZOnWojRoywefPmueofcsghVq1aNfd78+bNbdiwYda1a1f3b+321b/HjRtnTZs2taFDh9qcOXM4BiZOjqeuEIBA5AggACPnkryoEAIwL9yYfSOuvPLKUnfuzp492zp16uRuWKlSJSf2lFfJOwh69OjRJQ6Cbtmype8K0tH5RkVGCEAgIQToFxPi6JDNRACGDJzblU+Ajo4WAgEIQKAkAfpFWkQuCCAAc0GVawYmQEcXGB0FIQCBPCXiY3aLAAAYTElEQVRAv5injt3JZiEAd7IDuD0jXdoABCAAgfIIIABpH7kggADMBVWuGZgAHV1gdBSEAATylAD9Yp46diebhQDcyQ7g9swA0gYgAAEIMANIGwibAAIwbOLcr1wCjHRpIBCAAAQYGNMGck8AAZh7xtwhAwIIwAxgkRUCEEgEAfrFRLg5dCMRgKEj54aEOmgDEIAABPwTQAD6Z0VO/wQQgP5ZkTMEAnR0IUDmFhCAQKwI0C/Gyl2xqSwCMDauSkZF6eiS4WeshAAE/BOgX/TPipz+CSAA/bMiZwgE6OhCgMwtIACBWBGgX4yVu2JTWQRgbFyVjIrS0SXDz1gJAQj4J0C/6J8VOf0TQAD6Z0XOEAjQ0YUAmVtAAAKxIkC/GCt3xaayCMDYuCoZFaWjS4afsRICEPBPgH7RPyty+ieAAPTPipwhEKCjCwEyt4AABGJFgH4xVu6KTWURgLFxVTIqSkeXDD9jJQQg4J8A/aJ/VuT0TwAB6J8VOUMgQEcXAmRuAQEIxIoA/WKs3BWbyiIAY+OqZFSUji4ZfsZKCEDAPwH6Rf+syOmfAALQPytyhkCAji4EyNwCAhCIFQH6xVi5KzaVRQDGxlXJqCgdXTL8jJUQgIB/AvSL/lmR0z8BBKB/VuQMgQAdXQiQuQUEIBArAvSLsXJXbCqLAIyNq5JR0Q0bNljNmjWtsLDQatSokQyjsRICEIBAOQQkABs0aGDr16+3vffeG1YQyAoBBGBWMHKRbBFYtWqV6+hIEIAABCBQkoAGxvXr1wcLBLJCAAGYFYxcJFsEtm3bZkVFRVa9enWrVKlSti5b6nW8UTWzjf/hgUfJZgIPeJTXAYXZPrZv324bN260evXqWeXKlXPaL3Lx5BBAACbH11iaRoB1NTu+4BVeUhie8Pt/ghge/9dG4MHzwkskvwggAPPLn1iTAQFeaLzQKprhQQAiAMtqI/QfGXS2ZI0kAQRgJN1CpcIgQAeOAEQA+n/SeF54Xvy3FnLGgQACMA5eoo45IbBlyxYbNmyY3Xnnnbb77rvn5B5xuig8SnoLHvAo7/mlfcSpd6OupRFAANIuIAABCEAAAhCAQMIIIAAT5nDMhQAEIAABCEAAAghA2gAEIAABCEAAAhBIGAEEYMIcjrkQgAAEIAABCEAAAUgbgAAEIAABCEAAAgkjgABMmMOTbu6QIUNs2rRptnjxYqtSpYr7tmZFSafwDxo0yMaMGWPr1q2zNm3a2KhRo6xFixYVFY3832XPTTfdZFOnTnV1Pffcc+2JJ55w32MuK3Xq1MkKCgpK/Pniiy+2V199NfL2plfwqaeeshEjRtjPP//s/Dly5Ejr0KFDmXa8/vrrdu+999r3339vTZo0MbWnrl27xs7usiqcCY/x48fbVVddtcOl/vrrL6tatWrsmcydO9e1jc8++8y1jylTpth5551Xrl16Lm655Rb75ptv3Fc7+vbta9dcc03sWWBAfhJAAOanX7GqDAIDBgxw4kbfHB47dqwvATh8+HD3otcLr1mzZjZ48GDTy2HZsmXuk3VxTmeeeaZjIXGr1LNnT2vUqJG99dZb5QpAcbjvvvtSefbYY4/YfaT+tddes27duplET7t27Wz06NH23HPP2ZIlS+yggw7awf4FCxY4cXj//fc70SdB0L9/f/vggw/coCDuKVMeeh5uvvlm9xwUTwcccEDcUbj6v/POO/bhhx/aMcccYxdccEGFAvCHH36wli1bWo8ePaxXr16u7HXXXWevvPKKK0+CQNQIIACj5hHqEwoBvbx69+5doQDU7J9G8srbr18/Vzed/1WnTh2TMFRHH9e0dOlSO/zww+2jjz5KCRj9fuKJJ9q3335rhx56aKmmaQbw6KOPdrNlcU4SbXq5P/300ykzDjvsMDfLo/Mh05NmOXUYsoSBl8444wyrVauWe8nHPWXKw+8zFHcuqr++S17RDKD6B82k67nykmb/vvjiC9PggQSBqBFAAEbNI9QnFAJ+X14rVqxwob5FixZZq1atUnXr0qWLm0mcMGFCKPXNxU2ef/55F65KD4PLrkcffbTU8J7qIQGoEJfEsYSwZhE1sxqn2dCtW7fannvuaRMnTiwRwtWMlpYHpIe4ZbdmBfv06eN+vCROEsIrV67MhYtCu2YQHnqGunfvbgceeKD9+++/blCg2dHiz0loBuT4Rn4E4EknneRsf+yxx1K1kWi86KKLbPPmzbbbbrvluJZcHgKZEUAAZsaL3HlCwK8AnD9/vgsPrl692s0EekmhUr30Z86cGVsiQ4cOdWHt7777roQNCu9qbZe+kFJaevbZZ61x48amUN/XX3/t8h1yyCE2a9as2LAoKipywkVhurZt26bqLSYS9elhTWXQmlHxuvTSS1P5X375ZcdKs8JxTkF4aLZ4+fLldsQRR7iZUQmf6dOnuxmvpk2bxhnHDnX3IwD13Fx55ZV21113pcp7/Yf41q1bN6+YYEz8CSAA4+/DxFswcOBAt0mjvLRw4UI79thjU1kyFYDpHbjW+RQWFtqMGTMix98vj3fffbdUsaOX99VXX2133HGHL9u0SF5s9V+FVOOQPMGjF7RC3l7SWs8XX3zRhcDTkwSgxOEll1yS+tNLL73kWP39999xMLvMOgbhkX6xbdu2Of9rJuzxxx+PNY/0yvsVgOkDJw0w2rdv7zaR5MvayLxybMKNQQAmvAHkg/lr1qwx/ZSXtLGh+M5EvwIwjiFgvzw0exUkBJzOWaFgfUtZwknr5OKQgoQ8CQFX7FkNjLSpqPg6yYpLRT+HHwFICDj6fqSGJQkgAGkRiSTgVwB6m0C07ktHOihJPNSuXTtvNoF8/PHHdvzxxzvb9PsJJ5xQ7iaQ9AajMLDCgFo3p5dgXJI2PbRu3drtAvaSNsVofWdZm0A2btzowpxe0vpHrZnMl00gmfAobSCgdqS2oPWl+ZT8CEBtAtHuee0i99K1117r1pSyCSSfWkP+2IIAzB9fYokPAj/99JOtXbvW7dbTGV/z5s1zpbSGrVq1au735s2bOwHgne+m3b7697hx49zaJq0TmzNnTt4cA6Pwn45AUdLaxoYNG6aOgdHax1NOOcVeeOEFJxJ1/p3CnmeddZbtt99+7mV36623mo6BUZh9l1128eGFaGTxjj155plnXBhYR+FofaM2uIjB5Zdf7tYJemJQ4WIJXIWJJRLffPNNu+eee/LuGBi/PLTsQoMFPRNaA6iwr2aBFfb0BhTR8HSwWmzatMmtcVTS5o5HHnnEOnfubPvss4/bEKS1r3o+9GwoecfA6GQAzYRK9GkXMMfABONPqdwTQADmnjF3iBABLdIubefu7Nmz3e5WJY32JfaUV8k7CFoiqfhB0DrzK+5JYjj9IOgnn3wydRD0jz/+6DZ8eHy07vGyyy5zmz/0gmzQoIGdffbZbhewXoxxS5r9e/DBB90aLflTu3q9WUy1By0d0GyxlyZNmuREn7c0QGLw/PPPj5vZZdY3Ex6aFZ88ebL98ssv7gxIiSStPy2+pjLOYDTIk+BLT1dccYVrE+of9Hwon5c0Cy4u3kHQmhXkIOg4t4L8rjsCML/9i3UQgAAEIAABCEBgBwIIQBoFBCAAAQhAAAIQSBgBBGDCHI65EIAABCAAAQhAAAFIG4AABCAAAQhAAAIJI4AATJjDMRcCEIAABCAAAQggAGkDEIAABCAAAQhAIGEEEIAJczjmQgACEIAABCAAAQQgbQACEIAABCAAAQgkjAACMGEOx1wIQAACEIAABCCAAKQNQAACEIAABCAAgYQRQAAmzOGYCwEIQAACEIAABBCAtAEIQAACEIAABCCQMAIIwIQ5HHMhAAEIQAACEIAAApA2AAEIQAACEIAABBJGAAGYMIdjLgQgAAEIQAACEEAA0gYgAAEIQAACEIBAwgggABPmcMyFAAQgAAEIQAACCEDaAAQgAAEIQAACEEgYAQRgwhyOuRCAAAQgAAEIQAABSBuAAAQgAAEIQAACCSOAAEyYwzEXAhCAAAQgAAEIIABpAxCAAAQgAAEIQCBhBBCACXM45kIAAhCAAAQgAAEEIG0AAhCAAAQgAAEIJIwAAjBhDsdcCEAAAhCAAAQggACkDUAAAhCAAAQgAIGEEUAAJszhmAsBCEAAAvlFYNu2bVZUVGTVq1e3SpUq5ZdxPqzZvn27bdy40erVq2eVK1f2UYIsIoAApB1AAAIQgAAEYkxg1apV1qBBgxhbkJ2qFxYWWv369bNzsQRcBQGYACdjIgQgAAEI5C+BDRs2WM2aNa2goMCqVauWv4aWYdmmTZusY8eOtn79ett7770TZ39QgxGAQclRDgIQgAAEIBABAn/88YcTPp999lliBWDr1q1NQrhGjRoR8Eg8qoAAjIefqCUEIAABCECgVAIIwE2GAMz84UAAZs6MEhCAAAQgAIHIEEAAIgCDNEYEYBBqlIEABCAAAQhEhAACEAEYpCkiAINQowwEIAABCEAgIgQQgAjAIE0RARiEGmUgAAEIQAACESGAAEQABmmKCMAg1CgDAQhAAAIQiAgBBCACMEhTRAAGoRbBMkk/CT6CLqFKEIBASASS/iUIBCACMMijhgAMQq2MMj/++KM1btzYPv/8czv66KOzeOWKL8VJ8BUzIgcEIJDfBJL6JYgwBeDHH39sl19+uS1cuDAyZ+7pIGiOgcn82UYA+mRW0fcVr7jiChs7dqz9/vvvtt9++9muu+7q88rZyeadBF84fbrVaNcuOxflKhCAAARiQEACSJ9Cq+hLEE899ZSNGDHCfv75Z2vRooWNHDnSOnToUKaFr7/+ut177732/fffW5MmTWzIkCHWtWvXVH7NPA4aNMjGjBlj69atszZt2tioUaPctcNM2RaAd9xxh02ZMsWZoHfZAQccYKeddprdeOON9tVXXyEAw3RuDu+FAPQJ95dffknlfO2116x///62bNmy1P/bY489duonaLwOYENBgdU46SSfVpENAhCAQPwJpPq/cr4EoX67W7duJhHYrl07Gz16tD333HO2ZMkSO+igg3aAsGDBAicO77//fif6JIjU73/wwQdO6CkNHz7cicLx48dbs2bNbPDgwTZ37lz3bqhevXpoYHMhANesWWPDhg2zf/75xz799FO755577LzzzrOzzjoLARiaZ3N7IwRgAL562Hv37u1Gm8VTegh4zpw51rlzZ5sxY4ZpRPXtt9/aiSeeaK+++qr7ZM8tt9xiq1evtrPPPtvNHu65557uchpVapT6zDPPuJGqOhaNQi+88MIya4sADOBIikAAAnlBwI8AlGg75phj7Omnn07ZfNhhhzlRI6GTni6++GLTdd95553Un8444wyrVauWvfLKK66frlevnnsX9OvXz+XZsmWL1alTxwnDXr16mfdO0EziE088YQqfNm3a1PXtehcorVy50m644QYnLLdu3WqNGjVy/b+Elt+UCwGoa0ose0kCUO+0hx9+uIQA1MynRLJEoiJREtOy/ZxzznFF33jjDcd33rx5VqVKldT1NJuoiZMHH3zQr5ll5iME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\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "def animate(i):\n",
    "    ax.set_title('Polarization')\n",
    "    ax.set_aspect('equal')\n",
    "    ax.set(xlim=(-1.2, 1.2), ylim=(-1.2, 1.2))\n",
    "    \n",
    "    E = E0*np.exp(1j*(f*t[i]+phi))\n",
    "    \n",
    "    xx = np.array([0,E[0].real,0])\n",
    "    yy = np.array([0,0,0])\n",
    "    uu = np.array([E[0].real,0,E[0].real])\n",
    "    vv = np.array([0,E[1].real,E[1].real])\n",
    "    \n",
    "    plax = ax.plot(ES[0].real, ES.real[1])\n",
    "    qax = ax.quiver(xx,yy,uu,vv,[0,55,200], scale_units='xy', scale=1.)\n",
    "\n",
    "animate(0) # initialise the plot with the animate function\n",
    "    \n",
    "timeline = amp.Timeline(t, units='ns', fps=10)\n",
    "block = amp.blocks.Nuke(animate, axis=ax, length=len(timeline))\n",
    "anim = amp.Animation([block], timeline)\n",
    "\n",
    "anim.controls()\n",
    "anim.save_gif('nuke')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {
    "raw_mimetype": "text/restructuredtext"
   },
   "source": [
    ".. image:: nuke.gif"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Raw Cell Format",
  "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.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
