{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":1,"outputs":[{"output_type":"stream","text":"['test', 'train.csv', 'sample_submission.csv']\n","name":"stdout"}]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"import tqdm\nimport glob\nfrom fastai.tabular import *","execution_count":2,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"seed = 2019\n\n# python RNG\nrandom.seed(seed)\n\n# pytorch RNGs\ntorch.manual_seed(seed)\ntorch.backends.cudnn.deterministic = True\nif torch.cuda.is_available(): torch.cuda.manual_seed_all(seed)\n\n# numpy RNG\nnp.random.seed(seed)","execution_count":3,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def gen_features(X):\n    strain = []\n    strain.append(X.mean()) #0\n    strain.append(X.std()) #1\n    strain.append(X.min()) #2\n    strain.append(X.max()) #3\n    strain.append(X.kurtosis()) #4\n    strain.append(X.skew()) #5\n    strain.append(np.quantile(X,0.01)) #6\n    strain.append(np.quantile(X,0.05)) #7\n#     strain.append(np.quantile(X,0.10)) #8\n#     strain.append(np.quantile(X,0.90)) #9\n    strain.append(np.quantile(X,0.95)) #10\n    strain.append(np.quantile(X,0.99)) #11\n    strain.append(np.abs(X).max()) #12\n    strain.append(np.abs(X).mean()) #13\n    strain.append(np.abs(X).std()) #14\n    strain.append(np.square(X).kurtosis()) #15\n    strain.append(X.mad()) #16\n    return pd.Series(strain)","execution_count":4,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv', iterator=True, chunksize=150_000, dtype={'acoustic_data': np.int16, 'time_to_failure': np.float64})\n\ntrain_df = pd.DataFrame()\ny_train = pd.Series()\nfor df in tqdm.tqdm_notebook(train):\n    ch = gen_features(df['acoustic_data'])\n    train_df = train_df.append(ch, ignore_index=True)\n    y_train = y_train.append(pd.Series(df['time_to_failure'].values[-1]),ignore_index=True)","execution_count":5,"outputs":[{"output_type":"display_data","data":{"text/plain":"HBox(children=(IntProgress(value=1, bar_style='info', max=1), HTML(value='')))","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"5870efb2cb3a43349cb3470e043c50c5"}},"metadata":{}},{"output_type":"stream","text":"\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['time_to_failure'] = y_train","execution_count":6,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":7,"outputs":[{"output_type":"execute_result","execution_count":7,"data":{"text/plain":"          0         1       ...               14  time_to_failure\n0  4.884113  5.101106       ...         3.263401         1.430797\n1  4.725767  6.588824       ...         3.574302         1.391499\n2  4.906393  6.967397       ...         3.948411         1.353196\n3  4.902240  6.922305       ...         3.647117         1.313798\n4  4.908720  7.301110       ...         3.826052         1.274400\n\n[5 rows x 16 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>0</th>\n      <th>1</th>\n      <th>2</th>\n      <th>3</th>\n      <th>4</th>\n      <th>5</th>\n      <th>6</th>\n      <th>7</th>\n      <th>8</th>\n      <th>9</th>\n      <th>10</th>\n      <th>11</th>\n      <th>12</th>\n      <th>13</th>\n      <th>14</th>\n      <th>time_to_failure</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>4.884113</td>\n      <td>5.101106</td>\n      <td>-98.0</td>\n      <td>104.0</td>\n      <td>33.662481</td>\n      <td>-0.024061</td>\n      <td>-8.0</td>\n      <td>-2.0</td>\n      <td>11.0</td>\n      <td>18.0</td>\n      <td>104.0</td>\n      <td>5.576567</td>\n      <td>4.333325</td>\n      <td>1111.171375</td>\n      <td>3.263401</td>\n      <td>1.430797</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>4.725767</td>\n      <td>6.588824</td>\n      <td>-154.0</td>\n      <td>181.0</td>\n      <td>98.758517</td>\n      <td>0.390561</td>\n      <td>-11.0</td>\n      <td>-2.0</td>\n      <td>12.0</td>\n      <td>21.0</td>\n      <td>181.0</td>\n      <td>5.734167</td>\n      <td>5.732777</td>\n      <td>1591.567111</td>\n      <td>3.574302</td>\n      <td>1.391499</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>4.906393</td>\n      <td>6.967397</td>\n      <td>-106.0</td>\n      <td>140.0</td>\n      <td>33.555211</td>\n      <td>0.217391</td>\n      <td>-15.0</td>\n      <td>-3.0</td>\n      <td>13.0</td>\n      <td>26.0</td>\n      <td>140.0</td>\n      <td>6.152647</td>\n      <td>5.895945</td>\n      <td>643.756238</td>\n      <td>3.948411</td>\n      <td>1.353196</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>4.902240</td>\n      <td>6.922305</td>\n      <td>-199.0</td>\n      <td>197.0</td>\n      <td>116.548172</td>\n      <td>0.757278</td>\n      <td>-12.0</td>\n      <td>-2.0</td>\n      <td>12.0</td>\n      <td>22.0</td>\n      <td>199.0</td>\n      <td>5.933960</td>\n      <td>6.061214</td>\n      <td>1797.082229</td>\n      <td>3.647117</td>\n      <td>1.313798</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>4.908720</td>\n      <td>7.301110</td>\n      <td>-126.0</td>\n      <td>145.0</td>\n      <td>52.977905</td>\n      <td>0.064531</td>\n      <td>-15.0</td>\n      <td>-2.0</td>\n      <td>12.0</td>\n      <td>26.0</td>\n      <td>145.0</td>\n      <td>6.110587</td>\n      <td>6.329485</td>\n      <td>695.744438</td>\n      <td>3.826052</td>\n      <td>1.274400</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_test = pd.DataFrame()\nseg_ids = []\nfor segs in tqdm.tqdm_notebook(sorted(glob.glob('../input/test/seg_*'))):\n    seg_name = segs[segs.rfind('/')+1:segs.rfind('.')]\n    sub = pd.read_csv(segs,iterator=True,dtype={'acoustic_data': np.int16})\n    for df in sub:\n        ch = gen_features(df['acoustic_data'])\n        X_test = X_test.append(ch, ignore_index=True)\n    seg_ids.append(seg_name)","execution_count":8,"outputs":[{"output_type":"display_data","data":{"text/plain":"HBox(children=(IntProgress(value=0, max=2624), HTML(value='')))","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"5fd199db0bf54f26ba7c68db51ac8faa"}},"metadata":{}},{"output_type":"stream","text":"\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_test.head()","execution_count":9,"outputs":[{"output_type":"execute_result","execution_count":9,"data":{"text/plain":"         0         1      2     ...           12           13        14\n0  4.491780  4.893690  -75.0    ...     4.102161  2375.162944  3.248521\n1  4.171153  5.922839 -140.0    ...     5.045369  1955.044737  3.429208\n2  4.610260  6.946990 -193.0    ...     6.179525  1606.461297  3.461984\n3  4.531473  4.114147  -93.0    ...     3.583863  1253.910000  2.678503\n4  4.128340  5.797164 -147.0    ...     4.993617  2795.248550  3.283856\n\n[5 rows x 15 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>0</th>\n      <th>1</th>\n      <th>2</th>\n      <th>3</th>\n      <th>4</th>\n      <th>5</th>\n      <th>6</th>\n      <th>7</th>\n      <th>8</th>\n      <th>9</th>\n      <th>10</th>\n      <th>11</th>\n      <th>12</th>\n      <th>13</th>\n      <th>14</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>4.491780</td>\n      <td>4.893690</td>\n      <td>-75.0</td>\n      <td>115.0</td>\n      <td>28.837568</td>\n      <td>0.327908</td>\n      <td>-8.0</td>\n      <td>-2.0</td>\n      <td>11.0</td>\n      <td>18.0</td>\n      <td>115.0</td>\n      <td>5.224607</td>\n      <td>4.102161</td>\n      <td>2375.162944</td>\n      <td>3.248521</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>4.171153</td>\n      <td>5.922839</td>\n      <td>-140.0</td>\n      <td>152.0</td>\n      <td>56.218955</td>\n      <td>0.295708</td>\n      <td>-12.0</td>\n      <td>-2.0</td>\n      <td>11.0</td>\n      <td>20.0</td>\n      <td>152.0</td>\n      <td>5.198340</td>\n      <td>5.045369</td>\n      <td>1955.044737</td>\n      <td>3.429208</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>4.610260</td>\n      <td>6.946990</td>\n      <td>-193.0</td>\n      <td>248.0</td>\n      <td>162.118284</td>\n      <td>0.428688</td>\n      <td>-11.0</td>\n      <td>-2.0</td>\n      <td>11.0</td>\n      <td>20.0</td>\n      <td>248.0</td>\n      <td>5.597193</td>\n      <td>6.179525</td>\n      <td>1606.461297</td>\n      <td>3.461984</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>4.531473</td>\n      <td>4.114147</td>\n      <td>-93.0</td>\n      <td>85.0</td>\n      <td>41.241827</td>\n      <td>0.061889</td>\n      <td>-5.0</td>\n      <td>-1.0</td>\n      <td>10.0</td>\n      <td>14.0</td>\n      <td>93.0</td>\n      <td>4.961487</td>\n      <td>3.583863</td>\n      <td>1253.910000</td>\n      <td>2.678503</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>4.128340</td>\n      <td>5.797164</td>\n      <td>-147.0</td>\n      <td>177.0</td>\n      <td>79.539708</td>\n      <td>0.073898</td>\n      <td>-10.0</td>\n      <td>-2.0</td>\n      <td>10.0</td>\n      <td>19.0</td>\n      <td>177.0</td>\n      <td>5.070900</td>\n      <td>4.993617</td>\n      <td>2795.248550</td>\n      <td>3.283856</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"procs = [Normalize]\ncont_vars = [x for x in range(train_df.shape[1]-1)]","execution_count":10,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data = (TabularList.from_df(train_df,procs=procs,cont_names=cont_vars)\n                .split_by_rand_pct(0.01)\n                .label_from_df(cols='time_to_failure')\n                .add_test(TabularList.from_df(X_test))\n                .databunch())","execution_count":90,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(data.train_ds.cont_names)","execution_count":91,"outputs":[{"output_type":"execute_result","execution_count":91,"data":{"text/plain":"15"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"class SmoothL1LossFlat(nn.SmoothL1Loss):\n    def forward(self, input:Tensor, target:Tensor) -> Rank0Tensor:\n        return super().forward(input.view(-1), target.view(-1))","execution_count":92,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn = tabular_learner(data, layers=[1024,512], ps=[0.07,0.7], emb_drop=0.7,metrics=[mean_absolute_error])","execution_count":98,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.loss_func = SmoothL1LossFlat()","execution_count":99,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.model","execution_count":100,"outputs":[{"output_type":"execute_result","execution_count":100,"data":{"text/plain":"TabularModel(\n  (embeds): ModuleList()\n  (emb_drop): Dropout(p=0.7)\n  (bn_cont): BatchNorm1d(15, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n  (layers): Sequential(\n    (0): Linear(in_features=15, out_features=1024, bias=True)\n    (1): ReLU(inplace)\n    (2): BatchNorm1d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n    (3): Dropout(p=0.07)\n    (4): Linear(in_features=1024, out_features=512, bias=True)\n    (5): ReLU(inplace)\n    (6): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n    (7): Dropout(p=0.7)\n    (8): Linear(in_features=512, out_features=1, bias=True)\n  )\n)"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.lr_find()\nlearn.recorder.plot(suggestion=True)","execution_count":101,"outputs":[{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":""},"metadata":{}},{"output_type":"stream","text":"LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\nMin numerical gradient: 6.31E-07\n","name":"stdout"},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd4VFX6wPHvO+mdkEYJJBCK9BaQKmIFC5bFjg076u6q6/pz3XVddd1dy1qWtbK6Kpa1FxTBhiBICR1Ch1ACpFDS68z5/TGTECCBhGTmzkzez/PMk5k7d+59D8PMO6fcc8QYg1JKKQVgszoApZRS3kOTglJKqVqaFJRSStXSpKCUUqqWJgWllFK1NCkopZSqpUlBKaVULU0KSimlamlSUEopVSvQ6gCaKj4+3qSmplodhlJK+ZRly5blG2MSTrSfzyWF1NRUMjIyrA5DKaV8iojsaMx+2nyklFKqliYFpZRStTQpKKWUqqVJQSmlVC1NCkoppWppUlBKKVVLk4JSSqlamhSUUsoHPP/dZuZvznP7eTQpKKWUl7M7DM9/v4kl2w+4/VyaFJRSyssdKKnEYSAhKsTt59KkoJRSXi6/uAKA+EgfTwoikiUia0RkpYg0OGGRiAwVkWoRmeTOeJRSyhflFTmTgidqCp6YEG+cMSa/oSdFJAD4BzDHA7EopZTPqakpJPh6TaGR7gY+BnKtDkQppbxRTU0h3g/6FAwwR0SWicitRz8pIh2BS4CXjncQEblVRDJEJCMvz/1DspRSypvkF1cQFhRARHCA28/l7qQw2hgzGJgA3Ckipx31/HPAA8YYx/EOYox51RiTboxJT0g44RoRSinlV/KKKoiPCkZE3H4ut/YpGGOyXX9zReRTYBgwr84u6cD7roLGA+eJSLUx5jN3xqWUUr4kr7jCI/0J4MaagohEiEhUzX3gHGBt3X2MMV2MManGmFTgI2CqJgSllDpSflGlR0YegXubj5KAn0VkFbAE+MoY842I3C4it7vxvEop5Vfyiis8co0CuLH5yBizDRhQz/aXG9j/BnfFopRSvqrK7uBgqX/UFJRSSjXTgZJKjPHM1cygSUEppbyaJ69mBk0KSinl1fI8OO8RaFJQSimvVlNTSNSaglJKKU/OkAqaFJRSyqvlFVUQGRJImAemuABNCkop5dXyiio81skMmhSUUsqr5RdXEB8Z7LHzaVJQSikvpjUFpZRStfKLKz02GR5oUlBKKa9VUW2noKzKYyOPQJOCUkp5rf3FlYDnrmYGTQpKKeW1apfh1JqCUkopT897BJoUlFLKa9VezaxJQSnfsS2vmL0FZRhjrA5F+ZnDzUeeu07BrWs0K+Xv/rd0Jw98vAZwVvH7d4yhf3IbRnePY2CnWAJsx19ofdaavfzrhy0YIDTIRkigjTZhwZzZK5Fz+7YjOjTIA6VQ3iq/uIKYsCBCAj0zxQVoUlCtkMNhsJ3gy7ox5m3K4w+frmVM93jOPCWR1dkFrNldwA8bc3n2O2gTHsTYHgmccUoiZ/dOIjz48Met2u7gH99s4LX52+mZFEWntuFUVNupqHKwJruAb9bt46HP1jKuZwKXDenEWb2Tmh2v8j15Hr6aGTQpqFamuKKaS/69gG6JkTx/5SCCA0+uBXXDvkKmvrOc7omRvHjNYKLq/KIvKK1i3uY8ftyYy08b8/h85R4iQwK5cEAHrhjaiQ5tQrnr3RUs2X6Aa4en8McLeh3xS9AYw4pdh/hi5R6+WrOX2ety+L8Jp3D72LRml1/5Fk9fzQyaFFQr88TX69mSV8zm3GJs/1vJ81cOJDCgaYkhp7CcG99YSkRIAG/cOPSIhAAQEx7EhQM6cOGADjgchowdB/kgYxefrcjmvSU7CQ6wYbPBs1cM4JJBycccX0QY3DmWwZ1j+eP5vbjng1X8fdYGIkMCmTw8pVnlV74lv7iSPh2iPXpOTQrKpxlj+NPnazlUWsUTl/Y7bhv8vE15vLt4J7eM6UJSdCiPf7WekEAbT182oLY5Ka+ogm/W7aN9dChjesQf8Qu+2u7gx415PD17I4VlVXxw+wjax4QdNz6bTRjWpS3DurTlzxf25stVe1m+8yA3je5Cr/Yn/rAHBtj45+UDKKus5k+fryUiJKDeRKL8k9YUlGqiz1ZmM2PRTgAy9xby2nXppCVEHrNfYXkVD3y8mrSECO47pyehQQGUV9l5es4mggNtjO/bjveX7OK79TlUO5yjiKJCAzm3TzvO6pXEqt2H+GjZbvKKKkiMCuGlyUPo0yGmSbFGhQZx9amdufrUzk16XVCAjWlXD2bKf5fyuw9XExYUyPi+7Zp0DOV7yirtFFdUa1JQ/s8YQ7XDENTEZpuj7TlUxsOfryM9JZZ7z+nB3e+u4OJpC3jhqkGMOyXxiH0fn5lJTmE5H98xktAg56//u87oTnmVg2k/buH9pbuIiwhmyugu/GpwMnsKypi5ai+z1+3jo2W7CbAJ43omcuXQTpzeM6HJTU7NFRoUwGvXpTP5P4u5693lPDD+FG4e0wWR5neYK+/k6RXXamhSUB6RW1jOz1vymb85n5+35FNYVsV5/dpzeXonhndt2+QvN4fD8PuPVmN3GJ65fAApcRF8ftcobn1rGVPeXMr5/drTNT6C5LbhlFXa+SBjN1NPT2NQ59gjjnPfOT3o1DaMqNAgzuqVVNvx3LNdFON6JlJR3ZdlOw7SLSGSxOjQFvv3OBkRIYG8OWUY93+4ir9+vZ7F2w/wzGUDiAnXYav+KK/Y81czgyYF5WblVXb+8mUm7y1xNvG0jQhmZFocUaGBzFy1l09XZJMSF87ZvZKICg0iNMhGWHAAkSGBxEWGkBAZQnxUMHERIUeM+Z+xeAc/b8nnr5f0JSUuAoDk2HA+vmMkj85cx7xN+Xy9Zi+uliB6JkXxm7O6HxOfiHDF0Iabc0ICAxiZFt+C/yLNEx0axMuTh/DGgiz+Nms9570wnz+e34ui8mq25ZeQlV9CbEQwT1zSV2sRPq52igutKSh/sXN/KXe8s4x1ewq5cVQqvxqcTO/20bWdug9f0IdZa/fyv6W7ePOXLKrsDV8RHB4cwMBObRjcOZZuiZE88fV6xvZI4OphR36hhwUH8LdL+wNQWe1gX0E5uw+W0i0p0qMXALmTiDBldBcGp8Ry5zvLueOd5QAEBQiJUaFkHypjbI94xvdtb3GkqjmsmPcINCkoN/k2M4d7P1iJAP+5Pp0zex178VVYcACXDk7m0sHO0TTVdgfl1Q7Kq+wUllWxv6SSvKIK8osr2JJbzPKdB3npp63YHYaYsCCenNT/uL+GgwNtdI4Lp3NcuLuKaamBndow67djWLu7gI6xYXRsE4aIMP65eTw1eyNn9UryeN+Hajk1fQptI/TiNeXDlu88yGvztjFr7T76dozmpWuG0Klt476UAwNsRAbYiAwJJD4yhK4Jx+5TWlnNql0FJEQFk2RxG783iA4NYmS3I5u3fnduT257exkfL9993KYx5d3yiipoGxHc7AEZTeX/PyO2boWpUyE6Gmw259+pU53bVYtwOAyz1+1j0ksLufTFhSzcup+7z+jGR7ePbHRCaKzw4EBGpMXRLTGqRY/rT87pncTATm147rvNlFfZrQ5HnaT84gqP9yeAvyeFWbOgf3+YPh2KisAY59/p053bZ82yOkKfV1pZzR3vLOO2t5exr7CcRy7szcL/O6P2WgDleSLCA+NPYW9BOW//ssPqcNRJyiuqID7Ks01H4ObmIxHJAooAO1BtjEk/6vlrgAcAce13hzFmVYucfOtWmDQJSkuPfa6qynmbNAlWr4Y0nVPmZOw5VMbNb2awYV8hD53XixtHpWobtpcYkRbHaT0S+PfcLVwxrJPOtuqD8oorGHLUEGpP8MQneJwxZuDRCcFlOzDWGNMPeAx4tcXO+swzzi/+46mqgmefbbFT+gu7w7A06wBVdkeD+yzfeZCJ0xaw60Ap/7lhKLec1lUTgpf5/bk9OVRaxZPfbGBbXvFx30/lfQ6VVtEm3M9qCidijFlY5+EioOUmdZkxo3FJ4e23Ydq0Fjutr9tXUM49/1vJL9v20yMpkkcv6svwrnG1zx8oqWT6/G1M/3k77aJDee+WU+mepO373qhvxxguHdSRGYt2MmPRTgJsQqfYME7vmcgfzut10jPEKvczxlBaaScixPNNsO5OCgaYIyIGeMUYc7yawE1AvY38InIrcCtA586NHE1RXNyy+7UC36/P4XcfrqK8ysHdZ3Tjk+XZXPnqIi4e2IGp47rx2Yps3lyYRWmVnfP7tefRi/p6fLicapqnLhvANcNTyMovYXt+CRtzivjvwiy25Zfw8uTBR6zxoLxHpd2B3WEseX/cfcbRxphsEUkEvhWRDcaYeUfvJCLjcCaF0fUdxJVMXgVIT09v3JqHkZHOTuXG7NfK2R2Gx7/K5I0FWfRuH82/rh5EWkIkU0/vxotzt/DKT9v4bOUeROCC/h24+4xu9NDagU8IsAlDUmIZknK4bfqDpbv4v09Wc/Vri3njhqHEamL3OmWVzlFjYRYM1nBrUjDGZLv+5orIp8Aw4IikICL9genABGPM/hY7+eTJzlFGx2tCCgqCa69tsVP6qtfmb+ONBVncMDKVB887pfbK37DgAO47pyeXDk7m6zV7Oad3kjYV+YHLh3aiTXgQd723gste+YW3bxp2winAlWeVupKCFc1HbmtUFJEIEYmquQ+cA6w9ap/OwCfAtcaYTS0awH33Ob/0jycoCO65p0VP62u25Bbxz283Mb5PO/58Ye96p4LoEh/BneO6aULwI+f0acdbU4aRU1DOhOfn89YvWVRrR7TXKK2sBiDMguYjd/Y0JQE/i8gqYAnwlTHmGxG5XURud+3zMBAHvCgiK0Uko8XOnpYGH30E4eHHJAd7YKBz+0cfterhqNV2B/d9uJqI4AAeu1gnUGtthneN45OpI+nVLpqHP1/HhOfn89OmPKvDUhyuKYRb0HzktqRgjNlmjBnguvUxxvzVtf1lY8zLrvs3G2NiXUNWGxq2evImTHBeh3DrrRAdjbHZKA4J55czLnVunzChRU/na6b/vJ1Vuw7xl4v6enzSLeUduidF8e4tp/LqtUOotDu4/vUl3DFjGUXlJxi5p9yqNikE+1FS8Bppac4hpwUFiN3O/dPn8X9n3NaqawhwZLPRhf11Ns3WTEQ4p0875txzGvef25M5mTlc8uJCtuXpyDyr1DQfhYf4V/ORVxrWpS27D5aRfajM6lAsY3cYbTZSxwgJDODOcd14+6Zh7C+u4KJ/L+DHDblWh9UqaU3Bg4amtgVg6fYDFkdinW8zc1i16xB/uqC3NhupY4xMi+eLu0bTKTacKW8u5a1fsqwOqdUptXBIaqtLCr3aRxMVEsjiVpwUXl+wnY5twrhoYEerQ1FeqlNb5yp2Z56SyF++zGTlrkNWh9SqlNUOSdXmI7cLsAnpqbEszWqdSWFtdgFLth/ghpGpRyxvqdTRwoIDeObygbSLDuW376+gpKLa6pBajZKaPgVtPvKMYV3i2JJbXLuyUWvyxoIswoMDuHxoJ6tDUT4gJiyIZy4fwI4DpTw2M9PqcFqNsko7IhBiwfxUrTQpOPsVMlpZbSGvqIIvV+1h0pBkYsJ0KmXVOMO7xnH72DTeX7qLb9buszqcVqG00k54UIAlg0BaZVLo1zGG0CAbS7YftDoUj3pn8Q4q7Q5uGJlqdSjKx9xzVg/6dozmwU9Wk1NYbnU4fq+0stqS4ajQSpNCcKCNQZ1iWZK1n/IqOxv2FTJrzV5mrt6DMY2bb8/XVFTbmbFoB+N6JtA1QScBVE0THGjjuSsGUVZlZ+o7y2vH0Sv3KK20W9KfABavp2ClYV3a8vz3mznlT98csb3qCgeXDGq5ZR1q/PGzNazeXcCTk/pzSrvoFj/+icxctZf84kqmjO7i8XMr/9AtMZJnLx/Ine8u55a3MvjP9UN1yVU3Ka20WzIcFVppTQHgsvRkrhrWmXvP7sG/rhrEzLtHk54Sy8Ofr2NvQcte2HagpJL/Ld3F6t0FTJy2gNd/3o7D0fgaicNheOWnrSzckt/kc9sdhnV7Cnht/ja6J0Yyult8k4+hVI0J/drz9GUDWLh1P1PfWU5ltU6i5w5lWlPwvOTYcP52ab8jtj192QAmPD+fBz5ew5s3Dm2xTp7PVmRTZTe8e/OpvL5gO4/OzGTupjxuHJnK3oJydh8sJftQGf06xnDjqC5HDBWttju4/6PVfLoim4jgAL64ezRpJ2j+Mcbw3pJdzMncx7KsgxS5hhI+f+VAvXpZNdulg5Mpq7Lz0Kdr+c37K/jXVYN0KdYWVlJZTaRFfQqtNinUJzU+gj+c34s/fbaWdxbvZPLwlGYf0xjDBxm76J8cw8hu8YxIi+OdxTt5/KtM5rlmpAy0CXGRwXy+cg9zMnN49oqBdGwTRkW1nV+/t4LZ63K47bSufLhsN3fMWMZnd4467opMczJz+MOna+iaEMGFAzswNDWWoaltSY4Nb3Z5lAK45tQUyirtPP7Vep6cvZE/nNfL6pD8SlmlnYRIa2Yb0KRwlMmndmbOun088fV6xnSPJyUuolnHW7enkA37injsoj6Ac/KxycNTOOOURHYdKKVT23CSokOxCXy8PJs/f76WCc/N45GJffhs5R7mbcrjzxf25sZRXRjdPZ7rXl/CQ5+u5Z+XD6j3V395lZ3HZmbSMymKr349Wn/BKbe5eUxXNu4r4r8Lsrh+ZCod2+hCPS3Fyo5m/cY4iojw5KT+BNiE+z9c3ezRSB9m7CI40MbEAUdOKdGhTRindo2jQ5swAmyCiDBpSDJf/2YMXRMiufeDVczfnMeTv+rPjaOcncNjuidwz1k9+HRFNjMW76z3fC//tJXdB8t4ZGIfTQjK7X57dg8Apv2w2eJI/EtppV2HpHqT9jFh3H9uT5ZkHWDdnsKTPk55lZ3PVu7h3D7tiAlv3MViKXERfHj7CP54fi+mX5d+zJXHd43rxuk9E3jsy0wWbzty9dJdB0p5ae5WLhzQgRFpcScdt1KN1bFNGFcN68QHGbvJyi+xOhy/UVpZbckCO6BJoUEX9u9AgE2YtXZvo/Yvrqhm98HSI7Z9tz6HgrIqLhvStCGuQQE2bh7TlTN7JR3znM0mPHfFQNq3CeXq6Yt5evbG2hEgj3+ViU2EP5x3SpPOp1Rz3DmuG0EBwvPfa22hJRhjKKvS5iOvExsRzIiuccxas69RTUi/fm8FY5+ayz/nHP6S/jBjN+1jQhnVwsNA24QH88Vdo7lkUEem/biFidN+5vWftzN7XQ53n9lNF2FXHpUYHcr1I1L5bGU2m3OKrA7H55VXOTDGmvWZQZPCcY3v245t+SVsyjn+ClRrswv4YUMuXeIjeOGHLVz07wX8sCGH+ZvzmDQk2S2zkcaEBfH0ZQOYfl06+cWVPDozky7xEdykF6cpC9w2No2I4ECe/W6T1aH4vJoZUiNCtKbgdc7t0w4R+HrN8ZuQXpy7haiQQD6+YySvXZdOXlEFU/6bgcPApCY2HTXVWb2T+Pae07hlTBeevWIgIYF6hanyvLYRwUwZ3YWv1+xjbXaB1eH4tDILF9gBTQrHlRAVwrDUtsftV9iSW8Sstfu4bmQKMWFBnO36kp40JJmrT+3c7CGtjREbEcxD5/dmYKc2bj+XUg25eUwXYsKCeEH7Fprl8FKc2nzklSb0bcemnGK25NbfhPTi3K2EBNqYMupws01sRDBPXzaAJy7pV+9rlPJH0aFBXDcihW/X57A17/hNrqphpRYusAOaFE5ofN/2AHxTT21h14FSPl+5h6uGdSbOoqsPlfIm149MJSjAxvT526wOxWcdriloUvBK7WJCGZISy9drjl1c5JV5W7EJ3HpaVwsiU8r7xEeGMGlIMh8vzya3SNddOBnafOQDJvRtR+beQnbsP3xxTm5hOR9k7GbSkGQdAqpUHbeM6UqV3cGbC7OsDsUn1TQfhWlNwXuN79sOgFlr95FbVM6r87Zy1WuLqLY7uH1smsXRKeVdusRHML5PO97+ZQfFFboYT1PVjD7SIaleLDk2nAHJMUz7YQsj/vYDT3y9gajQIKZdPdgjo4uU8jW3ntaVwvJq3l9S/xxdqmElNc1HQTp1tle7dkQq//5xC+P7tuNXg5PplqhLWirVkEGdYzm1S1te/3l7beezapwyi5uPNCk00qQhyW6/EE0pf3Lb2K5M+W8GM1fvccsSt/6qtNJOoE0IDrQmkbr1rCKSJSJrRGSliGTU87yIyAsiskVEVovIYHfGo5TynNN7JJISF84ny7OtDsWnWLmWAnimT2GcMWagMSa9nucmAN1dt1uBlzwQj1LKA2w24bx+7Vm4dT8HSiqtDsdnlFZWWzYcFazvaL4IeMs4LQLaiEh7i2NSSrWQ8/u1x+4wzFl37HU+qn7+XlMwwBwRWSYit9bzfEdgV53Hu13blFJ+oE+HaFLiwvnqBJNKqsPKKu2WdTKD+5PCaGPMYJzNRHeKyGkncxARuVVEMkQkIy8vr2UjVEq5jcjhJqSD2oTUKCWV1UT4a/ORMSbb9TcX+BQYdtQu2UDd9SaTXduOPs6rxph0Y0x6QkKCu8JVSrlBbRNSpjYhNYbf1hREJEJEomruA+cAa4/a7QvgOtcopOFAgTFG65lK+ZE+HaLp3Dacr+qZP0wdy+o+BXfWUZKAT0Wk5jzvGmO+EZHbAYwxLwNfA+cBW4BS4EY3xqOUskBNE9L0+ds4WFJJbESw1SF5NWdSsK75yG1nNsZsAwbUs/3lOvcNcKe7YlBKeYfz+7Xn5Z+2MidzH1cM7Wx1OF7NOSTVD5uPlFKqRt+O2oTUWFY3HzUqKYhImoiEuO6fLiK/FhFd+1Ep1Si1o5C25HOoVEchNcTuMFRUO3yio/ljwC4i3YBXcY4YetdtUSml/M75/dpT7TDMycyxOhSvVbOWgi8MSXUYY6qBS4B/GWPuB/TKY6VUo/XtGE1SdAjzNum1Rg2pWUvBF2oKVSJyFXA9MNO1Lcg9ISml/JGIMCotnl+27sfhMFaH45WsXp8ZGp8UbgRGAH81xmwXkS7A2+4LSynlj0akxbG/pJKNOUVWh+KVvCEpNKrhyhiTCfwaQERigShjzD/cGZhSyv+M6hYPwIIt+fRqH21xNN6npk/B62dJFZG5IhItIm2B5cBrIvJP94amlPI3HdqE0SU+gl+27rc6FK/kDTWFxjYfxRhjCoFLcU51fSpwlvvCUkr5q5FpcSzefoBqu8PqULxOqQ91NAe61jm4nMMdzUop1WQj0+Iprqhm1e4Cq0PxOmVVvjMk9VFgNrDVGLNURLoCm90XllLKX41IiwNg4ZZ8iyPxPiUVPtJ8ZIz50BjT3xhzh+vxNmPMr9wbmlLKH7WNCKZ3+2gWar/CMXzmOgURSRaRT0Uk13X7WESS3R2cUso/jeoWx7KdBymvslsdilc53NHs/c1Hb+Bc+6CD6/ala5tSSjXZyLR4KqsdZGQdtDoUr1JaWU1IoI0Am1gWQ2OTQoIx5g1jTLXr9l9Al0BTSp2UYV3aEmgTFmzVfoW6rJ4hFRqfFPaLyGQRCXDdJgPaIKiUOikRIYEM7NRGO5uPYvUCO9D4pDAF53DUfcBeYBJwg5tiUkq1AiO7xbMmu4CCsiqrQ/EaZVXVlnYyQ+NHH+0wxkw0xiQYYxKNMRcDOvpIKXXSRqbF4TCwaJs2OtQoqbAT4QtJoQH3tlgUSqlWZ3DnWKJCAvl+va6vUKOs0u4bNYUGWNc9rpTyecGBNs7olci3mTk65YVLaVW1z/Qp1EcnRFdKNcv4Pu04WFrFku0HrA7FK5RWWD/66LgpSUSKqP/LX4Awt0SklGo1xvZMIDTIxqy1+xjpmla7NfP6IanGmChjTHQ9tyhjjLV1HKWUzwsPDuT0HonMXrdPV2PDefGaLzcfKaVUs03o147cogpW7NKrm8uqfLujWSmlmm3cKYkEBQiz1uyzOhRLVVY7qLIbnx6SqpRSzRYdGsTobvHMWrsPY1pvE9LhGVK1+Ugp1cpN6Nue7ENlrM0utDoUy5RW1azPrDUFpVQrd3bvJAJswqy1e60OxTLesD4zaFJQSnmB2IhghndtyzetuAmptML6tRRAk4JSykuM79OObfklbM4ttjoUS5RWtpLmI9dU2ytEZGY9z3UWkR9dz68WkfPcHY9Syjud27cdwQE2Xpq71epQLFFaZf1SnOCZmsJvgPUNPPdH4ANjzCDgSuBFD8SjlPJCiVGh3Da2K5+uyGZxK5w5tab5KMKfm49c6zifD0xvYBcDRLvuxwB73BmPUsq7TT29Gx3bhPHw5+uoamWT5LWW5qPngN8DDb27jwCTRWQ38DVwt5vjUUp5sbDgAP58YW825hTx5sIsq8PxqDJ/bz4SkQuAXGPMsuPsdhXwX2NMMnAe8LaIHBOTiNwqIhkikpGXl+emiJVS3uDs3kmM65nAc99tJqew3OpwPKY1DEkdBUwUkSzgfeAMEZlx1D43AR8AGGN+AUKBY6ZKNMa8aoxJN8akJyQkuDFkpZTVRIRHJvah0u7gia8b6o70P6UV1YhAaKCfJgVjzIPGmGRjTCrOTuQfjDGTj9ptJ3AmgIj0wpkUtCqgVCuXEhfB7WPT+HzlHpZmtY61Fkor7YQFBWCzWbt+mcevUxCRR0VkouvhfcAtIrIKeA+4wbTWK1eUUkeYenoa8ZHBTPthi9WheERplfVrKcAJFtlpKcaYucBc1/2H62zPxNnMpJRSRwgNCuDGUV14avZG1mYX0LdjjNUhuZU3rM8MekWzUsqLXTsihaiQQF7+yf8vaCupqLb8GgXQpKCU8mLRoUFcMzyFr9fsJSu/xOpw3MobFtgBTQpKKS83ZXQqgQE2Xpm3zepQ3Mob1mcGTQpKKS+XGBXKZUOS+XjZbr++bqGkwvr1mUGTglLKB9x6WleqHQ5e/3m71aG4TZmXjD7SpKCU8nopcRFc0L8DMxbtoKC0yupwWly13cHegnKSokOtDkWTglLKN9w+No2SSjvvLNlhdSgtbueBUiqrHXRPjLQ6FE0KSinf0LtDNKO7xfPmwiwqq/1rBtVNOc6SccGiAAAR1ElEQVSFhbonRVkciSYFpZQPuWlMF3IKK5i52r9m2d+SWwSgNQWllGqK03sk0D0xkunzt/vVWs6bcorp2CaMiBAdfaSUUo0mItw0uguZewv5xY9WZ9uUU0SPJOtrCaBJQSnlYy4e1JG4iGCmz/eP4anVdgfb8ku8oj8BNCkopXxMaFAA145I4YcNuWzJLbY6nGbzppFHoElBKeWDJg9PITjQxn/84GK2mpFHPbSmoJRSJyc+MoRfDe7IJ8t3c6Ck0upwmqVm5FE3rSkopdTJu+bUFCqqHXy3PsfqUJrFm0YegSYFpZSP6tMhmsSoEH7a5Nsr+HrTyCPQpKCU8lEiwmk9Evh5cz52h29es1Btd7Atr8Rr+hNAk4JSyoeN7ZFAQVkVq3YfsjqUk7LzQCmVdofX9CeAJgWllA8b3S0eEZjno01I3jbyCDQpKKV8WGxEMAOS2/hsv8LmHO8aeQSaFJRSPu60Hgms2nWIQ6W+NzR1c653jTwCTQpKKR83tkcCDgM/b8m3OpQm87aRR6BJQSnl4wYkxxAdGshPG32rCckbRx6BJgWllI8LDLAxpnsC8zbn+dR02t448gg0KSil/MDYHgnkFFaw0dVx6wu8ceQRaFJQSvmBMT3iAby6CSmvqILt+SW1tRlvHHkE4D1d3kopdZLax4TRMymKeZvzuG1smtXh1Ovu95azaNsBUuLCGdczkXV7CkiO9a6RR6A1BaWUnzitRzxLtx+kuKLa6lDqlZVfSt+O0aQlRPL+0p0szTrIKe2irQ7rGN6VopRS6iRN6Nee1+Zv58FP1vDClQMREatDqmV3GPKKK5g0JJnfnduT8io7S7MO0DXBu5qOwAM1BREJEJEVIjKzgecvF5FMEVknIu+6Ox6llH8a3DmW34/vyZer9vDsd5utDucI+0sqsDsMSdEhgHP1uDHdE+jYJsziyI7liZrCb4D1wDH1JBHpDjwIjDLGHBSRRA/Eo5TyU3eMTSMrv4QXvt9Malw4lw5OtjokAHIKKgBIig61OJITc2tNQUSSgfOB6Q3scgvwb2PMQQBjTK4741FK+TcR4fGL+zGiaxwPfLyaxdv2Wx0SADmF5YAmBYDngN8Djgae7wH0EJEFIrJIRMa7OR6llJ8LDrTx8uQhdGobzi1vZfCv7zeTV1RhaUw5RZoUEJELgFxjzLLj7BYIdAdOB64CXhORNvUc61YRyRCRjLw87x2HrJTyDjHhQfz3hmH0T27DM99uYuTfv+c3769g5S5r1l3IKSjHJhAfGWzJ+ZvCnTWFUcBEEckC3gfOEJEZR+2zG/jCGFNljNkObMKZJI5gjHnVGJNujElPSEhwY8hKKX/ROS6cGTefyvf3jeWaU1P4YX0ul764gFUWJIacwgriI0MIDPD+qwDcFqEx5kFjTLIxJhW4EvjBGDP5qN0+w1lLQETicTYnbXNXTEqp1ictIZJHJvbh5wfOoG1EMI/NzPT4HEn7Cst9oukILLh4TUQeFZGJroezgf0ikgn8CNxvjPGOniGllF+JCQ/id+f0JGPHQWau3uvRc+doUjiSMWauMeYC1/2HjTFfuO4bY8y9xpjexph+xpj3PRGPUqp1uiy9E73bR/P3WRsor7J77Ly5RRW11yh4O+9v4FJKqRYSYBP+dEFvsg+VMX2+Z1qqK6rtHCip1JqCUkp5oxFpcYzv044X526tvX7AnXILncNh22lSUEop7/TgeadQbTc8NXuj28+V67pGIVGbj5RSyjulxEVw46hUPlq2m6z8Ereea59riot2MVpTUEoprzVldBcCbMJ7S3a69Ty1U1xEaVJQSimvlRQdytm9kvggYxcV1e4biZRTVE5woI024UFuO0dL0qSglGq1rhnemYOlVXyzdp/bzpFTUE5SdIhXre9wPJoUlFKt1qi0eFLjwpmxaIfbzpFTWOEzTUegSUEp1YrZbMLVp3ZmadZBNu4rcss5fOlqZtCkoJRq5SYN6URwgI13F7untqBJQSmlfEjbiGDO69eOT5ZnU1JR3aLHLq6opqTS7jNTXIAmBaWUYvLwFIoqqvly1Z4WPe6+At9ZXKeGJgWlVKs3JCWWnklRvPXLDuyOlptWO9eHluGsoUlBKdXqiQi3je1K5t5CHvp0TYutt3B4GU7faT4KtDoApZTyBpcOTmZbXgnTftxCTHgQD07o1exj1kxx4Us1BU0KSinlct85PSgoq+KVn7YRExbE1NO7Net4OYXlRIUEEhHiO1+1vhOpUkq5mYjwl4l9KCyv4slvNhITFsQ1p6ac9PFyCst9ZnbUGtqnoJRSddhswtOXDWBczwT+/Pk6tuUVn/SxfO0aBdCkoJRSxwgKsPHkpAGEBgXwt1kbTvo4OYUVPrO4Tg1NCkopVY+EqBCmjkvj28wcFm7Nb/LrHQ5DblE5iZoUlFLKP0wZ1YWObcJ4fOb6Jl+/cLC0kiq78anhqKBJQSmlGhQaFMADE04hc28hHy/f3aTX5vjY2sw1NCkopdRxXNi/PYM6t+Hp2RubNDdSzYpr2nyklFJ+RET44/m9yS2q4JV52xr9utplOLX5SCml/MuQlFgu6N+eV37ayq4DpY16TU3zUaIPLbADmhSUUqpRHjq/FwE24ZEv1jVq/32F5cRFBBMc6Ftfs74VrVJKWaR9TBi/Pas732/I5dvMnOPuW1ntIHNPgc/1J4AmBaWUarQbR3WhR1Ikj3yxjrJKe737lFfZuWPGMlbtLmDy8M4ejrD5NCkopVQjBQXYePzifmQfKmPaj5uPeb60spqb38zg+w25PHZx32bNm2QVTQpKKdUEw7q05dLBHXl13ja25DrnRXI4DPnFFVz/+hIWbs3n6csGcO1w30sI4IFZUkUkAMgAso0xFzSwz6+Aj4ChxpgMd8eklFLN8eCEXnyXmcMlLy7AJkJReRUOA4E24YWrBnFB/w5Wh3jSPDF19m+A9UB0fU+KSJRrn8UeiEUppZotISqEf14+kK/W7CU6NJDosCBiwoJIT23LwE5trA6vWdyaFEQkGTgf+CtwbwO7PQb8A7jfnbEopVRLOqt3Emf1TrI6jBbn7j6F54DfA476nhSRwUAnY8xXbo5DKaVUI7gtKYjIBUCuMWZZA8/bgH8C9zXiWLeKSIaIZOTl5bVwpEoppWq4s6YwCpgoIlnA+8AZIjKjzvNRQF9grmuf4cAXIpJ+9IGMMa8aY9KNMekJCQluDFkppVo3tyUFY8yDxphkY0wqcCXwgzFmcp3nC4wx8caYVNc+i4CJOvpIKaWs4/HrFETkURGZ6OnzKqWUOjFPDEnFGDMXmOu6/3AD+5zuiViUUko1TK9oVkopVUuTglJKqVpiTNMWo7aaiOQBO+p5KgYoOMnHNfdr/sYD+ScZ4tHnaco+9W1vTNx179fd5s5yuLMMde+39vfC6jLUve8t74V+tk+uHCnGmBMP3zTG+MUNePVkH9fcr/M3o6XiaMo+9W1vTNz1lcHd5XBnGfS98J4yeON7oZ/t5pXjRDd/aj76shmPv2xgn5aIoyn71Le9MXHXvd8SZWjMcdxZhsacvzH84b2wugyNjeFEWrIc+tl2I59rPvIEEckwxhxzEZ2v8Ydy+EMZwD/KoWXwHu4shz/VFFrSq1YH0EL8oRz+UAbwj3JoGbyH28qhNQWllFK1tKaglFKqlt8nBRF5XURyRWTtSbx2iIisEZEtIvKCiEid5+4WkQ0isk5EnmzZqI+Jo8XLICKPiEi2iKx03c5r+ciPicUt74Xr+ftExIhIfMtFXG8c7ngvHhOR1a73YY6IuH3ZLjeV4ynXZ2K1iHwqIm5dbcZNZbjM9Zl21Dc5Z0tpTuwNHO96Ednsul1fZ/txPzf1ctewJm+5AacBg4G1J/HaJThnbxVgFjDBtX0c8B0Q4nqc6INleAT4na+/F67nOgGzcV6/Eu9rZQCi6+zza+BlX3wvgHOAQNf9fwD/8MEy9AJ64pyWJ93bYnfFlXrUtrbANtffWNf92OOV83g3v68pGGPmAQfqbhORNBH5RkSWich8ETnl6NeJSHucH9ZFxvmv+xZwsevpO4C/G2MqXOfI9cEyeJwby/EszsWc3N5B5o4yGGMK6+wage+WY44xptq16yIg2QfLsN4Ys9GdcTcn9gacC3xrjDlgjDkIfAuMP9nPv98nhQa8CtxtjBkC/A54sZ59OgK76zze7doG0AMYIyKLReQnERnq1mjr19wyANzlquq/LiKx7gv1uJpVDhG5CMg2xqxyd6DH0ez3QkT+KiK7gGuAeieN9ICW+D9VYwrOX6ae1pJl8LTGxF6fjsCuOo9rynNS5fTILKneREQigZHAh3Wa10KaeJhAnFW14cBQ4AMR6erKxm7XQmV4Cef62Mb19xmcH2SPaW45RCQc+APOZgtLtNB7gTHmIeAhEXkQuAv4c4sF2QgtVQ7XsR4CqoF3Wia6Rp+3xcrgaceLXURuBH7j2tYN+FpEKoHtxphLWjqWVpcUcNaODhljBtbdKCIBQM3SoV/g/NKsW/1NBrJd93cDn7iSwBIRceCci8RTa4U2uwzGmJw6r3sNmOnOgBvQ3HKkAV2AVa4PUjKwXESGGWP2uTn2Gi3x/6mud4Cv8XBSoIXKISI3ABcAZ3rqR1IdLf1eeFK9sQMYY94A3gAQkbnADcaYrDq7ZAOn13mcjLPvIZuTKae7OlK86QakUqdDB1gIXOa6L8CABl53dCfNea7ttwOPuu73wFl1Ex8rQ/s6+9wDvO+L78VR+2Th5o5mN70X3evsczfwkS++F8B4IBNI8ET87vz/hJs7mk82dhruaN6Os5M51nW/bWPKWW9cnnrzrLoB7wF7gSqcv/Bvwvnr8htgles/8cMNvDYdWAtsBaZx+GK/YGCG67nlwBk+WIa3gTXAapy/ntq7swzuKsdR+2Th/tFH7ngvPnZtX41zfpuOvvheAFtw/kBa6bq5dRSVm8pwietYFUAOMNubYqeepODaPsX1778FuLEpn5ujb3pFs1JKqVqtdfSRUkqpemhSUEopVUuTglJKqVqaFJRSStXSpKCUUqqWJgXlF0Sk2MPnmy4ivVvoWHZxzpC6VkS+PNHsoiLSRkSmtsS5lTqaDklVfkFEio0xkS14vEBzeHI3t6obu4i8CWwyxvz1OPunAjONMX09EZ9qXbSmoPyWiCSIyMcistR1G+XaPkxEfhGRFSKyUER6urbfICJfiMgPwPcicrqIzBWRj8S5TsA7NfPRu7anu+4Xuya0WyUii0QkybU9zfV4jYg83sjazC8cnuwvUkS+F5HlrmNc5Nrn70Caq3bxlGvf+11lXC0if2nBf0bVymhSUP7seeBZY8xQ4FfAdNf2DcAYY8wgnDOSPlHnNYOBScaYsa7Hg4DfAr2BrsCoes4TASwyxgwA5gG31Dn/88aYfhw5W2W9XHP0nInzCnOAcuASY8xgnGt4PONKSv8HbDXGDDTG3C8i5wDdgWHAQGCIiJx2ovMpVZ/WOCGeaj3OAnrXmXUy2jUbZQzwpoh0xzlLbFCd13xrjKk7z/0SY8xuABFZiXO+mp+POk8lhycUXAac7bo/gsPz178LPN1AnGGuY3cE1uOcDx+c89U84fqCd7ieT6rn9ee4bitcjyNxJol5DZxPqQZpUlD+zAYMN8aU190oItOAH40xl7ja5+fWebrkqGNU1Llvp/7PTJU53DnX0D7HU2aMGeiaCnw2cCfwAs61FRKAIcaYKhHJAkLreb0AfzPGvNLE8yp1DG0+Uv5sDs5ZRwEQkZppiWM4PIXwDW48/yKczVYAV55oZ2NMKc7lOO8TkUCccea6EsI4IMW1axEQVeels4EprloQItJRRBJbqAyqldGkoPxFuIjsrnO7F+cXbLqr8zUT55TnAE8CfxORFbi3tvxb4F4RWY1zcZSCE73AGLMC52ypV+FcWyFdRNYA1+HsC8EYsx9Y4BrC+pQxZg7O5qlfXPt+xJFJQ6lG0yGpSrmJqzmozBhjRORK4CpjzEUnep1SVtI+BaXcZwgwzTVi6BAeXu5UqZOhNQWllFK1tE9BKaVULU0KSimlamlSUEopVUuTglJKqVqaFJRSStXSpKCUUqrW/wMGzblpKMTwmgAAAABJRU5ErkJggg==\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.fit_one_cycle(10, 2e-2, wd=0.2)","execution_count":102,"outputs":[{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Total time: 00:11 <p><table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: left;\">\n      <th>epoch</th>\n      <th>train_loss</th>\n      <th>valid_loss</th>\n      <th>mean_absolute_error</th>\n      <th>time</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>0</td>\n      <td>3.773748</td>\n      <td>1.644148</td>\n      <td>2.102905</td>\n      <td>00:01</td>\n    </tr>\n    <tr>\n      <td>1</td>\n      <td>2.347727</td>\n      <td>1.899246</td>\n      <td>2.376062</td>\n      <td>00:01</td>\n    </tr>\n    <tr>\n      <td>2</td>\n      <td>2.019687</td>\n      <td>2.072341</td>\n      <td>2.525737</td>\n      <td>00:01</td>\n    </tr>\n    <tr>\n      <td>3</td>\n      <td>1.853202</td>\n      <td>1.905922</td>\n      <td>2.359099</td>\n      <td>00:01</td>\n    </tr>\n    <tr>\n      <td>4</td>\n      <td>1.824795</td>\n      <td>2.283046</td>\n      <td>2.758467</td>\n      <td>00:01</td>\n    </tr>\n    <tr>\n      <td>5</td>\n      <td>1.766400</td>\n      <td>1.917797</td>\n      <td>2.379342</td>\n      <td>00:01</td>\n    </tr>\n    <tr>\n      <td>6</td>\n      <td>1.745857</td>\n      <td>1.894257</td>\n      <td>2.351234</td>\n      <td>00:01</td>\n    </tr>\n    <tr>\n      <td>7</td>\n      <td>1.735505</td>\n      <td>1.843065</td>\n      <td>2.310651</td>\n      <td>00:01</td>\n    </tr>\n    <tr>\n      <td>8</td>\n      <td>1.710064</td>\n      <td>1.877511</td>\n      <td>2.339326</td>\n      <td>00:01</td>\n    </tr>\n    <tr>\n      <td>9</td>\n      <td>1.688989</td>\n      <td>1.823134</td>\n      <td>2.281589</td>\n      <td>00:01</td>\n    </tr>\n  </tbody>\n</table>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_preds=learn.get_preds(ds_type=DatasetType.Test)","execution_count":20,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sub_csv = pd.read_csv('../input/sample_submission.csv')","execution_count":21,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sub_csv.head()","execution_count":22,"outputs":[{"output_type":"execute_result","execution_count":22,"data":{"text/plain":"       seg_id  time_to_failure\n0  seg_00030f                0\n1  seg_0012b5                0\n2  seg_00184e                0\n3  seg_003339                0\n4  seg_0042cc                0","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>seg_id</th>\n      <th>time_to_failure</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>seg_00030f</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>seg_0012b5</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>seg_00184e</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>seg_003339</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>seg_0042cc</td>\n      <td>0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"sub_csv['time_to_failure'] = test_preds[0].numpy()","execution_count":23,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sub_csv.to_csv('submission.csv',index=False)","execution_count":26,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}