Last active
August 29, 2015 14:01
-
-
Save msund/de982a8f2ce01e650f18 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "Reproducible figures" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": "IPython and Plotly: Collaborative, web-based MATLAB,<br>R, and Python plotting " | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Collaboration, data analysis, and data visualization sometimes feels like this:" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "from IPython.display import Image\nImage(url = 'https://i.imgur.com/4DrMgLI.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"https://i.imgur.com/4DrMgLI.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 1, | |
"text": "<IPython.core.display.Image at 0x101aafbd0>" | |
} | |
], | |
"prompt_number": 1 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "The goal behind Plotly is to solve that problem, so you can do all your analysis, collaboration, and plotting in one place, online. It's collaborative, flexible, and free for public plotting. You own your data and control your privacy. Read on to learn more, or run `$ pip install plotly` and copy and paste the Python code below. The source for this NB is [here](https://gist.github.com/msund/61cdbd5b22c103fffb84). Suggested listening for reading is here:" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "%matplotlib inline\nimport matplotlib.pyplot as plt # side-stepping mpl backend\nimport matplotlib.gridspec as gridspec # subplots\nimport numpy as np", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 2 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "You can use our key, or [sign-up](https://plot.ly/ssi) to get started. It's free for any public sharing, so you can make and share as many plots as you want." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "import plotly.plotly as py\nimport plotly.tools as tls\nfrom plotly.graph_objs import *\n# py.sign_in(\"IPython.Demo\", \"1fw3zw2o13\")", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 3 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "import plotly\nplotly.__version__", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 4, | |
"text": "'1.0.0'" | |
} | |
], | |
"prompt_number": 4 | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": "I. shareable matplotlib figures" | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Let's start out with a matplotlib example. We also have [a Notebook](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s6_matplotlylib/s6_matplotlylib.ipynb) on the subject; this NB focuses on collaboration, sharing, and interoperability among languages and our web app." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "fig1 = plt.figure()\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nx = np.arange(10)\n\nplt.plot(x, x)\nplt.plot(x, 2 * x)\nplt.plot(x, 3 * x)\nplt.plot(x, 4 * x)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 5, | |
"text": "[<matplotlib.lines.Line2D at 0x106220f50>]" | |
}, | |
{ | |
"metadata": {}, | |
"output_type": "display_data", | |
"png": "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\n", | |
"text": "<matplotlib.figure.Figure at 0x1060c1b10>" | |
} | |
], | |
"prompt_number": 5 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "To re-create the graph in Plotly and use Plotly's defaults, call `iplot` and add `strip_style`." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "py.iplot_mpl(fig1, strip_style = True)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~PythonAPI/438\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x1062002d0>" | |
} | |
], | |
"prompt_number": 6 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "It's shareable at a URL, contains the data as part of the plot, and can be edited collaboratively with our web app. But that's just the tip of the iceburg. Strap in for a collaborative graphing adventure. " | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": "II. ggplot2 plots in Plotly" | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Suppose you see a lovely graph on the [World Bank website](http://blogs.worldbank.org/opendata/accessing-world-bank-data-apis-python-r-ruby-stata). The graph uses [ggplot2](http://ggplot2.org), a remarkable plotting library for R. You want to get the data from it, draw the graph with a log axis, and embed an interactive graph on your website." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image(url = 'http://i.imgur.com/PkRRmHq.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"http://i.imgur.com/PkRRmHq.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 7, | |
"text": "<IPython.core.display.Image at 0x10622a6d0>" | |
} | |
], | |
"prompt_number": 7 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Let's say you decide to try Plotly's [R API](plot.ly/r) and ggplotly packages, which are part of the [rOpenSci](http://ropensci.org/blog/2014/04/17/plotly/) project. We run the script in our RStudio (or the new [R kernel](https://github.com/takluyver/IRkernel) for IPython), add `py$ggplotly` to the call, and re-draw the ggplot2 figure in Plotly. It's drawn with D3, and adds the data to your graph at a URL: [plot.ly/RgraphingAPI/1457](https://plot.ly/RgraphingAPI/1457). Then we can call it in a Notebook." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "tls.embed('RgraphingAPI', '1457')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~RgraphingAPI/1457\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x106200d90>" | |
} | |
], | |
"prompt_number": 8 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "The data is called from the WDI database like this:\n\n'dat = WDI(indicator='NY.GNP.PCAP.CD', country=c('CL','HU','UY'), start=1960, end=2012)'\n\nIf you or a collaborator want to analyze, share, or add to your data or graph, you can, because the data and graph are together. I forked the data and shared it: [plot.ly/~MattSundquist/1343](https://plot.ly/~MattSundquist/1343). " | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "If you want to use Plotly's default graph look, you can remove the ggplot2 defaults." | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Then maybe I want to edit it quickly with a GUI, without coding. I click through to the graph in the \"data and graph\" link, fork my own copy, and can switch between graph types, styling options, and more." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image(url = 'http://i.imgur.com/rHP53Oz.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"http://i.imgur.com/rHP53Oz.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 9, | |
"text": "<IPython.core.display.Image at 0x10621c290>" | |
} | |
], | |
"prompt_number": 9 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "We can share it to edit collaboratively, privately or publicly. Share straight [into a folder](http://plot.ly/python/file-sharing) from the API. I and my collaborators can always [add, append, or extend data](http://plot.ly/python/add-append-extend) to that same plot with Python, R, or the GUI. " | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image(url = 'http://i.imgur.com/YRyTCQy.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"http://i.imgur.com/YRyTCQy.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 10, | |
"text": "<IPython.core.display.Image at 0x10620b590>" | |
} | |
], | |
"prompt_number": 10 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "We can also get the data, and run stats, fits, functions, add error bars, and more." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image(url = 'http://i.imgur.com/JJkNPJg.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"http://i.imgur.com/JJkNPJg.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 11, | |
"text": "<IPython.core.display.Image at 0x106231250>" | |
} | |
], | |
"prompt_number": 11 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Now, having re-styled it, we can call the graph back into the NB, and if we want, get the figure information for the new, updated graph. Note that the graph links back to the original Python API and we've put a link back to the source on it." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "tls.embed('MattSundquist', '1339')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~MattSundquist/1339\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x10622ac90>" | |
} | |
], | |
"prompt_number": 12 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "And there we have it. A reproducible figure, drawn with D3 that includes the plot, data, and plot structure. And you can easily call that figure or data as well. Check to see what URL it is by hoving on \"data and graph\" and then call that figure." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "ggplot = py.get_figure('MattSundquist', '1339') ", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 13 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "ggplot #print it", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 14, | |
"text": "{'data': [{'line': {'width': 3},\n 'mode': 'lines',\n 'name': 'Chile',\n 'text': None,\n 'type': 'scatter',\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n 600,\n 640,\n 660,\n 650,\n 740,\n 760,\n 770,\n 800,\n 860,\n 1020,\n 1110,\n 1320,\n 1620,\n 1120,\n 980,\n 1070,\n 1320,\n 1740,\n 2240,\n 2640,\n 2190,\n 1780,\n 1600,\n 1410,\n 1410,\n 1560,\n 1820,\n 2090,\n 2240,\n 2490,\n 3020,\n 3330,\n 3610,\n 4320,\n 4930,\n 5380,\n 5250,\n 4910,\n 4920,\n 4760,\n 4550,\n 4570,\n 5230,\n 6250,\n 7260,\n 8630,\n 10020,\n 9930,\n 10720,\n 12270,\n 14310]},\n {'line': {'width': 3},\n 'mode': 'lines',\n 'name': 'Hungary',\n 'text': None,\n 'type': 'scatter',\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n 540,\n 590,\n 670,\n 830,\n 1000,\n 1150,\n 1200,\n 1330,\n 1520,\n 1770,\n 2070,\n 2200,\n 2170,\n 2010,\n 1930,\n 1860,\n 2040,\n 2400,\n 2710,\n 2770,\n 2880,\n 2740,\n 3140,\n 3630,\n 4000,\n 4220,\n 4320,\n 4370,\n 4380,\n 4460,\n 4580,\n 4720,\n 5210,\n 6550,\n 8540,\n 10220,\n 11040,\n 11510,\n 12890,\n 12980,\n 12930,\n 12900,\n 12410]},\n {'line': {'width': 3},\n 'mode': 'lines',\n 'name': 'Uruguay',\n 'text': None,\n 'type': 'scatter',\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n 580,\n 610,\n 660,\n 680,\n 720,\n 640,\n 610,\n 670,\n 820,\n 850,\n 870,\n 1060,\n 1370,\n 1620,\n 1490,\n 1420,\n 1630,\n 2150,\n 2870,\n 3650,\n 3290,\n 2190,\n 1740,\n 1510,\n 1780,\n 2210,\n 2600,\n 2730,\n 2840,\n 3180,\n 3830,\n 4350,\n 5040,\n 5530,\n 6160,\n 6970,\n 7240,\n 7260,\n 7050,\n 6500,\n 5140,\n 4240,\n 4130,\n 4720,\n 5380,\n 6380,\n 7690,\n 8520,\n 10110,\n 11700,\n 13580]}],\n 'layout': {'annotations': [{'align': 'center',\n 'arrowcolor': '',\n 'arrowhead': 1,\n 'arrowsize': 1,\n 'arrowwidth': 0,\n 'ax': -10,\n 'ay': -28.335936546325684,\n 'bgcolor': 'rgba(0,0,0,0)',\n 'bordercolor': '',\n 'borderpad': 1,\n 'borderwidth': 1,\n 'font': {'color': '', 'family': '', 'size': 0},\n 'opacity': 1,\n 'showarrow': False,\n 'tag': '',\n 'text': 'Source: <a href=\"http://blogs.worldbank.org/opendata/accessing-world-bank-data-apis-python-r-ruby-stata\">World Bank</a>',\n 'x': 0.9880317848410782,\n 'xanchor': 'auto',\n 'xref': 'paper',\n 'y': 0.02994334820619583,\n 'yanchor': 'auto',\n 'yref': 'paper'}],\n 'autosize': True,\n 'bargap': 0.2,\n 'bargroupgap': 0,\n 'barmode': 'group',\n 'boxgap': 0.3,\n 'boxgroupgap': 0.3,\n 'boxmode': 'overlay',\n 'dragmode': 'zoom',\n 'font': {'color': 'rgb(67, 67, 67)',\n 'family': \"'Open sans', verdana, arial, sans-serif\",\n 'size': 12},\n 'height': 568,\n 'hidesources': False,\n 'hovermode': 'x',\n 'legend': {'bgcolor': '#fff',\n 'bordercolor': '#444',\n 'borderwidth': 0,\n 'font': {'color': '', 'family': '', 'size': 0},\n 'traceorder': 'normal',\n 'x': 1.02,\n 'xanchor': 'left',\n 'y': 0.5,\n 'yanchor': 'auto'},\n 'margin': {'autoexpand': True,\n 'b': 80,\n 'l': 80,\n 'pad': 0,\n 'r': 80,\n 't': 100},\n 'paper_bgcolor': '#fff',\n 'plot_bgcolor': 'rgba(245, 247, 247, 0.7)',\n 'separators': '.,',\n 'showlegend': True,\n 'title': 'GNI Per Capita ($USD Atlas Method)',\n 'titlefont': {'color': '', 'family': '', 'size': 0},\n 'width': 1413,\n 'xaxis': {'anchor': 'y',\n 'autorange': True,\n 'autotick': True,\n 'domain': [0, 1],\n 'dtick': 10,\n 'exponentformat': 'B',\n 'gridcolor': 'rgb(255, 255, 255)',\n 'gridwidth': 1,\n 'linecolor': '#444',\n 'linewidth': 1,\n 'mirror': False,\n 'nticks': 0,\n 'overlaying': False,\n 'position': 0,\n 'range': [1960, 2012],\n 'rangemode': 'normal',\n 'showexponent': 'all',\n 'showgrid': True,\n 'showline': False,\n 'showticklabels': True,\n 'tick0': 0,\n 'tickangle': 'auto',\n 'tickcolor': '#444',\n 'tickfont': {'color': '', 'family': '', 'size': 0},\n 'ticklen': 5,\n 'ticks': '',\n 'tickwidth': 1,\n 'title': 'year',\n 'titlefont': {'color': '', 'family': '', 'size': 0},\n 'type': 'linear',\n 'zeroline': False,\n 'zerolinecolor': '#444',\n 'zerolinewidth': 1},\n 'yaxis': {'anchor': 'x',\n 'autorange': True,\n 'autotick': True,\n 'domain': [0, 1],\n 'dtick': 'D1',\n 'exponentformat': 'B',\n 'gridcolor': 'rgb(255, 255, 255)',\n 'gridwidth': 1,\n 'linecolor': '#444',\n 'linewidth': 1,\n 'mirror': False,\n 'nticks': 0,\n 'overlaying': False,\n 'position': 0,\n 'range': [2.6533245446042573, 4.234708848978488],\n 'rangemode': 'normal',\n 'showexponent': 'all',\n 'showgrid': True,\n 'showline': False,\n 'showticklabels': True,\n 'tick0': 0,\n 'tickangle': 'auto',\n 'tickcolor': '#444',\n 'tickfont': {'color': '', 'family': '', 'size': 0},\n 'ticklen': 5,\n 'ticks': '',\n 'tickwidth': 1,\n 'title': 'NY.GNP.PCAP.CD',\n 'titlefont': {'color': '', 'family': '', 'size': 0},\n 'type': 'log',\n 'zeroline': False,\n 'zerolinecolor': '#444',\n 'zerolinewidth': 1}}}" | |
} | |
], | |
"prompt_number": 14 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Want just the data for another figure, to analyze, or a pandas DataFrame?" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "ggplot_data = ggplot.get_data()", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 15 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "ggplot_data", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 16, | |
"text": "{'data': [{'name': 'Chile',\n 'text': None,\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n 600,\n 640,\n 660,\n 650,\n 740,\n 760,\n 770,\n 800,\n 860,\n 1020,\n 1110,\n 1320,\n 1620,\n 1120,\n 980,\n 1070,\n 1320,\n 1740,\n 2240,\n 2640,\n 2190,\n 1780,\n 1600,\n 1410,\n 1410,\n 1560,\n 1820,\n 2090,\n 2240,\n 2490,\n 3020,\n 3330,\n 3610,\n 4320,\n 4930,\n 5380,\n 5250,\n 4910,\n 4920,\n 4760,\n 4550,\n 4570,\n 5230,\n 6250,\n 7260,\n 8630,\n 10020,\n 9930,\n 10720,\n 12270,\n 14310]},\n {'name': 'Hungary',\n 'text': None,\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n None,\n 540,\n 590,\n 670,\n 830,\n 1000,\n 1150,\n 1200,\n 1330,\n 1520,\n 1770,\n 2070,\n 2200,\n 2170,\n 2010,\n 1930,\n 1860,\n 2040,\n 2400,\n 2710,\n 2770,\n 2880,\n 2740,\n 3140,\n 3630,\n 4000,\n 4220,\n 4320,\n 4370,\n 4380,\n 4460,\n 4580,\n 4720,\n 5210,\n 6550,\n 8540,\n 10220,\n 11040,\n 11510,\n 12890,\n 12980,\n 12930,\n 12900,\n 12410]},\n {'name': 'Uruguay',\n 'text': None,\n 'x': [1960,\n 1961,\n 1962,\n 1963,\n 1964,\n 1965,\n 1966,\n 1967,\n 1968,\n 1969,\n 1970,\n 1971,\n 1972,\n 1973,\n 1974,\n 1975,\n 1976,\n 1977,\n 1978,\n 1979,\n 1980,\n 1981,\n 1982,\n 1983,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n 1991,\n 1992,\n 1993,\n 1994,\n 1995,\n 1996,\n 1997,\n 1998,\n 1999,\n 2000,\n 2001,\n 2002,\n 2003,\n 2004,\n 2005,\n 2006,\n 2007,\n 2008,\n 2009,\n 2010,\n 2011,\n 2012],\n 'y': [None,\n None,\n 580,\n 610,\n 660,\n 680,\n 720,\n 640,\n 610,\n 670,\n 820,\n 850,\n 870,\n 1060,\n 1370,\n 1620,\n 1490,\n 1420,\n 1630,\n 2150,\n 2870,\n 3650,\n 3290,\n 2190,\n 1740,\n 1510,\n 1780,\n 2210,\n 2600,\n 2730,\n 2840,\n 3180,\n 3830,\n 4350,\n 5040,\n 5530,\n 6160,\n 6970,\n 7240,\n 7260,\n 7050,\n 6500,\n 5140,\n 4240,\n 4130,\n 4720,\n 5380,\n 6380,\n 7690,\n 8520,\n 10110,\n 11700,\n 13580]}],\n 'layout': [{}]}" | |
} | |
], | |
"prompt_number": 16 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Now, want to use Python packages to analyze your data? You can read that data into a pandas DataFrame. " | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "import pandas as pd", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 17 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "my_data = py.get_figure('MattSundquist', '1339').get_data()\nframes = {data['name']: {'x': data['x'], 'y': data['y']} for data in my_data['data']}\ndf = pd.DataFrame(frames)\ndf", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Chile</th>\n <th>Hungary</th>\n <th>Uruguay</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>x</th>\n <td> [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196...</td>\n <td> [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196...</td>\n <td> [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196...</td>\n </tr>\n <tr>\n <th>y</th>\n <td> [None, None, 600, 640, 660, 650, 740, 760, 770...</td>\n <td> [None, None, None, None, None, None, None, Non...</td>\n <td> [None, None, 580, 610, 660, 680, 720, 640, 610...</td>\n </tr>\n </tbody>\n</table>\n</div>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 18, | |
"text": " Chile \\\nx [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196... \ny [None, None, 600, 640, 660, 650, 740, 760, 770... \n\n Hungary \\\nx [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196... \ny [None, None, None, None, None, None, None, Non... \n\n Uruguay \nx [1960, 1961, 1962, 1963, 1964, 1965, 1966, 196... \ny [None, None, 580, 610, 660, 680, 720, 640, 610... " | |
} | |
], | |
"prompt_number": 18 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Plotly has interactive support that lets you call help on graph objects. Try `layout` or `data` too. For example." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "from plotly.graph_objs import Data, Layout, Figure", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 19 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "help(Figure)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "Help on class Figure in module plotly.graph_objs.graph_objs:\n\nclass Figure(PlotlyDict)\n | A dictionary-like object representing a figure to be rendered in plotly.\n | \n | This is the container for all things to be rendered in a figure.\n | \n | For help with setting up subplots, run:\n | `help(plotly.tools.get_subplots)`\n | \n | \n | Quick method reference:\n | \n | Figure.update(changes)\n | Figure.strip_style()\n | Figure.get_data()\n | Figure.to_graph_objs()\n | Figure.validate()\n | Figure.to_string()\n | Figure.force_clean()\n | \n | Valid keys:\n | \n | data [required=False] (value=Data object | dictionary-like):\n | A list-like array of the data that is to be visualized.\n | \n | For more, run `help(plotly.graph_objs.Data)`\n | \n | layout [required=False] (value=Layout object | dictionary-like):\n | The layout dictionary-like object contains axes information, gobal\n | settings, and layout information related to the rendering of the\n | figure.\n | \n | For more, run `help(plotly.graph_objs.Layout)`\n | \n | Method resolution order:\n | Figure\n | PlotlyDict\n | __builtin__.dict\n | __builtin__.object\n | \n | Methods defined here:\n | \n | __init__(self, *args, **kwargs)\n | \n | ----------------------------------------------------------------------\n | Methods inherited from PlotlyDict:\n | \n | force_clean(self)\n | Attempts to convert to graph_objs and call force_clean() on values.\n | \n | Calling force_clean() on a PlotlyDict will ensure that the object is\n | valid and may be sent to plotly. This process will also remove any\n | entries that end up with a length == 0.\n | \n | Careful! This will delete any invalid entries *silently*.\n | \n | get_data(self)\n | Returns the JSON for the plot with non-data elements stripped.\n | \n | strip_style(self)\n | Strip style from the current representation.\n | \n | All PlotlyDicts and PlotlyLists are guaranteed to survive the\n | stripping process, though they made be left empty. This is allowable.\n | \n | Keys that will be stripped in this process are tagged with\n | `'type': 'style'` in the INFO dictionary listed in graph_objs_meta.py.\n | \n | This process first attempts to convert nested collections from dicts\n | or lists to subclasses of PlotlyList/PlotlyDict. This process forces\n | a validation, which may throw exceptions.\n | \n | Then, each of these objects call `strip_style` on themselves and so\n | on, recursively until the entire structure has been validated and\n | stripped.\n | \n | to_graph_objs(self)\n | Walk obj, convert dicts and lists to plotly graph objs.\n | \n | For each key in the object, if it corresponds to a special key that\n | should be associated with a graph object, the ordinary dict or list\n | will be reinitialized as a special PlotlyDict or PlotlyList of the\n | appropriate `kind`.\n | \n | to_string(self, level=0, indent=4, eol='\\n', pretty=True, max_chars=80)\n | Returns a formatted string showing graph_obj constructors.\n | \n | Example:\n | \n | print obj.to_string()\n | \n | Keyword arguments:\n | level (default = 0) -- set number of indentations to start with\n | indent (default = 4) -- set indentation amount\n | eol (default = '\n | ') -- set end of line character(s)\n | pretty (default = True) -- curtail long list output with a '...'\n | max_chars (default = 80) -- set max characters per line\n | \n | update(self, dict1=None, **dict2)\n | Update current dict with dict1 and then dict2.\n | \n | This recursively updates the structure of the original dictionary-like\n | object with the new entries in the second and third objects. This\n | allows users to update with large, nested structures.\n | \n | Note, because the dict2 packs up all the keyword arguments, you can\n | specify the changes as a list of keyword agruments.\n | \n | Examples:\n | # update with dict\n | obj = Layout(title='my title', xaxis=XAxis(range=[0,1], domain=[0,1]))\n | update_dict = dict(title='new title', xaxis=dict(domain=[0,.8]))\n | obj.update(update_dict)\n | obj\n | {'title': 'new title', 'xaxis': {'range': [0,1], 'domain': [0,.8]}}\n | \n | # update with list of keyword arguments\n | obj = Layout(title='my title', xaxis=XAxis(range=[0,1], domain=[0,1]))\n | obj.update(title='new title', xaxis=dict(domain=[0,.8]))\n | obj\n | {'title': 'new title', 'xaxis': {'range': [0,1], 'domain': [0,.8]}}\n | \n | This 'fully' supports duck-typing in that the call signature is\n | identical, however this differs slightly from the normal update\n | method provided by Python's dictionaries.\n | \n | validate(self)\n | Recursively check the validity of the keys in a PlotlyDict.\n | \n | The valid keys constitute the entries in each object\n | dictionary in INFO stored in graph_objs_meta.py.\n | \n | The validation process first requires that all nested collections be\n | converted to the appropriate subclass of PlotlyDict/PlotlyList. Then,\n | each of these objects call `validate` and so on, recursively,\n | until the entire object has been validated.\n | \n | ----------------------------------------------------------------------\n | Data descriptors inherited from PlotlyDict:\n | \n | __dict__\n | dictionary for instance variables (if defined)\n | \n | __weakref__\n | list of weak references to the object (if defined)\n | \n | ----------------------------------------------------------------------\n | Data and other attributes inherited from PlotlyDict:\n | \n | __metaclass__ = <class 'plotly.graph_objs.graph_objs.DictMeta'>\n | A meta class for PlotlyDict class creation.\n | \n | The sole purpose of this meta class is to properly create the __doc__\n | attribute so that running help(Obj), where Obj is a subclass of PlotlyDict,\n | will return information about key-value pairs for that object.\n | \n | ----------------------------------------------------------------------\n | Methods inherited from __builtin__.dict:\n | \n | __cmp__(...)\n | x.__cmp__(y) <==> cmp(x,y)\n | \n | __contains__(...)\n | D.__contains__(k) -> True if D has a key k, else False\n | \n | __delitem__(...)\n | x.__delitem__(y) <==> del x[y]\n | \n | __eq__(...)\n | x.__eq__(y) <==> x==y\n | \n | __ge__(...)\n | x.__ge__(y) <==> x>=y\n | \n | __getattribute__(...)\n | x.__getattribute__('name') <==> x.name\n | \n | __getitem__(...)\n | x.__getitem__(y) <==> x[y]\n | \n | __gt__(...)\n | x.__gt__(y) <==> x>y\n | \n | __iter__(...)\n | x.__iter__() <==> iter(x)\n | \n | __le__(...)\n | x.__le__(y) <==> x<=y\n | \n | __len__(...)\n | x.__len__() <==> len(x)\n | \n | __lt__(...)\n | x.__lt__(y) <==> x<y\n | \n | __ne__(...)\n | x.__ne__(y) <==> x!=y\n | \n | __repr__(...)\n | x.__repr__() <==> repr(x)\n | \n | __setitem__(...)\n | x.__setitem__(i, y) <==> x[i]=y\n | \n | __sizeof__(...)\n | D.__sizeof__() -> size of D in memory, in bytes\n | \n | clear(...)\n | D.clear() -> None. Remove all items from D.\n | \n | copy(...)\n | D.copy() -> a shallow copy of D\n | \n | fromkeys(...)\n | dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n | v defaults to None.\n | \n | get(...)\n | D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.\n | \n | has_key(...)\n | D.has_key(k) -> True if D has a key k, else False\n | \n | items(...)\n | D.items() -> list of D's (key, value) pairs, as 2-tuples\n | \n | iteritems(...)\n | D.iteritems() -> an iterator over the (key, value) items of D\n | \n | iterkeys(...)\n | D.iterkeys() -> an iterator over the keys of D\n | \n | itervalues(...)\n | D.itervalues() -> an iterator over the values of D\n | \n | keys(...)\n | D.keys() -> list of D's keys\n | \n | pop(...)\n | D.pop(k[,d]) -> v, remove specified key and return the corresponding value.\n | If key is not found, d is returned if given, otherwise KeyError is raised\n | \n | popitem(...)\n | D.popitem() -> (k, v), remove and return some (key, value) pair as a\n | 2-tuple; but raise KeyError if D is empty.\n | \n | setdefault(...)\n | D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D\n | \n | values(...)\n | D.values() -> list of D's values\n | \n | viewitems(...)\n | D.viewitems() -> a set-like object providing a view on D's items\n | \n | viewkeys(...)\n | D.viewkeys() -> a set-like object providing a view on D's keys\n | \n | viewvalues(...)\n | D.viewvalues() -> an object providing a view on D's values\n | \n | ----------------------------------------------------------------------\n | Data and other attributes inherited from __builtin__.dict:\n | \n | __hash__ = None\n | \n | __new__ = <built-in method __new__ of type object>\n | T.__new__(S, ...) -> a new object with type S, a subtype of T\n\n" | |
} | |
], | |
"prompt_number": 20 | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": "III. MATLAB, Julia, and Perl plotting with Plotly" | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "We just made a plot with R using `ggplot2`, edited it in an IPython Notebook with Python, edited with our web app, shared it, and read the data into a pandas DataFrame. Your whole team can now collaborate, regardless of technical capability or language of choice. This linguistic flexibility and technical interoperability powers collaboration, and it's what Plotly is all about. Let's jump into a few more examples." | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Now let's say you see some code and data for a [MATLAB gallery](http://www.mathworks.com/matlabcentral/fileexchange/35265-matlab-plot-gallery-log-log-plot/content/html/Loglog_Plot.html) plot you love and want to share." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image(url = 'http://i.imgur.com/bGj8EzI.png?1')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"http://i.imgur.com/bGj8EzI.png?1\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 21, | |
"text": "<IPython.core.display.Image at 0x10726d590>" | |
} | |
], | |
"prompt_number": 21 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "You can use Plotly's [MATLAB API](plot.ly/MATLAB) as show in [this Notebook](http://nbviewer.ipython.org/github/plotly/IPython-plotly/blob/master/See%20more/MATLAB_Wrapper_Examples.ipynb) to make a shareable version, with LaTeX included. You run the MATLAB code in your MATLAB environrment or the [MATLAB kernel](https://github.com/ipython/ipython/wiki/Extensions-Index#matlab) in IPython and add `fig2plotly` to the call. And we get:" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "tls.embed('MATLAB-Demos', '4')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~MATLAB-Demos/4\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x10726d5d0>" | |
} | |
], | |
"prompt_number": 22 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "And you can similary collaborate across all Plotly APIs, working on plots made with data from [IJulia](http://nbviewer.ipython.org/github/plotly/IPython-plotly/blob/master/See%20more/IJulia%20-%20Multiple%20Axes%2C%20Subplots%20and%20Insets.ipynb), Perl, Arduino, Raspberry Pi, or Ruby. You could also append data to any figure from any API, or from the GUI. Want to make your own wrapper? Check out our [REST API](http://plot.ly/rest/). " | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "tls.embed('bpostlethwaiteb', '26') #An IJulia graph", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~bpostlethwaiteb/26\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x10726d490>" | |
} | |
], | |
"prompt_number": 23 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "This graph was made with Perl ([code here](https://github.com/plotly/User-Projects/tree/master/mandelbrot))." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "tls.embed('karasik.dmitry', '2')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~karasik.dmitry/2\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x10726d5d0>" | |
} | |
], | |
"prompt_number": 24 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Head over to [Plotly's API](plot.ly/api) to see more, and check out our [User Guide](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s00_homepage/s00_homepage.ipynb#Installation-guidelines) to see how it all works. " | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": "IV. WebPlotDigitizer and Plotly" | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Let's suppose next that you wanted to plot data from a graph you loved in a [Facebook Data Science post](https://www.facebook.com/notes/facebook-data-science/mothers-day-2014/10152235539518859). " | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image(url = 'https://i.imgur.com/sAHsjk3.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"https://i.imgur.com/sAHsjk3.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 25, | |
"text": "<IPython.core.display.Image at 0x10726d690>" | |
} | |
], | |
"prompt_number": 25 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "You can take a screenshot, and drag and drop the image into [WebPlotDigitizer](http://arohatgi.info/WebPlotDigitizer/app/). Here's [a tutorial](http://blog.plot.ly/post/70293893434/automatically-grab-data-from-an-image-with) on using the helpful tool, which includes the handy [\"Graph in Plotly\"](https://plot.ly/export/) button. You can put it on your website so your users can easily access, graph, and share your data. And it links to your source." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image (url = 'https://i.imgur.com/y4t5hdj.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"https://i.imgur.com/y4t5hdj.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 26, | |
"text": "<IPython.core.display.Image at 0x10726d650>" | |
} | |
], | |
"prompt_number": 26 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "I can then make and share the graph in Plotly. " | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "tls.embed('MattSundquist', '1337')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~MattSundquist/1337\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x1012551d0>" | |
} | |
], | |
"prompt_number": 27 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "You can make fits from the grid or GUI. Check out [our post with five fits](http://blog.plot.ly/post/84309369787/best-fit-lines-in-plotly) to learn more." | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Here's how it looks." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image (url = 'http://i.imgur.com/BUOe85E.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"http://i.imgur.com/BUOe85E.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 28, | |
"text": "<IPython.core.display.Image at 0x10726d490>" | |
} | |
], | |
"prompt_number": 28 | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": "V. Revisions, embedding, and sharing" | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "A fun thing here: these edits and changes could come from different members of our team, editing the same plot from different languages and sharing it. We can also save revisions and versions. " | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image (url = 'http://i.imgur.com/ATn7vE4.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"http://i.imgur.com/ATn7vE4.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 29, | |
"text": "<IPython.core.display.Image at 0x10726d450>" | |
} | |
], | |
"prompt_number": 29 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "You can also stop emailing files around. Have your discussion in context in Plotly. The graph being discussed is [here](https://plot.ly/~etpinard/25/average-daily-surface-air-temperature-anomalies-in-deg-c-from-2013-12-01-to-2014/)." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image(url = 'http://i.imgur.com/OqXKs0r.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"http://i.imgur.com/OqXKs0r.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 30, | |
"text": "<IPython.core.display.Image at 0x1062cb5d0>" | |
} | |
], | |
"prompt_number": 30 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "It's also interactive." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "from IPython.display import HTML", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 31 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "HTML('<br><center><iframe class=\"vine-embed\" src=\"https://vine.co/v/Mvzin6HZzLB/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe><script async src=\"//platform.vine.co/static/scripts/embed.js\" charset=\"utf-8\"></script></center><br>')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<br><center><iframe class=\"vine-embed\" src=\"https://vine.co/v/Mvzin6HZzLB/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe><script async src=\"//platform.vine.co/static/scripts/embed.js\" charset=\"utf-8\"></script></center><br>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 32, | |
"text": "<IPython.core.display.HTML at 0x10726d4d0>" | |
} | |
], | |
"prompt_number": 32 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "And displaying in your browser in an iframe is easy. You can copy and paste the snippet below and put it in a blog or website and get a live, interactive graph that lets your readers zoom, toggle, and get text on the hover." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "i = \"\"\"<pre style=\"background:#f1f1f1;color:#000\"><iframe src=<span style=\"color:#c03030\">\"https://plot.ly/~MattSundquist/1334/650/550\"</span> width=<span style=\"color:#c03030\">\"650\"</span> height=550<span style=\"color:#c03030\">\" frameBorder=\"</span>0<span style=\"color:#c03030\">\" seamless=\"</span>seamless<span style=\"color:#c03030\">\" scrolling=\"</span>no<span style=\"color:#c03030\">\"></iframe>\n</span></pre>\"\"\"", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 33 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "h = HTML(i); h", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<pre style=\"background:#f1f1f1;color:#000\"><iframe src=<span style=\"color:#c03030\">\"https://plot.ly/~MattSundquist/1334/650/550\"</span> width=<span style=\"color:#c03030\">\"650\"</span> height=550<span style=\"color:#c03030\">\" frameBorder=\"</span>0<span style=\"color:#c03030\">\" seamless=\"</span>seamless<span style=\"color:#c03030\">\" scrolling=\"</span>no<span style=\"color:#c03030\">\"></iframe>\n</span></pre>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 34, | |
"text": "<IPython.core.display.HTML at 0x107285f50>" | |
} | |
], | |
"prompt_number": 34 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Your profile keeps all your graphs and data together like this https://plot.ly/~jackp/. " | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "Image(url='https://i.imgur.com/gUC4ajR.png')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<img src=\"https://i.imgur.com/gUC4ajR.png\"/>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 35, | |
"text": "<IPython.core.display.Image at 0x107137d90>" | |
} | |
], | |
"prompt_number": 35 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Plotly also does content. Check out our's posts on [boxplots](https://plotly/boxplots) or [histograms](https://plot.ly/histograms)." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "HTML('<center><iframe class=\"vine-embed\" src=\"https://vine.co/v/M6JBhdiqPqA/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe><script async src=\"//platform.vine.co/static/scripts/embed.js\" charset=\"utf-8\"></script></center>')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<center><iframe class=\"vine-embed\" src=\"https://vine.co/v/M6JBhdiqPqA/embed/simple\" width=\"600\" height=\"600\" frameborder=\"0\"></iframe><script async src=\"//platform.vine.co/static/scripts/embed.js\" charset=\"utf-8\"></script></center>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 36, | |
"text": "<IPython.core.display.HTML at 0x101ab1710>" | |
} | |
], | |
"prompt_number": 36 | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": "VI. Streaming Graphs" | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "You can stream data into Plotly. Check out the live feed into the temperature in the Southern California house of one Plotly user. This data is available from a URL. That means you could publish your results to anyone in the world by streaming it through Plotly. You could also send data from multiple sources and languages., and then keep your data around to analyze and publish it." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "tls.embed('flann321', '9')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~flann321/9\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x107293050>" | |
} | |
], | |
"prompt_number": 37 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Or you can even stream in real-time. Check out the [Notebook here](http://nbviewer.ipython.org/github/plotly/python-user-guide/blob/master/s7_streaming/s7_streaming.ipynb) or see our [Raspberry Pi Instructable](http://www.instructables.com/id/Plotly-Atlas-Scientific-Graph-Real-Time-Dissolved-/) showing real-time dissolved oxygen." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "tls.embed('streaming-demos','4')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~streaming-demos/4\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x107293050>" | |
} | |
], | |
"prompt_number": 38 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "You can stream from basically anywhere." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "HTML('<center><iframe src=\"//instagram.com/p/nJkMMQRyvS/embed/\" width=\"612\" height=\"710\" frameborder=\"0\" scrolling=\"no\" allowtransparency=\"true\"></iframe></center>')", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<center><iframe src=\"//instagram.com/p/nJkMMQRyvS/embed/\" width=\"612\" height=\"710\" frameborder=\"0\" scrolling=\"no\" allowtransparency=\"true\"></iframe></center>", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 39, | |
"text": "<IPython.core.display.HTML at 0x10726d5d0>" | |
} | |
], | |
"prompt_number": 39 | |
}, | |
{ | |
"cell_type": "heading", | |
"level": 2, | |
"metadata": {}, | |
"source": "VII. Using Plotly for other Python libraries" | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Plotly also lets you re-make and share graphs from matplotlib and other Python libraries that rely on matplotlib. " | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "An exciting package by [Greg Lamp](https://github.com/glamp) and the team at [\u0177hat](https://yhathq.com/) is [ggplot for Python](https://github.com/yhat/ggplot). You'll want to run `$ pip install ggplot` to get started." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom ggplot import *", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 40 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Get the data" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "from ggplot import meat\nmeat_lng = pd.melt(meat, id_vars=['date'])\nc = ggplot(aes(x='date', y='value', colour='variable'), data=meat_lng) + geom_line()", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 41 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "meat = meat.dropna(thresh=800, axis=1) # drop columns that have fewer than 800 observations\nts = meat.set_index(['date'])", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 42 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "from ggplot import meat\nmeat_lng = pd.melt(meat, id_vars=['date'])\nc = ggplot(aes(x='date', y='value', colour='variable'), data=meat_lng) + geom_line()", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 43 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "And draw the figure in Plotly." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "fig = c.draw() \npy.iplot_mpl(fig, strip_style = True)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~PythonAPI/439\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x10ea06110>" | |
} | |
], | |
"prompt_number": 44 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "The gallery of [examples](http://nbviewer.ipython.org/github/olgabot/prettyplotlib/blob/master/ipython_notebooks/Examples%20of%20everything%20pretty%20and%20plotted!.ipynb?create=1) from [prettyplotlib](https://github.com/olgabot/prettyplotlib), by [Olga Botvinnik](https://github.com/olgabot), is a fun one." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "prettyplotlib = plt.figure()\n\nimport prettyplotlib as ppl\n\n# Set the random seed for consistency\nnp.random.seed(12)\n\n# Show the whole color range\nfor i in range(8):\n y = np.random.normal(size=1000).cumsum()\n x = np.arange(1000)\n\n # Specify both x and y\n ppl.plot(x, y, label=str(i), linewidth=0.75)\n \nplt.show()", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "display_data", | |
"png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEACAYAAAC6d6FnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXd8XOWd7/8+Z3rTzGjUu1wkuRcQtsFgWkKLYxLSyIYk\nC9m7IXfT7m727uZmd1+/+9pkL5tssqmQZAPZJBACSQidgAHjghtusmVJlmT1MtJoep9Tfn+MPLKQ\nbMuWhA0+79eLF9aZc57znCnP53m+z7cIqqqqaGhoaGhcdogXuwMaGhoaGhcHTQA0NDQ0LlM0AdDQ\n0NC4TNEEQENDQ+MyRRMADQ0NjcsUTQA0NDQ0LlNmLQCxWIzPfOYz1NXVsXTpUvbu3UskEmHLli1U\nVVVx5513Eo1G56KvGhoaGhpzyKwF4F/+5V+oqqqiqamJpqYmGhoaePDBB6mqqqK9vZ2Kigoeeuih\nueirhoaGhsYcMmsB2Lp1K1//+tcxm83o9XqcTif79u3jvvvuw2Qyce+997J379656KuGhoaGxhwy\nKwHo7+8nmUxy//33s27dOh544AESiQT79++noaEBgIaGBvbt2zcnndXQ0NDQmDtmJQDJZJITJ05w\n1113sW3bNpqbm3niiSfQsktoaGhoXPrMSgAWLVpEfX09mzdvxmKxcPfdd/PSSy/R2NhIS0sLAC0t\nLTQ2Nk65dtu2bbO5tYaGhobGLJn1HsDixYvZu3cviqLw/PPPc/PNN7Nu3ToefvhhEokEDz/8MOvX\nr59ynSYAGhoaGhcX/Wwb+M53vsOnP/1pkskkN998M5/4xCdQFIVPfepT1NfXs3btWh544IG56KuG\nhoaGxhwyawGoq6tjz549U44//fTTs21aQ0NDQ2Me0SKBNTQ0NC5TNAHQ0NDQuEzRBEBDQ0PjMkUT\nAA0NDY3LFE0ANDQ0NC5TNAHQ0NDQuEzRBEBDQ0PjMkUTAA0NDY3LFE0ANDQ0NC5TNAHQ0NDQuEzR\nBEBDQ0PjMkUTAA0NDY3LFE0ANDQ0NC5TNAHQ0NDQuEzRBEBDQ0PjMkUTAA0NDY3LFE0ANDQ0NC5T\nNAHQ0NDQuEzRBEBDQ0PjMkUTAA0NDY3LFE0ANDQ0NC5TNAHQ0NDQuEzRBEBDQ0PjMmVOBECWZdas\nWcPmzZsBiEQibNmyhaqqKu68806i0ehc3EZDQ0NDYw6ZEwH4/ve/z9KlSxEEAYAHH3yQqqoq2tvb\nqaio4KGHHpqL22hoaGhozCGzFoD+/n5eeOEFPve5z6GqKgD79u3jvvvuw2Qyce+997J3795Zd1RD\nQ0Njvkl1BZACCVI9wUnHVUW9SD2aX2YtAF/96lf59re/jShONLV//34aGhoAaGhoYN++fbO9jYaG\nhkYOVVZIdowRfu3knLWpJCXCr3QQPzRE8KnjBP7QnDvu/Y9dc3afS4lZCcBzzz1HUVERa9asyc3+\ngUn/1tDQ0JhrEsdHCT7VQvzA4Jy1KfnjyNE0gk5EzSikTgaQo2nSvcFpz48dGECOppH8iTnrwzuN\nfjYXv/nmmzzzzDO88MILJJNJwuEw99xzD42NjbS0tLBmzRpaWlpobGycq/5qaGhcZsQPD5E46iX/\n7pUoyQyjP3sL0WbEUJlHpi+MkpYRjboLbl/yx9G5LNmBXFZRUhIAgknH6IP7MFY5QQAlJSGa9KT7\nQ2SGo0Re7yLR5EXnNOH+8LK5etx3lFmtAL71rW/R19dHV1cXjz/+ODfeeCO//vWvWbduHQ8//DCJ\nRIKHH36Y9evXz1V/NTQ0LjPiR4bJDEdJto+R6vBjWV6M85ZFeD6xEmtjOZIvPqv2fb84SLLNR7on\niLHKSWYogqHMQf7dKwFI94YQHSbCWztRMzL+J44Reb0L85LCWd/7YjOncQCnvIDuv/9+ent7qa+v\nZ2BggM9//vNzeRsNDY3LBCWRATE7rqS6AqROBnBsrMZU4wbAUGjD/+gR4k3DF3wP0WYg9FwbSiSN\n7aoK5EAC151LMBTaKPpSdvLquXslqJDqCWJZWoRrSwOWZUUYSh0oSXn2D3qRmJUJ6HQ2bdrEpk2b\nAHA4HDz99NNz1bSGhsZliKqqjPxoL7p8C8V/dw2BJ5tRomlEqyF3jr7QCkCieQTryhLkaBoUFV2e\nacb30LktKLEM9utqMJY5KP7K1bnXRZMex00LEO1G5GgKyRfHXOfBtCAfAFOtG/+Tx5BjaXQ24xw+\n/TuDFgmsoaFxSSJ5YwDo8y0IgoC5oQB0wqRz9PlWbBsqQVFJnfQTfqWDwO+bz9m2ksjgf+IYalJC\nNOsp+vJ6jGWOac+1rS1DEAWUWIZkqw+dxzrpdeuaUmK7+y7wKS8umgBoaGhcciSOj5BsH8P14aW4\nPph1KTcv8mBamD/pPEEv4thYjWg3EvjDcdS0jJKUyIzEztp+stNPuieI75eH0DlMiMZzG0MEvYg0\nGpuyujAtyCczEiP04onzfMqLjyYAGhoalxyh508Q29OHsTwPQZcdpkSrAcfG6mnPd21uIO99C0n3\nhlBiacb++9BZ25fHsq6bSjSNsdI5oz4VfGYN9uuqc3udpxBEAVVSSBwbIbK9e0ZtXSpoAqChoXFJ\nYlqUj2ie2TalIAo5uzwAepH0YJjIjm6UeAY5nMq9pGZk0n0h9AVWDKV2zPUFM+6TfV3ltMcd19Vg\nv66GZOvojNu6FNAEQEND45JCVVX0BVact9ed13W6PBPF/yu7gWtfX0n8wCCxPf0En2nF96tDZHxZ\ns1D8qJfMUATnB+pxbKqdkz6balzY11WgyzO/qwJhNQHQ0NC4pJCDSfQeK6Lp/J0UBZ0IehFjtYtk\nqw/TonzSfSHUhMTYI4eQAgkygxE8n16NodA2Y/PPjO9v0qGmZNSMjBRMApd2ZgRNADQ0NC4pEk1e\nLCuKL/j6kq9ejaHEjmNTDa7NDRhK7Lg/ko3U9T/WRLJlFP3bPHnmCtGsR0lkiGzvxvfzt4hs78b7\nnUs3j5AmABoaGpcMsYODxPb1Z9MvzAJBFLBdVYGgF/HcsxpTrZvCv26k4C/XZl/Xz8/Qp3NbCD3f\nRvzgEACxvf0AyLH0ebclBZMMf3vnvK4gNAHQ0NC4JFAlhdiePkwL3DnPn7lEl2dCtBoovP+qOW/7\nFOb6AjJD2QJYxX97DYgClhXFSGPnThkhR1IoiUwuKd0pt1Ilev7iMVPmLBJYQ0ND43xQUhKCTszN\nxqVAAtNiD873LZrX++rs8xexq3OaASj64noEUcC6thRDiQPJF8dU5Trjdem+EP7HjyLajdn0F7KK\nodSBbV0FGW8UnWNmkc3ni7YC0NDQuCiEX+nM5dwHiB8YRJdnvog9mj2CKGC/pirnvpp3wwL0HutZ\nVwCJ5hHCr5/E89k12K+pAlnFtqES27oKLCuKSbb65q2/mgBoaGi8o+TSLRtE0r0hMt6sySRx1Iuh\ncH42Z99J7FdXTfpbn29BPkvNgMjOHiRvDH2BNZfnyLGxGvNiD7o8E8oF7B/MFE0ANDQ03hFUVUVJ\ny4z8YA9KWkKJZwAY+9VhUl0BDBV5k4O53iMIehFVPvNGrqHIRv4nViAIAvpCG5aVJRPX6sR5LUep\n7QFoaGi8IySOjRB+qR0A/6NNSP4EhfdfRWYwPKMEbu9mRKvhjBlD1ZSMoTwPAL3TjPOW+d0DmdSv\nd+xOGhoalzWZ/hAA1ivKsoVUFBWd3YixYm6DsS5F9B4LcmCqGShxzAtCdu/gTIgmHUpSmp9+zUur\nGhoaGm9DCiQp+tJ6BKMOxw21qOODmmg1INqMFNy79iL3cP4QbUb8vz1Kydc2Zv36JQXBoCPR6sN1\n55KzXqvPtxLe2onrA/Vz3685b1FDQ0PjbcjRNMgKokmPIAgIgoBomSjs4rxt8YwTv70bOfWsqqSQ\n7g7i/c/d2Vn9+HtyNuzXViNHUmc954L7NS+tamhoaIyjqirBP7VgXVt2xnNMte53sEcXDzmcIt0f\nBlEg1R2YUS4iQSeCOj85hTQB0NDQmDekYBJpNIa+yIZlWdHF7s5Fw1znwX5dDZEd3SSahrFdWU78\n8BD6YvuMrhetBiRfPOdCO1doAqChoTFv+H7+FumeIHqP5WJ35aIi6ETs6yowVblw3rYYY42LTF8Y\n47j3z7nQu82M/fIQIz/YM6f9eu8a3TQ0NC4qqqwAENnWjfuupRe5N5cG1jWlQNac47ln1Yz3PaxX\nlGNa7CG2b2BO+6OtADQ0NGaFqqq5oK7TSfdm3T51TvN7MsBrNgiCgKFk+iL006GzGzGW5eUihecK\nTQA0NC5jkp1+4keHZ9VGujtI8Pm2ScdURSW6uw/nB+pxbWmYVfsaE1xSAtDX18cNN9zAsmXLuP76\n63nssccAiEQibNmyhaqqKu68806i0eicdFZDQ2NuiWzryqUvvlCiO3uQA8lJwUqZ4SiCQcSypBDD\nDDc6Nc6NqebMGUUvhFkJgMFg4Hvf+x7Nzc38/ve/5xvf+AaRSIQHH3yQqqoq2tvbqaio4KGHHpqr\n/mpoXJaoqporMThXKCkpW8FqtsnG9CLWtaWkTvpzh+RgAvMizyx7qPF25jpqelYCUFJSwurVqwEo\nKChg2bJl7N+/n3379nHfffdhMpm499572bt375x0VkPjciX8cge+n781p23KwSSGEvus0gwoaQnR\nqMO0MJ9UdzB3XAok0Lnf3amdLwfmbA+go6OD5uZmrrrqKvbv309DQ9bu19DQwL59++bqNhoalyWJ\nJi8wt8FAqU5/NhBpFk0qkTSizYjOZUY+bYUieWMYijTTz6XOnAhAJBLh4x//ON/73vew2+3zWsNS\nQ+OdxPvDufW7vhBUKetOiTC5PKA0FifVFbigNpWkRPyoF2ONG9FqmNaLZyak+0IYyhzZ9A46IZvy\nYbz9ud6w1Jh7Zi0AmUyGu+66i3vuuYctW7YA0NjYSEtLCwAtLS00NjbO9jYaGu8YWQ+WXtJ9IdSk\nNK/52GdCuj+EbUMljhsXkO4LkeoNokoKoZc7CD7fdkGDd7LNhxJOIRp156xYdTYSx0cx1xcA2aRl\now/uQ46kEG3a4P9uYFYCoKoq9913H8uXL+crX/lK7vi6det4+OGHSSQSPPzww6xfv37WHdXQmG/C\nr3YSOzhIuidIdGdvrlyhOsfh9+dCjqWRQsncSjrVFcBU48ZU5SLdEyTwu2PEDgyQ6Q9jqnGTHk+z\nfD6oKSmXhVLvsWTTM59vG4oKIrlkZvoSGwDJ9jEMJZr5593ArCKBd+3axW9+8xtWrlzJmjVrAPi3\nf/s37r//fj71qU9RX1/P2rVreeCBB+aksxoa84UUSBA/OIQu34IgCjjvqCP0/AlMC90oicykzJXz\nSaorkCuOYllZghxMoGYUHJtqQYDUyQD6EjuJI17My4qwNBSQ8cbO+z6ZkRjG8QRs+nwrieMj592G\nEkujs08UK7csL0b2J0kcHsZx04Lzbk/jnWdWArBx40YURZn2taeffno2TWtozCvhbV04NtUgCNlC\nHOm+7CzasqSQVKcfc30BakpGDqdQ4hLMMJBVVdVcm+dL/PAQkR09ANgay4ntz4b9O25akCsYkv8X\nqxBE8D18kLzra5FjaeROP0pKIvznDpyb6895f1VWkMMp9AXZ+ru6PBNy+PzTDUu+OHr3RI4fQRCw\nrCwmtq8fY9nMo1w1Lh5aLiCNdw1yJIUcSWEsm1kCrTMhBZPE9w9gWVaEodCGqqqk+8N4Pr0afYEV\ny4piBJ2IdU0psQODZIYjIHLW+ybbfCTbfGR8MQrvveL8niuaYuw3R9DZjBR94SoQBdSMQnowgm1d\nBaaqCd9vvcuMqqrk/8Wq7CarKKBE00S2d5PqDpDuCpwz7YLkT6AvsOaEQrDoURLnv4+QOunHtHiy\nr7/ebaH4f12dTWGsccmjfUoa7xoSR734H2264Oujb/aSHoyQ7gliWpRPqmMMgFT7GMnmkeygqBPR\nOSbMGro8E5HXuwj8vnlKUY70UASAjDdK8JlWkm0+kKZfEZ+NZMsoSiSNzmlG0InZYilGHZ5PrsS8\nMB/BoJt0viAIGAqz9nbBpEMOp0gcHsZ5ex2pnuB0t8ghR1Ikj4+id0346AuCAIp63vEAmeHotPns\ntcH/3cNl80l5vV5CoYnNsra2NmRZvog90ngnyQxHiO7qxf/oESLbunBsqiUzmB3AU91B3HctnXbg\n0o0PlLo8E6MP7Sc9EM69FnqujcxIlLFfHUbnseD51Cp0eWbkcAo1M/PvVrLDj3lpYe5e54MgCBjL\n87BeWY6p2kW6OzjhNnoa4Vc68f5gN4mjXmL7+xHtk4uTZwYjjP5s/4zvq6oq6IQLNndpXBpcNgLQ\n1NREd3c3AIqi0N7ezsjI+W98aVwcVFUlMxKbMnDNBDmaJvRKJ64PNiCY9RT9zTr0+RaUpJRNsXDa\nhujb0RdYEfNMuLYswf2RZYRfO4nvkYOoqoocTZNs9WFZWYLtynIMpQ5Miz2M/nQ/3v/cTbJ9bFIf\npkMKJNDZjThvr8N+bfV5PxuAdW0ploYCBIMOQ3lettD4254/fnQYncNEdFcvqNkatZOes9iGoNeh\nSgpydPJKJ9npR1VVvN/fjRzOBnupafmcpQw1Ln0uCwFQFIVUKkUymSQajfLCCy9gsVhIJBIXu2sa\nM0BVVLzf2YUgCujzLbk88zO6VlUZfXAfloYCzPUFFH9xfW6mr3OYSLb5JtnD344gCBT9dSN6twVj\ntQtpOIrki+N75CBICsk2H8bKPKwrSwAw10/YxIN/aiHZmc2PM/rgPuRYGlVRSQ9GcrP0U3b0U3Vy\nLwR9vhVDaXbTVTTqCL/SOSl2IdXlx1jlyrl9mha60TknrzY896xG5zaTaBkluquXZJsv18fgH49n\nVxZpmfT4qkmJZ7RAr/cAl4UABALZaMnR0dFcZtKysjJNAN4lnPJQsW2oRLQZUWIz37A8lehMPM2u\nfwpbYzmhZ9vOWI9WUibPhE954ggmHZHkEPHrEsjBJMaqiQyNOruJkq9txFTnQV9oI7qrJzcYSyMx\nMgNh/I8eIfxKB6qiIo3GMRTZZvw858J2VQWW5UUkW0aBrHgmW3zYripH77ZQ8rWNuD+8bNIeAIzv\nA6hZQUo0eQk+04rvkYMo6awpK/TiCWxXlZM6Mcbwt3cS29efEx2Ndy+XhQDEYlk/6SVLljA0NARA\neXk5XV1djI2Nne1SjYuMHEuTOObFfnUVhkIbhmIbvv8+hPdHe8iMTvV/l8MpEq2jub/jh4axXV2J\nua5gyrmGUgfFX9mAqW5q1kpVVXmx+2+niID7o8vxvb+f1tUv01L0AsV/dw26acxSrg824PnManR2\nE+nuAIZSB6lOP6mT2cmIKquEt3aSOOpF55q7comi1YBlZUm2fmxaxvsfu0j3BDEUnFtkdHkm0n0h\nCj/fSP4nViBaDYSey+b5V2IZLKtLSZ7wAdncRFq2z3c/l4UA+Hw+brjhBiwWC2NjYyxYsIC8vKxL\nnyYAlzajP9lHbHdfboPUWOXKpmdISGTGvXBOJ90fIvRsG5IvPm7fj2JrLM/N3t+OYNBNa3pJSH6i\nGS++xORCJ8ZqJ03CE1TUXoNZl3dW05EgCIgOI4ljI9ivriTji5EeCKMvsiHohNxG8Zn6dqGINiPS\nWIzo9m4ArFeWzchc47i+lvyPLEfnMOWSxKU6/ZgWujFU5qHLM4EKztvrsCwv0kxA7wHe8wIgSRLJ\nZBKbzYbZbCaZTFJfXw9AXV0der22kTWXyJEU8izzy6uyQmRHN8PfezN3THRkZ9n6Ihv2a6pAFCZl\nn4SsXVpJShgq8vA9chD/Y01IY3FE4/l/xpHMMIWWBrzxY5OOh9MD1ORdx8rSj6POII2mzmEi2elH\nX2RHDibROU14/mIV6f4wyeOjFH5+7vNk6WwGUp0BBKMOx/W1WFeVzOw6u3FSCofMUATzsiLcH16G\n5xMrEQQB98eWY67z4Lytbs77rfHO854WgGQySTgczs32zWYzoiii02X9qvPz85GkdzbPy3udsV8d\nJrqzZ1ZtpHuCxPb0c2pyrXOZJ/zeBQH71VUU3HfFJM8aVVEZ+fFeEs0jOK6tYfxkHNfXXlAf4hkf\nJdZVRDOTPWq6w9upybsOAJuhgNF461nbMS/2YKzIQ7QZcH9kGXnvW0RA6sH6iSpMC9wI8zCLPhU3\nYKxxYWssR59vvaB2PJ9ZQ97Nk1M6mKpdU+IS3usEg2ePrXgnSSbntijQe1oAXn/9dVpaWjCbs+YD\nq9XKbbfdlnvdYDCQyWQ3FOXv3oc62In89A9Rjr+Jmryw7IiXM+mBMPoCK5I/QWxf/wUlKYNsmmNj\ntQv7xmocN9ZS+FdXTsnFo7MZJlWyOrVRLA1H0RdaKbz/KvI/sWJa2z9AKNXHb9s+ykD0QO5YINnN\nkyfuASAm+cg3L2As2cGJwIu5c/zJTgot2RVktWMjI4njZ30WvcdK/keXZ4O3CmyIRh1/7vl7utM7\nMWwu4ImOT57HOzNzzPUFFzzwn8JQZLug1dN7iUwmw86dO0mnZ1k1bY7YunXrnLb3nhCA0Mkd0x43\nGAwEAoGcAACTbLZ6vZ5MJpPLuqg8+2PoPIz6xu9Q9784pb2LTSzj4+DIL5GUuZ0FzIbTaz9Ed/Tg\n/EA9OruRyBvdJFpGz3LlGdpTVCLbunFsqsF2ZTm2K8qnPU8w6FBTMomWUeJHhkm1Zzcn9SV2RJMe\nnd04xbZ+IvASh0d/A0Ag1U2hZQl9kYlqdS/1fA1JTSIpKYKpHlymahQ1Q3vwz0TSWecBWc2gF7Pf\npwJLHf3RfajqzN1SU3KEfNMC/MlOvPFjqMjEMuf/Pp0L1wcbpt2c1pg54XCY7u5uBEHgzTffpKen\nJ3f8YtQ8URQlZ72YK971AiAlgsSGmlDk7Ew+HA6TSqXIZDI508+p/78ds9lMLBYj7h//AcZCiF/9\nL8T/8R+owyffkf6fD93hNxiONTH6to3Ji0nwmVaUlIQSzyCYdOhsRvJuWUzh5xuR/VPdbFVFzaZM\nOAOn/MtPJSo7GzqnidBzbSTbfKROBjAvKUQ5S1KzvshuRuLZGXs0PcxSz4cIp/tQVRVVVSmw1LPQ\neRP90X3EM6NY9PmsL/kiiiqxZ+jHHB79Db7EiVx7Rp0dl6kqJw7nIpYZpc3/HOX2RuLSGKF0Hx7z\nYp45+QVScoSTodfpDL2mFVS6RDh27BhtbW0sXbqUaDRKb28v8Xic7du3Mzw8zPPPP4/Pd+bv8lxz\n9OhRqqsvLFjwTLzrBSDp70Y0WFBSWf/+vr4+BgYG8Pl8uN1ubrnllikCoMaz3iM6nY5ayc/QW9tJ\nl9YxbC8dr2ykB+XSSxMRSQ9Rk3cdkfTgOc9NSIEpLozzQWYoQsYbRRqL5wZt0ahD5zDl/N9VWcm5\nZgb/1ELwmVYy3ui07UmjMcxLCmeUT8ayqgTHDbUoiQyqpJB34wLcH18+7bmqqqIgAyopOUIw1Yvb\nVINV78GXaCWjxDDpHJTbGzk8+muuLvsqgiBQYlvB5gU/Qi+aafE/zQLn9ZParXZcy6HR/z5nXxVV\npsX/NM3+P1Jgqafc3khb4HmuLf8aAH/suJeO4CvsG36Qo77HkdUMv2//LN3h6Ve3GvOPIAisX7+e\n6upqampqMJlM9PT04PF4OHDgAKqqkkrN/29MVVXGxsYYHBxk8eLFc9r2JS0Ao6OjZ50NqYqMlAxh\nclWSSWT9qxOJBH19fRw4cIDS0lIMhqmbbMpDX0GVsisG57FXCfp9vOpYxqGy9RP3M1lRE9MPUheL\nlBylzL6Go2NPkpKnukCeQlFlmsf+wH7vz5CU5HmZKKa9b0+QjC82xbtHlRWUeIbIti5SPUH0nsmz\ndkEvIgWTpAfChF9qR0nLuVw6Y786TKi1h0hqYpNVSUkEft88Y/dCU5UL25XlWFeWYK7zIFoNZ/R3\nj2aGsRtKWJJ/J0913Ed/dB8WvZtS2xoOjz7KcKwJs85Juf0KPrjgQeyGoknXF1tXAHBVyecnHS+x\nrUBWMyhqdsKQkAJs7f3nifdOCpOWY7QHX6I9+GcAPJZFLHa9n3zzQsw6F9eW/z0FlnrGku3YDcWM\nJFoYjbeQUWK5FYvG/OP1eic5haiqSkFBAaIosnz5cqqrq+ns7GTx4sVYLNnYjXdib6Crq4vdu3cj\ny/K049lsuGQFwOv1snfv3lzgVrhnD+Ge3ZPOGdr9EHIqirV4KUl/F6FQiOHhYaxWK6tWrUKf9pEM\n9BJoexl5fIWgvP5Y9v+/+mdUWcLkymfYUUFFRTmlpaW56GDBXQKB4Xfwic9NRonjNFZRbFlKb/jN\nac+RlTS/O/EJusM7iKa9vN7/r3SFt8/qvqHn2gg928boT/ZNvlckjbHKhTQaJ90dzJUGPIV1TSnJ\n4yNEd/ViXlpE/NAQplo3nk+vRjDpOHn4JZ7r/pucmEnjJiNd3tSo3bNhXVOKrbHirOeMJFoosiyh\n0rGOMvuVXF/xjey1hgJ8yTaafI9j1mUzW4rCVDtrlWM9Kzwfm7Zto2gnLWe/X9HMCKOJFrrDOwHY\nOfRdtvV/k9FEG7fVfIe765/EIFow6RzcUv3/EASBCnsjOiH7w7695nsscr2fAyOPsMB5AwZx7oLE\nNKbi9XpJJBJ0dXWxf/9+2tvbgay9/e0xHgUF2e+3x+Phpptuor6+nkgkMq8mO1mWGRwc5Nprr8Vk\nOr/fxUy4JAVAkiT279+Pw+FgdHSU+OgJBrqOkxjrRpEzOZstQCrQjTGvjGAwyMmTJ1m3bh2NjY1U\nVlYSO/A0/uPPkgx0kwr2AaD6h0EQIDiC8vA/Ipizfs91dfVYLJbcF4DCClRvT26l8HbUvlZU+ewu\npKqq8sYbb5zthOx/54EgCKwo+DjB1FRXyxb/M7w18gsgKxZriz6DL9FGe/AljvrOvmoAGDn4GKnQ\nwNRuSgpyaOpSVxqJYiixU/K31+D51KopZhtDiYPorl5MtW4sSwuJ7e/HWOnEUGyn+Esb0NXbKVPX\n0hnMejakxqNMz1cAZsJo/DhF1qUAXFf+95TYsjP6AvNiSqwriUmjmPWuM15vNxazvOCj075m0jlI\nydmVzdZ1pmMuAAAgAElEQVTeb+A0VhFJD9If3c9IvJly+5XIShKnseqM7W8o/TIfWvhf6EQDZbY1\nCAgsdL4v167G/HDo0CFaW1tz2QI6Ozs5ePAgfX192O2Ty1rqdDpuueWWnDBUVlbS29vL8PD8TRSj\n0Sgulwun08nNN9885+1fMgKg+gZIh4ZI+Drx+/1UF9tZvcBGLBoh1LOfzmgRwaSO4T0/I+XvZujN\nn4CgI3/J7QiCQLPXxMDAQE6lVVVBTcUotCwiv+E2pGQwm1FSkFA2/zXCkvUQ8SNu/DC33XYbVquV\nmpqaXIZQoXYl6uuPofzg86ixCXdGNZNCjYdRnvw2yvf/etJrb2dgYIBI5CyDbvQ16Lp9Ru+Pok6I\njUWfT1yaHMHsS7TTPPZ7ToZeY13JF/jo4l/jsSzmA7U/pDbveo6NPcEfO+6lL7Jn2vbldAxFSpIM\nTBUWncOEkpEQ3Sak0Hg2SFkh+HTrWaNYT3mhmBsK0XusqAkJ82lpFxSHgvutEryRY4w91kR6MIJ5\nSSE697lnvbKaFeaZetBExk1Ab8egs3JD5T/hNFZi0l1YoZmsAEyYC+vctxJK9dEb3kW+eSHLPB9m\nU8XXz5rszaJ3YdZnVyBGnY3ba7+L01RB8hIXAFnJTsjGEu3TmholJTUlmvpM9EZ2TzuxmWtUVWXP\nnj0cPXoUSZLwer10d3dzyy23sG7dOuLxOMePH5/WeeR0E8ypGfl8ppVPJpM5L8b5SL19yQiA8qt/\nZuzY0wTaXmJs1ItVGYNMgkAgwIFhJ0ajkYRlEQDRoSMYnRW4Fl2POb92UllKQRCyX8TuZlSzBV1g\nFJ0skGndhfrWS4Q8Vka9+5AarkDR6xCKa3KuVVarlaKiIoLBIILFjrD8WoR1d8BgB5AVFeXBr6Bu\n+x3Chg8i1DWiHtuBcvi1Kc+TSCQ4fPgwMPULEuzYRrhnD3KsBTVzbg+SSHqI3524G5cpO4M06mxk\nlIk4hYPHvbzZ+0tur/1P7lr0S2rzNqEXzew82E/Qb6POfSvXV/wfHBkHuqYDDO76cW4FdfC4l5aT\nY8jJCJaCOjKREdS3bYALFj3NH9vK4NUtpLuzQTHSWALz0kJsjdO7aZ6i+KtXo3eZES0Gir+yYZI/\nv5Kn4F6wiPRAmPjICKnaJIZb8vELnfy55x/O2KakpHjixCdRVJlnTn6BaNp7xnMB2oMvwzlKNRZY\n6rDoZ1j38W2Y9W4OjDzMwZFfUmhZwkLnzSTlICCysexvL6hNAINoOaPL73y4jl4IT7R/kt7Im7zc\n+3UeP/FxukKTV7yhVB8HR869SQ6wa/C7vNj9d/PRzUkEg0F8Ph89PT2sXr0aSZIwGo0YDAYKCwu5\n5pprkGUZh+Psye4EQaCgoCBnNj569Ci9vb0z6kMqlWLr1q14vV7a2s4skKcLwHxwUQVA/sN3UUd6\nULuPoRRVopcULEUNhP1DuIqqcS64FhWBMkuITZs2EU8kMbmqSIcGsJWuwFrUAEB/fz9lxflsXD6+\ncecbQH7qPxHyS1ADwwj//S/IKMj7nkenN2N0luMb3E30xs1T+lRVVUVHRweqqiK+/7MIy69FadmD\nnElz/I+PoNpcqK17EMoWIdzyl6i7nkJ97dFsIFlmYkPo9OIz27dP2OBVVSXmbaG7s43hDoGkeg2c\nyzSTaAHgiqL7cscExNyq4FjnAP5gmljYjFFnQxCyH+u+o8M8+ec2jp4YJd+0kLWhK4iLWeGQk9n+\ntfcGONQygpyJoTM7UEUDfXsmfrDRN3vJ9IeR1SSjhjZibYNIoWQ2wVip45xRoYJ+4iv29nMzSgz7\n4grynOUc2fwMh4sf55mTX2Br3z/jT3bmNlZPcSrqti3wXPa5fU8AsLX3n1BUmd+2fZQ3B/+TnQPf\nyQ2QkpLkLe/PCaam/jBTaZmewRDxRIY1hZ+h0NJw1mc5E3nGcoKpbnrCOxGFbG4hs87JYOwAFv30\nmUZnSlqOsmfox5PMd974MZ45+QVCqb5ZtT0bRuMt/LYtaxJrHvsDHnPWO+X0lZCqKoTSffiTnWTk\nswdWqqpKoWUJhZYl89fpccLhiVXVqUG+sXEiJYcgCGzatAmX68wmwVOsWbOGQCBAJBKhp6eHrq6u\nGfUhEAiQTCbZv38/g4Nn9upLJBK5Def54OKuAHqas4P/H7+HtHAppqF+xI4mErEwjsIaAFauXEnd\nug9iMpmyuUiW3EHhmk9izs+G+L/00ks0NTVRUlKKkhhFVRXk0DChddcgZeKQTkJFPeZFV5Oym8Fk\nxll7LUDO/n86brcbURQZHc0OIIKzEJIxUgOddJmKibtKEFZeD2WLEQzZJaCw8noor4OuiXKF8Xic\nK67I1oY93VVs6M2fkBDy6I17SCoSaXkBZPpRFRlFmt6lLCWF2FT+j7kZbCyRwSBXsrX3X3hq+25M\n9jEy8UJ+/exxhkYnfoBF+VYMepF+b4TwaHbmHiu2Y6pZQ9OhI+zYf5IrrLvxGPyMtfyZAZ9MIv9a\nxmJGfP4IqqISbxrGcJUbiyEfo9HO7tqfET82RLx5mMzC868je4pwaoCUHMHizsdWXExEGiKSGeaG\niqwHTbntCqLpCduqrKTZ2vdPAIwm2iixrqLZ/0eW5G+hzn0H2/q/CUAo3U9fdC/NY3/gz93/m2dO\n/k9shkJWFEzdwN1xoJ8/vNJOW7cfnWi44CW221xDnft21pd+kSX5WwBYkr+FjBJHFGYXSXtt+dew\nGjwcH3sqd6w3/CZXFN1LZ+jVWbV9oaiqyongS7m/Q+k+rizOTk4kNbti6Qq9wVDsCHuHf5LzbDqd\njBynNzLh1JGUgxh1NkRBj6zMj2eNqqqEQiFisRgbNmwAwG63c9ttt+F2TxZqh8OBKJ57eDSZTEiS\nxODgIGvWrMFqteY8g063TLydSCSSEx2jcXLA3tDQUG5zORAITNmLmEsumgCoPceRTEbiu/cRcGxE\nMlvQr/8QakZGVcFoz9ryHa4iTOasa5/dbicSiWCwuhkcjeILRJEkiUWLFlFWWUvS303C10mg4zVS\nJChc+0lIRMFix5hfhXzNZjDb0VvzyV/6AeTU9DPvBQsW0No6keNF8JRx/EC2XF58+U2IN9+DYJj4\n0IQV1yLeeh9K60RUaTwex2q1cscdd+BwOPAOe5GT2QHen9BT7dyLaGpFkuxEXttFYKCFaP/BafsT\nTg9gN2bt17Ki8NMnjvDWjuWkfWsweZpYv9ZOfUVWEAdHsgKQychYzHq++BdrGfLF2Lv3MK6696N3\nlpCwipjS/RhDR0ioNlbYDiMKKskgJI6PIprsdPcMIgcSmGrcyI3gMlaxqfofKfDUM3aohWRZnH3B\nn57/Bz/O3uEHGUu0Y9Ll5Wa3ipqhxLaCu+ufpMS2mrFk58T7Ob7noaoqsprGY16IUbSxzHMX1XlX\n440fpdS2hmCqh2LrCjpDr+JPnSQlh9lc+2Ma8qeu9vynqlvN0onDpHNwRdFfUmpbRaltNQAey2I+\nXvf47BoGHMZSVng+ji85EYAWTg+y0HUzY4n2Wbd/IbQFnsNhKOFjdY9xbdnfU2hZQr55IR9c8BNG\n4y2k5Ah7hn/EGwPfAmCB88YpSfX6ovvYNfjd3L5BT3gnlfYNOAwlU/IvweQ9sAslEomwY8cOIpEI\neXl53HTTTeh0uknRtQkpSCDZjaoqNPken1HUvcfjob29neLiYpxOJ16vl1gsxgsvvDDl3I6OrDk5\nGo3icDi49dZbp0w8Dhw4wNDQEMFgkGg0OkUg5pKLJwDxME/fHGJkoZP00jgZiwF9QQ1tcgEuY5xE\nwEtHb4BHnjrGoZbsF8LpdOaWby9s72LX7gOIokhZWRkAnhUfJjnQhKLXU2ypR2ewgMWO4CpCb3ES\n8x5DZ7Rnl+jualRFmWLvBnC5XOj1+gn3roJyhk356PV6Dnf189xzzzHcPz7bX7gaXEUIzgLIpFAD\nw6TTaWKxGFZrttLU4oVleI8cQzlxJ6oKsYSBiryDNI/ewYkRD1T+jjePdBMbbMbX9Mcp/Ymkh3EY\nSgEYGo2xfHEB79+wiI4T+ThdCZKKn8K8EhqXl9AzFCYSS/PMtk4KxvPMLywx0uAeQjW5KbTU0eE/\njmLIo9IySIRigmpWXCz9KuamYYrcBQz3nECKpBAdRoKpPvJMlQA4HBV03LSLI4t+TyDVhaxmaDk5\nxuHWEfYcOXeAGmQHcUlNUp23EUEQqHSsZ3Xhp9lQ+qXcOZWOdXSGXsn9HUhml9ZjyROoqsLygo/x\nwYUPYhAtWPXZjeVN5f/I7TXf5crizwFQ5bgGmH7zTFVVFEXl+qsqCc8ye+mZmM6d9EIQBAG9YObY\n2B/YP/wzVBR0ggGrofCi7AX0RnazvOBj6AQDFY5Gbq76vwDYDIXIaor2wJ+pycuusu+o/T717tun\nbO4GU904jZUEU30oqkxcGiPPVI7DWEY4PYA33szuoR/lnu93J+4+pxnpbCSTyZytXVVVDAbDFNOK\npKRo9T/Ln3v+gTeHfkCr/xm6wzs4MPIISSk0fo7Mr9v3TrqupKSE8vJy9Ho9tbW1DA4O4vdnK8Gd\nWgV0dHSwdetWWltbGRoaYmBgAIvFgl6vRxAEFEUhkUjkzEF6vR6/38/y5cvnte7yvAnA9u3bWbJk\nCYsXL+aHP/zh1BNkCZkMcpEH4ibSkWHauoYZNRTgFlLsaNlFIplV/Z0HBxgajeJ0OvH5fBxpOkaJ\nx4qAzMbrbsTe14TSuheDzkwyNoyr9ArENTdlH/Cjf49wzYfRm52IBiuCOPGj1JnsyOmpRUWAXOro\noaEhjkSzb1NdXR2SJLH+yjr8PY9m29jyRQRTNgBKsOYhP/J/ePnll4mEwjmPAav0GqplJ7Jkxmhq\nxSLHMQQLAYin9TR5PwSoKEqKTGzyD1pSUuhFM4IgEAglaevyU5RvZdkiD1uuW0VSCRLLjFKUV8K1\nV1RgMuh58bXDpGNjrKg1o8gZVhePYNVn+PlTJxnsczEkvciQIzs7Wdm4Abn4Ov7UtQY1KBFY4MYW\nKGGRJ0Jg8BlEq46E5Mc2Psg2NSv4xBNEMoMUW1fwq5de5cUdXby2t5fOvpllTYxLYziNFawt+iwA\nJbaVLMnfnBs0ACx6N2a9m1hmlLQcpTXwLOtKvsArvd9gNNGCKOhyPvKCIPKJuicQBAGnqTInlis8\nH2VdyRem70NSwmYxsKTWQzg6/9Gcs+WK4r/kqO9xOkKvYBjPRZRvriWQ7H5H+6GoMjrBeEZxi6SH\nODr2O8rtjVQ6sjN6nWhEVlKTxCqSHqbKsYGXev6OI6OPkpCCWHQuCiyLOTjy3+wY+DYuUyWD0YPE\npexgGplmZTBTjhw5QnFxMStWrKC2dnKG2Df6v8XJ0Ots6/8mrYFnUJGJpAe5qfL/0uR7nJ7wTp7q\nzE4qmgND7BzuJHPaxNHpdLJmzRog6yUkyzLBYBCbzZabDLa2tuYyefb29rJ06dLcwK7X6xkcHOTV\nV1/l4MGsFeD48eOEQiGcTucFP/NMmLdUf1/+8pf56U9/SnV1Nbfccgt33313zkUTIJpvwTx0HZI+\niRAqxFpXTnerj403bOKtHb8llfESMKW46311BMJJXt/XR0mBlfho1k+9qKSGhGii6YSPDW8+DukE\nwrJr0BtlDHVX597c0001Bas+gqib8ELRmezIqSiRvv24Ft2Q2zyFrEdQNBrN+QivN0bxVJfhVp7A\nFvklewKfpSoSxu44zVWseinRzuxSV4lmIN0DmQGM4YdJSh/BH1+HJMs4C5pJddxGid6C0TmKX99A\nobkfObMJo7kNJZNENGR/5HFpDKshO/hu3dND33CED2xagCAI1JZ76OjJ4E92sqrgLwAoKbCiy7RS\nZImQbDvIMCDqzQT0dSiI9A8nicrroWwPYwtdlFmNVJbk4fG4SQV8pKvSxLf6Ofm+FlbHSpANY6jh\nAGZndkPM77NSUAp31PyQ4wP7sdj93LT6an7/8gmKPTa6B0JUlDjQnyGVw2DsEKFUP07TmX3iT1Fq\nXcVQ7AgZJU6d+3Zq8q7Fn+wk37xwyrmnz5IEQcgJQp5pei8l71iMQrcFs0lHInXppwTPM2afQ0Ck\n2LoKgBLrapr9f6DCMfc1Bc5ESg5j0p/ZXfb91f+PaMZLgbmOKseG3PHqvI1448cwiBYSUhBJSeI2\nZ1NNtwaeBWBD6d+MmwRD3FL9ABklTn90P093/jUAw7HD5JsvLL23JElUVWW/c6cHbimqxFiyg8HY\nodwxiz6fpBzCZigkJYcpt1/JQPQtJCVFV2SMMquTwViIasf0XmNOp5Ouri6KiorYvn07FRUVXHXV\nVRw6dAiz2YzP52PhwonvsNFozMUSVFdXU11dzfbt2/H7/fO6AQzztAI45QFz3XXXUV1dzfvf/372\n7p28bBoWExiitURTEkZzOWbXKhLxFL9o244pr4BozWscG3qN0kIbq+oLaViQT2S8FmxSsTM63M2C\n2mpGfDEorkb84k9Qh07iCYuIhultZnqTA1E/4VKlM9qRUxESI61Icf/EieFnsSafZO/evRQUFGC3\n23Hd+BGEzvW45CcxKF3U2kbo7+kAZSLhmbj0akKlDXhsTor9JpSRX8LAlwiENpPMeDgYXE5LZC32\n0i1IwTIWOSvwJAUal5ZT5vDh10cQJDPD+37BoDfrThdK9ZJnLCOVlgiM26yt5gkRK7Yux22qBVki\nFewnTxwjIRkxOCZ83hUpyeK1N3LP5qV8YNNCrij5FJsq/pFjoT8xlujA5TBxw5XgrTpEp/WbHLrx\nD+jCSVr0HQSirRQNQ+zoq0iyjF4tJja8hpe2BTl8PEFKCVFZ4uBzd61gQYWTP25tp+Xk9FXWAslu\n3uj/Fkd9v8M5blI6G6W21XijuxmMHsjZ1q8s/hwLnDec89pzLZuPtftYUOHKug0rKodbR87Z5sXm\n1up/p9KxgXL7WgDc5moycjy3h5KSI1M8p+YSf/Ikf+r8H2f1bLIZCii2LkMnTk5ZYNa7GIweYOfg\nf3Bg5Bc05G/GYcyu1K4oupe7Fj2CKOjRiQbq3R/AYSzFZigmPJ73ymNezBHfYySkALKSZjh2dErc\nQSqVmrbOdzKZzPnsp6Qwj5/4WE4ERuItufoOC5w3ohOMXFv2NRqL/yoXF+IaD+ALpwdpCQ5zQ1k9\nvVH/lPucoqamhoaGBhobG0mn03R1deFwOCgpKWHhwoWoqjppY9doNBKPZ81bdrudvLw8Vq5cicVi\nmVfzD8zTCmD//v00NEy41C1dupQ9e/Zwxx135I4ZQh4KiWIU7Jhryjn6mzdxliURlH2UFN3HgPxb\n3IufJSpvJN+wgLVLinHZTRw/ApEEmG1QWOghc2AYoaA865Gj0yMUnntgOYXOZMff8jwACV8HBlsB\npDph+J/INy8D1uSWjaT7QF9KVPgqsZFenIYELf3dVJofwbZowsQVd9ZSMeLHrJZA8gRq6QPIQ104\njSGSsouMAlbnYux36hAMOiw2B2PHnsKUJ5GK7cGQvp20uZvewRfJd69kKHaYOvftHO8co64mn6pS\nB4Wn5XlfWXg3ALGhY4ROvoFZn8fRsVrW3XwVw3t/DkDxlZ9BZ9Dlrlu7tBhVLeSGin+mPfgSY8lF\nHPD/AhrArHMStPcjWEV0SQ+GuA8JBX0yRDgYpLa0kFX1X+K3L7Sit1qxeXqzM227CUnO/qhOme7e\nzks9X0NAh6ymcj+qMxL4Ddboq1yTOISsgk73/834cz0bqqoiSQqZjELReO6iEX+CwdFeVtQVoJuB\n58fFwm2u5erSL08aFFymKqLpYUwWB9v6/pWEHODOhT+b83urqpqbJTumCag7F2ZdHoFUNwB3LvxZ\nTkQ+tvixKWKxqjBbI8GidxFNezHrXFxX/r9pD75EKNVPe/BF+sMHuaP2B+SZi3L96+rqoqura1LN\nD8h61bhcLhRVZmtf1ssskhlEJxg54nuUa0q/yprCzyAIAlcVf37S+3t3/ZOk5RhJOcRwbJBSq5OF\neQVsGzzBmbDZbCxalI1Zuv7669m2bRsmk4lVq7Irt5MnT05K67BgwQIWL15MKpXKbfgWFxfP++AP\nF3ET2CwLeBxhYqKJ455mnGk9opjGIiYYUSfe3Le8/5X7d0151h5W6s6+SSZBZTSY4nf+rA+yUFgJ\nzukLgEyHaByvMqUzkomOQuIQjHwTSr+D3VXHbTfWUVQ0HlvQvRk8n0cVHChSCpNhhAp7E22DtZOW\nlJGIETEA5oUR5Ew10Z5SxIiHkvwyGpzDrFixgry8PEzVLoxlDo71Za/dddKDrBqQIiPoalZQFa/E\nv/8xwtEROk8KDPlirF1SxIIKFybjNPbXcfOVo7iOD92+FlFvpGDFhzE6StGZprqRCYJIkXUJwVQv\nPZGdrB/OLrONuuy5qqigiDaGpXJ63UHSWIiefJ0Cl4XSQjufvGMJH73pSsrLU2TGV0HuPBO3bqzN\nCUBSCuU2zwCcxkq2LHyIK4ruw/a2ZGuTUDMQfBKSraSNi8nozu2PPVN++admfvpkE2VFE++J2ZR9\nP3/9zKWfeO3tg4LNUEg0M0Iw1YNeNGM3FE96vcn3OK/3/et515AYiTfzcs/XCacHGIi+xcs9/0A0\nPcSt1f/OYtct591viz6faMbL+6q+OWkF8fbB/+00Fv8V15Z/DbPeSZntCrrCbxBJe7EMbeJYUzOQ\nNe88//zzjI2NTcmXE4vFaG5uxmwXCaZ6CKcHqHZspDf8Jv3RfTS4N2M3Tgy20w26Rp2NAksDfbE+\n3Po3KLHmMRSfWYS2zWajrKxskkvpxo0bJ93HZDKh1+ux2Wy5fUOTyURl5cwnsxfKvAhAY2PjJDfK\n5uZm1q9fP+kcp2UU+wk7kqGMt3xP8ZYnjWJM4Lb106c8jKCIlJvejyjoc2mNRVFg9apVXK12ctuJ\np1Af/xZp0cRQdPzDW3oNQmX9jPuptzixlqzAs2wLqiLB6PfB/Vmw3wSWNej6P0Yq0IEq+cFyBTi3\nkEqO4W64DUdZDeW2XgbDdRw6MB7opcok5BRiLA9b5ZPEjiwkcvwYQsRFYcOteGrXUV1dnfuQf/1s\nM28cGOLxjqvoCq4iQz69Rc/xeuTHAGQUhaVeD2/s8xKNZ7Bbz+wOpipZ85jVU0OhOzuzNeaVUrDy\nw2e8RhT0BFJd1ORdhytQzscqHuW68n/gwwt/webAd1lUspziNbUk7RIHQ8uQEgEWVmYH45ICG6X5\nJcSkYX7f/uns+y8IlBfbiY8LQFvgeQ6M5yaSlQwmXR4WvYs691TXt0lk+sGyFioexFj1KGZjFQR+\nC6Gnz/GJnptAOElZkY0Nq8tyx/7yQ8v55B1LiCUyNLWN8sb+ixdgdb7YDEWMJdt5sfvvUFERBf0k\nl8nRRCtpJYpvGpdRVVWJZUY5PPob/OMut+0dJ4jH43jjrbl2dwz8O/7USRJSgDxj+aS9spniMJby\nwQUPUmA5v1rChdaG3DX55oX0hHeQb6hDH6/EPxIjk8nk4mwymQyyLBONTsTCBALZLME7/P/EoZFf\nsdh1K2uKPo03foyO4Cvn7E9v1M9rA228NjDIYHQH8cxb6AQRURByG8FvDJ3ZHVcQBNauXTvp2Ezi\nC94p5qUnp3aut2/fTnd3N6+88grr1q2bdI5gz6Nk07+TSKfJVxUMS3ah2LMfnCV6B+UjS3DHl1Ll\n2MBTnX9F89hTEN1ORWIzNnV8P8HmZLP+ILbx9AJCVQNC3jQrAHX6gCVRZ8S18DqMjvHZqCCC/bps\nsjjLahRVz9jxP5PqfoCU8VOkw0OEIu0IzgL0BR9E1mft0oPDEUKDz5Ee+HdMrhPYF76GEO8l0bcY\n8mIU3Hk1OpMNe9mqSfcf9SewGEWWJ4+T7zQhCAoJIYkcK8AfN9FmzBalMekypJIpRg/+5oyZB5V0\nDEf1BoyO4mlfPxPrSv4ntXmbUJMSotWAw1iCSZ+HfX0l9e5b2eP9HkbRQiRtIy1YcTsnh6WfymLp\njWdnYzaLgVgijaxkGI43jRc62cbh0V9TZl875f7TIYWPgWkBWFaDaIRkE4z9COK7z33xWVBVlfIi\nO3feODmnukGvo6TAhtGg49W9PfQOXdr5d07HbiiiLfB87m+zzk1CCuT+VlWFFZ6Ps3PwO7ljKTnC\n1t5/4mT4/yfvvePbuO/7/+cd9iZIgAC4pyiJ2tOWLMm2bDmOd2K7TmLHTdKMuqmbpEm6f03TNGmb\nNHWm803SxGniFTvetizbki0PWXtv7k2CIEBsHIC7+/1xJEhK1LIpx3709XjoIQk43B1A8DPe79d4\nlWfa7+FY+OlC7sCJ4yd5advD9B1WuLrq2yhqHhUVt6kWWc2hE985J91mOP/d+WSMUykFQUBFoURY\nhMfnQrb3cqBzE5IkUVFRwSWXXILJZKKtTZvMZFkmmUxSM99GuWshwfQRlpZ+GovejctUSTIXwmbw\nTnvNB068zV9te4x/2/cij7bvYV9YwqwLYtV7UFWVue4Au4a7UFWVh1p3kcidfYe1a7gL6RzmkX8M\nXLSp6L777uPzn/88V111Fffcc88UBhCAxbuQ45lbkNRhTF03YRpaiujKsmjLvST6l1MjzsPafoBG\n6+V8VPwKodhb0K/xxAV7DPFzn0GwOKiTOil2mZHliYbQePhIAS3LQTkHh1gOo+ontlyKzs9w9HPY\ninKEh6oYaT1K6PDTxPRRsnIcnakImUrWX76CRs/rvLEXIsF9lNjasc/dBToR/bI4QqgI0Wxk5+Dp\noilvsYVPLBTw5EeosOWR8jrCI1ez8O2b0XVWMFLUy2jcyPXzU3x4gYSSS5HsPzDt7WdjIcTYhQ3+\nAHWuy5E7k8hx6bRVud3owzCmzpw/y4vVakXJT+XML/R+nEsDf8Xh0O+1laeQRZZVJDmGw+DHa5nN\njsGfcHJ0I2W2xYXXZSJdqIp8mvuokpcInugG+yTnw7IfQe1zkOu/INXWW/v6iMQyHGsfIZHKEk9m\ncTDiBu4AACAASURBVNiMiGcwsPvsrQv4s48uwDhdie19ivEBrNTajKxIWA3FpMdokzkljV40UWZf\nTE5JaRoCVeXJ1s8wnD5Od2wblfaV2AylBI+Z6evrA8so+oyPXEqk2FzHdbU/YKX/L7Do3VP8p94r\nxOPxgqBKkiSsXTcip82U+6tRiroYGOopsGvMZjOXXHIJkiQxODjIxo0baWlpIS30U+/SaOHj33Gd\nYMJlnJ4hJsl53g52kBlLGVztq8Mg2mkq/iJFpip2Df0/ZrmsdMZH+Je92r1998D0Wb09iQhZOc8v\nj7/F4fD56WTeS1w0Gui6des4duzYWY/x+xZSq/8uz3Tei03MExBbcZSs48bqr5Ll65Tt2gizVqA+\ndz+XXN/BsONWPFI9gvd7CP33oBb/DURacdqNxJJZ3HYZ1CzxV09iLHNOtRXOHAHrBF0utqUd55V1\nhf8b9GEy4rWMk65y8SHkXA6r8DQp8TYEnRmzdxYnpS0M9n+f9VXfAASk4RN0e+OUpNo4Ef0QleZZ\nCHyRvFyK4JEomX0VeTVDW/QVvJY51LrWklcyhGJh9IYM9mgvdYubSegeR5KasYg9pGeHWVz8Gt3C\nhyDixuA4jpQAZ80a8pnT2QdStB85niK+rQPb3KlfajUng148a8kl8ocz175X+D6PSefCXe5jtM2N\nnE0gjpmmqYpMuX0ZAOl8mEdPag1pi+PLRBJ6jDo7xWatGWbVewpURoBE7z5AIHz0WUSDlZLmGzEo\n+4j2aqtXVe+ncMf2MX2AsRqybWBqOOP9jiObk9lxcIBil5mNb2gislWLyig9R1C6w2bEqNeRzckY\nz+Fz9H6AXjRzS/0v2TX0czL5Ucy6Irb2fodLA/di0bunOKC2Rl+m2XMrKmNJbSjUudZjiu4nmBc4\ndGQ/kq2HFfOXsP/wblAFnMYynMYyeuLbZ0SNez4Ih8OoqsrBgwcLzdQ9e/aQy+XQK06i4QyeOitX\n1f89W7duJU0av197n0ajkXw+XygD2f0SramnWFD+qynK7IXej5/x/YxKKVb76lkTqMdrdmA3mLir\ncaWWDdx/gLboZtymebRGYwykohhEHVa9EVlVCGdSPNX+VQK2m/hw9TV8a99Gbq/JY9en6EqEWeKp\n5I3BVtYGGglLSQ6OtDHbJRTsyd9r/FGLUUWeKzgeWsa1tT9lVsOjzDO+hW/OMzjNAxh0fvrdPtSe\nEyCo6BU3R2QBNVaGqq5BUUFpLkdc2cXqkq8zGpdId3wE2q7A5Hmd7v7fISs5GP8hZzsL11VlhdSe\nftRJuwaTsZ9I6x5Sw1oDWor2YXD40NkbyVTciG3RtbTZWkAQiGV7GUwexFlyJan+g9SNzkVvnU0s\nWUrKM8yT0lx62taDoMMYcBYaodsHf8So1M2mrr/l1aG/oqj2ddRgN64FK+krOonbP0RT2auohmKE\nkkYu8d1FR8KHcLIKVGjvSpFMalvNZPdxEm2HCR97gZHDT2IcbUbnMhVKRHIyi5pXGLrvbaT2iZLA\nqZCjGThLOd5vW4DbrOWQ6ox2hvc9XKDfaYE8mpBuTvGN3Fj3U6ocl+ItG+BIRx8G0YaaqmFW0bXc\nVH//lNqxkkuRCbcX/p3o24vU9X3SYY2OqWSnWW1alkDm8OmPn/qeZIWjbRoV9fXdvYXHt+3vpzJw\ndodHAKvFQDL9zn2O3muY9S7mFN/IAs/HMOpsZJUkW/u+Q09iRyEDAbRVb9voZiodl1JkqsFrmU3A\ntpBq44cQHaPksyrN5VdTWTqXEnMDL7/8Ms899xyRSITmkltY5L3zPXk/e/bsYefOnSSTSUZHNXHh\nwMAAoVCI2qpGhoPDmM1mrFZtMq9u8FNUVMRw6hhRqReHw0FoJIjFCXLxCa6rvQ+TzjFFvCYKOvTi\n9LkTYSmF22Sh1uHBPu73Nb5zGGtaS/IQfalR1pc3cXPNQnxWJ8PpBC9078OuHyEu/Yo9w60ELHmC\nqWfxmIJs6j3KF958mAdbd5HO59gz3M3W/md4tfebF+2zPBf+uN0InYumld/DrosS8HyGtOsTGExP\naU+FQ/xh4VrU1r0IzXMRM2byioQ60kvG+WniGNAP3YuAhF1sIRqPEs/HCNKEc/4T1Io/YlvnXyC3\nrEAWXajZHhj8R3ItDzD0fS1NS81OcKYNxiRGZxnJ/gOMHHmWRO8ePPNuZtj23zy5ZZDnOu7lZOQF\nPPpVOGKfpmX0RXIDcZScAX1GwBELUmzvJG4cYDS0hB5PnIHsEfJKhuc6/hKACvtyNnb+NbGsVvZI\ncYTRkf3IVm3f0aJuw2EYIJm0Ec6vwKk7Scjjot3vYDAYoDscIp7OIo32Eu3ZTGxwK5lwB+6ma1Ci\nKnqfHSWlDVzD9+9k+Be70Xushcemg3TwPmwrys74/GSYXFrqlpKd4FoP7X6A5OBY/d/gZU7xzYyw\nhRHbj8llDfx+YwdLfZ8+7VxyLkV6uJWixqsQ9SLp4ZPEkisw6gexly8gn5kmZ8HYoO0AYFoH1bys\nkMsr/OB3e+kPJvjULfMKA/nqxWV8+ZNL8ZVMHxk5GXargUTq4kf9zSQ8liYqHSupc13B9bU/pLHo\nGk5EXqDSrvXeKh2Xsqb8axwe+T21znVsqPo280puQxBEclkFg1FEbNxBY6VWpguHw+Ry2mcXjUbH\ncoyXvSfvxWg0Ulpais/nY3BwkNWrVxeeq6mpATSlvk6no+ZSCU+lNihv7ft3joWfwel0EhoOM+x+\nEsGQP6MY8Ex4a6iNpqLpqa71ritpcl9HRGrjEi9cVzmfq8pn47M4+Oc9z3EwfAiAYSnAWwM/o8mh\nidxKjD1UW48xu8hHpc1NSzRId3wHPnMIEOhP7OXtgV9d1HSx6fBHb0ebTQYo+XOMtuVYfF9Dta1H\nNvwpdt9fcqPlAcTbFiHUbUHtG8Gc1ZGOdBKxS/QIWk+hT7WRE7wsEm/ErndxIF2HIGpf3LL8SXQo\nHJb1JOOvkEzug9iLmOq0VaCSlWHg7yE/gk6vxzP/Fpw1q5BGNetgQdTz+EsnEXQS2UQAOWtnpL+S\n1hMeVEVPIhMk6vIhpVScthilgkwwfZhrjBZEq0pMCBPOaKvcOtcVrCn/OgCNhr9itO1ayqLlvLQ6\nxsHQI1TYlrOmrQGXGiepFLPjmIfY8NusX15MRE7QP8YPbh0WGTnyNLIqIMaqQRAx2WsQjDoMHhuZ\nE1qqlt5nx3l1vRaaHp/e6iCxowdz8bPYV2Tx/vmKc/6sjE4/trKFyNkEqiKjM2pUymjbayhjTTBz\nRiSZHUbJWdl7TKt5HjgRZPeRCWdPRc4h6k2gKlg8Dfiq+jAbO9HbqzE4qhANmjbi9Buo0vQYcgza\n1kx5SlVVfvi7vQXfqBOdYYocJu66YS6+EisrF5SdN6/aW2wlOPLe17tnCg5jgEXeO1lf+Y3Cruuy\nsq8QsC1kddlX8FpmT3E/lSSJgKuZVTWfLRijiaLI/PnzWbNmzRRWzcXGuE/P0qVLsdlsSJKEy+Vi\nw4YNXHnllVgsFq677jr0eq167TD4iWTaySlpSswNRKUu8o4OZNMIqj51Gi32XEjnc4xKaRqd0zeH\nPZYmFnvvpjexC7PwJEadtoj0WbQx5QuzF7PQ83GORlfgM/dQalnItTU/ocxWTK39OF+ev54/m72a\n3aEujMJWXIY+AtZFbO37Dp2xjewPHZz2uhcLf/QJAICSz4NBW4UK5f+Fbmz2rdMdRwj9F4LSj7D8\nThw9wwzTTUhqIVv0J7yiVrCTUjrH7GMNuSgJcZjHUzdxvOcfsKsyknE2LWoZdrmfThkQ9Ljn3425\nIY8qyRB/AYLfAfM8AEyucgKr7iGwSvOQKSkB//L7MNoHsBqKGBo0o9eJHNu5gi2eb3PQ+jukiAud\ntQGzy01pRhPA1UllJHUJutse47Kyr7LceSeqInPHrEfpaislPbyAuS0Z6hxX0J/Yg93oJ5Bwoxo0\nEYtNTrP9eB379+8vqAaXOrR6aE4ROTRaRajHjLv8ZrJdo5iqXVgW+Mj1xVAVFdGgw9xQgs5lRo5m\nNBfNZFbrCTBGAXz7GAg5hNT2QnrXuaAzOchnosjZJEZXGYFV9+CsvYxMpBOA0SPPs25kHddUfo87\nLvk8Aa+N1u5RDkxS2uZibVjcAZx163h1Vy9CfpBi18u4mz9FxHU7+uJZiEYHxzvChXt99rU2FMEJ\ncgSSWt4uye2QH0ZVVf77f/cAWsDNHR+ezYZVNQiCgLfYyieun8uFIOCxMRCa3iPqgwK9aKbYXHfa\n41WOSzHqbMiyXKBPZrNZAq7ZhcAhgA0bNlBVVYXFYiESiZzV2vhUvJNVrCzLhEIhcrlcgSY9Z84c\nrrvuOkRRxGg0FswVJ0/kFY4VDCT3M5JupcTSSFhqZ+fwT2hY4gAxf5reJK/IZ2XjDKajVDncZ10s\naFYjjzLbfUMhk6HBWcrH62uR1TAmnZNvLb+ZEnMT8zy3UGQqZW35vZRa5iLlY5Ra7OwIdqIXtN9r\nq3Hs+ynMY2fwqfd0F/D+mABOhbECRZ3NW93/H5L9ZgAEWx0NdZ+kt9rASKaVGuc6Kkvvodx1Df1Y\nURQdvz/wN5hHAuQsR/GXrCIeq0CfbeOyV7XBPJ0sQhhTDtrqH0KVUqD3QeIVsE/YC4x/yRRFRTRE\nKDFo22KPtR4540LKyuTT2gpBGp6NrnYVR7OzaR+wYwr7oHw9nVIDll49LcbDuP/3Z6iP/xc9j/yc\n1P/8E139Gs3Q4Z3DisAXiOcGcJoqEDzlqN2LCVh0+GwmcrJWf6ypCrBkyRKcNgeVmTyxjA0FUJuL\nyXdLSB0RjDVuRLuRzPEQuf4YgllbIelcZtKHg4R+tZfRJ48SefIYqqyQORLE6Bsml1gG0oRm41yw\nlNSTCbUiSwl0JgdC8jUssc8TbX2RzEg7Bpv2ubjNZpx2E8UuC6qqIuWUwhc7O/AkRulhFFslof43\nIb2bR1t+BsATr7RwtCNOUrGz+c0TPPT8MTr7YrR0Rbjvt3sIRtIw+Pdgng99X4Dwb4iPuXnWVri4\ndUMTZV47zQ3vjHIIYyWgi+QQ+sfE5EF8YGCAl1/W3FYnWyWMY9yl0mAwEI1GC/kY58LIyAgvvPDC\nlGuN2xycDYlEgsOHD08JQDl1sJ8OOsGAgszxyDOU25ez3Pc5/NYFVDlWAUyZ1AAebdvDfx3UGDvd\niTAPt+7iSGSCndOXjFJuPbfwUBBELHo3HdHXeK332ziNZpLSY+wbfgCT3onHbGdD9bfwWZsBzcup\n2nkZXfFtiILIVWWz8Fo0QVxGqcdi/BjzPJ/Erk+wuf8Eg+cpNHu3eH9OALbLUAO/oX5fKf3Bu1Cr\nnwDLMqxVy+m1DzGUOoTbVEOT+8Os8H+BZfn/IbTlR9QPleLv1oRgRzMRdMHl6MihMxlR5CKiiQCC\nNQ7GBkRdEjHzW41rXv5TMJ2eBhWNS+B9loCzkdtnPcTaqi9y7ycu5TMfmY/DamDui19kruseZi+t\nZ9/xYVI5HW59BFdJGfNWXE5v/s+4quKbWIwesld+isdzy3kazSDrTzIbIVA/pshtptQyB0qrUQ9t\nZUlTPVXFDubrXuHquu9QnbuDslIz5tleymoWkFZqcLvdDKXDhPZ3kz40hN6jrY50RWYtq3csiUsQ\nBUSbETmcJjeQINs1SvjhQ6T2D+K6PINpzs2QP7OvSQEjvwBVRWeyo+QyWolGECBzBJ2YQVUNhI9v\nBEHAFlhQKAlZTTku932NjJTnrX1a7yOXtWAQTtB7+Fvc3vxdHj36L/SF9LSPuYn2BRMc7jdzyyUm\nykrtPLm5hdJiKwubvOwI/yub+76h/cwAlBiRWIaVCwJct7YOz3nkCZ8LgiBgMRtIfYAaweeDLVu2\n0NvbSz6fL4SWqKp61tQpQRCoq6tj165d55V9m81mUVW1EIc6ft1gMDglietUpFIpEokE4XC40Nw9\nX+TkFHlFosRcT0PR1Vr8qdHPuvJ/4FB4qtI4lElg0xuJZTP88vg2Xhto4VC4nxe6tT5WbzJCpf38\nUtzMejfB9FEGkvu00pVopcy29IzRolWOVfQn96KqCmv8RtymGhaX/gt9SYneVDF1jjLMOnisfS+v\nnsVqYibx/pwAoEDhtLw8QPAXQRCN2opEtLG09NOFlYGak8kcCDEy10GNpNCdqiPe/ZdsDHai9Cxl\n+JV/RhIUxDmvUVTTTLT4E1D+ExShFkHeC8WfAdsqbTCbhFxe5tFNR1D1IWqdawuCJ50o4jDquDmS\nZVRnxO00I4oCd90wl0uX1GMprsbmcOK0mxANZtKxcqQ7v01nVqsRDo7R8mw3fR5xvlbHXl/5DRzG\nAEL9QoRZy8Ffi62umUp7FpM+qdVxsy3o7EY8S2sJ5mKYTCbq6urIGPI4NzQUPo+SuxahpHKYGyfC\n171/vhzXdbOwLgng+/KlGGuLyA3EEcU+MDUCZ/nFVlWNSTXyEwj9QPsMLJrQz+qbC7lBKPs+ACar\nFjUp6o3IuTF7CPMQHks3BjFDIpUDJYuSSyHbr6ax6GUUzIxmawB4aosWlhGOprG7SrAb85R5tabt\nnTfMZf0l1dxwRROhzGxU0Q61myD2DMlEBJfdNKO0Tb/HxuDIB7sMNA5VVXnjjTdQVZWenh5efPFF\nTp48icFg4OjRo8iyfFZ16riwc9zj/kxQFIVQKITL5SKfn1pm2blzZ8Hq+FQkk0kikQh+v79gnHYh\naCi6muqx7IdETkIQRPKKDEINT3YdZlSa2IHkFAWvxcHXdjyBy2jmn5dcx4nRIZ7u0vQ1A6koAev5\nWTBb9W5i2T6Moo1Ytg+nqYw15V+lZBq3WtAsJQQE3uz/Pq/2/iseSxP1riYGUlFS+Sw2gwlIsM77\nJMdGu2mJXnyDwvftBADguUdrTGayWYYePUBuOMktDb+gsehDgPbF3vTKNg65Ejxr68V4YwPOS8qI\nFeewJIvYcbmVoZVz6F6ilSGKHFWElTzdmXYwzkEnHtZKQJOgqipDI0ke3XgCiy1DwLYUu3HqMVJH\nBDkqETSIBV65t9iKw9+Ip+nywnFWi4HHXzrJz35/gI1vdDCr2s3yeX6+cvcyivyne+EIFoeWQ6w3\nIBSVIl72E+RDH0b1/h2MhccLgsDatWuZN28eZrMZwwo/5lkTg70w5mtjaphYhQiCgGVuKc719Qjt\nS9EXjf3Yc32gLwNBD/kzbPFbFkPLGPsj8gCMPoa5uBaDvRR9742QfBVsaxANRgzsRSf0I+b2ouRS\nkO0iYNhIXtHz8at0WKK7yUbfAp2LIfEL6MUcQvVDXLumlo99WNuB/enNzdx4RQML5pSjylkaKhzc\n0bBjivOjzWrQJhODD9BD9jh269k9ZS4Ufo+No60jSNmL5675XiGZTBKNRjEYDKiqysqVK8nn86xe\nvZqOjo4Cs+ZM8Pv9NDU1nbOUE4vFNOv0Sy4pTADBYBCHw8GCBQtOKzOB9vv26quv0tXVxdy5c3E4\nHKeJRs+FWe5raXRfQyKX4a+3/4GIlOLJzgMFkdavT05VkI+XIitsbspsLvpTGuPs2a5DdMRGMIjn\nt5AoMc9CJxgotc6jN7ETr2XOOSNAV/rvoTexg1WBL1HhWIFB1JHKZykxaQsdWYkjCJCTO3mkbfcF\nfQ7vBO/rCUBv0xqT+Wo7anecfDCJTjBwMhrkn3Y9Q3x/P+U9Ki87BhCNBoqb/FyxqIa2dJCENUmx\n4sTZVEqPXeILbz6MxeBjILmPbf33MTLGqkmfmCrhHgwlefC5Y4wkBrDVPYLddHo9UI5or7n+xrm4\nHBNfalFv0lLIxjC7dupWcPWSctYsrTj/D0AQEJxNIDkg1w1KEpQMTmses8mIxWwmawbRYpj0EgFz\ncynCdH78Y9RJg6sVvd+urexFE5T8BQx9+/TjpysNpXZhKanDW7JFu5/6rSAY8K/4LI6qy/AEBjHK\nW8kOPAHRpzAbUrza8XGMyX00FgWJ9byFzhogntbRw9cRDBVUBZz4PTZWLy7D7TRrf9xOFHkiIGey\nXXelzzFh1+D7R8qF/8FhntnVeqXfQV5W6Oqfho76AUM8Hsfn81FXV8eqVavwer1ce+212O12PB7P\nOQdcnU5HaWkpAwMDZ21QSpKEx+MpNHFVVWXnzp1YLBaqqqoKr00kEgXb5ng8Tnl5OZdddhlWq5Xl\ny5e/YxfM7kQEg6ijJRokkctQaXMz1x3g+KjGDJPkPKl8ltzYYmKZV+sP+CwO9ILIK33HuW/Vred9\nPZ1o4PZZD1FqncOJyPOUjtX7zwaz3sXa8r+h2rm6UFXwW53UOMYXcQp2g59Km4xZN7OLmulw0ZTA\nMwXfV1eTeLOLZHuK/GgaRVUIZRIEMwkSnYMcvcLCtxo+QnZSQs83ll5Hf3cag6jDa7YznNEGvnjO\nQih9giJTNSMmEZ79BmrqBNHnW/D99WoEUeDgiWFWXH6QpBQlrA4WPMEnQ45lsCzyY/aenVPeWO1m\nbn0JPYNxbr6yAbfTfNbjp4XVCTkP5B6Bzlshr+0ECHwfc2ofmeRSYCrLpejDZzC4yvWAzo3ePoLn\nritg3PPMsgBQoHUt1G8GwQCJrTD8fbBdAWXfA0RtN6BmoftuyIxZUkxa8Qgln4KST6FPHSR36HHI\nDhMdaGD27HXE+zejN6TIxl14FlxGujuP0XGt5vWDNnGtXDChRxD1RtLB48iZGBZvE7lUWLPrBjxu\nCx192sCsmubhMrSgGI4C56dnOB+IosCi2aX0DMaZVTN9TfeDgnQ6TUVFBYFAoPDYON3zVJPGM8Hl\ncmG32wmHw5SUlEx7TDabLazyx4NP4HRW0OHDh5EkibVr19LR0UFlZeUFl32mQ3cizEdqFvF01wFM\nooF/WnItB8N9HI0M0BYbpjM+Qn9qlD+pX8rsIh/1Y1TPby67gW/seZ5SiwPxHRjdzSq6Fqveg/1s\nDreTcKqe4lJfLaVmbZy5vOKfkNUspfFtHApvJpVbh/UM+SYzgff9BCAIAvZVVbyk62PBYIiH9h5m\nVp+BRTkbISmJy+xBEARMuom34rM4SdtV+ocTmHUGolltxR6RICNHqXKsIir3klphxHhyBF9/E0o6\nh2g1EIlliGRe0kyvVE6z0VWkPJljIUr/YkWh0Xo2LGv209zgmeLhf0Ew2yAjgD0A6Uk+QEoUs3IC\nSZpz/ufKh8C8ENJ7xyaSSffv2ADJrZA+BNYlEN8IuS4o/yGMKygb90H7BpCHQTAB02+VBesCdMYX\nkdOHgQYMod2YS5sxpn9FZ3YdbmMxaWkQ/1kmUEGnDSRKPoOjagXS6ISi12I2kMrk2XGwn7f2jdLg\n+To3Fh8HrjrD2d4ZAl4br7zddWG7tvchMpkMbvf5NTbPBofDMW3gyjgkSSoM5D6fj+5uTU8z3tQ1\nGo3EYrHC37t27QI4bUIZDCUpKTJj0J+9FBPNpnEZJ3bc3YkIt9ctYWVpLXpRsz9ZWFLBn81ezX8e\n0BhPf7fomkmr7Ql8Y+l1pz12vhAEkUrHynMfeAY0uycWLqXWOShqntd6v4VNB4cjLawoPffO4p3i\nfV0CGoegE1m/ZDGpUAKjqMcSlbmlvYQQGUy66b8kNouB7QcGeH13L2adnkqbm1hOYz6UWGaRyo8Q\n8rbBYiOW+T6Gf7qT4GgvNqsej2UWtzX+LzfX/5zZxTdMOa88msEyvxThPBuOHreFSv+7WN1Y7KiZ\nJPj/DaoegprnoOpByBxFyHWgKDlkaRiS5+GUKYfBulLTPoT/B6RJXk3O6yDwHyCdgPwIxF/UHp/c\nIxGEsRW/AIZqaHjrjJfSmWwkk7WIejNKNomrYT0W3wKsVdfy4HNHGRpJYTGdeYsrCAL+lZ+ldPHH\n0FuLp5SALCY9h1tCvLVPo+9ZihZC5uy+U+8EJqOe4iIzufwHrw+ghd4rBXtkm+3cCuhzwWw2c+CA\ntggZz7qdjEgkgtOprWTHS0b19fXMnavtUJ1OZyHq8KqrriIYDDJ//vwpJZ9kOsdjm06w6/AgZ0I2\nJxNMxfn6jqliwdGxCcFmME5ZEC71VOExa5z7ctvMZUtcLEzuI/TGHpzy3NtD7TN7rRk920VEkdmK\nL6qjctTAJa5KRkw5IuY8LuP0K2uP28JnPjqfwVCSL8+/kjsbV3C4K4ht9NMErIspNtczKnWRLclo\nfjjAluBXsDhHsOi1L4lF78akmxi8laxMdFML4nmKpmYCgtkGmYQ2+Jpng7ECTHO1Vbyaos7bxcH9\n2yDyG231npqeaQFoOwBjFbhug4qfg2NqchKmWZB4dcJvp/oPIJ5StqrbCO67wHntacypydAXXUIi\nUYfe6kZndmqcbt/fUlNVxXVr6+jqj2GznH0DKuq1z1lnsKDkJ1ae44E4VQEHd94wl6tXN2v9iIsg\noLGaDaTS7z8b33Ohra2Nbdu2sWnTJoLBYCFp6t3A7XZrgkJZZv/+/Wzfvn2KPiCXyxXopON9AIvF\nUig31ddqNXeXy4Uoilx11VWF4yNjYsVYQmJeo4fewQmrj1Akze83nSj8/8cP7eN3j2n/z8p5vr3z\nCTJyDpNOf1r/IC8riILAbGuAOofntAbvyGiaQy3np3FQVZWNb8zsAHwm3FT3MwK2G8iruUIeiqqq\nPHBy+4xe5wMzAQCY19ewwd2ASRZ5czXc/PFrWOKZPjVHEARcdpNmdKYK+CxOwsNZTp4o4ZnNvTS6\nrufDNd8nKvVgX1WFfo426Gesr52mHlQVlcyJEMEfvA2yinVRYJorXiQ4S2D0lC+oIKCKs1DlegK6\nX5FLtSDFDkLPXTB0SnRi18cn/i2PgK4EfP8A1hXa35NhrNUmiNFHx7QR09PZ8H4Fij911tu2lS3F\n6puLwebBt/SuKc8FvHa+cvcyTMYLqUAKpIaOIWdTiKLAR6+exa0bmibcPfVeGPoGKNPbXrxT2CYb\nw52vG2box3CBCVwzgcnUy1AoRDqdxul0sm7duhk5v9FopL6+nm3btmGxWEin0+zYsQNZljlxLHht\n2QAAIABJREFU4kRh0AdtsLJbjaSDR5FGe1BVhViHpuCeP1frUZnNE4uLXz91mJff7qJ3KIHLbiIt\nyWx8o53dRwZ58Pmj9A7GOdkZZmR0Uga3ItLXs5c/zQ2wc6ANj+n0Xc6PH9zHwZPDDO8W+NL8K097\n/lBLiJe3dZ3X+9/4RgfH2s9DMzMDsBpKaHDfQFdCpDuusYGG0qf7X71bfLAmAJcVW1ZEzcp8bvHl\n6M6HrqXCE6+cxKI3sMxZg4hAz2CceMyEy1SpuQJW2Hg5eRzTwBziwp7TJgA5mmH0GU0tK1j0iKb3\nsHVSXIY60ocaG9GUy+PI3YFyeCGU/xSXqZ94dqxUoy+FnMZ6QM2BdHQiuD4/AvpzUOysKyG1bVph\n3IXCVX85zto15z7wPKAz2hht3UKs403ymRjlp/ZlA/8OpiYYffjMJ8l2g3JhCl+bxUAylYXR30Pr\nqnO/IPIIhH8JPXdrKWbvEVRV5cUXXywwbAwGAzabDVEUZ6TBOo7Zs2fT3NxMc/NEXXrcd38yzTOX\nGGK2YwBXroNsYpjMSDuCINJU4SC8/3eok0gbiqLiK7FyuCXEG3t6cdiM3H1TM6qqubnKsordauC5\nre389pmjzKkrQTUo+KIuTH1aH2Fjxy7cJht7jgyy9+gQqqqiqiomk45X3h4b4OXTd6wjo2l8JVbS\nmdxpzeojrSHS0qR0tUgKo0FHXj5/W4x3gzKrC591FfuHN/LrYz9lb6ibW2vnzeg1PlATgM5uRI5J\nqIqKcIZQj1OxckGA3sEE6UyORDKH3SsStUf55Wu7SaazGAQHXUODqP5+mjo1FbHHPDVWUo5MrDoM\nnndfS70QCKKI4ChGeeK/UZ7478LjqpSCrqOoQ3bMzmYkz30waz+4btSauaAFqAC0XqpRQOUInCtf\n1zQHRDucQc14Qfd+HlL+84Wrfi2+ZXeDqCO490GG9z9KvHfPpIvpwHXzmVPD4i9D542QfO2Crms1\n6yFzCILf1hhQ58Lwv2t/Sydg+D+0CWf4vyC57YKue6F4/nktFSwej7N//348Hg96vf40Qda7hSAI\nFBcXI4oia9asmTLoz5kzQUjIJULYyxdhdFWQGjpK5MQmDPZSKio0Z87RYHfhWG0QtvGJ67XX+8d+\nx8pK7Vx1aTUlRRZuu6aJ8oAdRVWxWvSoTXEusVpoUfV0qHocKMwrDrD7yBCv7eph8/ZuHnjqMOlM\nnvUrq2ioKuKtfX2nDfJ5WUEQBO5/9AADw1N7GkfbRhiNaTu5VCaH0aCjvrKooBDfc2SwkH99MSAK\nIku9yxmRwpjFV3mtfwum0K9m9hozeraLDL3HitQ5inIBPi015S6uWFnJ/Y8eIBhOcelKP4Ol2gr5\noReOcaJN4vm3d2AqGabh4zfRuPNPMQzYyU8a9FMHBim+Yz4ldy/GdskfgRHir4WwRv8sfIEz2pdV\neeoHmDzX0d4x9gtlWaZROJPbtBUvaD2DtjWgSlNom9PCWAENb16Md/GuIOrN6Ex2TM4AqAqqnCXe\nvfOUg6zTD9JqHuKbQOfWegWgOYqq517JWS0GTPld53eTqgrGOij+nPZ/UzN0fRQivz2vHIN3A6vV\nSnNzM4lEAlVVqaqqwu12FwzfLgZcLhdLly5l+fLlLF26dEoJKB1qweJpxFW3BjkTxV6xFJOrHFNR\nJaq1nK1vTzTte4biVPod+EpsfOqWeTjG9D8Lm7wsmOXl7puacTvNbLFo/S1REECv4hTTbFfNyK5K\nPt+wFI/eQdGYLufgyWEiMe29L5xdyg2X17P/eJCNb3bw5t7ewg4BFZbN87NyQYAXXm+nf3jC+TQc\nzZCW8jz+0gn+8PJJVswPYLcaeOH1dp5/vZ2tu3sJjV5c19hqRwnKWKTtYvcbmOV3QCU/C973NNDJ\nEHQirmsazupvPx0WzPJiNupprHaDoPLNZdfz/NutjPbkcFdEKJn7COAlpYpUDLoIbe9AJ6m8MDvG\n7YMBpNYw7ltOd5TcNtSO3+Kkbroc4hmE4K3UMpzsbpSH/w1x7e2orz2MeOMXUfZvxmY2EY1GkWUZ\nnSGgrT777gFDJZT+o9Y87r4TPF+8qPf5XsDsaaDE7MLoDDBy+GlUVZ26y8gNwsA/ErN9HavYSnT4\nIM7M/Rjs8yDwPUi+rg3UbWvB/y0wL9ImvTOgyGEiF9oB3r+G0E/OfGOx5yD+EhiqwHMPjD4CVb+B\ntsvBvACy7VpJTphZcU8kEsFgMOB0OvH5fOzfv79g5FZXV3dOle+7RXHx6TtFVc6DIKIzWtEZrfgv\n+RziJFFTytKEVT/R1I0nspR5NZbOZK3MdLvHukY7g/IoLakg60UT1zVciksEqfVlJLaysPEWls/z\n89SWVv7so/Nx2icCXW68op7N27tJpnPsPDTIivl+KvwOZlW7mVXtZk5dCb9/8Tg3XtGAXieSTOfo\n7IvRPaDV3usriwhH0/QPJ2E4yapFZcSTORRFW5SdKWr0QiFnU0ijPVi8s7AbTNxS989Y9BZ6E28h\npFpn5Brj+EDtAACMlS7MTRc24AqCQFNtMaIoIAoiPouTKxZVM+wOsbZJo3ku9t1Gf2qUYJHMj0vb\nODRLprpNIdk6ctr5lLGV429bdrAj2PHu39S5UDkb8bPfRahfBIMdqMfGyhyecoTiAPZsnJqaGuLx\nsSZR/StQdIcm/BKtmtX1rP1a4/cDDlFnxOQqRxBERIMFJXcKL730byG1g9dff50XX+vnWFua0UwF\n5Ic0wVv6gLYqBxj8R+i8HsK/BmkadsfA3+E0jZKRPcSNfwJqBjpumH7nMPJLbXIxj9XGG17Xdls1\nT0P5jzVabesabRKYIaiqyltvvcWuXbuora3FYrEgyzKzZ2v9G51ON2VV/l4hl45gsE7oDsYHf1VV\niSezDI6C25IjEsvw6s5uhkaS2Cxnv8/smIWzoSLHHrWVf3AYcOoSVDmqqPBM2F57bFnqKov4yt3L\nCoP/OBqq3OgmDdLdA3FWLZrg4AtDb7BhiZ3tB/v53XNaTOr+MRvzqy/VUvFkeaKEVFps5aVtnTyy\n8TgPPn/mWNULQS4ZInzsBRK9e8gltGuXWitwGEuYU3wjTmH6nIJ3ig/cBDBTqC0uYVGzB4O+mY81\nPUZd0RUMpGIMXVtK3CizVRxgYdJFd6mMYalm4JZXZGRF4b5Dr5LKZ6m2FzPwHti2CoKA4ChGnLsK\n8Y6/Qz25G2Hl9QhFpVBSjjrSj9fr5cCBAxMlotK/1f6YL56I5I8Nk6usECtZgH0d2FbjdsrUetoY\nzVSSzPq0QVswIOcySLlysK+feE3oB9D1kannUVVNDDf6IIJlnmY9YWrSGumZIxA/JQRcXwKB74Pr\no1MeHhw1s+/k2CRlXTHRl5kBjJd3kskkJSUlCILAmjVrClz8i41cKlKIBJ2MzEgremsJqqqSlxVi\nCYm39vYxNJLiF48fJBgT8dsSHHjjOfYdC9I7lDjnBNCTjNBosfFm71Ei2RT6ZBBcDXT0xhB0ek6k\ntR26RTi7JYjLYWL1Yq0PURVwFHYZ+UyM9EgbXlOEbE6h2GXmjmub8JpjXLGiivmzvKiqyqyaYq5Z\nXcNnPjKfcp+dj314NnUVrikTwztBR1+Uzr4ow/sfxVxcg6N6JdnY1O+Kks9gMpyfUd354v/sBAAQ\nsLoYGDOCSuQkHmvfy7ziMj5Wv4yMksda7UbwWogt1xqn24baeb7nMCejQfaFeii3FaG8xxFuQlkD\nuH1QMhag462EnuOUlpbisFkndgGg7QKM1TN+D8rhN1A7Ds34eS8UFm8T0bat5JKhKY/LjlvR5zux\n2uYjoDKUugzZ/ytURSY2Wk5kZBaq79+h/nWN7XRqWUZVIPhv2r8j/4ujdC1tPaNQ/Sj4/xU19iIM\nfJWMlCYYTjEQHAHBCI4rpzTPW7oiHGoZ5o09fZqK2rIQoo/P2PvPZDK4XC7KymbOAuNCEG1/naHd\nD5CND015PDlwGKOrgoMnh/nh7/ZyqCVEW+8osWSWhU1erltXD+VXMatoiI9dXcG9dy45a/lk60AL\nT3ce5CP5EHcqYZr0IgZXORb/QmLJLJ19UU6Gi/Es+Cj5tJZ/Pc4ySg4cItG3r3CutcsqWDZPY8xN\nFmhKoz3YfHNRZAkB0IkCxfoR1lccY/GcUlRVYWDbT3E7TTQ3eHA5TJiMenwlNi5ZWIbDajyNHbTj\nYD/tvaNn9E+Ss9pklc7kOXA8yNYdrZiLa3FULsPo8JPoP4A8lo2tqirJwaOYi2vP50dz3vg/PQH4\nrS56EpoH/daBFgBKzQ6qHcWUWuzYlpejNrgK4QwjUpItfScwiCKPte9lfdlsknmJWPbM8viLAWH+\nWm0iAAjUQU6CnuM4j75G4vi7cxBUh3tQE2cOkQdQtz+HeuTMKuD3Avl8Himn4KpfR3dnW8F3BiBD\nLaai5XiKnCwvT5OSjAzt+wOJvn3klVIsRcXk06Ogc0LVw1DzjBY4r2Th5CLo/oQ2UIsaG8Xhnk82\nJ9PeO0pCnYMc01TSv33idX737FGe37ITVTfVXiAal3j2tTYOnQzhLbZoojnX7VPtPN4l0uk0ZWVl\nLFmyZMbOeb5IBY+TSw5j9c8rDLoA4WMvoMpZnt8WZPN2jYSw4+CAZrESTVNT7sJs0hMoL0c1urFl\n21HSI8jZ1BkHyodad3EiOoTBZKdNtHKXzYDZVYHDZmQwlGRoJMXVq6rRW9zazxUYePtn5KU4ib59\nZOMTtsq+Ehs6UeSmKxsoK7UXHs+nIhgdAdR8lmsuq+Wa1bVjJRgBRc4hZ7QxQB47/6kwm/TEEtKU\n93DoZIinNrdy5JQyci41gpxLM7TrAZR8hvsf3U9Xf4xiSxadWVvh64w2RL2psAtIDR4hlwhiKX33\n9OzJ+D89AVTaijgRHeTl3mM803WQDRVz0IkiZdYi1vob0RdbqSsP8MDJ7WTkHCOZJCoqC0sqaCry\nUWZzsbK0ho09R97T+xbnr0VwagOOIAgIl96E8vSPMGdiZNLvToCkHtyK2rrv7AeZraiTRClqzwnU\n4Z6zvGDm0dvby+bNmzEVVXGyK0hP94SY59VXX8VkcSONduOZdyMiKoqqMVPstbeic84jL42V7gQB\nDAFNPyFHNOaO1KJZb9Q8qZXRgPpKN09tbuWtgxLJtEBONnLl/H7u/JCb2ZUSsjhWJpQVOvuitHZH\nWNbs4+YrGyhymBgYToDOMYWFlclk3jFLJ5FIsH///ikGb+8VVEVmtGUzal7CUlJPNh4s2HXL2SRW\nf7Nm1w3cds0sPnljM/MaPLT1RDVxJqDXiQSW3EY2MUzkxCaGdv2a4N4J24PgvkcK5zTr9BQbLJj1\nRuyls8jFB7GU1GO3GjDoRbr6ozhtJkS9CVXOFgbh0ZObkaU4os4wRXcAWkN3steQLMXQ2zwocpYi\nh4nSEiv5TBSTuwo5EyOXCiMaLIXo01Nhs+h54Kkj7D4yhKJoDCO7zUh1mZOXtnUSHnMbUFWF0KEn\nyYy0Ixrt7NyxB1CxmPWUuiAtT/Qt7OWLUeUcSl4iHTpJUeP6Kc30mcA7ngC+9rWvMWfOHJYsWcKX\nvvSlKSZRP/zhD2lsbGTu3Lm8+eb7j1I4DoveyN8t+hB7Qt2UWV3cUDUfAJNOz5qAtsL2W12s8Fbz\n+kArYSnJXzZfzmpfPat9mkp2Q8VcOuIjbBtq5292PPmeJflMQZEXchK2bILeZO68IvhOhRoLoUop\n1FAvhHpRDm5F2be58Lz8yHcmPPkNZtDpUTNJ1HQC5bH/RD30+ky9m/PC+MA5GIphNRnIpLXt9HjS\nVZFuFFFvRjSYMbkqUKpuoHTxx7B46tEZbUSOvzj1hDq3ZpCnK4LAdzRvJH2pVkZDoyReu6aWtt5R\n+uP1DKVnU2/8AaXRjzLX9TiRtDYhDw4neeKVFrbu7sVuNVJXWcTSuX4Ot4zvUCZKHbt27eLgwXcW\nAj48PIzP57vg9KyZQGroCAgi/pWfRW8tJjV4iNCBxxhtfRVB1OOqW0uRw8Rnb11Apd+Jx23BV2Jj\nMJTENclGRdQZUPIZdCY7Fk8jgjgxOeZTI8iZGOl8jkpbMet9NeiNNtZVLURv86C3arm9y+b5CUcz\nOGzawCiIelJDRzA4fGRjfdr9BY9pO4JMjNChpwplFQBlbIBV8hJ6swNVnqARK7k0RoefeM9O8qkw\nBpuXWOc2FPn0Rv7KBdpE/MaeXrbu7iGezOKwGfnIVY3cumEWm97q0HoiqQhqXiLa9hq2skVUsZ9q\n+wg+p0K5cJRIcmJIFnRGlLxE6NCTZGMDMz74w7uYADZs2MCRI0fYvXs3yWSShx56CNACIH7605+y\nefNm7r//fu69994Zu9mLAVEQKLcVISBg1E3Piq2yF7Mz2MkNVQtocJUyx+1nQUl54fV+i5PfnNzO\naDb9npeDAARRh7BgHc6yKoRMki1btpwWv3euoGnlmZ+gPP//QM6jhgeh5wTq7hcnXtvfCvEIai4L\negOCvw7lF19DeeoHUDsfdf8WVOnivXdFUcjlcoX76enpoaSkhJMnT7K4yY8i58lkMiSTSSpKHViE\nNI5qLX6zobGR3t4JN1H9GENlqL+3MGFgatL0E/picFx92vVFUWB2bTEZSUZx3o6v/rPaE75voCg5\nntnuQlFUcmN14IVNXhbP0RTl3mIL/cMJzVROMBdyGWRZRhCECw4Bz2Qy5PN5Kiunt0F5R5BaySX6\nUJVzCJtUlcxIG/6qdkS9Ed2YF1cuGSIT7tAyLASRtJTHOsnryefRjjOcYqJodPgxu2twN21AZ7KT\nTQwT3P8IAMG9DxLZ8XPqrQ7WegKIJjs6oxXP/ImGfYXPwRf+ZFHBVsTqbybatpWi+svxrfg03kV3\nYAssALTdSTbWhyzFURWZ8PGNhI+9wOCOX6LkJQRRj5KfKOOoSh6d2UlmpJ18OoKjajkGeymD238+\nxZ0WNIfaxXNK+dJdSxkMJQlHM5S4zAiCQFXAicmoY+vWt8lEOtEZtdJT2lzHoFrPklqodYQQlQzd\nsYkJXdSbUGQJUDG4KsnlZ16B/I4ngKuvvhpRFBFFkWuuuYatWzX16Y4dO/jQhz5EVVUV69at06hf\n8Zn3sJhJ1Dk82M7iuV1mc9GTjOAxT68C9pjtheyBVP6PEyYuXvVJdB/5MmZvOWY5c5pt76ZNm+jv\n70dRlOkHHJcXOg9DNqN5DXUdAXsRqqJAn7arUZ7+EaSiCDYXwrzVGlNmoB3xik9o5+ibmd1PX1/f\nafmzLS0tvPHGG2QyGcLhME6nE6fTSSaTQW+y4nGZCYfDJJNJTKSxVy4rUBHHA0/GB3uDtQRH7eXs\n2rufYHCsPmxbC7GnQe8/430JgsA1q2uorL0Mg/NSbTB3XIup/reUeBtJpLIFlajLbiowTARBoLnB\nw0vbusDcBMPf1T5PRWFwcJBNmzadM283FAoVgtZ37dpFe3v7uzZ4UxVZsw1Jvg3D3yXe8gi5xCkN\n9WxqShqbmtyFmtqNmHoZujWPp9Il2s/f6CrHXFw/9t5UdJNiJr1uK1+6a+lp91BUvw57+SIA9GYX\n6eAx8skRhEmr3eZUL7KUKAycZ1sJm1zawkxvLUFnsCAIAs6aVYhGOyOHngC0hu/w/kfIjLSDKqO3\nlmCwa/RKg83DyJGnyWdiZGMDWL2zsHhnIUX7Mdh9hclnvIFb+FxUhStWVCGKAqFImideaSmI0gBu\nvrKRWYZ9JPsPUNx8A/6VnyESyyEUL8CUbsOjnsS76GOMxNQJXYHehJqXEPUmjklL+M3TMy8mnJEe\nwC9+8QtuuEHj0+/cuXOKJLypqYmdO3ee6aXvCzQ4vTgNZ1bY1dg9uE1W3Kbpt9vry2fzHytu5usL\nr+a1gRaSuT/OJACwfM06GtQomZd+g3pSawiPh37v3buXo0eP0tfXVzheDXYjP/49yCQRv/RzxLu/\nibjyes2B1OpCue+zKL//T8Sb74V8FmXTr8FiR3B6ED+lpYgJRV6Nnnqu3sF5IJvNsm/fPhIJTZHZ\n3d3N7t27GR4eJpfLsWPHDt5++21MJhOiKKLX69GbnTgMWQYHB0kmkxgFCZ1x6mQdCAQKzpVDQ0Ps\nax3BbVFoadGa/+iLNRWv8QwGeGNobvBo/HJBr5niiSYcNiMet4VYMstoXCtNOU5xjF3W7OdER5gf\nbVyCIrWiKAoGg4FAIIDP5yOTmb5309fXh6IobN++nUwmQyQSwWq1ksvlppipvRMMbP850vAb0PdF\nEMxkJfE0XcXQrl+TDrWCkkWV82RGBzDox5qamUOgpNGZHCDqcNWu4bn9Ilt39RR6AJNxLqGU3uIm\nOXAIndmFweYlcOkXADAbLGRj/Rjt5+bAi3ozZav/YoqITBB1eObdhNGlCf7i3TuQpQRGp1a2KV18\nB+5GjRYs6Axko33EOt7EVrawcF9KNqH120QdnoW3E21/Q+uFtL5Gom8fA9vu19TFcp5l8/ys8rdQ\nbJpQFY+bFCpyHr2lCFFvZiSapsRtx7vwdgB0Zjtz6op5bmsbqUyOHEaSA4fIxgYYCCYodpknjAln\nCGedAK6++mrmz59/2p9nn322cMw3v/lNHA4Ht912GzB9qWGm/GAuFnxWJ59quvSMz9sMRv59xc3o\nz2A+Z9EbsBlMY6HOEJ6GG/1ewuQoIpeTUfs11WBvby+NjY00NDTQ29tbmADUWAjlke9A9zHoOa6V\nkgQRoWoO4hd/gnjNpxE/+S8Ic1ch1C1EvP4e6D0BY97qgsP9/7N33uFxnWXevs+Z3tVHvVqSLXfL\nLXYSGztOwU7PJoGlBwIJKRB2IbT9skCWhUCAAIHAhl4SCIF0x45jJ3aKe5eLrGKrl1GdXs77/XFG\nI8uSbFmWS+JzX5cva059ZzQ6z/s+5fcgf/H/1JtmFiH8fYim6jMa+6FDh3A4HIkHYktLC8nJyWRm\nZhKJRBKrSaPRSFlZGUuWLMFgd2OMdeH39tLTVo9ZryCd8LtKSkqip6eHQCDAvn37SElJITcphsmo\np78pnpmTdh/YTqOxR9KtiR9TkyxU1Xg4WOuhJC+Jopzh+dqfvGEaEcVMty+ZlpYWUlJSqKysxGq1\njtpoZefOnYl4RzQapb29nfz8fFauXDlsBSDGIG0xQNBTB0Ih2LoWX+waYs47UGIGlHilqRINE/aq\nBlNE+qHuKoLN/6L7aCNGs079rADCR5FkHbbM6cgGCz39EbZXtREJe8C7YczjATCnFmFJL0fWm9Xv\noqzjJedkzCJGxNeJwTH66uxU6C1JpE69jqxLPoctexZCiRIN9iEbhk7q7NnqaiTi78JVdCkARoc7\nYQwAjPZ0zKlFeJt342/bT1+9qvPU8vbjdO59lgVT08i3d2EKHSPqVzOkov5uwnISbV4LUrzrWFdv\nkGSnObH6kHVGZk9xY9Dr+Meaw/zyGXVFvbl9EplpNnLdDprbjzMqE8BJpSDWrl170pN/97vf8eqr\nr7Ju3WCwcMGCBbz22mCRzMGDB5k3b94ZDvPsM9rD/XTQSTI3Fs7kYE8rUSVG0VmWiBgN46ylHJKS\nyOg6gBPw+/1kZWURi8UwGo3EYjEif/4WutK5+ItmYa3eAilDs0kkY3x2abYiXX2Hui09FybNActg\n+lzCzSHrkCYvQHQ0IOWUjmvciqLQ19dHaWkpW7duZcmSJcRiMUpK1Fn5wYMHSUlJoaurK6Ezrzu+\nIVDUjy8UxJg0fF5js9nw+Xy0t7czadIkCgoKaH7rDWLeCLUHa5mZMzPeGnN85GTYeWVjHZVT3SyZ\nO7JvPtll5oZlk6g6NIfe2p0sXrQQfJuwWPIJBAL09fWhKApJSWrdycBkqrZWLXbr6uri2LFjFBcX\nI6IhWrc8ic7swpE3D4M9nY6dfyVr0d1jmnB1HVQbpvuDUxEBHbpMFwabi7DnLXT2YjxVq3FN+gDW\nzGn01r2LNa2bSLQPh3UbptxPgvNyNU02XA/mybiKFhMKR5FtCp+7aQa+jr9BzztgXzr85kKM2EtC\nZ7SRXHYFPTVvEgv1EVMUupUYsojEYwtnNpGUJAkkHY78edhzZhHxd6E3DzXUOpN92GdoSsrDlDT0\nd2pOzqfnyBuYU0sIemoAMNgzEEqU1s2/Rmd24WvZg69lD9mLP08k0I0+uYRDjf1Mi8ZoavPS2NqP\n3aq6s7IXfz5x7eUL8/nFU7soyHayunEWPUETV1S4iSmCt3Y2qZI2E8S4XUCrV6/mkUce4fnnnx+y\nFJ0/fz6vvvoqx44dY8OGDRMuR3uhk2S08kzdTn598PzlyZvNZrz+AIfkZNra2ujs7MRkMmFpq8Eh\nxbBG/fi6u/HW7OMtQwF88n/QfeI7Y7q2VD4PKS1n5H0WB3QOV1wcK4FAALvdTkZGBnq9nubm5sEg\nLTBt2jTmzp3L9OnTh6U/CiWGUQoR01kxpwwvfjMajYTDYXp7exP6NanTbsRt7qMnYh1xzDt37qSt\nrW3Y9pFw2Iw4bEYWzTx5UVZWup2ooueqyypItnuh6R4sBjVmc+zYMXbu3Ek4HKampobWVrUrVl1d\nHZMnT0700jUYDAR71Bx7U1I+4b5m+urfwujKJdzfMqbxGh3JpKVuQggdBls6vTVvYMuqRNEX01P9\nIgC9R9ZjzZiM1dqEP1hOLNCF1d6DbI9P6IxFqsZRnJ6+EA2RLn6z43+R+v8K0dbhshlCQOOnoOfv\no8piJJVcTmrFKg73tlPmchMN9aG3TlxfZllnRGe0YU7KQ28eXjU9FkNjcuUBAmfhIlIqriVz/h2k\nzbgFZ77aYzkWGhr3jAV6ycguIC23jCf+tptnX6tm1uSMEe9lNOi4aUUZFSWp9ARN3HHTdBw2Iy67\nkY6uiRWfG7cBuPfee/F6vVxxxRXMnj2bu+++G1B7gd51110sW7aMu+++m5/85CcTNtj3AplW9Qvl\nCfnY1zVxZf+nw0CXpT6dla1btxIIBNDr9TgPv0Xp4dew12xlU+Fy3rGVEovFCJnGbqDK2tDBAAAg\nAElEQVTl8vmDRWjDbmxD7NmQUC49Xfx+PxaLBb1ez7Jly6iuriY/Pz+xv7CwEKPRSEFBwRAZYgBz\najEVFdO49LKlOHJHLoxKT0+ntbUVu11dwZhc2Uy67FP0R81sXP8qQgg8VS8S7lcfvE1NTWzdupWG\nhlPXOEiSxIdXThmW5TIMESEaltHV/EadPUtGLJ67CQQC9Pb2UlBQwJEjRzhw4AAejyeR6WMwGDCZ\nTCycmokSixBoP0hS6XKcBfOJeDsQsRg2dwWevf9MFEOdlHADhvTlqmtk+o3Y8+ZiSSsjacrtGAz9\nGF3ZGGxpGB1unCkd+KJXEg31IyddAXK8D6+pHEIH+EedGvt5bt8+rs5fw52ZDWwLL0RYF4Fvo3ps\nzKsqsoYPQ2CnWmnd8OkTPpuhgfAjfe2Uu9ykTbsBZ8HYmtefK2SDmfSZ/4be7MScnI9sUDN+zKlF\nZFR+hOTSK8hceCd6SxL+9oPEIn5ko43pZWk4rEYKc5zkZ40u2ZGX6SAr3c7USam4HIOCdgP1BBPF\nuNVAE8GzEbj//vu5//77x3vp9zTZVhc2vYnJSW52ehoodqZh1Z+7FpIAcjz7YkmSwupeKExLQvnH\nD9GFfLg+810sb7+Ay5nGjpZesjMy8Hq9E5NPHs+SEu88Bys/N2x2I4I+lMfvQ771K2rM4O1/IV8+\nGDvq6upKuD+MRiMLFiwYUW1yJBy5wzNMTqSsrIzs7Owh45JlGZvVQp8/SMBTS6i3Eb0lGeNx/ubu\n7m7y8vKGK4+ewKn0bNatW4fb7cbvtyGJvTQ3pOLO+S6WnmfpqfVgtTlIT09PZNR5PB7mzZtHUVER\nDoeDVGMffbVvErRakWQD1nhVqDm1CIRqBHXmJGKRAHrLyH0feus24SpcCEo/kmUZGXPU2bzNrWrp\nSEBKQRaKZEIxL4PwUWQ5iiVjJsHmViTTcasrnQsR87K2cT83OHdzZ/aPiUqp6OUi+mwf5BgeCvzv\nqPpMvjeg9evqqsE8C4K7Ie4Lp/919cZt34aS9YnLN/t7uTyrFP1xjd8vJEb7jPVmV8K1ZHTl0VO9\nDlNyPrLBgjvVwMdvGFtTlySHiasWD5V+WL4wf5Sjx8dFXQl8NjDq9Dx6yc3cVDSLd9vq+OI7z9Ad\nOrua4SOxatUqdHlqY5uKnkPQ0QjdbUiyjOnS60mfsZC5c+eSl5dHY2NjIsf+jLAlIV39aZB1Q1YB\nonYPysHN0FQNSIij++DofsS21YhIiEgkwp49e6iurh7ywE9PTx/q4z9DJEka0R35gWVXkJWRRGvV\nazgLLkks310uF4sXL040P3/ppZeG1BOcDqFQKOHmUUJmFLmXQO8umroL0ekt9Hv9pKWlYbfbmTJl\nSkLd1Wq14nSqPZVD3Wq1c8+R9TiLFieubc+diz2vUg3GZk1DCY/8fVOiIXzNuxGRTrXpj2UUCQnn\njci+59EbZai/HnTpOPLmkj7vP8GxcsihYX0un3S+TMi3jXrvFETm9yDnpyx2l/Bmj03tSeHbFH/4\nF0O4DuyXQekO0Luhfx20PAA9/xjiEvrerjXs6Gw4aXbee4GkkssxOrMQseiEFHLNLM849UGngWYA\nzhLJRitRoeC2OHm6ZvupTzgbFExlZXkWouptpDlXIH/0oSG7U1NTSUlJobm5mc2bN5/x7SSdHrni\nEqSpl6Ks/T0iEk9927YasflFRHcb0uIbIBhQs4UmzUFsXc327dsTbpbzIV8MkJKWhS77UmxZM1Ai\nAQKBAGazmeTkZAKBAC++qPrFd+3aNeo1IpEIhw8fTgRtj6exsZFp06ZRUJBPtq6fDjGdkpTdPLOh\nmwMNl3F54W8oyFN9wiUlJSQnDw30RbwdhLqPorck4ypeMsR3LcWLrwB0RuuwHPUBBlxDke7NyAab\n2kVtJPQp6sO45jJVNdX9DXW7bBwWvD1s+jTTTbVYg5t4vv4+DI65IFvIsjrZ1HaUfssV0Psv9WBb\n3GglfUS9TsZXoVfNzcf/FphnQsxLIBqhtr8z8d7e60g6E3BuRSPHimYAzhI6WeaJyz7MfdOWUtvf\neV5SQyVJgkJV3gKrU1UOPQFZllm1ahWKooxblmDYfQsqkIqmI47sRHiaoaMBHCngaULKLEb0exAN\nB5FXfBzRcoRISPVrut3uCbn/eEhJTeNgTSMvvfQS2xv0rFu3LiGrrNfryczMxOl0Dos9HI/f7+fw\n4cNUVVUNVpMKQbDXw4EDB0hLS6Mi102uPcozVf+G16QWUNU3JeHMWIAcbeCpVw4SicbIzs5mxYrB\niuSO3X/DkjGZjDkfxpY1ugvB6Mgi3Dt8laJEQwS76pH0JoLt2zAkncINoYsbIOcqVTRvBIQQrG+q\n5dWOr/Js3cdxmQazw+S4QdrUYwFvPCsw7T4oehnk+GcoOyF0WF1VFDwLxjyINvHkobf4zOTFfGP2\nNScf43sEncmGOfXk9SXnC80AnGXSzHaWZpXR7Os9L/eXBiqcIycXHRNCcOzYsZMec1r3zS2H1lqU\nFx6HkB8pq1gtTEvPg44GpJRMJIsdolHk7lauCNWc13Rhl8tFcnIyDoeDiCJhtVopLS3F33GYyinZ\nVFZWcvnllxMKhTh69OiI1/DFpTA8uigbNmygq6sLWmrpfupRAMxGA2Lbatypdm6+ag72gv9kwZRU\nDvTbUPRFEDpEc7sXry+CJElDjI3BkUlSydJTvg+dyY4SHR4oDHpq8TZuw+TMwtuXidE1SiB/APd/\nqc1s7B8Y9ZAGXzeWPht1tTnUt17GwqlDs8N+sujfqA6YwZALWd9TZbcNx2VJSRLEOsBYCKZiMBbS\n3vUugWiEuekF5NknLt3xfGLPno3VPbyj4IWAZgDOAdlWZ6LvwPlAuvTmU+bmX3rppWMOuI6JlCzE\nznWIrhakmx5QM4ciIbWGwN+XCBgreiOSJGGQJl7n5ERE42FEb8eo++fPn8/ll1/O/EKZJYvnIcsy\nPYfX0nv41cQxGRkZ1NfXU1NTM+TccCzKr/a+SXOSzE5rAL3JSHV1NeFXfsPerLlcMrUMedtqxO4N\n6AoryIq3QJwzQ12V+WJziXT8mmxHNZG+jRBpgjY1Ndfffggl7BtW3DYqkkw02IcQg7IfsXAflrRS\nDFb1czc6T9FDQOc8ZS8JT9CHOaoaqU/eMI3ywqHfH7POQCgWVeW27VeOfBHjJHyK6vaL2Ffi63qK\ncDReFCcUCB48+TjfA+gtrrMi5DYRaAbgHKA2njn7ncNGQ57/QSR34UmP0el0+P1+ent7CQQC7Nx5\nZrIOksVORNbz1qwP0SDZIbMYUnNUf/W8D4IrHUVR2Jw+B31mIYSDKLvXoxzagvLiLxGBiat4FIe3\nEvv9N1H+9j1VyuJk45Yk9HqZtm1/QMSi6K0pSHpTIrA6f/58wuEwDbUHEg/XaLCP5t5WUgS0hLwE\nZMGfYkfp6Ohge9oM0BtJ6msGXy/yx7+NlFOKEledtJj1zHb24u2M0B6cw21Tv09G4D+hbiX0PkOg\nfQ+BzmpSKlaN+f3qzS469z5Lx86n6DrwMv72KqJtT2HPmYM9OYa7hLEbkxFo7vDy0hu1NLb3E/NL\n3HX7LJJdIwdrjTo9IUUZsfALgIKn+NJBAzGh8NOqLewJlXCzOx7EDh2GY7dD7Pz97bzf0QzAOSDN\nYqcj2M/qhirq+jvZ29V06pPOA6mpqWzcuJHu7m6amppGlScYKwcX34E7Oxefz0eLpxspHoSWF12P\nPGcFL7/8Mj19/YQjEaSULMS6PyFeegJxeCv0dp784mNA2fAUoqkaZfVvwNOMfPOXwGhG+NUsHyEU\nRFCNzSjbBmf59pxZmFOKCXbVoTM5sLoriIUHC3sWLVoEsWBCKqGndiPy/ucpDlrp0ymUu9xk+71M\nad9Nl87GnBnT1Kyn3g5VdA9offfXqsYOYHPa8B3cSbsnFUUedHuEo1l0V2/ElJSH3jJ2d4glvVxd\nMYhuQt319FSvJxCahF6qRfK+gi71xnF+oiqH6ro4VN9F7V4/SgQsptGzydNMNjzBkxhzSY9AoicU\noD3YT0s0lcnKyxDtAv+7oEuH2qvV1xoTjmYAzgE6SabZ18s/63fxh8Ob+dn+N86rYNxozJ49m5KS\nElpa1BTOw4fPTN3TH4lSVFSEz+djx44d9PYOusGEEJjNZtLT05k+fTrSJdchTbsM+favAqBsfgHR\nMkKj9jEimqoRO9YiqrcjLVyF7oEn1eB0ZhF0xGMd1TtQHr8P5cC7iDf/hlL1NsLXi6G1GXvOLLoP\nr8HqrkBvchALDhoAm82GRRemp7ON+r4OGroaeCrmQi/H+K+yqXxx+jI+EA5T2KOO35qSDn0eCAeR\n9AbC/W3ozC4ivg6EEGRPraA5EOZQ7SSknOd4csd3affm0uO7gozJRdjdhaeVDWN0uNEbIc3+a9xT\nZyW2S013qo3r9eNvIhNTFHYeUBVUIyl+PnbtyXtO59iSONLXSesoLtCBZu9f2/ocJlmP214CwT1Q\nuww6fwxZ/wOuG8C7Ztxj1hgdzQCcI+6YvIhV+dNp9veil2TeaR//w+1sYrfb6erqYv78+ePuVgWq\niJtOp8NkMiWu09MzWKEajUZxuVwsWLAAl8ulNr2/8hNI2ZOQV90FNbtU+emTcDLJCbFvI1LllWqD\nG/NgdgpJGYhuVd5B+PvAkYJ45dfq6/V/RdTvQ3nh5xiCEVKn3oBZMaAz2YeU9gshcBkC7G04ypot\n62j2J7MsZw5pJj/B5h2qBnxPO8EVH0eSVGkO+j3Qqv7Og131OAsWEOptpuXtx0m3eJlU0E9ZZhfK\nL79AbyidI62L0fd60Hm+AY2fOa3PXpJ1ZBQbkPTp6GghOb0Ja1rc55/04dHdMccxWq/rdo+fOVMy\nmDU1DXuGdEoNrdlpeTxTu4P/t/2lIb+vZ2p38tmNf+G+t/+e2OY0mrmx9EoS9amFL4B1HqTdA/1r\nIHD++1C/39AMwDmiIjmLK3ImU5mWz5dnXklX8Pwqho6G1WolFAphtVqJRk/RHOQ4fD5f4g989eFd\nbN++HW8kRHfIj86kZiId3xciGAyOLmc8aQ7yR/4fJI+u/igUBeVHnx59f087Un4FtB1Vs43iSJlF\niNp4umtXK/L19yJNX4J84xcgLQda1OCuqNuL0R9AWfNb5EiUaGjQjSFiYRxWHYE+heygjdS0XFoP\n1aCXBbGQl4ivE2N2Mv05BaxcuUrtm3HnD5E/8l9EvB3426owunKJxCUnPPv+CUCmsw/FaOBG824C\ngQrayERCQUjxStiYd+z+8GgrpH0ewjVYrB6Sym8E62JI/8IpT93laeTBLf8acV99Ux85bgeZJSby\nkk/tlnIazISUKElGC787/C698YZJ/miIK3OnIBAUO1TRRJveBIZMKN0KxevUtFAA2arWDgRHr8HQ\nGB+aATiHWPQG7pxyKS6jOfGHcKExoJNzus1G1q9fTygUorq2hpZjDQgER71dfG/3Gur6PSQlJSUq\natvb2zly5MioOfWSLCNl5IMsEzvOVSaO+8zE9ldHOlXdF42o1cjZkyDkT2QcAUhJGUjOFJSDmxHN\n1ZDsRl7xMaSi6RD0IQ7Ge1f4e8HXCx2NSE99n1hwcPWiRIJELClIyORbu1gwS9WpsXZ2Y3VX0LHr\naQhHiR1ZT2+t2hJV0umRMgrwHHgZV/FlarMSWc0MSZt1Oz/uzyZgzkRc9TEKb/0UydnJtEbiWTX+\nEPjeRtStRHh+xTNrDrH2nXqqajr5x9qhbjrRF4+dRFrBPAN8b4MxngGW+/PRPzMhWN1QxVutNfyi\n6k3MOgNtJyQuxBSF2sYeinJd7O1qJmkMEg2SJPGlGVdwa3El77bX8eXN/6Q/HMQT8nFt/nQeW3Qr\nX5l1JQ/OupIbi2YOnAT61KEXMmSrmVHqYC/ewHDvyIZ5vGgG4DzgMJrpi0ysqNNEMfBQHqjIPR1l\nz+fffYPdB6uwhwQRkx6dJNEd8tOSrGPBggVqwwwhaG9vp6mpCZdruGb+8fRb7PDTu1Di6YzKz+5B\n2b4G5c2/IzY+Ex+fmj4qlBixR+9Q+xRveArJmYpksiAtvBaShxaYSfNXIva8AdEIkuE4I5ScibT0\nduQv/BrRUovo74asEuSYQqS3BSUaJhANE/F30qUzMSu5gYLCYpBkzMRQfD6cRZeROv1m9N0+pIgP\nb8seepp2Jj5HvdmJJU3NwbfOup197rn4dGbSs+zsUWJEXalIkkSS1EZtr1r2r6zXQ9PdSEovQV8E\nEY2SL76DuevrKOH2xPBFzXaU//sKwtcLIqjOoCNHwTL9lL+7w73t/LN+F6sb9vOZyYtZll3Gf21/\ncUj9SrvHT06GHSEJXm8+NGoL1RMpc2UwJy2P/65cSZ4tmf/Y/Cw51iSMOj2m+DWKHGm4LaOLo2HM\nV7OCRBRavwE1l0P4uHqMnqeg5gqo/7cxjek9iRIAzxMTeknNAJwHdJI8qo/1QuCaa65JFCKNFAdQ\nFAWPx5N4PSDZbPVGqEnTIZfnUJSXT3GOKlwlZBlZr8NiseD3+1EUhUWLFp2y8ve5STNodaZwuGYX\n4R71QScOvKv2KnYXQFYJtNarB3c2Du5vqkb6wIcAkBfdgHRCQZHkTEV365c5UQJbd93nkaddiiTL\nIOsQG/6KNGkWQqdHEVECR97iC+88Q7C/nf3BEMlJFdhNbpS/fZ/LaGFSQT4c3IyhZj+ybOLPtlJ6\nhYS//m3e3f0cnfueG9L4fGtXM/9oqaGqp5UpSZk4bCl09LWjxCIY9DJ9oSQ2t95BY6SQdn7OwbrL\n8PW3U9r0AuVp2yh2bcbtaCIWbxUpxe5AumQ6on63ajAP7YD0L4N19GZHPSE/3SE/77TXsTynnIhQ\nqEzLZ0rc/fbfO15KHNvVGyQ12cLbrbUszy5ndmruSX9/Qz5zSSLT6kIgmJacxa0lpxbvG4JsBcUH\n1XPVIDF6VVV0gO4/QswDIgwdP4HAxFS1X1CE68FUNqGX1AzAecKiN4zaP3hfV/O4NfUnggEBNofD\nQX9/P+FweIguf19fH++8806i8bzf70eyqf58i9XCzZMqmT15KpdNm83ji28ny+rk7k1P4XA4WL9+\nPceOHRtTjwhPOEjNzKXkvfhL9L/9Guj00H4UafJCsLogFkV542kARHc7pGYj1v8F+jqRxqkgWdfX\nydH+LuQP3ol8z8/YWziVJ5bfxpGYnV5PFWnEaO86RkhvwbxjPbzyJDQdxpBVhG7BSsTGZxDr/0Jy\nUgZH+jupNibzc8VJnq+JcG+j2j4RCMWi/L12B9NTslnbdJBSVwbZSVnQqRZ92Z1J3HHzTN6qu4R/\nuG7gpS2CjR3XEQp2kZ+2HxFJATmJRe4f09ExKLwnp/4OSX8fBAyIl3+FMK4cVcoB4Ctb/sWDW/7F\nO221zErNY3ZqHpIk4bY4mZeuFoLt62rmJ/vW09UbJMVl5mBPK1fnVYyriVIwFsEyXnXcjLgmUdb3\nIednEI2vfpQw6LOhbCcYcqDvBfCM7u56zxJtBctpGs5ToBmA88TkpEx2e4ZrtvSE/Px0/waaz2Pl\n8ACpqal0dHSwf//+IWJxXq+X4uJijhxR89h3Hq5iX6yHjlwHWdYTOizJMjcXz+YSdzFN+ghpaWlk\nZWWNSfRNEQJ36VzeXnY7z12yCvmTDwMgXXMH8g33It/6n9BWr4rOebtV+QkA5eQN1k/GKw37efLQ\nW0jOVNpjER6vepO+aITtzgxi/iCfl/twBDrJScpCSnZDXyeYrEhzrkSyOpA/+yjklCI5UylypFJY\ncimd6HjWWqx+HmbVADT61FaBl2ZOosXfS5krg8LUAoyxEJ7OWoKSrPYejpPlq8MXc6LX9+DMEYju\nEoTjo+ilAL2trwAgovEHa9SI8nIUafoSRLUqRHjM20UoFuXbO16myTe8X8BlmZMoc2Xwb8WDCqE3\nFM7EaTDz3NE9VHW30Ojp429N2+iNBHGMU6UzFIsl3D6njWU6oFMrlPXpEO1QfeKdj6lyEgPoM1Qx\nuwt4lT0uIi1gmFi9LM0AnCcWZhTydlvtsJl+fb8Hh8F03vsKA6SkpODxeOjs7Bwiy9zd3U1OTg7B\nYJBoNIq3u5dFZdP4xMzLuaVo9rDrmHUGbimaxQZPLfPmz6ey8tSzmP3dzVT3tVOe5OaK6R+gxmpn\ndzhA6J6fq32LJVmd5aflqKJzbzyNNGUh0srPoRTNwDPOLKtALIJNb6Iz6OVwTzt2vYl56QXIOhNZ\n+w5g7vDQYXBSaXaq2kaAfOcPB1tjShLyLf+BdMl1PDjrKmam5vL44tuxWVx0mpKJ6Myq7pK3m8q0\nfGak5PCLSz+EJElYTXa2m9zEjr3Dznix4GdvnckXP1bJ5VctoGJSBvs7FqFz1iC2RVFeOEQk+t/o\nw3vwef0QdNEY+RAdwQKEkNhhnQ19HvZ2NfHwjtX8eO/rNPp6hsiTFzvSKHSk8pHS+ep7OS5FNM1s\nZ3FmCce8XciKTJ2ni4PeFhShjFul84Hpy7muYPytNynbrrqDDJmqC6jnr9DzJzBPUfc7rgDnByGw\nAzy/GP99LkT8b4Nl7oRectwNYTTODLvBTIrJxnd2vsI353wwsb096KXM5abrPPQQOBFJkpg2bRpG\no5Hdu9XG6V6vl76+voRSZk9PDyGHiZLUzJM+FOwGM2UuN83+3jGJfNX3d3HP1CWJcQD84sBGbiuu\nZFlOeeK42PKPoexci8GWBO5C5OxJ/NOoZ9POl/nRJacfEBQCipypfH3r8wB8Z+51pFvszE8vJOIu\nwfWnb+GqPYrk1SEA+fM/HRTciyOdMMPVyTIfzJ/K7w73MycqQeMBnq3fxX9XrhzywAUwOjIg1EaD\n0COESDSZsRaWYepooKV9FsycAlkHIBJCXvMiWSt6Obb1KcqT8ujwZiCFijB84pu8+cIhFF8LB4O7\nqTRNYnu/umLrCQcIRiMggUHW8cCM5aN+HtOSswhEwxyo6aLXobr8ludMPu3PdYBs28kD/2NGtqmz\n/gGlUecN6v+um9T/LXOg958Tc68LgahH/XKemB11hmgG4DxyZe4UvrXjZaJKLOFP7Qj0U+5yn5cm\nMiMxoEuv0+loamqivr6eiooKJElCCEF3dzf9BoFzDD73AkcKR72eMRmAVn8vl7gHuyHpZZlMi5Od\nnoaEAYgpCl88tImHa3ZhLJnFP47uJdVsZU3jAQDeaq0h2WSlIvn0Kl+zLIMPqfR4DYHTaIaMAgac\nS2LXOqQrP4lkGlsntSyrizsnX8q/6nehl3UszyknwzI8DlKROZmuvqPEbNn4omHsx2UpXVqZg5iT\ng6ST0d12HSLgRRw7gKH7P5ic8xgi43HqNhtJsU+hq7qbyvJUunYnI3dEyS9MZ7tyhAemL+eXBzby\nx+rNXJs/nRmpI/d3HmCSK4NJrgyeazjC0sW5mMw6zPoLRNjMdimYJsVba57gzDCWQGTi1G3PO97X\nwbHi1MedJpoL6DySY0vi8sxJtAX6OdLbTpu/j3fa6yh1pZ/UAESV2DkPEufm5rJz505KS0sTRiEn\nJ4dDhw7hkSPYxhDYK7CncLT/5JouESVGMBqhK+Qn2Tj4cE02WgnGIijxVFKAF47tpTg5kx6LHcXT\nzNqmA7zZcoSfLb4NgD9Ub+axfRvG/B5jioIsSYkWngPXOR7dA08i361WKEuFY2vtl3gPJivdoQAd\nAS+3FM1OaOYfT54rg2nzPopdbxyWJKCTZfS6wXMkix2pdA6y/0o2tXwBxbmQGA5Mtnx2HWxnzvQc\nqsxTaI9mU3XEw5VZU0jBgaXdQbnDzQvH9rIwo3DIPXr6Q/R61cyvZ9YcoqVDLYALBKO47OYL5+EP\nqkRE6ucg63+H75NNQ5vOCwHeN8/d2EZD8Z9c4TTWC91/GnwdOhL//6Ba1zHBaAbgPJNmsfPH6s08\nsuc1fl+9mYgSI93ioGeUtn4AP9jzGi837DuHo1RXAna7nYyMwZZ0BQUFKMVuluRPGZNPONPqpDVw\n8gKeV47t51s7XkZCGnJNk86QmBF7IyE8QR8He1p5YPpynp2+mAOLbmB+egFfnL4Mg6zjics+DKit\nZseKPxrGqjcyOy2XRxbciGGULBfJHDdMtpPkrY+ALEk0+LppDfSN+PA/HusIBmDEscg6dMu+Tkvw\nEvq8YSxmHemZJlZeXozDphqyK/vXkZtupULOZ8f+dtJ6UrncOZlbC+dgPyGYu+bteta+XU9Dax/H\nWvrxBSL4g5GTCr5dsMi2QfkIpR+a7xvcJ2JQPU/NIDqXeNdD12/g8CzwbxssbgMIN6gP/44fqIZC\n8cPRWyDWrbbWNA5v6HSmaAbgPGPTm6jrV3Pqu4I+PpBdhkHW0ejtYVNrzYjn+KMRjvR2nNNVgNVq\nZenSpUO2/fLARg5G1GDmWNBJMhIS0RGydIQQtPh7afR1E4xFsZww01zkLubjZQvJsSbxZusRvrb1\nOQJRtXHKvLwKfta0nxSzbYgr6tGFt1DsTBvzexwwALIkn9KlJd/7i0QbxtOh3JXBzUWzTnncWA3A\nAAXZTrbvb6M91sePjqylvEitIl68PB1nloEPToqxo6qNnv4gKy8vZsf2To5tiwz7DklAOKIQCKm/\no+fX1/DiG7WkjCL3fEGT9CHo/TuEaiGq6j8lMoOiHeoKIVJ3bsfUvxbC8Vl98xeg48fxccWg8Q7o\n+jW4blbdWj1PqXn//a8DUbWhzgSjGYDzzGJ3Mf8z73runHwp3WE/l2eqZfu59iT+WL05kS44gDcS\nIs1so6qnlere9pEueU6IKDH80TBfmnHFsEDmyci2uVjdUMV3drxCV9DH0zVqJk1boI+Htr9EbyRI\nptVJIDq0SX2BI4V56QUUO9N4/qha5OOLqq6KqSlZrMiZzI2FQx+stnhwVgihBj1PQW84oPr6x8CJ\ngd+xcvfUJVziLj7lcVa9kc7TyGQqyUtiz+EOsMSICoUGr/q96ZcCRIqmYe1rpl2vEbYAAB9lSURB\nVDgvCaNeR0aKFa8/QndfiP1HPHR0+3l5Yy2RqIKiCIwGmRc31JCXGU9Zbe1n0axTNJC5EDEWQt/z\ncPQm8L2jbovFGwJFmkAyDZ2Bn238W0DpBSn+HRNR8K4Fz//BkcVgKIDcJ8C6ADoeAc8vIeeXapaT\nfHqrzbHyHlzXvb+QJIlUsy2hq5JpVX/RX5y+nA3Nh9nQXM3tJZWJIHGDt5siRxqL3SU0+nooSzo/\nfXQP9rRS5spAd5qz4CJHKr85pP4xfnXrcwAszSrj3fZ6VuVPY3pKDqsbqmgP9I94/rSUbD5dvoio\nUDDGq2pTTDZuOS5//XgcBjM/3LOO6r52fnHph05qrDqCXtKPVw49j0xypfPtHa+QbLIwPeXkgVqA\nJIcJox3azF3ghe/tXsPPFt9Ge6CfqZlFsOdNLrn6KgAURZ0FV1a4qW3sYc3b9QAcrusmL8uBy27i\nWEs/ZQXJlBem0O8Lo9O9B+eKejc4rgbTZOj8CbhuBf9W1ZcebQbrfNXHbpk92AN5NEREnYEP/D8e\nfJvUvsg9T6vGqf9ldbvnZ/F7hNSHv4iA59eQcifoUyD7pyCPs3juFJzxb/WHP/whsiyr/U/jPPbY\nY5SWllJRUcGmTZvO9BYXBTpZ5qeLbh3ygJqXXkh1bzuff+tpDvWoS1hvJIjTYCbdYqfzZI02zgIR\nJUaTrwchBAd72k47uwZgQUZRIr0TVJ2YTW011PZ1ck3eVAodqXy0dAH3Tls66jXmZRRyibuYyvRT\nu56KnKlU96krpVZ/H23+PrVNIeCLhHjh6KBkQEfQS/oImTnng1xbMg/Pu45n68amgOkJ+9ibcZjJ\n8QlBRInRE/LTEfSSklGA6GpNuHtkWeKLH6tkybw8guEYqUlm7v332dx6TTlL5uaxZG4uBVlOctwO\nZpSns3jOqQ3QBYmkUwPEyR+Hgqch6WZo/y7UX6u6hRwfBM/jUH/TyOe3fANCh1S3UfU8dbVQPQ+C\n44y/BfeCeRo4roLUu6HoJSgYlMPGOj8+bgMU/h1S42q3xly1uO0scEYrgIaGBtauXUtBwWDv0Pb2\ndh5//HHWrVtHXV0d9913Hzt27DjjgV4MnCiuZTMYE0HT7Z3HKE9y442GcBosp+0jPlO8kSBfevdZ\nAO6dupQjfR3cUDhzXNeanpLDE5d9mF8f2MRNRbP5WnwlMLDKsRmM2JiYGc+VOVPY0HwYIVQXz4/3\nvY5Zp+fK3Apa/b1s6TjKqvzpdIf9vNKwn6VZJ++dfC5JM9vJtDrpDvlJPkW66YCrsDI9n6qeFtLN\nDr6y5V+UONMx6Y0oaTmqXlK6GkgcCLBftaiQcDSGQa8jO31w9XPzlROrOXNekSQ1XVQooMQnTd2/\nVfsNFP4T6m9W5SOc1w49z7sGYp2qnpI+A5ruUQPLwQPqg/x08L2junEkA9g/MHRf2S7wvavO/s8x\nZ7QCeOCBB/j+978/ZNvmzZu5+uqryc/PZ8mSJQghhujAa5wen5tyGQszCmmMl+97IyHsBhM2vQlf\nNExn0Iv3HCiLvtVayw2FM7HrTfx0/wYWZhSNmiUzVj4z5VJSzTbunbqUq/MqJmikQ5EkiW/PvZZr\n8qbSHwlSYE8hGIvy/NE97PI0Mi05i+6QP5Ge6hqnhtDZoszl5nBv25BtJ8ZHQG3Q/rkpl5FvT+Hr\ns68hx5YEQM6ANIcrHeWPDw0L+rocJtKTx1bL8J7neHel61Y1q8ZYBO5vQLBq6LHhRrAvA1O5GkOw\nLwdjMWQ8ePr1Bf6t0HQXpN07+jG2hWNq1DPRjHsF8Nxzz5Gbm8uMGUNzU7ds2cKUKVMSr8vLy9my\nZQvLl49ebagxOrPT8pidlscP97yGIhSafL0scpdg1unZ09XEnq4mnAYzNxXNGlNwcbz0R4JUpuez\nNKuUVxqq+ED2xM0Qp6VkMy3l7AUZ9bIOu8HErw5uYkFGIR8vW0iKyYpZZ+Cet55OxCJW5U8ft8TB\n2SLHlkRVtyr2tquzge5wgNUN+/nKzCtJOa7PQXfIT5lrMB50TV4Fl2VOwhEvJJMmL0DsXg/dbSjv\nPI+06DqkkzTced+S8XVVR+j4Gbx1AfQ8o6aEDvjag7vV2IDrFjUTx1gC5skQ7Tz9eoJYL5gq1FXI\nBcZJDcCKFStobW0dtv3hhx/mu9/9LmvWDPbpHJhZjJSaeKH9Ub0XCcei/P7wZuR40Ph4+iJBnq7Z\nztz0gjOelZ/I602HyLK66I+EcBjMWPRGbhpDGuOFhlGnw6o3cFPhLJKOc6c8VLmSb2x7gWnJ2UxJ\nuvAeiBlmO2/EA+KrG6uo6/dQ4kyjM+hNGIAdncdY13yIVQWDuv9qKutgRpPkSkOaexWi8SDi0Gak\n8nkn7bj2viVpBHkQXRqEqqD3b5D8EXVb6AjYL1fjCM6Vxx2bombuNHxS1SIqG0OMJtoBKZ+cmPFP\nMCc1AGvXrh1x+759+6irq2PmTNUH3NjYSGVlJZs3b2bBggW89tpriWMPHjzIvHnzJnDIFyf/Xjqf\nh3eu5pPlg9rujyy4ifp+D1s66gHY0l7P4sySM76XNxJkR2cDl2eV8nTtdq7MnYL3DBQgLwSmp+Tw\nw4W3DMsCSrc4+PLMFZQ408/TyE6Oy2ihJ94JTSfJPLrwFnZ6GugIeilDnfEf7GljkjM9UcE8GlJO\nGcqfvwWACPlOq0juQkXU7AKdntOtyh6CbFIzbkLVg9vCR8D4qeHHSjKkfBq6/i8+AHFq1020Bcxn\nx8V5powrBjBt2jTa2tqoq6ujrq6O3NxcduzYgdvtZv78+bz66qscO3aMDRs2IMvymLTfNU5Ovj2F\nUmcGJY7Bwian0cyM1Bw+PXkxt5dUstPTMCH3eqetjj8f2coxbxd5tmR6QgGCsej4ZXwvEEZLAb1Q\nH/4wuHp+8eheGn092AxGCh0p1PV7EELwfwff4o2Wah6YfmoXq+QugOJ44L6/++QHvwcQQkF57qeI\nA++c+cVSPwvhOvWBLgTE+kE3ynMr7R4ofFHN51e8aqeukxE8oKaiXoBMyF/08S4et9vNXXfdxbJl\nyzAajTzxxMS2MLuY+Y+ZV4y6z24wjxgcHA87OhtYll3OwztXc03eVGr6OojFWy9qnHvsBhPbO4/x\n7bmrAMixJtHq76M/EmJrx1Hy7cno5LHN5SRHKgKgz3OqQy98+rogLRdx4F2UwunIUxaO/1qSTm07\nGT6i+vlNp4inGXPBeT0EtkHzF6F058grASEARV1lXIBMiAGora0d8vr+++/n/vvvn4hLa5wGZp2e\nYCyCWTf+kvFgLIJZb+C2kkpSzTbybMnk2ZJ5p7321CdrnBUGVEMH5CkGJlwt/l6uzqsYVgF9MqRL\nb0Ka9QGUDU9P/EDPMeLwVqSiGYjORsTa36NEgsgzlo7/gsYSaPgMSHrI+cmpj0/+MHT8SP3Zu0bN\n7z+RWAfoJlbCeSJ5D5b3aYxGisl2ykYodX2dPLJ75NgOQIuvl+x46uAVOZMpT3IzOy2Pj0yaP6Fj\n1Rg7bouTYsdQTaMWfy9bOurJMJ+ee1UyWZBSs8HXg+jpmMhhnnPEW/9U1VA/9yOIhhE7Xht+TO9p\nvEddMsgWKF4D5qmnPt6QD74N6s++t4fvjzRDx6PqyuICRTMA7yPy7SnU9598af+/u9dwpG/0P4oG\nX08ih3wAWZKGZM5onFsucRex/LgmOADzMgrY1Foz/rqFzkaU3zyIOIU894WK6G6FlCykzCIkqxP5\nnp8hpecjPM2Dx3S1ojz5IMI3xvaqzuvV6tyxyptIEuT/RS0Ui3YO3x/YA/2rVUNxgaIZgPcRk5Pc\n/KF6cyJv/EQO9bRh1RvJsSaNuB/g3fY6ZpzFnHyN00cnycMasN9eorYGHKt43YnIn31U/aG1/kyG\ndt4QVe8gzRiUFJGMFpg0G3HswOAxLTVgssBYjZwkjf3hP4C5QnUFiRECwQNVx+by4fsuEDQD8D4i\nLS5k9pN964mc0DTGFwnz6N51BKJh0sw2+sLDv7CdQS8pJuswjXiNC5M8W3JCRPB0kWwu5Nu/irL9\n1Qke1dlBREJDX3c0IJUPdUtK9iToaUMMNFMKeCEtF+WNpxGNh87VUAcJbIe836rVxBcomgF4HyFJ\nEl+ffTUAVd0tPPDuMxyJS0b/dP96Pl+xhIcqVzHJlUFN3/Al6/7ulnEJvGmcH74x55oxteIcDSl7\nEuj0iLg43oWCCAeHunL6PCg/vXvoQUEfkuUE5VabC7FzHco/4wHcgBcptxyaqlH+9n2UHWvPXg8N\n2QrKcfG3jh+q7h/z+PSyzhWaAXifoWrBXM2/6ncTjsV4ZM9r/Kl6C0ZZz4zUHDKtTrKtLn55YCOR\neGOWRl8339z6PH85spWKC7AaVuPsISVnQvfwav/ziXj9zyjP/AAxkHp8gg9fBP0wUkxqoOF8b4c6\n66/fi1RxCdLVd6jnbX0FWs9SAxi9GyLHaTb1rQb3Q6fvUjrHvLcrezRGJN+ewv3TPkBH0MsP9rzG\n3q4mph43sy9PcjMrNZf93S3kWF3s726hPehlanKWFuy92HCkqEVhabnneyQAxJ79MYQDSHlToL8L\nYXGgPH1Cz19fD5IjZdi5Ulz3CF8fYntcpsbmQq5YhEjJhmgIsWsdOFORBozFRKHPhGirWj8Q6wdT\nKbiun9h7nAU0A/A+JclkTUgD9IQDiVxyAIOs4/qCGfxs/xt4QoPL1lmpF8ZDQOMc4khGeHsuHFmI\n+r1qcNeeDB2NkJQBSgyMZtU1tOVlRPtRpKyRJU/k2x5E2fQPCPqRP/Q1pHiQXMosRAiB+Nv3Eb4+\ndLd8aWLHrc8YbDsZ2AHWyom9/lniwl6faJwRRp2eh+ddB0CGZWhLuSyrC09I7UH82SmXAoNBZI2L\nB8meMqwqWNn0j7N6TxH0o+x5Y/QxFc9EmroY5c2/g6cZadENSPOuQVRvQ2x5Cer3Dbp7Tjw3pxT0\nRtAbEw//xD5JQr7xC0hWB8q+TRP7Pg1Zat6/721ovh8s7w39M80AvM9JM9u5Krci0SlqAEmSeKhy\nJbcWVzIn3tR90gWsiaNxlkjPRWx+gdgvvoAIeIk9eoc6yz6b0h/t9YjX/jDyvpwy1QA4UsDmQnnx\nF2BzIbkLEfveShwmnaQVqnzlJ5Gv/dzIOwumIjoaEO88pwrJTRTm6dD1W/C/G399YYq/nYhmAC4C\nbiqaNaJSZJbVlRBIe+KyDw/rSKbx/key2JEqFkFKJqJuD6TEY0V9Z69ATHSrmWnKjqEV6UKJwXGa\nRvKKj6tjTM5Ux9V0GPmG+9SdqaNnq0mOZCRn2sj7ZBnJXajWBpwgq35GyBbI+Ap0/wHyfq/KSbwH\n0AyAhsZFjnz1HUjTLkNUb0eauhhp0Q3QpRYTKttWI7xqN7rYk19FWf/XM7qX6O9CrP8L8qf+F7Ht\n1UR+vxAKNFbD8T0MkuOz/Iw8NVgNkJ6P/Lkfn1EQV5p3DfKtX4aJjnw4roGs74Hlwk79PB7NAGho\naKj6QDW7VGmFlExEdyuipx3x5t9RfvNVdXbe247YOVxv57To70KqvAopKR1p0hzojgdOj+xEeeYR\n5HnXDDlc98CTSEaL6r+/8wfq7N56ZvLyUmq2Wh8Q9J2eVtCp0NlHFoS7gNEMgIaGBlJmEfLH/hty\nyyE5C7pbUX7zVXVnag7K776JNHkh5E0etXBM1O9DHKsacV8Cfx8MPMBTMhFdLYiQH2XranVmnz16\n20TJnjyetzY6nibVuI1VK+h9iGYANDQ0AJDSclWp6aQMxN6N6saCqUipWdDTBvYkJItDlVgYAWXP\nGygv/3rUalvl7X8h/H1gVTPSpJQs6GpB1O1Fmjz/jGf2p4t8x/9CkhvliQcQkTAAQlEQE9RX472A\nZgA0NDSGIBmMau49oLv5gYTomlQ2F8xWlLW/RzRVo2x4auiJ4SDS9CWIuL6QaKkdsiIQ776AOLhl\ncCafkqnGGmp2IRWfe7+55EpXq6CNZsS2V9SNtbsRb5z9XgmxZ3+EcuBdhLcHEQkjFDXrSsSiiOYj\nZ/3+A7w3QtUaGhrnFPnun6K8pHbzk7InoXvgSXWHEIj1f1WDwe1HEfM/iBSf0ROLIFWuQFn9JMy9\nGmXjMxDoR77+PhgQH2w8BGk56s+2JFXzx2hBTso4x+9QRf73b4LVhRJPSxXebsThrYgltyHphzdW\nEuEA4vW/IF1+K+h0SOOtnG+uQXia1QC7wTi0rqG7DWnJbWoqbPFM8DSpmUtnAc0AaGhoDEMyW9Hd\n/MXh27OKkS+5DuWfP0a6+tOIvW8iLViFqN8H/n4ksw1CfkTtHjXVUm9A+c2D6rlXfQrJ6kyIuEmS\nBGYb8oJV5/S9DXk/Aw/WkF91Xfn6IHsSYstLajbUiRytQlS9jah6G+zJ6O78wWnfUwihGsFYRP2M\nwkFwpiGVzUW01YPJhnj7X4jkTKRoGLH6yUEDPMFoLiANDY3TI7cM+favIRVNQ8T7CSjP/gh61Px+\nzDaUf/0EqXAqUk5ZQoxNKqhAKpo+5FK62x5EKpx27sY+CpIjGbHmd9DbgbxglfogHgHR3TZYizBC\nrEB0NJz6Zr2dSM405A99AwB51eeQV3wceeG16K6/F2nmEoiE1JVB3V5V5dTXi7L1lXG+u9HRDICG\nhsZpIRlMSNklakA46EX0eZDK5yF//jEA5EuuQ5q5FHn5R5Gv+ChyxSKkOSvANnojovONvPJziJAf\nUbsb3IUQCgwLZgslhmg4AOl5yPc/AalZagbT639B9HYiohGUPz5E7LmfIY7sUK83QkBcef1PSKWV\nSLKMfM/PkcrmIWUNNqGXkuOKvJGQ2rHNXYjYvQGx8ZkJf9+aC0hDQ2P86PTgaYakTLUrFyBlFCAt\n/+iQw+Slt5+HwZ0e8uQFiGQ3kiSpzWW8PeA4LvW0ZreaKTVQlKYoKC88DscOINrq1awmvRGiIZTn\nfw4ls8Dbje7f/ytxCdHdquoUlc4BGKZXBGrMRb7n5yiv/BopsxgsNsT6v4K7ANFSO8RYnPF7nrAr\naWhoXHRIGQWIur1gc5764AscqWwu8mW3qC8yCtQgdySEqN2DUBSUF36urg4GaKlBsjiR5l0DrbWI\n/ZuQlt4+2KmsZtegWyyO2LcJeeYHTj0Woxn5unuQF6xEKpkNsShSxWJE18jtXseLtgLQ0NAYN1Jm\nEcobTyPn3na+hzKhSNklqlhcfxfi9T+rRXIMnbHLtz2oNqa32FGsTpAkpPwKCAcQWSXQUgMWJ0II\nNeANiM5GpPkfHNsY4udINhfyJx6G7lZ1BTGBnNEK4Le//S1Tpkxh6tSpfOUrX0lsf+yxxygtLaWi\nooJNmzad8SA1NDQuUPKngME0mNr5fiGnFNF0BHFkB1LlVYgdr0HRDMibnDhEyilNZDTJlVciz1mh\nSlxk5CPH+w1IBVPhyI7B64aD40odlVIyweJAvPn3M3tfJzDuFcC+ffv41a9+xfPPP09paSkdHaqm\nRnt7O48//jjr1q2jrq6O++67jx07dpziahoaGu9FJLMN3Se+c76HMeFIkozkLkBUvY206EaUv30P\n+cb7B7uOnep8g0lNey2bi/KPR5EnzQFvN8i68Q/qLLjZxm0AXnnlFe644w5KS0sBSE9XteQ3b97M\n1VdfTX5+Pvn5+Qgh6O/vx+E4t2XeGhoaGmeCtOgGNXvJZFUro0+zGEueuli9Tno+Yt8mxPZXVent\n8Y7HlY5814/Hff5IjNsFtGbNGvbt28fcuXP59Kc/TVWVWvK9ZcsWpkyZkjiuvLycLVu2nPlINTQ0\nNM4hksWuSlJb7FA8Uy1yG891yioRa38HXS3IY/T/jz6miZ1In3QFsGLFClpbhwcdHn74YYLBIF1d\nXWzcuJHXXnuNe+65h9dff33EvNeBYIaGhobGew1JktANFH+Nh9xySM0BT9PEDWqCOKkBWLt27aj7\nNm7cyNKlS7FYLFx77bV89rOfJRgMsmDBAl57bVAz/ODBg8yb997oj6mhoaEx0UiShPyR/1KlsC8w\nxu0CuuSSS3jllVcQQrB582ZKSkowm83Mnz+fV199lWPHjrFhwwZkWdb8/xoaGhc1kk4/WEB2ATHu\nIPD111/PmjVrqKioYPLkyTz66KMAuN1u7rrrLpYtW4bRaOSJJ56YsMFqaGhoaEwckhite8NZ5qGH\nHuKhhx46H7fW0NDQ0ECTgtDQ0NC4aNEMgIaGhsZFimYANDQ0NC5SNAOgoaGhcZGiGQANDQ2NixTN\nAGhoaGhcpGgGQENDQ+MiRTMAGhoaGhcpmgHQ0NDQuEjRDICGhobGRYpmADQ0NDQuUjQDoKGhoXGR\nohkADQ0NjYsUzQBoaGhoXKRoBkBDQ0PjIkUzABoaGhoXKZoB0NDQ0LhI0QyAhoaGxkWKZgA0NDQ0\nLlI0A6ChoaFxkaIZAA0NDY2LFM0AaGhoaFykjNsAVFVVsWrVKmbNmsW1117LgQMHEvsee+wxSktL\nqaioYNOmTRMyUA0NDQ2NiWXcBuBb3/oWH/vYx9i1axcf/vCH+da3vgVAe3s7jz/+OOvWreMXv/gF\n991334QNVkNDQ0Nj4tCP90SXy4XH40FRFDweD8nJyQBs3ryZq6++mvz8fPLz8xFC0N/fj8PhmLBB\na2hoaGicOeM2AI888gjz58/nwQcfJCsri23btgGwZcsWpkyZkjiuvLycLVu2sHz58jMfrYaGhobG\nhHFSF9CKFSuYPn36sH/PP/88n/rUp7j33nvxeDzc9f/bub+QpvowDuBfJaxBYGDYgv7MnG3qwq1y\nR5LZjBK8WIskloEEs5tRF4UEUXYXgUjk8CIiWBdBjG4iszSSWBtU26KuNjUklwYls1C32kLW816I\n5zUy3jl9N/L3fO4842zP7zs5D+fPM4cDdrsdAEBEv71PXl7e/1M9Y4yxjOXRYkfsNCiVSoyOjkKh\nUCAej0OtVuPz5894+PAhBgYG4HQ6AQB6vR4+n++3S0BdXV2Ymppa/goYY0wgZrMZZrN5Rd4r40tA\n9fX16Onpgc1mw4MHD3Do0CEAgNFoxPnz5zE2Nob3798jPz9/0ev/Z8+ezbxqxhhjy5bxGUAoFMKV\nK1cQDoeh0+lw+fJlaLVaAIDT6UR3dzcKCgpw8+ZNmEymFS2aMcbY8mXcABhjjP3dcjIJ7PV6UV5e\njrKyMnR3d+eihKwaHx9HfX09KisrYTabcffuXQBALBaD1WrFtm3bcOTIEcTjcXmf1TxMl0qlYDAY\nYLFYAIibAwB8+/YNJ0+exM6dO1FRUQG/3y9kHrdu3cK+ffuwZ88e+fKwKDnY7XZs2rQJu3btkrdl\nsvbBwUHs3r0bO3bswKVLl9L7cMoBvV5Pz58/p0gkQhqNhqLRaC7KyJpPnz7R27dviYgoGo1SSUkJ\nzczMUEdHB505c4aSySSdPn2aOjs7iYhoYmKCNBoNffjwgTweDxkMhlyWv+KuXbtGJ06cIIvFQkQk\nbA5ERG1tbdTe3k6JRIJmZ2dpampKuDy+fPlCKpWK4vE4pVIpamxspP7+fmFy8Hq99ObNG9LpdPK2\nTNbe2NhIbrebJicnqba2loLB4H9+dtbPAKanpwEAdXV12L59OxoaGuD3+7NdRlYplUro9XoAwMaN\nG1FZWYlgMIhAIIDW1lasXbsWdrtdzmHhMN3+/fvlYbrV4OPHj3j8+DFOnTolPzIsYg7zBgYGcPHi\nRaxbtw5r1qxBYWGhcHkoFAoQEaanp5FIJPD9+3ds2LBBmBxMJpM8SDtvKWufPzsYHh6GzWZDUVER\njh49mtZxNesNIBgMyjeLAaCiogKvXr3Kdhk5MzIyglAoBKPR+EsWWq0WgUAAwNyXvNgw3Wpw7tw5\ndHZ2Ij//3389EXMA5pphMpmEw+GAJEno6OhAIpEQLg+FQoEbN25ApVJBqVSitrYWkiQJl8NCS1m7\n3+/HyMgIiouL5e3pHlf510CzKBaLwWaz4fr161i/fv2iQ3N/shqG6Xp7e1FcXAyDwfDL2kXLYV4y\nmcS7d+/Q1NQEj8eDUCiEe/fuCZdHNBqFw+FAOBxGJBLBy5cv0dvbK1wOCy137enun/UGUF1djaGh\nIfnvUCiEmpqabJeRdbOzs2hqakJLSwusViuAuSzmf0V1cHAQ1dXVAABJkhAOh+V9h4aG5Nf+Zi9e\nvEBPTw9KSkrQ3NyMZ8+eoaWlRbgc5qnVamg0GlgsFigUCjQ3N6O/v1+4PAKBAGpqaqBWq1FUVIRj\nx47B5/MJl8NCS127Wq3GxMSEvD0cDqd1XM16AygsLAQw9yRQJBLB06dPIUlStsvIKiJCa2srdDrd\nLwNwkiTB5XIhkUjA5XLJX5jRaMSTJ08wNjYGj8fzx2G6v83Vq1cxPj6O0dFRuN1uHDhwAHfu3BEu\nh4XKysrg9/vx8+dPPHr0CAcPHhQuD5PJhNevX+Pr16/48eMH+vr60NDQIFwOC2Wydq1WC7fbjcnJ\nSdy/fz+94+oK3MReMo/HQ1qtlkpLS8npdOaihKzy+XyUl5dHVVVVpNfrSa/XU19fH83MzNDhw4dp\n69atZLVaKRaLyft0dXVRaWkplZeXk9frzWH1/w+PxyM/BSRyDsPDwyRJElVVVVFbWxvF43Eh87h9\n+zbV1dXR3r17qb29nVKplDA5HD9+nDZv3kwFBQW0ZcsWcrlcGa09FAqRwWAglUpFFy5cSOuzeRCM\nMcYExTeBGWNMUNwAGGNMUNwAGGNMUNwAGGNMUNwAGGNMUNwAGGNMUNwAGGNMUNwAGGNMUP8Awysd\nsxE46PMAAAAASUVORK5CYII=\n", | |
"text": "<matplotlib.figure.Figure at 0x10fe0a2d0>" | |
} | |
], | |
"prompt_number": 45 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "We can either re-print it in Plotly or strip the style. " | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "fig = tls.mpl_to_plotly(prettyplotlib)\nfig['layout'].update(showlegend=True)\nfig.strip_style()\npy.iplot(fig)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~PythonAPI/440\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x10622ae50>" | |
} | |
], | |
"prompt_number": 46 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "[Seaborn](http://stanford.edu/~mwaskom/software/seaborn/index.html) by [Michael Waskom](http://stanford.edu/~mwaskom/) can be installed as ` $ pip install seaborn`. You may need to [import six](http://stackoverflow.com/questions/13967428/importerror-no-module-named-six), which you can do from pip. The styling isn't yet translated to Plotly, so we'll go to Plotly's default settings. " | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "import numpy as np\nimport seaborn as sns\nimport matplotlib.pyplot as plt", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 47 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "def sinplot(flip=1):\n x = np.linspace(0, 14, 100)\n for i in range(1, 7):\n plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 48 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "fig15 = plt.figure()\n\nwith sns.axes_style():\n plt.subplot(211)\n sinplot()\nplt.subplot(212)\nsinplot(-1)\n\npy.iplot_mpl(fig15, strip_style = True)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~PythonAPI/441\" height=\"525\" width=\"100%\"></iframe>", | |
"metadata": {}, | |
"output_type": "display_data", | |
"text": "<IPython.core.display.HTML at 0x10fdedc10>" | |
} | |
], | |
"prompt_number": 49 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "Suggestions or comments? Email [email protected] or find us at [@plotlygraphs](twitter.com/plotlygraphs). Happy plotting!" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# CSS styling within IPython notebook\nfrom IPython.core.display import HTML\nimport urllib2\ndef css_styling():\n url = 'https://raw.githubusercontent.com/plotly/python-user-guide/master/custom.css'\n styles = urllib2.urlopen(url).read()\n return HTML(styles)\n\ncss_styling()", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"html": "<style>\n /*body {\n background-color: #F5F5F5;\n }*/\n div.cell{\n width: 850px;\n margin-left: 10% !important;\n margin-right: auto;\n }\n h1 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n }\n .text_cell_render h1 {\n font-weight: 200;\n font-size: 40pt;\n line-height: 100%;\n color:#447adb;\n margin-bottom: 0em;\n margin-top: 0em;\n display: block;\n white-space: nowrap;\n } \n h2 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n text-indent:1em;\n }\n .text_cell_render h2 {\n font-weight: 200;\n font-size: 20pt;\n font-style: italic;\n line-height: 100%;\n color:#447adb;\n margin-bottom: 1.5em;\n margin-top: 0.5em;\n display: block;\n white-space: nowrap;\n } \n h3 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n }\n .text_cell_render h3 {\n font-weight: 300;\n font-size: 18pt;\n line-height: 100%;\n color:#447adb;\n margin-bottom: 0.5em;\n margin-top: 2em;\n display: block;\n white-space: nowrap;\n }\n h4 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n }\n .text_cell_render h4 {\n font-weight: 300;\n font-size: 16pt;\n color:#447adb;\n margin-bottom: 0.5em;\n margin-top: 0.5em;\n display: block;\n white-space: nowrap;\n }\n h5 {\n font-family: 'Open sans',verdana,arial,sans-serif;\n }\n .text_cell_render h5 {\n font-weight: 300;\n font-style: normal;\n color: #1d3b84;\n font-size: 16pt;\n margin-bottom: 0em;\n margin-top: 1.5em;\n display: block;\n white-space: nowrap;\n }\n div.text_cell_render{\n font-family: 'Open sans',verdana,arial,sans-serif;\n line-height: 135%;\n font-size: 125%;\n width:750px;\n margin-left:auto;\n margin-right:auto;\n text-align:justify;\n text-justify:inter-word;\n }\n div.output_subarea.output_text.output_pyout {\n overflow-x: auto;\n overflow-y: scroll;\n max-height: 300px;\n }\n div.output_subarea.output_stream.output_stdout.output_text {\n overflow-x: auto;\n overflow-y: scroll;\n max-height: 300px;\n }\n code{\n font-size: 78%;\n }\n .rendered_html code{\n background-color: transparent;\n }\n ul{\n /* color:#447adb; */ // colors text too\n margin: 2em;\n }\n ul li{\n padding-left: 0.5em; \n margin-bottom: 0.5em; \n margin-top: 0.5em; \n }\n ul li li{\n padding-left: 0.2em; \n margin-bottom: 0.2em; \n margin-top: 0.2em; \n }\n ol{\n /* color:#447adb; */ // colors text too\n margin: 2em;\n }\n ol li{\n padding-left: 0.5em; \n margin-bottom: 0.5em; \n margin-top: 0.5em; \n }\n /*.prompt{\n display: None;\n } */\n ul li{\n padding-left: 0.5em; \n margin-bottom: 0.5em; \n margin-top: 0.2em; \n }\n a:link{\n font-weight: bold;\n color:#447adb;\n }\n a:visited{\n font-weight: bold;\n color: #1d3b84;\n }\n a:hover{\n font-weight: bold;\n color: #1d3b84;\n }\n a:focus{\n font-weight: bold;\n color:#447adb;\n }\n a:active{\n font-weight: bold;\n color:#447adb;\n }\n .rendered_html :link {\n text-decoration: none; \n }\n .rendered_html :hover {\n text-decoration: none; \n }\n .rendered_html :visited {\n text-decoration: none;\n }\n .rendered_html :focus {\n text-decoration: none;\n }\n .rendered_html :active {\n text-decoration: none;\n }\n .warning{\n color: rgb( 240, 20, 20 )\n } \n hr {\n color: #f3f3f3;\n background-color: #f3f3f3;\n height: 1px;\n }\n blockquote{\n display:block;\n background: #f3f3f3;\n font-family: 'Open sans',verdana,arial,sans-serif;\n width:610px;\n padding: 15px 15px 15px 15px;\n text-align:justify;\n text-justify:inter-word;\n }\n blockquote p {\n margin-bottom: 0;\n line-height: 125%;\n font-size: 100%;\n }\n /* element.style {\n } */ \n</style>\n<script>\n MathJax.Hub.Config({\n TeX: {\n extensions: [\"AMSmath.js\"]\n },\n tex2jax: {\n inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n },\n displayAlign: 'center', // Change this to 'center' to center equations.\n \"HTML-CSS\": {\n styles: {'.MathJax_Display': {\"margin\": 4}}\n }\n });\n</script>\n", | |
"metadata": {}, | |
"output_type": "pyout", | |
"prompt_number": 50, | |
"text": "<IPython.core.display.HTML at 0x110090b50>" | |
} | |
], | |
"prompt_number": 50 | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment