You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by bz...@apache.org on 2016/11/09 04:40:46 UTC

[1/3] zeppelin git commit: [ZEPPELIN-116] Add Apache Mahout Interpreter

Repository: zeppelin
Updated Branches:
  refs/heads/master 0758b7078 -> e25266706


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/e2526670/scripts/mahout/add_mahout_interpreters.py
----------------------------------------------------------------------
diff --git a/scripts/mahout/add_mahout_interpreters.py b/scripts/mahout/add_mahout_interpreters.py
new file mode 100644
index 0000000..307364d
--- /dev/null
+++ b/scripts/mahout/add_mahout_interpreters.py
@@ -0,0 +1,290 @@
+# /**
+#  * Licensed to the Apache Software Foundation (ASF) under one
+#  * or more contributor license agreements.  See the NOTICE file
+#  * distributed with this work for additional information
+#  * regarding copyright ownership.  The ASF licenses this file
+#  * to you under the Apache License, Version 2.0 (the
+#  * "License"); you may not use this file except in compliance
+#  * with the License.  You may obtain a copy of the License at
+#  *
+#  *     http://www.apache.org/licenses/LICENSE-2.0
+#  *
+#  * Unless required by applicable law or agreed to in writing, software
+#  * distributed under the License is distributed on an "AS IS" BASIS,
+#  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  * See the License for the specific language governing permissions and
+#  * limitations under the License.
+#  */
+
+import argparse
+import json
+
+from os.path import isfile
+from os import getcwd
+
+from subprocess import call, check_call
+
+
+#######################################################################################################################
+# I put these here so it will (hopeully) be easy(er) to bump versions / maintain
+# If there is demand, we could easily make parts or all comand line arguments as well
+#######################################################################################################################
+tar_name = "apache-mahout-distribution-0.12.2.tar.gz"
+mahout_bin_url =  "http://apache.osuosl.org/mahout/0.12.2/%s" % tar_name
+mahout_version = "0.12.2"
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument("--force_download", help="force download Apache Mahout", action="store_true")
+parser.add_argument("--restart_later", help="force download Apache Mahout", action="store_true")
+parser.add_argument("--zeppelin_home", help="path to ZEPPELIN_HOME")
+parser.add_argument("--mahout_home", help="path to MAHOUT_HOME, use this if you have already installed Apache Mahout")
+parser.add_argument("--overwrite_existing", help="if %sparkMahout or %flinkMahout exist, delete them and create new ones. Otherwise Fail.", action="store_true")
+
+args = parser.parse_args()
+
+
+
+class ZeppelinTerpWrangler:
+    def __init__(self, interpreter_json_path):
+        self.interpreter_json_path = interpreter_json_path
+
+    def _getTerpID(self, terpName):
+        terp_id = None
+        for k, v in self.interpreter_json['interpreterSettings'].iteritems():
+            if v['name'] == terpName:
+                terp_id = k
+                break
+
+        return terp_id
+
+    def _terpExists(self, terpName):
+        terp_id = self._getTerpID(terpName)
+        if terp_id == None:
+            return False
+        return True
+
+    def createTerp(self, original_terp_name, new_terp_name, overwrite_existing=True ):
+
+        new_terp_id = new_terp_name
+        if self._terpExists(new_terp_name):
+            print "Found existing '%s' interpreter..." % new_terp_name
+            if overwrite_existing:
+                print "deleting %s from interpreter.json" %new_terp_name
+                del self.interpreter_json['interpreterSettings'][self._getTerpID(new_terp_name)]
+            else:
+                print "exiting program."
+                exit(1)
+
+        orig_terp_id = self._getTerpID(original_terp_name)
+
+        from copy import deepcopy
+        self.interpreter_json['interpreterSettings'][new_terp_id] = deepcopy(
+        self.interpreter_json['interpreterSettings'][orig_terp_id])
+        self.interpreter_json['interpreterSettings'][new_terp_id]['name'] = new_terp_name
+        self.interpreter_json['interpreterSettings'][new_terp_id]['id'] = new_terp_id
+        print "created new interpreter '%s' from interpreter '%s" % (new_terp_name, original_terp_name)
+
+    def _readTerpJson(self):
+        with open(self.interpreter_json_path) as f:
+            self.interpreter_json = json.load(f)
+
+    def _writeTerpJson(self):
+        with open(self.interpreter_json_path, 'wb') as f:
+            json.dump(self.interpreter_json, f, sort_keys=True, indent=4)
+
+    def _updateTerpProp(self, terpName, property, value):
+        terp_id = self._getTerpID(terpName)
+        self.interpreter_json['interpreterSettings'][terp_id]['properties'][property] = value
+
+    def _addTerpDep(self, terpName="", dep="", exclusions=None):
+        if self.interpreter_json == {}:
+            print "no interpreter.json loaded, reading last one downloaded"
+            self._readTerpJson()
+        terp_id = self._getTerpID(terpName)
+        deps = self.interpreter_json['interpreterSettings'][terp_id]['dependencies']
+
+        dep_dict = {
+            u'groupArtifactVersion': dep,
+            u'local': False
+
+        }
+        if exclusions != None:
+            dep_dict["exclusions"] = exclusions
+        deps.append(dep_dict)
+
+        ## Remove Duplicate Dependencies
+        seen = set()
+        new_deps = list()
+        for d in deps:
+            t = d.items()
+            if t[0] not in seen:
+                seen.add(t[0])
+                new_deps.append(d)
+
+        self.interpreter_json['interpreterSettings'][terp_id]['dependencies'] = new_deps
+
+    def addMahoutConfig(self, terpName, mahout_home, mahout_version = "0.12.2"):
+
+        print "updating '%s' with Apache Mahout dependencies and settings" % terpName
+
+        terpDeps = ["%s/mahout-math-%s.jar" %  (mahout_home, mahout_version),
+                    "%s/mahout-math-scala_2.10-%s.jar" %  (mahout_home, mahout_version)]
+
+        if "spark" in terpName.lower():
+            configs = {
+                "spark.kryo.referenceTracking": "false",
+                "spark.kryo.registrator": "org.apache.mahout.sparkbindings.io.MahoutKryoRegistrator",
+                "spark.kryoserializer.buffer": "32k",
+                "spark.kryoserializer.buffer.max": "600m",
+                "spark.serializer": "org.apache.spark.serializer.KryoSerializer"
+            }
+            terpDeps.append('%s/mahout-spark_2.10-%s-dependency-reduced.jar' % (mahout_home, mahout_version))
+            terpDeps.append("%s/mahout-spark_2.10-%s.jar" % (mahout_home, mahout_version))
+            terpDeps.append("%s/mahout-spark-shell_2.10-%s.jar" % (mahout_home, mahout_version))
+
+        if "flink" in terpName.lower():
+            configs = {
+                "taskmanager.numberOfTaskSlots" : "12"
+            }
+            addlDeps = [
+                "%s/mahout-flink_2.10-%s.jar" % (mahout_home, mahout_version),
+                "%s/mahout-hdfs-%s.jar" % (mahout_home, mahout_version),
+                "com.google.guava:guava:14.0.1"
+                #"%s/guava-14.0.1.jar" % mahout_home  ## reuired in lib dir if running against cluster
+            ]
+            for t in addlDeps:
+                terpDeps.append(t)
+
+        for k, v in configs.iteritems():
+            self._updateTerpProp(terpName, k, v)
+
+        for t in terpDeps:
+            self._addTerpDep(terpName, t)
+
+#######################################################################################################################
+# Need to be sure we know where Zeppelin Top directory is so we can edit conf files
+#
+#######################################################################################################################
+
+def valid_zeppelin_home(path):
+    return isfile(path + "/bin/zeppelin-daemon.sh")
+
+if args.zeppelin_home == None:
+    zeppelin_home = getcwd()
+    if (zeppelin_home.split("/")[-1] == "bin") and (isfile("zeppelin-daemon.sh")):
+        print "we're in the zeppelin/bin"
+        zeppelin_home = "/".join(zeppelin_home.split("/")[:-1])
+    print "--zeppelin_home not specified, using %s" % zeppelin_home
+else:
+    zeppelin_home = args.zeppelin_home
+
+
+if not valid_zeppelin_home(zeppelin_home):
+    print "%s does not appear to be a valid ZEPPELIN_HOME - e.g. the top level directory of the ZEPPELIN install" % zeppelin_home
+    exit(1)
+else:
+    print "ZEPPELIN_HOME validated"
+
+interpreter_json_path = zeppelin_home + "/conf/interpreter.json"
+
+if not isfile(interpreter_json_path):
+    print "interpreter.json doesn't exist. Checking weather Zeppelin is running."
+    status = call(["bin/zeppelin-daemon.sh", 'status'], cwd=zeppelin_home)
+    if status == 1:
+        print "Zeppelin doesn't appear to be running- it is possible that Zeppelin has never been run (interpreter.json is created when Zeppelin is run)"
+        print "I'm going to try to start Zeppelin to create interpreter.json"
+        call(["bin/zeppelin-daemon.sh", 'start'], cwd=zeppelin_home)
+        from time import sleep
+        sleep(3)
+    else:
+        print "We're in the correct top-level directory, Zeppelin appears to be running, but there is no 'interpreter.json'. \
+          \nThis is a confusing case.  Please try restarting Zeppelin, but if that doesn't work reach out on the mailing list."
+
+if isfile(interpreter_json_path):
+    z = ZeppelinTerpWrangler(interpreter_json_path)
+else:
+    print "'interpreter.json' not found in %s/conf" % args.zeppelin_home
+    exit(1)
+
+#######################################################################################################################
+# If --mahout_home not set, download and untar Mahout in to ZEPPELIN_HOME
+# Set MAHOUT_HOME to ZEPPELIN_HOME/<mahout_untar_dir>
+#######################################################################################################################
+
+def download_mahout():
+    if args.force_download:
+        print "--force_download: OK, deleting existing tar if it exists."
+        call(["rm", "%s/%s" % (zeppelin_home, tar_name)])
+        return True
+    elif isfile("%s/%s" % (zeppelin_home, tar_name)):
+        print "%s found, skipping download" % tar_name
+        return False
+    elif args.mahout_home:
+        print "--mahout_home set, skipping download"
+        return False
+    else:
+        return True
+
+if download_mahout():
+    check_call(['wget', mahout_bin_url], cwd= zeppelin_home)
+    check_call(['tar', 'xzf', tar_name], cwd= zeppelin_home)
+
+
+
+if args.mahout_home:
+    mahout_home = args.mahout_home
+else:
+  mahout_home = zeppelin_home + "/" + ".".join(tar_name.split(".")[:-2])
+
+#######################################################################################################################
+# Create new interpreters
+#######################################################################################################################
+
+z._readTerpJson()
+z.createTerp("spark", "sparkMahout", args.overwrite_existing)
+z.createTerp("flink", "flinkMahout", args.overwrite_existing)
+z.addMahoutConfig("sparkMahout", mahout_home, mahout_version)
+z.addMahoutConfig("flinkMahout", mahout_home, mahout_version)
+z._writeTerpJson()
+
+#######################################################################################################################
+# Add "export MAHOUT_HOME=... to conf/zeppelin-env.sh
+# Create if doesn't exist.
+#######################################################################################################################
+
+mahout_home_str = '\nexport MAHOUT_HOME=%s\n' % (mahout_home)
+
+zeppelin_env_sh_path = '%s/conf/zeppelin-env.sh' % zeppelin_home
+if isfile(zeppelin_env_sh_path):
+    with open(zeppelin_env_sh_path, 'rb') as f:
+        zeppelin_env_sh = f.readlines()
+    if any(["export MAHOUT_HOME=" in line for line in zeppelin_env_sh]):
+        print "'export MAHOUT_HOME=...' already exists in zeppelin_env.sh, not appending"
+    else:
+        print "appending '%s' to conf/zeppelin-env.sh" % mahout_home_str
+        with open(zeppelin_env_sh_path, 'a') as f:
+            f.write(mahout_home_str)
+else:
+    print "appending '%s' to conf/zeppelin-env.sh" % mahout_home_str
+    with open(zeppelin_env_sh_path, 'wb') as f:
+        f.write(mahout_home_str)
+
+
+#######################################################################################################################
+# You have to restart Apache Zeppelin for new terps to show up... do this for user unless the specified otherwise
+#
+#######################################################################################################################
+if not args.restart_later:
+    print "restarting Apache Zeppelin to load new interpreters..."
+    check_call(["bin/zeppelin-daemon.sh", 'restart'], cwd= zeppelin_home)
+else:
+    print "--restart_later flag detected: remember to restart Zeppelin to see new Mahout interpreters!!"
+
+#######################################################################################################################
+# Good bye
+#######################################################################################################################
+
+print "---------------------------------------------------------------------------------------------------------------"
+print "all done! Thanks for using Apache Mahout"
+print "bye"


[3/3] zeppelin git commit: [ZEPPELIN-116] Add Apache Mahout Interpreter

Posted by bz...@apache.org.
[ZEPPELIN-116] Add Apache Mahout Interpreter

### What is this PR for?

This PR adds Mahout functionality for the Spark Interpreter.
### What type of PR is it?

Improvement
### Todos
- [x] Implement Mahout Interpreter in Spark
- [x] Add Unit Tests
- [x] Add Documentation
- [x] Add Example Notebook
### What is the Jira issue?

https://issues.apache.org/jira/browse/ZEPPELIN-116
### How should this be tested?

Open a Spark Notebook with Mahout enabled and run a few simple commands using the R-Like DSL and Spark Distributed Context (Mahout Specific)
### Screenshots (if appropriate)
### Questions:
- Does the licenses files need update?
  No
- Is there breaking changes for older versions?
  No
- Does this needs documentation?
  Yes

Author: rawkintrevo <tr...@gmail.com>

Closes #928 from rawkintrevo/mahout-terp and squashes the following commits:

ed6eff0 [rawkintrevo] [ZEPPELIN-116] renamed add_mahout_interpreters.py and overwrite_existing feature
e7d4e12 [rawkintrevo] [ZEPPELIN-116] Made add_mahout.py script more resilient
7e83832 [rawkintrevo] [ZEPPELIN-116] Add Mahout Interpreters


Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/e2526670
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/e2526670
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/e2526670

Branch: refs/heads/master
Commit: e25266706e69e31fdae95180ac282f2ab10a497f
Parents: 0758b70
Author: rawkintrevo <tr...@gmail.com>
Authored: Sun Nov 6 07:54:14 2016 -0600
Committer: Alexander Bezzubov <bz...@apache.org>
Committed: Wed Nov 9 13:39:52 2016 +0900

----------------------------------------------------------------------
 docs/interpreter/mahout.md                | 220 +++++++
 notebook/2BYEZ5EVK/note.json              | 772 +++++++++++++++++++++++++
 scripts/mahout/add_mahout_interpreters.py | 290 ++++++++++
 3 files changed, 1282 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/e2526670/docs/interpreter/mahout.md
----------------------------------------------------------------------
diff --git a/docs/interpreter/mahout.md b/docs/interpreter/mahout.md
new file mode 100644
index 0000000..c3b4146
--- /dev/null
+++ b/docs/interpreter/mahout.md
@@ -0,0 +1,220 @@
+---
+layout: page
+title: "Mahout Interpreter for Apache Zeppelin"
+description: "Apache Mahout provides a unified API (the R-Like Scala DSL) for quickly creating machine learning algorithms on a variety of engines."
+group: interpreter
+---
+<!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+{% include JB/setup %}
+
+# Apache Mahout Interpreter for Apache Zeppelin
+
+<div id="toc"></div>
+
+## Installation
+
+Apache Mahout is a collection of packages that enable machine learning and matrix algebra on underlying engines such as Apache Flink or Apache Spark.  A convenience script for creating and configuring two Mahout enabled interpreters exists.  The `%sparkMahout` and `%flinkMahout` interpreters do not exist by default but can be easily created using this script.  
+
+### Easy Installation
+To quickly and easily get up and running using Apache Mahout, run the following command from the top-level directory of the Zeppelin install:
+```bash
+python scripts/mahout/add_mahout.py
+```
+
+This will create the `%sparkMahout` and `%flinkMahout` interpreters, and restart Zeppelin.
+
+### Advanced Installation
+
+The `add_mahout.py` script contains several command line arguments for advanced users.
+
+<table class="table-configuration">
+  <tr>
+    <th>Argument</th>
+    <th>Description</th>
+    <th>Example</th>
+  </tr>
+  <tr>
+    <td>--zeppelin_home</td>
+    <td>This is the path to the Zeppelin installation.  This flag is not needed if the script is run from the top-level installation directory or from the `zeppelin/scripts/mahout` directory.</td>
+    <td>/path/to/zeppelin</td>
+  </tr>
+  <tr>
+    <td>--mahout_home</td>
+    <td>If the user has already installed Mahout, this flag can set the path to `MAHOUT_HOME`.  If this is set, downloading Mahout will be skipped.</td>
+    <td>/path/to/mahout_home</td>
+  </tr>
+  <tr>
+    <td>--restart_later</td>
+    <td>Restarting is necessary for updates to take effect. By default the script will restart Zeppelin for you- restart will be skipped if this flag is set.</td>
+    <td>NA</td>
+  </tr>
+  <tr>
+    <td>--force_download</td>
+    <td>This flag will force the script to re-download the binary even if it already exists.  This is useful for previously failed downloads.</td>
+    <td>NA</td>
+  </tr>
+  <tr>
+      <td>--overwrite_existing</td>
+      <td>This flag will force the script to overwrite existing `%sparkMahout` and `%flinkMahout` interpreters. Useful when you want to just start over.</td>
+      <td>NA</td>
+    </tr>
+</table>
+
+__NOTE 1:__ Apache Mahout at this time only supports Spark 1.5 and Spark 1.6 and Scala 2.10.  If the user is using another version of Spark (e.g. 2.0), the `%sparkMahout` will likely not work.  The `%flinkMahout` interpreter will still work and the user is encouraged to develop with that engine as the code can be ported via copy and paste, as is evidenced by the tutorial notebook.
+
+__NOTE 2:__ If using Apache Flink in cluster mode, the following libraries will also need to be coppied to `${FLINK_HOME}/lib`
+- mahout-math-0.12.2.jar
+- mahout-math-scala_2.10-0.12.2.jar
+- mahout-flink_2.10-0.12.2.jar
+- mahout-hdfs-0.12.2.jar
+- [com.google.guava:guava:14.0.1](http://central.maven.org/maven2/com/google/guava/guava/14.0.1/guava-14.0.1.jar)
+
+## Overview
+
+The [Apache Mahout](http://mahout.apache.org/)\u2122 project's goal is to build an environment for quickly creating scalable performant machine learning applications.
+
+Apache Mahout software provides three major features:
+
+- A simple and extensible programming environment and framework for building scalable algorithms
+- A wide variety of premade algorithms for Scala + Apache Spark, H2O, Apache Flink
+- Samsara, a vector math experimentation environment with R-like syntax which works at scale
+
+In other words:
+
+*Apache Mahout provides a unified API for quickly creating machine learning algorithms on a variety of engines.*
+
+## How to use
+
+When starting a session with Apache Mahout, depending on which engine you are using (Spark or Flink), a few imports must be made and a _Distributed Context_ must be declared.  Copy and paste the following code and run once to get started.
+
+### Flink
+
+```scala
+%flinkMahout
+
+import org.apache.flink.api.scala._
+import org.apache.mahout.math.drm._
+import org.apache.mahout.math.drm.RLikeDrmOps._
+import org.apache.mahout.flinkbindings._
+import org.apache.mahout.math._
+import scalabindings._
+import RLikeOps._
+
+implicit val ctx = new FlinkDistributedContext(benv)
+```
+
+### Spark
+```scala
+%sparkMahout
+
+import org.apache.mahout.math._
+import org.apache.mahout.math.scalabindings._
+import org.apache.mahout.math.drm._
+import org.apache.mahout.math.scalabindings.RLikeOps._
+import org.apache.mahout.math.drm.RLikeDrmOps._
+import org.apache.mahout.sparkbindings._
+
+implicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext = sc2sdc(sc)
+```
+
+### Same Code, Different Engines
+
+After importing and setting up the distributed context, the Mahout R-Like DSL is consistent across engines.  The following code will run in both `%flinkMahout` and `%sparkMahout`
+
+```scala
+val drmData = drmParallelize(dense(
+  (2, 2, 10.5, 10, 29.509541),  // Apple Cinnamon Cheerios
+  (1, 2, 12,   12, 18.042851),  // Cap'n'Crunch
+  (1, 1, 12,   13, 22.736446),  // Cocoa Puffs
+  (2, 1, 11,   13, 32.207582),  // Froot Loops
+  (1, 2, 12,   11, 21.871292),  // Honey Graham Ohs
+  (2, 1, 16,   8,  36.187559),  // Wheaties Honey Gold
+  (6, 2, 17,   1,  50.764999),  // Cheerios
+  (3, 2, 13,   7,  40.400208),  // Clusters
+  (3, 3, 13,   4,  45.811716)), numPartitions = 2)
+
+drmData.collect(::, 0 until 4)
+
+val drmX = drmData(::, 0 until 4)
+val y = drmData.collect(::, 4)
+val drmXtX = drmX.t %*% drmX
+val drmXty = drmX.t %*% y
+
+
+val XtX = drmXtX.collect
+val Xty = drmXty.collect(::, 0)
+val beta = solve(XtX, Xty)
+```
+
+## Leveraging Resource Pools and R for Visualization
+
+Resource Pools are a powerful Zeppelin feature that lets us share information between interpreters. A fun trick is to take the output of our work in Mahout and analyze it in other languages.
+
+### Setting up a Resource Pool in Flink
+
+In Spark based interpreters resource pools are accessed via the ZeppelinContext API.  To put and get things from the resource pool one can be done simple
+```scala
+val myVal = 1
+z.put("foo", myVal)
+val myFetchedVal = z.get("foo")
+```
+
+To add this functionality to a Flink based interpreter we declare the follwoing
+
+```scala
+%flinkMahout
+
+import org.apache.zeppelin.interpreter.InterpreterContext
+
+val z = InterpreterContext.get().getResourcePool()
+```
+
+Now we can access the resource pool in a consistent manner from the `%flinkMahout` interpreter.
+
+
+### Passing a variable from Mahout to R and Plotting
+
+In this simple example, we use Mahout (on Flink or Spark, the code is the same) to create a random matrix and then take the Sin of each element. We then randomly sample the matrix and create a tab separated string. Finally we pass that string to R where it is read as a .tsv file, and a DataFrame is created and plotted using native R plotting libraries.
+
+```scala
+val mxRnd = Matrices.symmetricUniformView(5000, 2, 1234)
+val drmRand = drmParallelize(mxRnd)
+
+
+val drmSin = drmRand.mapBlock() {case (keys, block) =>  
+  val blockB = block.like()
+  for (i <- 0 until block.nrow) {
+    blockB(i, 0) = block(i, 0)
+    blockB(i, 1) = Math.sin((block(i, 0) * 8))
+  }
+  keys -> blockB
+}
+
+z.put("sinDrm", org.apache.mahout.math.drm.drmSampleToTSV(drmSin, 0.85))
+```
+
+And then in an R paragraph...
+
+```r
+%spark.r {"imageWidth": "400px"}
+
+library("ggplot2")
+
+sinStr = z.get("flinkSinDrm")
+
+data <- read.table(text= sinStr, sep="\t", header=FALSE)
+
+plot(data,  col="red")
+```


[2/3] zeppelin git commit: [ZEPPELIN-116] Add Apache Mahout Interpreter

Posted by bz...@apache.org.
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/e2526670/notebook/2BYEZ5EVK/note.json
----------------------------------------------------------------------
diff --git a/notebook/2BYEZ5EVK/note.json b/notebook/2BYEZ5EVK/note.json
new file mode 100644
index 0000000..1a753ba
--- /dev/null
+++ b/notebook/2BYEZ5EVK/note.json
@@ -0,0 +1,772 @@
+{
+  "paragraphs": [
+    {
+      "text": "%md\n\n### The [Apache Mahout](http://mahout.apache.org/)\u2122 project\u0027s goal is to build an environment for quickly creating scalable performant machine learning applications.\n\n#### Apache Mahout software provides three major features:\n\n- A simple and extensible programming environment and framework for building scalable algorithms\n- A wide variety of premade algorithms for Scala + Apache Spark, H2O, Apache Flink\n- Samsara, a vector math experimentation environment with R-like syntax which works at scale\n\n#### In other words:\n\n*Apache Mahout provides a unified API for quickly creating machine learning algorithms on a variety of engines.*\n\n#### Getting Started\n\nApache Mahout is a collection of Libraries that enhance Apache Flink, Apache Spark, and others. Currently Zeppelin support the Flink and Spark Engines. A convenience script is provided to setup the nessecary imports and configurations to run Mahout on Spark and Flink. \n\nWe can use Apache Maho
 ut\u0027s R-Like Domain Specific Language (DSL) inline with native Flink or Spark code.  We must however, first declare a few imports that are different for Spark and Flink\n\n__References:__\n\n[Mahout-Samsara\u0027s In-Core Linear Algebra DSL Reference](http://mahout.apache.org/users/environment/in-core-reference.html)\n[Mahout-Samsara\u0027s Distributed Linear Algebra DSL Reference](http://mahout.apache.org/users/environment/out-of-core-reference.html)\n[Getting Started with the Mahout-Samsara Shell](http://mahout.apache.org/users/sparkbindings/play-with-shell.html)\n",
+      "dateUpdated": "Sep 28, 2016 10:01:52 AM",
+      "config": {
+        "colWidth": 12.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "editorHide": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475013396125_39313566",
+      "id": "20160927-155636_1798325301",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003ch3\u003eThe \u003ca href\u003d\"http://mahout.apache.org/\"\u003eApache Mahout\u003c/a\u003e\u2122 project\u0027s goal is to build an environment for quickly creating scalable performant machine learning applications.\u003c/h3\u003e\n\u003ch4\u003eApache Mahout software provides three major features:\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eA simple and extensible programming environment and framework for building scalable algorithms\u003c/li\u003e\n\u003cli\u003eA wide variety of premade algorithms for Scala + Apache Spark, H2O, Apache Flink\u003c/li\u003e\n\u003cli\u003eSamsara, a vector math experimentation environment with R-like syntax which works at scale\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eIn other words:\u003c/h4\u003e\n\u003cp\u003e\u003cem\u003eApache Mahout provides a unified API for quickly creating machine learning algorithms on a variety of engines.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eReferences:\u003c/strong\
 u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href\u003d\"http://mahout.apache.org/users/environment/in-core-reference.html\"\u003eMahout-Samsara\u0027s In-Core Linear Algebra DSL Reference\u003c/a\u003e\n\u003cbr  /\u003e\u003ca href\u003d\"http://mahout.apache.org/users/environment/out-of-core-reference.html\"\u003eMahout-Samsara\u0027s Distributed Linear Algebra DSL Reference\u003c/a\u003e\n\u003cbr  /\u003e\u003ca href\u003d\"http://mahout.apache.org/users/sparkbindings/play-with-shell.html\"\u003eGetting Started with the Mahout-Samsara Shell\u003c/a\u003e\u003c/p\u003e\n"
+      },
+      "dateCreated": "Sep 27, 2016 3:56:36 AM",
+      "dateStarted": "Sep 27, 2016 4:02:55 AM",
+      "dateFinished": "Sep 27, 2016 4:02:55 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%md\n\n#### \"Installing\" the Apache Mahout dependencies and configuring a new Spark and Flink interpreter\n\nThe following two paragraphs are convenience paragraphs. You **only need to run them once** to create two new interpreters `%spark.mahout` and `%flink.mahout`. These are intended for users who don\u0027t have Apache Mahout already installed. They assume you started Apache Zeppelin from the top level directory or from the bin.  You can tell which one is you by weather you started Zeppelin by typing `./zeppelin-daemon.sh start` or `bin/zeppelin-daemon.sh start`.  If you started Zeppelin from somewhere else you will also need to run them from the command line.\n\nThey both run a python script which may be found at `ZEPPELIN_HOME/scripts/mahout/add_mahout.py`\n\nIn short this script:\n- Downloads Apache Mahout\n- Creates a new Flink interpreter with dependencies.\n- Creates a new Spark interpreter with dependencies and modified configuration to use Kryo serializa
 tion.\n\n__You only need to run this script once ever.__ (Maybe again if for some reason you delete `conf/interpreter.json`) \n",
+      "dateUpdated": "Sep 27, 2016 4:31:15 AM",
+      "config": {
+        "colWidth": 12.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "editorHide": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475015019489_-1704057033",
+      "id": "20160927-162339_341514150",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003ch4\u003e\u0026ldquo;Installing\u0026rdquo; the Apache Mahout dependencies and configuring a new Spark and Flink interpreter\u003c/h4\u003e\n\u003cp\u003eThe following two paragraphs are convenience paragraphs. You \u003cstrong\u003eonly need to run them once\u003c/strong\u003e to create two new interpreters \u003ccode\u003e%spark.mahout\u003c/code\u003e and \u003ccode\u003e%flink.mahout\u003c/code\u003e. These are intended for users who don\u0027t have Apache Mahout already installed. They assume you started Apache Zeppelin from the top level directory or from the bin.  You can tell which one is you by weather you started Zeppelin by typing \u003ccode\u003e./zeppelin-daemon.sh start\u003c/code\u003e or \u003ccode\u003ebin/zeppelin-daemon.sh start\u003c/code\u003e.  If you started Zeppelin from somewhere else you will also need to run them from the command line.\u003c/p\u003e\n\u003cp\u003eThey both run a python script which may be found at \u003ccode\u003eZEPPE
 LIN_HOME/scripts/mahout/add_mahout.py\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIn short this script:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDownloads Apache Mahout\u003c/li\u003e\n\u003cli\u003eCreates a new Flink interpreter with dependencies.\u003c/li\u003e\n\u003cli\u003eCreates a new Spark interpreter with dependencies and modified configuration to use Kryo serialization.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eYou only need to run this script once ever.\u003c/strong\u003e (Maybe again if for some reason you delete \u003ccode\u003econf/interpreter.json\u003c/code\u003e)\u003c/p\u003e\n"
+      },
+      "dateCreated": "Sep 27, 2016 4:23:39 AM",
+      "dateStarted": "Sep 27, 2016 4:31:12 AM",
+      "dateFinished": "Sep 27, 2016 4:31:13 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Convenience Paragraph if you started Zeppelin by \u0027./zeppelin-daemon.sh start\u0027",
+      "text": "%sh\n\npython ../scripts/mahout/add_mahout.py",
+      "dateUpdated": "Sep 27, 2016 4:23:59 AM",
+      "config": {
+        "colWidth": 12.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/sh",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475014957043_-748248820",
+      "id": "20160927-162237_1864782562",
+      "dateCreated": "Sep 27, 2016 4:22:37 AM",
+      "status": "READY",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Convenience Paragraph if you started Zeppelin by \u0027bin/zeppelin-daemon.sh start\u0027",
+      "text": "%sh\npython scripts/mahout/add_mahout_interpreters.py",
+      "dateUpdated": "Sep 27, 2016 5:26:49 AM",
+      "config": {
+        "colWidth": 12.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/sh",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475018789604_-139338572",
+      "id": "20160927-172629_1189436716",
+      "dateCreated": "Sep 27, 2016 5:26:29 AM",
+      "status": "READY",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%md\n\nAfter the interpreters are created you will need to \u0027bind\u0027 them by clicking on the little gear in the top right corner, scrolling to the top, and clicking on `mahoutFlink` and `mahoutSpark` so that they are highlighted in blue.\n\n#### Running Mahout code\n\nYou will need to import certain libraries, and declare the _Mahout Distributed Context_ when you first start your notebook using the interpreters. \n\nIf using Apache Flink the code you need to run is:\n```scala\n%flinkMahout\n\nimport org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\n\n\nimplicit val ctx \u003d new FlinkDistributedContext(benv)\n```\n\nIf using Apache Spark the code you need to run is\n```scala\n%sparkMahout\n\nimport org.apache.mahout.math._\nimport org.apache.mahout.math.scalabindings._\nimport or
 g.apache.mahout.math.drm._\nimport org.apache.mahout.math.scalabindings.RLikeOps._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.sparkbindings._\n\nimplicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d sc2sdc(sc)\n```\n\n__Note: For Apache Mahout on Apache Spark you must be running Spark 1.5.x or 1.6.x.  We are working hard on supporting Spark 2.0__\nIn the meantime, feel free to play with Mahout on Flink and then simple _copy and paste your Mahout code to Spark once it is supported!_\n\n### A Side by Side Example\n",
+      "dateUpdated": "Sep 28, 2016 12:36:44 PM",
+      "config": {
+        "colWidth": 12.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/markdown",
+        "editorHide": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475014730618_1513783554",
+      "id": "20160927-161850_1560940440",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003cp\u003eAfter the interpreters are created you will need to \u0027bind\u0027 them by clicking on the little gear in the top right corner, scrolling to the top, and clicking on \u003ccode\u003emahoutFlink\u003c/code\u003e and \u003ccode\u003emahoutSpark\u003c/code\u003e so that they are highlighted in blue.\u003c/p\u003e\n\u003ch4\u003eRunning Mahout code\u003c/h4\u003e\n\u003cp\u003eYou will need to import certain libraries, and declare the \u003cem\u003eMahout Distributed Context\u003c/em\u003e when you first start your notebook using the interpreters.\u003c/p\u003e\n\u003cp\u003eIf using Apache Flink the code you need to run is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class\u003d\"scala\"\u003e%flinkMahout\n\nimport org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\n\n\n@transien
 t implicit val ctx \u003d new FlinkDistributedContext(benv)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf using Apache Spark the code you need to run is\u003c/p\u003e\n\u003cpre\u003e\u003ccode class\u003d\"scala\"\u003e%sparkMahout\n\nimport org.apache.mahout.math._\nimport org.apache.mahout.math.scalabindings._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.scalabindings.RLikeOps._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.sparkbindings._\n\nimplicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d sc2sdc(sc)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eNote: For Apache Mahout on Apache Spark you must be running Spark 1.5.x or 1.6.x.  We are working hard on supporting Spark 2.0\u003c/strong\u003e\n\u003cbr  /\u003eIn the meantime, feel free to play with Mahout on Flink and then simple \u003cem\u003ecopy and paste your Mahout code to Spark once it is supported!\u003c/em\u003e\u0
 03c/p\u003e\n\u003ch3\u003eA Side by Side Example\u003c/h3\u003e\n"
+      },
+      "dateCreated": "Sep 27, 2016 4:18:50 AM",
+      "dateStarted": "Sep 28, 2016 10:17:05 AM",
+      "dateFinished": "Sep 28, 2016 10:17:06 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%flinkMahout\n\n// Imports and creating the distributed context, similar but not exactly the same ///////////////////////////////////////////\nimport org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\n\n\nimplicit val ctx \u003d new FlinkDistributedContext(benv)\n\n// CODE IS EXACTLY THE SAME FROM HERE ON - R-Like DSL ////////////////////////////////////////////////////////////////////////////////\n\nval drmData \u003d drmParallelize(dense(\n  (2, 2, 10.5, 10, 29.509541),  // Apple Cinnamon Cheerios\n  (1, 2, 12,   12, 18.042851),  // Cap\u0027n\u0027Crunch\n  (1, 1, 12,   13, 22.736446),  // Cocoa Puffs\n  (2, 1, 11,   13, 32.207582),  // Froot Loops\n  (1, 2, 12,   11, 21.871292),  // Honey Graham Ohs\n  (2, 1, 16,   8,  36.187559),  // Wheaties Honey Gold\n  (6, 2, 17,   1,  50.764999)
 ,  // Cheerios\n  (3, 2, 13,   7,  40.400208),  // Clusters\n  (3, 3, 13,   4,  45.811716)), numPartitions \u003d 2)\n  \ndrmData.collect(::, 0 until 4)\n\nval drmX \u003d drmData(::, 0 until 4)\nval y \u003d drmData.collect(::, 4)\nval drmXtX \u003d drmX.t %*% drmX\nval drmXty \u003d drmX.t %*% y\n\n\nval XtX \u003d drmXtX.collect\nval Xty \u003d drmXty.collect(::, 0)\nval beta \u003d solve(XtX, Xty)\n\n",
+      "dateUpdated": "Sep 28, 2016 1:41:59 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/markdown"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475015779325_-1869239670",
+      "id": "20160927-163619_899520006",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "import org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\nctx: org.apache.mahout.flinkbindings.FlinkDistributedContext \u003d org.apache.mahout.flinkbindings.FlinkDistributedContext@4452b0a5\nwarning: Class it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap not found - continuing with a stub.\ndrmData: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be\n(5,9)\nres1: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:2.0,1:2.0,2:10.5,3:10.0}\n 1 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:12.0}\n 2 \u003d\u003e\t{0:1.0,1:1.0,2:12.0,3:13.0}\n 3 \u003d\u003e\t{0:2.0,1:1.0,2:11.0,3:13.0}\n 4 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:11.0}\n 5 \u003d\u003e\t{0:2.0,1:1.0,2:16.0,3:8.0}\n 6 \u003d\u003e\t{0:6.0,1:2.0,2:17.0,3:1.0}\
 n 7 \u003d\u003e\t{0:3.0,1:2.0,2:13.0,3:7.0}\n 8 \u003d\u003e\t{0:3.0,1:3.0,2:13.0,3:4.0}\n}\ndrmX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true)\n(5,9)\ny: org.apache.mahout.math.Vector \u003d {0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716}\ndrmXtX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpABAnyKey(OpAt(OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true)),OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true))\ndrmXty: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpAx(OpAt(OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true)),{0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716})\
 n(4,4)\nXtX: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:69.0,1:40.0,2:291.0,3:137.0}\n 1 \u003d\u003e\t{0:40.0,1:32.0,2:207.0,3:128.0}\n 2 \u003d\u003e\t{0:291.0,1:207.0,2:1546.25,3:968.0}\n 3 \u003d\u003e\t{0:137.0,1:128.0,2:968.0,3:833.0}\n}\n(1,4)\nXty: org.apache.mahout.math.Vector \u003d {0:821.6857190000001,1:549.744517,2:3978.7015895000004,3:2272.7799889999997}\nbeta: org.apache.mahout.math.Vector \u003d {0:5.247349465378393,1:2.7507945784675067,2:1.1527813010791783,3:0.10312017617607437}\n"
+      },
+      "dateCreated": "Sep 27, 2016 4:36:19 AM",
+      "dateStarted": "Sep 28, 2016 1:41:59 PM",
+      "dateFinished": "Sep 28, 2016 1:42:25 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%sparkMahout\n\n// Imports and creating the distributed context, similar but not exactly the same ///////////////////////////////////////////\n\nimport org.apache.mahout.math._\nimport org.apache.mahout.math.scalabindings._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.scalabindings.RLikeOps._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.sparkbindings._\n\nimplicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d sc2sdc(sc)\n\n\n// CODE IS EXACTLY THE SAME FROM HERE ON - R-Like DSL ////////////////////////////////////////////////////////////////////////////////\n\nval drmData \u003d drmParallelize(dense(\n  (2, 2, 10.5, 10, 29.509541),  // Apple Cinnamon Cheerios\n  (1, 2, 12,   12, 18.042851),  // Cap\u0027n\u0027Crunch\n  (1, 1, 12,   13, 22.736446),  // Cocoa Puffs\n  (2, 1, 11,   13, 32.207582),  // Froot Loops\n  (1, 2, 12,   11, 21.871292),  // Honey Graham Ohs\n  (2, 1, 16,   8,  36.1875
 59),  // Wheaties Honey Gold\n  (6, 2, 17,   1,  50.764999),  // Cheerios\n  (3, 2, 13,   7,  40.400208),  // Clusters\n  (3, 3, 13,   4,  45.811716)), numPartitions \u003d 2)\n  \ndrmData.collect(::, 0 until 4)\n\nval drmX \u003d drmData(::, 0 until 4)\nval y \u003d drmData.collect(::, 4)\nval drmXtX \u003d drmX.t %*% drmX\nval drmXty \u003d drmX.t %*% y\n\n\nval XtX \u003d drmXtX.collect\nval Xty \u003d drmXty.collect(::, 0)\nval beta \u003d solve(XtX, Xty)\n",
+      "dateUpdated": "Sep 28, 2016 1:45:09 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475016737629_-774084480",
+      "id": "20160927-165217_1266863511",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "\nimport org.apache.mahout.math._\n\nimport org.apache.mahout.math.scalabindings._\n\nimport org.apache.mahout.math.drm._\n\nimport org.apache.mahout.math.scalabindings.RLikeOps._\n\nimport org.apache.mahout.math.drm.RLikeDrmOps._\n\nimport org.apache.mahout.sparkbindings._\n\nsdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d org.apache.mahout.sparkbindings.SparkDistributedContext@32c46474\n\ndrmData: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9\n\n\n\n\n\n\n\n\n\n\n\n\nres2: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:2.0,1:2.0,2:10.5,3:10.0}\n 1 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:12.0}\n 2 \u003d\u003e\t{0:1.0,1:1.0,2:12.0,3:13.0}\n 3 \u003d\u003e\t{0:2.0,1:1.0,2:11.0,3:13.0}\n 4 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:11.0}\n 5 \u003d\u003e\t{0:2.0,1:1.0,2:16.0,3:8.0}\n 6 \u003d\u003e\t{0:6.0,1:2.0,2:17.0,3:1.0}\n 7 \u003d\u003e\t{0:3.0,1:2.0,2:13.0,3:7.0}\
 n 8 \u003d\u003e\t{0:3.0,1:3.0,2:13.0,3:4.0}\n}\n\ndrmX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true)\n\ny: org.apache.mahout.math.Vector \u003d {0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716}\n\ndrmXtX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpABAnyKey(OpAt(OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true)),OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true))\n\ndrmXty: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpAx(OpAt(OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true)),{0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716})\n\n\n\n\n\n\n\nXtX: org.apache.mahout.math.M
 atrix \u003d \n{\n 0 \u003d\u003e\t{0:69.0,1:40.0,2:291.0,3:137.0}\n 1 \u003d\u003e\t{0:40.0,1:32.0,2:207.0,3:128.0}\n 2 \u003d\u003e\t{0:291.0,1:207.0,2:1546.25,3:968.0}\n 3 \u003d\u003e\t{0:137.0,1:128.0,2:968.0,3:833.0}\n}\n\nXty: org.apache.mahout.math.Vector \u003d {0:821.6857190000001,1:549.744517,2:3978.7015894999995,3:2272.779989}\n\nbeta: org.apache.mahout.math.Vector \u003d {0:5.247349465378446,1:2.750794578467531,2:1.1527813010791554,3:0.10312017617608908}\n"
+      },
+      "dateCreated": "Sep 27, 2016 4:52:17 AM",
+      "dateStarted": "Sep 28, 2016 1:45:09 PM",
+      "dateFinished": "Sep 28, 2016 1:45:23 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Use Resource Pools with Zeppelin",
+      "text": "%md\n\n### Taking advantage of Zeppelin Resource Pools\n\nOne of the major motivations for integrating Apache Mahout with Apache Zeppelin was the many benefits that come from leveraging the resource pools.  A resource pool is a block of memory that can be acccessed by all interpreters and is useful for sharing small variables between the interpreters. \n\nThe Spark interpreter has a simple interface for accessing the ResourcePools, the Flink interface is less documented but can be reverse engineered from code (thanks open source!)\n\n\nCollect betas from Spark and Flink- compare in Python\n\nCreate Matrix in Flink and Spark - visualize with R",
+      "dateUpdated": "Sep 27, 2016 5:55:31 AM",
+      "config": {
+        "colWidth": 12.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "title": true,
+        "editorMode": "ace/mode/markdown",
+        "editorHide": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475016792277_-1100474141",
+      "id": "20160927-165312_1668894932",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003ch3\u003eTaking advantage of Zeppelin Resource Pools\u003c/h3\u003e\n\u003cp\u003eOne of the major motivations for integrating Apache Mahout with Apache Zeppelin was the many benefits that come from leveraging the resource pools.  A resource pool is a block of memory that can be acccessed by all interpreters and is useful for sharing small variables between the interpreters.\u003c/p\u003e\n\u003cp\u003eThe Spark interpreter has a simple interface for accessing the ResourcePools, the Flink interface is less documented but can be reverse engineered from code (thanks open source!)\u003c/p\u003e\n\u003cp\u003eCollect betas from Spark and Flink- compare in Python\u003c/p\u003e\n\u003cp\u003eCreate Matrix in Flink and Spark - visualize with R\u003c/p\u003e\n"
+      },
+      "dateCreated": "Sep 27, 2016 4:53:12 AM",
+      "dateStarted": "Sep 27, 2016 5:40:35 AM",
+      "dateFinished": "Sep 27, 2016 5:40:36 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Flink ResourcePools",
+      "text": "%flinkMahout\n\nimport org.apache.zeppelin.interpreter.InterpreterContext\n\nval resourcePool \u003d InterpreterContext.get().getResourcePool()\n\nresourcePool.put(\"flinkBeta\", beta.asFormatString)\n",
+      "dateUpdated": "Sep 28, 2016 1:42:35 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475019635571_-1705373112",
+      "id": "20160927-174035_1591078106",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "import org.apache.zeppelin.interpreter.InterpreterContext\nresourcePool: org.apache.zeppelin.resource.ResourcePool \u003d org.apache.zeppelin.resource.DistributedResourcePool@3fdd93cc\n"
+      },
+      "dateCreated": "Sep 27, 2016 5:40:35 AM",
+      "dateStarted": "Sep 28, 2016 1:42:35 PM",
+      "dateFinished": "Sep 28, 2016 1:42:36 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Spark ResourcePools",
+      "text": "%sparkMahout\n\n\n\n\nz.put(\"sparkBeta\", beta.asFormatString)",
+      "dateUpdated": "Sep 28, 2016 1:45:35 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475019751650_-1885234738",
+      "id": "20160927-174231_1288588876",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": ""
+      },
+      "dateCreated": "Sep 27, 2016 5:42:31 AM",
+      "dateStarted": "Sep 28, 2016 1:45:35 PM",
+      "dateFinished": "Sep 28, 2016 1:45:36 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Collect Results in Python and Evaluate Differences",
+      "text": "%spark.pyspark\n\nimport ast\n\nflinkBetaDict \u003d ast.literal_eval(z.get(\"flinkBeta\"))\nsparkBetaDict \u003d ast.literal_eval(z.get(\"sparkBeta\"))\n\nprint \"----------------- differences between betas calulated in Flink and Spark-----------------\"\nfor i in range(0,4):\n    print \"beta\", i, \": \" , flinkBetaDict[i] - sparkBetaDict[i]",
+      "dateUpdated": "Sep 28, 2016 1:45:37 PM",
+      "config": {
+        "colWidth": 12.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/python",
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475020470280_1661203311",
+      "id": "20160927-175430_1451783515",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "----------------- differences between betas calulated in Flink and Spark-----------------\nbeta 0 :  -5.24025267623e-14\nbeta 1 :  -2.44249065418e-14\nbeta 2 :  2.28705943073e-14\nbeta 3 :  -1.47104550763e-14\n"
+      },
+      "dateCreated": "Sep 27, 2016 5:54:30 AM",
+      "dateStarted": "Sep 28, 2016 1:45:38 PM",
+      "dateFinished": "Sep 28, 2016 1:45:38 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%md\n\n## Plotting Mahout with R\n\nThe following examples show how we can leverage R to plot our results from Mahout\n",
+      "dateUpdated": "Sep 28, 2016 12:34:33 PM",
+      "config": {
+        "colWidth": 12.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/markdown",
+        "editorHide": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475087633007_-566041383",
+      "id": "20160928-123353_147363530",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003ch2\u003ePlotting Mahout with R\u003c/h2\u003e\n\u003cp\u003eThe following examples show how we can leverage R to plot our results from Mahout\u003c/p\u003e\n"
+      },
+      "dateCreated": "Sep 28, 2016 12:33:53 PM",
+      "dateStarted": "Sep 28, 2016 12:34:30 PM",
+      "dateFinished": "Sep 28, 2016 12:34:30 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%flinkMahout\nval mxRnd \u003d Matrices.symmetricUniformView(5000, 2, 1234)\nval drmRand \u003d drmParallelize(mxRnd)\n\n\nval drmSin \u003d drmRand.mapBlock() {case (keys, block) \u003d\u003e  \n  val blockB \u003d block.like()\n  for (i \u003c- 0 until block.nrow) {\n    blockB(i, 0) \u003d block(i, 0) \n    blockB(i, 1) \u003d Math.sin((block(i, 0) * 8))\n  }\n  keys -\u003e blockB\n}\n\nresourcePool.put(\"flinkSinDrm\", drm.drmSampleToTSV(drmSin, 0.85))",
+      "dateUpdated": "Sep 28, 2016 1:52:44 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 284.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475020580886_2102494975",
+      "id": "20160927-175620_816809523",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "mxRnd: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:0.4586377101191827,1:0.07261898163580698}\n 1 \u003d\u003e\t{0:0.48977896201757654,1:0.2695201068510176}\n 2 \u003d\u003e\t{0:0.33215452109376786,1:0.2148377346657124}\n 3 \u003d\u003e\t{0:0.4497098649240723,1:0.4331127334380502}\n 4 \u003d\u003e\t{0:-0.03782634247193647,1:-0.32353833540588983}\n 5 \u003d\u003e\t{0:0.15137106418749705,1:0.422446220403861}\n 6 \u003d\u003e\t{0:0.2714115385692545,1:-0.4495233989067956}\n 7 \u003d\u003e\t{0:0.02468155133492185,1:0.49474128114887833}\n 8 \u003d\u003e\t{0:-0.2269662536373416,1:-0.14808249195411455}\n 9 \u003d\u003e\t{0:0.050870692759856756,1:-0.4797329808849356}\n... }\ndrmRand: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@72c5b7be\ndrmSin: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@72c5b7be,\u003cfunction1\u003e,-1,-
 1,true)\n(2,5000)\n"
+      },
+      "dateCreated": "Sep 27, 2016 5:56:20 AM",
+      "dateStarted": "Sep 28, 2016 1:42:42 PM",
+      "dateFinished": "Sep 28, 2016 1:42:52 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%sparkMahout\nval mxRnd \u003d Matrices.symmetricUniformView(5000, 2, 1234)\nval drmRand \u003d drmParallelize(mxRnd)\n\n\nval drmSin \u003d drmRand.mapBlock() {case (keys, block) \u003d\u003e  \n  val blockB \u003d block.like()\n  for (i \u003c- 0 until block.nrow) {\n    blockB(i, 0) \u003d block(i, 0) \n    blockB(i, 1) \u003d Math.sin((block(i, 0) * 8))\n  }\n  keys -\u003e blockB\n}\n\nz.put(\"sparkSinDrm\", org.apache.mahout.math.drm.drmSampleToTSV(drmSin, 0.85))\n",
+      "dateUpdated": "Sep 27, 2016 6:38:39 AM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475021390512_-2030189316",
+      "id": "20160927-180950_1754833838",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "\n\n\n\n\n\n\n\n\n\n\n\n\nmxRnd: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:0.4586377101191827,1:0.07261898163580698}\n 1 \u003d\u003e\t{0:0.48977896201757654,1:0.2695201068510176}\n 2 \u003d\u003e\t{0:0.33215452109376786,1:0.2148377346657124}\n 3 \u003d\u003e\t{0:0.4497098649240723,1:0.4331127334380502}\n 4 \u003d\u003e\t{0:-0.03782634247193647,1:-0.32353833540588983}\n 5 \u003d\u003e\t{0:0.15137106418749705,1:0.422446220403861}\n 6 \u003d\u003e\t{0:0.2714115385692545,1:-0.4495233989067956}\n 7 \u003d\u003e\t{0:0.02468155133492185,1:0.49474128114887833}\n 8 \u003d\u003e\t{0:-0.2269662536373416,1:-0.14808249195411455}\n 9 \u003d\u003e\t{0:0.050870692759856756,1:-0.4797329808849356}\n... }\n\ndrmRand: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@1d6a6ecf\n\ndrmSin: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@1d6a6
 ecf,\u003cfunction1\u003e,-1,-1,true)\n"
+      },
+      "dateCreated": "Sep 27, 2016 6:09:50 AM",
+      "dateStarted": "Sep 27, 2016 6:38:39 AM",
+      "dateFinished": "Sep 27, 2016 6:38:40 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%spark.r {\"imageWidth\": \"400px\"}\n\nlibrary(\"ggplot2\")\n\nflinkSinStr \u003d z.get(\"flinkSinDrm\")\nsparkSinStr \u003d z.get(\"sparkSinDrm\")\n\nflinkData \u003c- read.table(text\u003d flinkSinStr, sep\u003d\"\\t\", header\u003dFALSE)\nsparkData \u003c- read.table(text\u003d sparkSinStr, sep\u003d\"\\t\", header\u003dFALSE)\n\nplot(flinkData,  col\u003d\"red\")\n# Graph trucks with red dashed line and square points\npoints(sparkData, col\u003d\"blue\")\n\n# Create a title with a red, bold/italic font\ntitle(main\u003d\"Sampled Mahout Sin Graph in R\", col.main\u003d\"black\", font.main\u003d4)\n\nlegend(\"bottomright\", c(\"Apache Flink\", \"Apache Spark\"), col\u003d c(\"red\", \"blue\"), pch\u003d c(22, 22)) \n\n",
+      "dateUpdated": "Sep 28, 2016 1:52:26 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/r"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475021654999_1062405375",
+      "id": "20160927-181414_1420533932",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAIAAAApSmgoAAAACXBIWXMAAAsSAAALEgHS3X78AAAgAElEQVR4nOzdeVzP9wMH8Nf32yWVTrocRblCMYyJ3JJE5JpjrplrZnMzc5v9xmy2sa25bZght6LccuScEnKVSiqlEqX6/P74tCILUd9332+v58Mffb7yeb++n/Tq3fvz+X6+CkmSQEREmkspOgAREZUsFj0RkYZj0RMRaTgWPRGRhmPRExFpOBY9EZGGY9ETEWk4Fj0RkYZj0RMRaTgWPRGRhmPRExFpOBY9EZGGY9ETEWk4Fj0RkYZj0RMRaTgWPRGRhmPRExFpOBY9EZGGY9ETEWk4Fj0RkYZj0RMRaTgWPRGRhmPRExFpOBa9xnr8+PHcuXNdXFwMDQ0tLCzatGkTEBCggnFtbGwUCkVkZOQbfn5aWppSqdTX18/Kynr+cUmSKlWqpFAoFArF33//LT+Ynp5uZmYmP7hz587Xxrh79+7bPYsiecWhliTJyspKoVBERUUVaZ+pqalz5851dnYuX758pUqVOnbseOjQoeKN/SaH6O3ye3h4KF5UuXLlVatWvXNkelsSaaInT540bNhQ/hKbm5vLH2hra1+5cqVEx42OjgZQsWLFnJycN/wnJ0+eBNC8efMCj8sFpFQqAaxbt05+8JdfflEoFPLTiY6OfnUMc3PzN4/xWrVq1QLwzz//FHj81Yc6Li7OycnJ1dW1SEmuXbtWrVo1eVeWlpba2tryoQgICCiup/OGh+gt8ufk5FSsWBGAg4ODk5OTg4OD/ES0tLTu3LlTHNmpyDij10yLFy++cOGCp6fnvXv3EhISYmJiHB0ds7Ky5FYtOSEhIQAaN26cV8evdfHiRfmf/OeunJycADx9+hSAJEnLli2rV68eAGtraxsbm
 1fHaNSo0ZvHeLWHDx9eu3bNyMioTp06Bf7q1Ye6UqVKV65cOXbs2Jsnefr0qYeHx927d0eOHBkdHX3//v24uDh3d/ecnJxffvmlWJ4O3vgQvUX+qKio+Ph4hUJx8eLFK1eu3Lhx4+7du3p6etnZ2REREcUQnYqORa+ZgoKCALRs2dLW1haAtbX1r7/+unr16nbt2gFISEgYNWpU1apV9fT0rK2tJ06cmJOTA2DUqFEKhWLevHkDBw40Nzdv1qzZnTt3pk+fbmdnZ2JiMm/ePHnngwcPVigUX331VZcuXYyNjRs0aHDq1Cn5r/KKHsCTJ0/mzJnToEEDAwOD+vXrb9myJS/emjVrWrRoYWJi0r9//7Nnz6Lwon///fflXQEIDAwMCwtr2rRp3ucX9kTyfkh89tlntra2VlZWa9asydvz4cOHvb29ra2tK1as2KtXr7xVpuHDhysUip9++kne9PHxUSgUf/75p7+/vzxVT01Nlef1b36oFyxYoFAoJk+eDGDSpEkKhWL69OkjRoywsrIqkCrP0qVLb968OWjQoOXLl8s/zMzMzJYuXTpjxowOHTrk7WfevHnTp093cXGRJKmw4/Dar1RhhyjPW+SX9+zg4GBgYCA/Iq+2KZVK+Yc0CSD6VwoqEV5eXgCUSqWrq+vMmTN37NiRmpoq/1VOTk7Lli0BODs7d+vWTV4WCAoKkiTpvffeA2BqatqhQ4fy5csDKFeunJ2dndy2AJKSkiRJkme1BgYGQ4YMcXZ2BmBnZ5ednS1JUufOnQHs2LEjJyenbdu2AJo0adK1a1d5Bebs2bOSJM2dOzdvFG1tbXmqGBoaWuApyKXm6+sL4JtvvpEkydPT09HR8fPPPwcwZ86cVzwROYaRkZG7u7u8BqKvr//s2TNJklasWKGlpWVoaNi5c+cKFSrICeUR5RoKCQmRN+Xivn79enh4uIeHBwAfH5/AwMA3P9SSJHXr1g3AX3/9JUmSm5sbgAoVKn
 h4eBRIlScjI8PQ0FChUNy4caOwL668H/l3nS5durziOLz2K/Wfh+h5Rc0vSdK0adPkYyVvJicnT5o0CcDYsWMLe0ZU0lj0mikyMnLkyJF5Uyr5+3Pv3r2SJEVHR3fq1Gn48OHZ2dlpaWlynYWEhDx9+lRHRwfA/v37JUkaM2YMgKZNm2ZnZycmJso7SUtLS05Olqt59+7dkiQ9ePBA3oyMjMxbnI2OjpbnesOGDXvw4EF8fHy/fv0ALFq0KDw8XKlUWlpaysu1CxYskJsoKyvr+fw5OTmmpqYALl++DGD27Nk3btxQKBRLly6V62bPnj2FPZG8GIsWLZIk6fz58wC0tbWzsrIiIyN1dXVNTU3Dw8MlSfrnn3/k5xUfH5+amqpUKsuVK5eZmSlJknzu0cTERF6blmvRz8+vSIdakiR5Sn779u2srCxDQ0MAy5cvL5Dq+b1duHABgKOjY94jNWrUyNvzH3/8kbefUaNG3bt37/Hjx4Udhzf5Sr18iAo8u6Lml/79CV3A/PnzX/5MUhkWvSZ7/PhxcHDw/Pnzq1SpIs/4JEnKyck5derUuHHjWrRoIU/b9fT0MjIyTp8+DaB27dpytXl7ewNYv369JEly28rtExgYKP8AkIfIycmROy4xMVE+fWptbS1JUqtWrV7+bl+9evXYsWPzZuiSJMmX07Rs2bJA8ps3bwKoVKnSo0ePAEydOnXcuHH6+vqJiYlGRkYA7t+/X9gTkWNUqFAhLS1NkiT5eTVs2FCSpBkzZsg/NuRRsrOzdXV1lUplenq6fE2Lq6ur/FfyQlP79u3l52hhYYFXnv79z0Mtn/C0sLDIyckJDQ0FYGVllZGRUSDV81avXp03riRJqampTk5OTk5Oenp6AMLDw/P2k9ebhR2H136l/vMQPe8t8uf9hK5Vq5azs7OTk5Ouri4AT0/Pwg4dqQDX6DXQihUrFi1aFBkZWb58+WbNms2YMWPRokUA5BaYOXNms2bNTp4
 86eXlNXPmTACNGjXS1dWV18qbN28uz/vOnDkD4IMPPsj7WF4clz+W1wEAhIaGPn782MbGxszMLG+BPjs7+9y5cwD8/f0PPKdr164FTr0+v6b/vLzHtbS0ADx48GD16tX9+/eXp95VqlSxtLQs7InI/7ZZs2Zyr8mbcvhLly49P9zly5czMzNr166tr68vN5f8afh35b1JkyYA7t69m5CQYGNj8/Lp31cfavmQNmnSRKFQyB+3atVKLr7nUz1P/qXqxo0b2dnZAAwNDa9cubJp06asrCwjIyNHR0d5P61bt5aPzCu+oK/9Sv3nIXreW+S/fft2UlKS/PnyydjDhw8DCAwMlE8bkBDaogNQ8Vu2bFl4eHhCQsLs2bMNDQ3j4+PXr18PwN3dPTY2dsGCBZUqVQoODtbS0pLXl+VvV/k7WV6Oj4mJiY6OtrCwsLe3x4tFLxfi1atXATx79kw+TTdq1Cg8185ZWVkZGRkAKlWq5OLicunSpRUrVjg4OLRv3z49PR1AeHh427Ztr1+/Ll9G8tqi37x58+PHj0eNGpX3+CueSIEOer7BU1JSAFy6dKlLly5Pnz794osvAIwfPx6AvGYiF3RUVJQ8s5aLvrDTxa8+1HiuKPM+/s9Uz5NHuXv37sSJE7/55hsdHZ0TJ04MGTIkOzu7UaNGSqWywH5ecRxe+5V6bZi3yC/vuU6dOvIvXgCSk5MB1KxZUz5PQ2KI/pWCit+cOXPkL65SqbSxsZG7skmTJmlpafL3IYDOnTtXr15d/li+Sr1u3boAzp8/L0nS9u3bAXh4eMg7dHFxARAcHCz9u2hbrly5pk2b1qxZE4CLi4u8AiAvzu7Zs0eSpK5duwIwNTX18PAwNDQsX7788ePHJUmSW1VXV9fd3V0+Fwrg2rVrBZ5CmzZtAOzcuTMzM1P+nGbNmuX98wULFrziicgxdu7cKe+qdu3a+Pf6d3m6rVQq27VrJ59O9Pb2ltcievfuDcDAwMDL
 y6tq1aryDqOioiRJmj17NgBHR0f5qb3hoZYkqWPHjgB27dolSZLciUePHn05VQGjR4+W96mnp2dsbAygfv36SqXyiy++yNvPsWPH5E9+xXF47VfqPw/R894iv3ze9aOPPsp7ZP78+QB69er18jMllWHRa6Bnz56tWLHCxcWlQoUKFhYWLVu2XLRokXx1RE5OzuTJk21sbKpVqzZnzhxXV1cAs2bNSklJUSgUeaci5Qsn5LXsx48fa2lpaWtrP3ny5N69ewAqV668bt26ypUr29nZjRkzRu6OvMXZ+/fvS5IUHx/fv39/MzMzU1NTLy+vixcvytkePnzYvXt3AwODOnXqLF26FECFChXk60DyZGdnyz8DoqOj5RWMvPKSA/v7+xf2RPJixMbGSpIkTyfzTvY+e/ZsxowZVapUMTIyatmy5ZIlS/KGvnz5snwlaMuWLeUzB1ZWVvLpipCQEEdHR0NDw40bNxbpUJuZmckHJCMjQz4ZIB+rAqkKyMrK+umnnxo2bGhgYFC7du3x48fLn//HH38U2M8rvqBv8pX6z0OU5+3yyz+hf/rpp7xHhg8fDqBdu3Zv8D+XSopCkqRC5vpEBW3fvr1Hjx7e3t7btm0TnYVehV8peh5XzagI5MX6/1ytplKFXyl6HoueioD1oS74laLncemGiEjDcUZPRKThWPRERBqORU9EpOFY9EREGo5FT0Sk4Vj0REQajkVPRKThWPRERBqORU9EpOFY9EREGo5FT0Sk4Vj0REQajkVPRKThWPRERBqORU9EpOFY9EREGo5FT0Sk4Vj0REQajkVPRKThtEUHKJqEhIRDhw6JTkFEVMyUSqWXl5eOjk5J7FzNij4oKGjHjh1ubm6igxARFad169a5uLjUqFGjJHauZkUPoEWLFiNGjBCdgoioOJ05c6bkds41eiIiDceiJyLScCx6IiINp9KilyQpJSUlJydHlYMSEZVxqij69PT0hQsX1qxZs1y5csbGx
 rq6uo6OjnPmzMnIyFDB6EREZZwqin706NGHDh3y9fWNiYnJzMyMi4tbvXr1uXPnRo8erYLRiYjKOFVcXunn5xcWFmZjYyNvmpubu7q6Ojs729vbr1y5UgUBiIjKMlXM6O3t7fft21fgwf3791etWlUFoxMRlXGqmNH7+vr6+PgsXry4fv36RkZGaWlpoaGhSUlJO3fuVMHoRPSGUlMRc+OxfeplXSsz1KolOg4VG1UUfePGjSMiIo4cOXLnzp2EhARTU9MRI0a4ublpa6vf63KJNEx8PLZtQ1oawsNx60yCw4OTodrOo2v4f2g0EZs2wcAgNRU3b6JyZVhYiM5Kb0tFVautrd2uXbvnH4mOjr5w4YKnp6dqAhDRy65cwSefYNQo3LqFY0dyxuesGXl7bJZ2ue7dRzTpUsNxzpxVtf+3Zg0aN8a1a3B0xNKlUChEh6aiEzanDg4OHjx4cFpaWmGfcODAgb///rvAg1euXKnF3yiJ3s0/f1y+8PfNapWefHer+6ZN5atUwYgR2DHn4rDJvQajXDltfPghDqe1zTm23i8chw9DqQSAOXPw55/o3190eio6YUXv4+Pj4+Pzik9o3LixmZlZgQeXLFmSmppakrmINNzUjuejI5607V13T4TOiSNZlreCUaW5oSHS9UwbmtyOiKhWrx5SU1FBN+N4eqM+fXJbHsCgQZg3j0WvlkrvKrmpqel7771X4EFLS8vY2FgheYg0wLnTWXGX7q+PdZf7e1/d7CUfh0+73rxvX8yaZ5cc/dgu4uBdo/Yb1mb72Y4P6jj0QXL+v01OhrGxsOT0LnivG6Iy5Fxgcse69/Jm6XPmay272+3YMZQrBygU0RXqeo2z+6zxieWKMeYfdmo/venGjbh+HQAePsSMGRgwQGR4emuqmNGHh4cX9le1a9dWQQAiklWuZ3LxNyAnR+56C92UrpVO79vX+fFjjBqFzp2VgAPgALQAYAqsWoWZMxEXB319TJqEl3
 7HJvWgiqIfPHjw6dOny5cvb2pqWuCv7t27p4IARCRr7679rW6Xum1+aDetadhVxfQ5FTb8XtGu8JNlNWti82YV5qOSoYqiDw4OHjZsWPny5X/66ScVDEdEhdHVxY4Q2+8n9lr12WM7i7T1u0zsWlZ+lx3Gnr23cvK1+Idarm10fL77QKHk1ZelkSqKXqFQ9O/f/8KFCyoYi4herUIFfPXbO5V7noh9Nwb1yZgxxbyKU4XtP94bXufEymuuxbJnKl4quuqmXbt2BV4wRUTq7ptx0b/8Yd+gazUADbpX/6jG8XD/u7U7VROdiwriVTdE9JZuJ1Zw6px/a0LnOpk3jsQIzEOFYdET0VuqbZNyZu3V3I1Fi4IPpDkd/zW7ZWscOSI0FxVUel8wRURvITYWCxYgLAy2tpgyBfXqleBY09fV7tk6ccSxI5WfRmwPsI+q2GhQjpee8plRz9PfBzy0a1Twle0kCmf0RJojLQ29e6NvXwQGYuZMjB2LGzdKcDibRlYB1+2ylTpnjz3Ner9534+Njlt0D9T3XGiwYEj7KOlxegmOTUXBoifSHP7+8PGBqysUCtSsiXnzsGZNyY5oZGUwfNUH09ufiUix/OxUP8yeDX//up93cqiScXPMdyU7Nr0xFj2R5njwANbW+Zu2trh/XyUD9+iBW7egrw8XFzx4gK1btRo5Z1+9rpKx6fVY9ESao1kzPP++bX5+aNFCJQN369ayXtKqA1XQvj0GDLg98eewm3qO+nzde2nBk7FEmqNhQ9Spg27d0LIlQkORnV3iSzd5Zuz5YLxj0obkeQZWRlkr4Nt9jzLKWUVj0+uw6Ik0yowZiIrCpUvw8EDduqobV1cXy0+6ZI0dmpGaaZCdgms18f33yclQKlGhgupi0H9i0RNpmipVUKWKiIFtbbW3b9HOzIS2dnSs8uOe0NXNvVGmry8qVhQRiQCw6ImomOnqAhg9GgsWoGFDADh5EuPGYeNGwbnKMp6MJaJ
 i9vQpMjNzWx7ABx8gPh7Z2UIzlW0seiIqZlpaBWv933c6ITF47ImomOnowNISu3fnbm7ejJo1oeCd6sVh0RNR8fvpJ+zciTZt4OaGEyewZInoQGUbT8YSqaVz57BqFR4/RseO6Nev1M2XjY3x22//bqSn4/vvcfw4zM0xdizef19ksjKJM3oi9XPwIGbOxIgRmDsX167h889FB3oFSUK/fqhaFdu2Yc4czJqF48dFZypzWPRE6mfxYmzaBGdnVK2KOXNw7RoePRKdqTBXr8LSEgMGoFw5VK+O1auxbJnoTGUOi55I/WRkvPByU0dHREaKS/NqsbGo9tybC1paIjFRXJoyikVPpH4sLBARkftxVhbOnUPNmkIDvUKDBjh0CDk5uZsHD8KZ98BRNZ6MJVI/X3+NQYMwYABMTPDnn/jkE+jpic5UmIoV0a8fPDzQpQtiYnDmDLZtE52pzOGMnkj9ODjA3x9mZkhLww8/YNAg0YFebdgw/P47bG3RuTMOHICxsehAZQ5n9ERqIyUFv/+O27dRvz4GD0bfvqIDvbnKlVG5sugQZRdn9ETqITkZHh6wscHIkcjOhpcXsrJEZ3orly7hyy8xfTpCQkRHKTM4oydSD7//jnHj0Ls3ADg5ITkZu3eje3fRsYpo61asWYPJk6GlhUWL4OVV6tedNAKLnkg93LwJT8/8TWdnhIaKS/O2fvgBAQEoVw4AmjRB69YselXg0g2RenByQnBw/uaJE6hXT1yat5KdDV3d3JYHoKMDCwukpAjNVDZwRk+kHoYNg6cnkpLQoAGOHUNEBObPF52piLS0kJWFtDQYGgLA06dISOAbDaoCZ/RE6kFfH/v3w8YGp06haVNs2lTqbmT2JqZOhbc3du/Gvn3o2RNffCE6UNnAGT2R2tDRUatLKv+LuzscHbFtGyQJS5agdm3RgcoGFj0RqVSNGpg0SXSIMoZLN0REGo5FT1SKJSZixIjcN2r67jtIkuhApJZY
 9ESl2EcfoW9fHDqEoCAkJeH770UHIrXEoicqre7fh5ER2rYFAC0tzJ2LXbtEZyK1xKInKq3yLjiXKRRcuqG3w6InKq1q1MDVq3jwIHfT3x9OTkIDkbri5ZVEpZVCgWXL0LMn6tRBUhKysrBunehMpJZY9ESl0aVLWL8ejx838pxytEvtmzA0hJWV6FCkrrh0Q1TqBARg6lT07o1PP4V/gGLOHw5seXoXLHqiUufbb/HXX2jaFHXrYtkyHDqEp09FZyJ1xqInKnWysmBklL9ZsyaiosSlIfXHoicqdQwMEB2d+3FWFq5cgb290ECk5ngylqjUWbAAvXvjk09gaIg1azByJLT5nUrvgDN6olLH2Rk7diAjAzEx+N//+GZ79K44TyAqjSws8PHHokOQpuCMnohIw7HoiYg0HIueiEjDseiJiDQci56ISMOx6ImINByLnohIw7HoiYg0HIueiEjDseiJiDSc5hZ9WBiGDEG7dpgwIf9dN4mIyh4NLfqICIwciYkTERAAT0/4+ODxY9GZiIjE0NCiX7UKCxbAyQlaWmjTBt7e8PcXnYmISAwNLfr791G5cv5m5cq4f19cGiIikTS06Js1w65d+Zu7dqFZM3FpiIhE0tD70Q8bhv79ERqKunVx5AhcXNCokehMRERiaGjRa2lh0yZcvIg7d7B4MapXFx2IiEgYDS16mYsLXFxEhyAiEkxD1+iJiOhfLHoiKvV27YKnJzp0wKxZfE3MW2DRE1Hptm0bNm7E+vXw90fduhg4UHQg9cOiJ6LSzdcXvr4wNYVSiT59YGiIO3dEZ1IzLHoiKt2ePoWBQf6mtTXvXlVUAoo+Pj4+OTlZ9eMSlSKxsbh1Czk5onOogzp1cORI7scZGThxAvXqCQ2kflRR9O7u7nFxcQCio6NbtGhhZWVVqVKl9u3bx8bGqmB02d9/o3VrtG6NLl1w/rzKhiV6SXIyvLzw2WdYuBBubrh8WXSgUm/BAsydi/HjM
 X8+OnbElCkoX150JjWjiuvo/f39nzx5AmDChAnVq1cPCAjQ0dGZNm3a2LFjt27dqoIAx49j82bs2wd9fcTEoE8fbNuGihVVMDLRSyZNwvjxaNsWAGJi0Lcvjh4Vnal0MzXFgQO4cAFJSRg7FiYmogOpH5W+YOrs2bN79+41MDAAMG3aNAcHB9WMu2ULvvoK+lI6/vSzSUgY2Nr74MEq/fqpZnCiF0VE5LY8ABsb2NsjMhJVqwrNVOoplXjvPQCxsQgOgrExWrWCjo7oVOpDRWv0MTExWVlZTk5Od/49XR4aGmppaama0Z88Qbm0BHTogMREVKlSLmjv0793q2ZoooIUCkhS/mZa2gtnGqlwmzdj0CDcu4djx9C2LeLiRAdSH6qY0bdq1apv374PHjzQ19ePjIzs1KnT0aNHu3fv/s0336hgdACdO2PFqMvfLf8WH3yQmYk/f8UvycNwz+WFWxkTqUbHjliwANOnQ6mEvz8kCebmojOpgfR0/PgjDh3Knch7eGDaNKxaJTqWmlBF0R85cgRAZmZmZGRkfHw8AH19/V27drm6uqpgdADe3rgyMbLV1MH29rh+HZMnw+56TVy5wqInASZPxrffok0baGmhVi2sXCk6kHoIC0Pz5vnLNU2bYsoUoYHUiurW6HV1dR0cHOR1+SZNmkRHR+/evdvT01M1o89sETRlqmuckYOtLZRK4KMwdO+umqGJXqBUYsoUtlRR2dggMjJ/MyUF+vri0qgbYXevDA4OHjx4cFpaWmGfcPz48d27C66kHz9+3MLC4m3GmzxZ95MhVRYuvB9d5cAPYcqoZh3NavG6G1IpScKBA7h5Ew0aoEUL0WnUjI0NtLXxyy8YNAjx8fjsM3z6qehM6kMhPX9eqDSJjY0NDQ0t8OCKFSsAvOVFmbduHfoycM6hVgM9EnPeb75+g+Lrr/ntRqqSlYWePVGvHho0wMmTSEnB6tWiM6mZzEz8/DMCA2FsjE8+QatWog
 MVq+HDh0+bNq1GjRolsXOVzuglSUpNTTU0NFQqX3+1j7W1tbW1dYEH9+zZ8/Yvs6pefda96rvCYWwMAD194OODoKC33BlR0axdi3btMG4cAPTpgylT4O+PTp1Ex1Inurr4/HN8/rnoHGpIFZdXpqenL1y4sGbNmuXKlTM2NtbV1XV0dJwzZ05GRoYKRn8uBoyMclsegJkZtLXx7JkqI1AZdukS2rTJ32zbFhcuiEtDZYsqin706NGHDh3y9fWNiYnJzMyMi4tbvXr1uXPnRo8erYLR85Qvj0ePkJMD3LuHWbOyx4x7Ehmvo8WbjZBKVK2K69fzN69dQ7Vq4tJQ2aKKpRs/P7+wsDAbGxt509zc3NXV1dnZ2d7efqVqry3r3Rsj+z2aemN8zrjx8y/XH1TnBIZsxtq1qsxAZdSQIejaFeXLw8UFx49j2zbs2yc6E5UVqpjR29vb73vp//T+/furqvxl3+PGoVvSmgV2vouOu344yvjj7R5QKHD1qopjUFlkbo4dOxAcjIkTERGBXbt4eSCpjCpm9L6+vj4+PosXL65fv76RkVFaWlpoaGhSUtLOnTtVMHoBXXJ2ddkyFlr/bjdogIgI1Kmj+iRU5lSsiLlzRYegskgVRd+4ceOIiIgjR47cuXMnISHB1NR0xIgRbm5u2toiruKvXRunT+ODD3I3T5yAt7eAGEREqqKiqtXW1m7Xrp1qxnqNGTPQsycGD0blyvDzQ+3asLcXnYmIqASVvbcStLZGQAB0dXHlCoYMwYIFogMREZUsYbdAEMnQEIMHiw5BRKQiZW9GT0RUxrDoiYg0HIueiEjDseiJiDQci56ISMOx6ImINByLnohIw7HoiYg0HIueiEjDseiJiDQci56ISMOx6ImINByLnohIw7HoiYg0XJm8TTERaaKkJAQFAUDbtjA1FZ2mNOGMnqiYRUVhzx5cuSI6Rxlz6hS8vBATg5gYdO2KU6dEBypNOKMnKk5ff43gYLR
 siW3b8PQp1q2Dltbr/xW9u+nTsX07LCwAoF8/9O6dO7snsOiJitGlS/jnH+zcmbu5bBl+/x2ffCI0U9mQkQEdndyWB2BhAT09PH2KcuWExio1uOPYVMsAACAASURBVHRDVGxOnczpanQYgwZh/HiEhXXvjpMnRWcqG/T0kJ6OnJzczZwcpKWx5fOx6ImKjeWWn2JjJCxYgP79MXZs9IEwKyvRmcoMb298+inu38f9+xg3Dt7eogOVJly6ISomd+92MDvnHjeu8W20bFklYt6mad3jfz0uOlWZ8cUX2LYN48cDQJ8+LPoXsOiJisnduwZOdlt+wtdfY/Zs2NhUWmY3rVatlaJjlSE9eqBHD9EhSiUWPVExcXLC3LlWs6UfflAAwLlzWC46EhEAFj1RsTE3h5cXevWCjw/i4vDXX9iyRXQmIoBFT1Scxo1Dhw44ehS2tjh4EPr6ogMRASz6l+XkYMMGBAbCyAjDh8PFRXQgUi916qBOHdEhiF7AyysLGjMGkZGYNw/DhmHyZBw5IjoQEdG74Yz+BQkJiI7GihUAULUqNm/GgAFwcxMdi4joHXBG/4K7d1GzZv6mqSnS08WlISIqDiz6F9SujTNnkJ2du3n1KvjKRiJSd1y6eYGBAQYNgrc3+vZFYiI2bsSff4rORET0blj0BQ0fDjc3HD4MS0scOAADA9GBiIjeDYv+Pzg6wtFRdAgiomLCNXoiIg3Hoici0nAseiIiDceiJyLScDwZ+xrBwfjnH9SogbZtoVCITkNEVHQs+lcZMQIpKdDVhZ8fFi/Gzp3Q0RGdiYioiLh0U6jAQNy+jWfP0KMH+vTBtWtYsEB0JiKiouOMvlAhIYiOxv790NICgGrVMGQIZs8WnIqIqKg4oy+Uri7MzHJbHkBqKpQ8WkSkhlhdhRo0CKGh2LoVcXE4cADz56NaNdGZiIiKjks3hTI3x/Dh+O47+PrC0hJ6epg1S3QmIqKiY9G/yrffYvdu7NsH
 IyNMncp3iCMitcSifw1PT3h6ig5BRPQOuEZPRKThWPRERBqORU9EpOFY9G9q50706oVu3fDbb/lvKktEVPqx6N/I6tXw88PPP2PDBiQkYOJE0YGIiN4Yr7p5I+vWISAg945m06ejfXtkZEBPT3QsIqI3wBn9m3r+vpXW1oiPFxeFiKgoWPRvxNgYN2/mfpyWhps3YWsrNBAR0Rvj0s0b+fZbDBqELl2grw8/P8ybxzchISK1waJ/I46OOHgQR4/iyRNs3w4zM9GBiIjeGIv+Tenro1Mn0SGIiIqOa/RERBqORU9EpOFY9EREGo5FT0Sk4Vj0REQajkVPRKThWPRERBqORU9EpOFY9EREGk6lRS9JUkpKSk5OjioHJSIq4/6j6JOSkiRJytvMzs5OSEh4lzHS09MXLlxYs2bNcuXKGRsb6+rqOjo6zpkzJyMj4112S0REb+KFog8NDXVycjI3N3dwcNi9e7f8YFRUVMWKFd9ljNGjRx86dMjX1zcmJiYzMzMuLm716tXnzp0bPXr0u+yWiIjexAtF/8knn/Ts2fPp06erV68eOXJkSEhIsYzh5+e3du1aNzc3c3NzHR0dc3NzV1fXP/74Y8eOHcWyfyIieoUXiv7ChQsTJ07U1dVt1arVzz//PHLkyOzieBtse3v7ffv2FXhw//79VatWffedExHRq71wm2JHR8eAgAAfHx8AXl5ea9as+eqrrz7++ON3HMPX19fHx2fx4sX169c3MjJKS0sLDQ1NSkrauXPnO+6ZiIhe64Wi//bbb3v06LFkyZIdO3ZUqlTJ19e3Y8eOe/fufccxGjduHBERceTIkTt37iQkJJiamo4YMcLNzU1bm3fDJyIqcS9UbYcOHa5fv3706FF9fX0AFhYWwcHBfn5+58+ff9dhtLXbtWv3/CPR0dEXLlzw9PR8xz0TEdGrvVD0n332WZ8+fXr16qVU5q7d6+np9enTp0+fPsU+cHBw8ODBg9PS0gr7h
 JCQkMDAwJcfNDY2LvYwREQa7IWiT0tL8/Ly0tfX79WrV+/evd9//31Fib0Hto+Pj3wyoDBmZmbVq1cv8KCxsTEXfIiIiuSF0ly5cuWvv/56/Pjxbdu29e7dW6FQ9O7du3fv3o0bNy6WxpckKTU11dDQMO83hleoXr36y0V/8uTJ2NjYd09C9HrBwVi6FImJaNwYU6fC1FR0IKK3VLBwtbW1W7duvWzZsrt3727dulVHR6dHjx4vF26R8JWxpH7OnMHs2ViyBAcOoHVr9OqFrCzRmYjeUqEz6wcPHpw9ezY4ODgxMbFRo0bvMgZfGUvq55df8NNPqFIFSiU6d0bjxjh9WnQmKjEPH2LpUkydih078NwNYDRGwaKPj4//9ddf27VrV7VqVT8/v48++ig2Nnbr1q3vMgZfGUvq58ED2Njkb9raIi5OXBoqSffuoUsX2Nige3ecO4fhw0UHKn4vFH2HDh1sbGzWrVvn7e0dGRnp7+8/ePDgd7/Kha+MJfXTvDnyXtAnSdi3D02aCA1EJeZ//8N336FPHzRrhrlzAeDyZdGZitkLJ2PbtWvn6+trZ2dXvGPwlbGkfiZMQK9eOHECdnY4eBA9eqBKFdGZqGTcuIGGDfM333sP166hQQNxgYrfC0U/derUkhiDr4wl9VOuHHbtwvnziI3FgAGwshIdiEpMrVoICYGra+7mmTOYOFFooOKnoqp9+ZWxRGrg3S5DIPUwZQp69MDo0ahRAzt2oFw51KsnOlMx41sJElHZZm2N/fuRkoJ9++Dmhl9+ER2o+HHxhIjKPGNjjBkjOkQJ4oyeiEjDcUZPRJTr5k3s3AmFAl27okYN0WmKD2f0REQAsGcPRo6EvT3s7TFqFPbsER2o+HBGT0QEAIsWYf9+GBgAQIcO6NQJXbqIzlRMWPTF6vFjbNiAqCi89x66d0eJ3eSZSoqvLzZuBID69TFnDkxMRAciFcnIQPnyuS0PoHx5GBriyRPo6wuNVU
 y4dFN8Hj5Ex47Q0UHnzrh8GR9+qJF3R9Jkv/2G0FDs34+gIHTqhEGDRAci1dHTQ3o6MjNzN589Q2qqhrQ8WPTF6ccfMXUqhg5FixaYNQtWVjh+XHQmKoq//sLixdDVBQAPD1SogOho0ZlIdUaORL9+OH0ap0+jXz+MGiU6UPHh0k3xCQ/HJ5/kbzZtiqtX0bKluEBURNnZeP62HKamSEqCra24QKRS/fvD0RHyvXonT0bTpqIDFR8WffGpWRPnz8PDI3fz3Dl4eQkNREVUpw4OHkT79gCQnIxz51C7tuhMpFJNm2pUv+dh0RefcePQtSsePkStWjh4EJGRnM6rma+/Rv/+WLcOpqYICcG334L33SONwP/HxcfcHPv3Y+1a/PUXmjTBlCm86kbNGBtj927cvo2UFCxeDB0d0YGIigeLvlhVqIBPPxUdgt6Nvb3oBETFjFfdEBFpOBY9EZGGY9ETEWk4Fj0RkYbjyVgq8+LjsXQprl5F3boYPx4VK4oORFTMOKOnsu3RI3h7o3VrrFwJNzd0747kZNGZiIoZi57Kts2b8fHH6NgRZmbo2BGjRuXevZIIiI/HtGkYPRohIaKjvBsWPZVtUVHQ08O+fbh7FwBq1EBkpOhMVCocPgwHB1y5grQ0dOqECRNEB3oHXKOnsu3cOWzfjoEDsXIlHBxQvjwaNxadiUqFgQOxeTPc3QEgLQ02Npg3D+XLi471VjijpzJsxw44O6NRI0RFwcsL+/bh2DH06CE6FpUKaWm5LQ/A0BDVqiEoSGigd8AZPZVhJ0+iZ080bYrgYFy7hhEj8PAh71BEMqUS8fH5F2Hdvw8XF6GB3gFn9FSGVaqE+/cBoHlzDB4MExNUqiQ6E5UWo0fD2RmBgQgLQ4cOsLZG5cqiM70tzuipDOvbF336wMEBdevi4kWsWIHt20VnotJi3jxYWWHkSGRkoH177NkjOtA7YNFTGWZri5UrsWAB7t2DvT3WreOrpeh5Y8Z
 gzBjRIYoDi57Ktlq1sG6d6BBU6h09isuX4eCATp3U8SwO1+iJiF5pyBBs3w4rK5w8ia5d8eyZ6EBFxqInIipcQAAqVsTSpfDxwdy58PDA6tWiMxUZi56IqHCXLqF16/zNNm1w8aKwMG+LRU9EVDg7O1y7lr8ZHg47O2Fh3hZPxhIRFc7LC+7usLZGy5a4dAmLF2PnTtGZiowzeiKiwunpYdcuREaeHPp7r0l27bQOT/3WPClJdKoi4oyeiOiVDA1PtZo8Nwi/+8PGBvv3o1cv7N8PbfWpT87oiYhe45df8PPPqFwZSiU8PPDeezhzRnSmomDRExG9Rnw8bGzyN21tERcnLk3RseiJiF6jWTPs2JH7sSRh3z41e9sC9VlkIiISZOJE9O6NY8dgZ4fAQPTsiSpVRGcqChY9EdFr6Otj1y5cuIDYWAwcCCsr0YGKiEVPRPRGGjZEw4aiQ7wVrtFTGfLHH2jbFq1bY8IEPHokOg2RqrDoqaz48Ud8+SW0tKBU4tIl9O0rOhCRqnDphsqKefPg54cPPgCAHTsweTLu3kW1aqJjEZU8zuhVKycH8+ahVSu0bo0BAxAbKzpQWZGaipyc3JYH0K0b0tPx8KHQTESqwqJXrcWLoa2NI0dw+DA+/RSDB4sOVFYoFDAywsGDuZuPHyM1FXXrCs1EpCpculGt/fsRGPg4XXHqFBSK95uZVykfFaVmV+SqJ0ND1K2LmTOxaRMqVoSfH1q1gp6e6FhEKsEZvWpJ0oWLio4dcfIkjh9Hh6Bply9JojOVFatWoUoVhIUhIADNm2PjRtGBiFSFM3rVeu+9iYMebD1QycoKiI4etmfSkGXbAjxFpyobLC3x11/IyoJSCSVnOFSWsOhV6umMebobb1gN+QgmJrh/33blj4oJyMyErq7oZGWGGt1alqi48H+9SumZ6D+u0QBbtuDxY1haShKePGHLE1HJ4m+wKqVQoE0bzPzG8EkFy/R0zJiBTp1EZyIi
 TceiV7VZs1CtGnr2hI8PHB0xbZroQESk6bh0o2pKJYYPx/DhonMQUZnBohcnKQk//4ybN9GgAT75BOXLiw5ERJqJSzeCJCXB0xP162PWLFSqBE9PZGSIzkREmokzekFWr8b48ejWDQDs7PDgAfz80KeP6FhEpIE4oxfk9m3UqZO/Wbcubt8Wl4aINBmLXpAGDXD0aP7mkSNwdhaXhog0GZduBBk8GN26ISEBLi44dgyxsXB3F52JiDQTZ/SC6Ohg9240bIhbt+Dujg0boFCIzkREmokzenGUSnTtKjqE5kpJwTff4NQpmJjg00/RurXoQETCcEZPmignB337omlTBATg55/x3Xc4dEh0JtJkkoSoKKSlic5RCBY9aaLQUNjbo1s3aGnBygq+vli+XHQm0lhHj6JFC3z5JXr0wKhRyMoSHeglLHrSRHFxsLHJ37SwQFKSuDSkyVJTMX069u/H2rUICECDBli6VHSml7DoSRM1bIjAQGRn527u3YvGjYUGIo11/jzat0eFCrmbQ4ciMFBooP8i4GRsfHy8jo6OiYmJ6oemssLcHMOGoVMndOiA6GjcuIEtW0RnIs2kr48nT/I3S+f7CKliRu/u7h4XFwcgOjq6RYsWVlZWlSpVat++fWxsrApGpzKqf39s3AhnZ3z0EfbuhaGh6ECkmVxcEByMsDAAePYM06ahXz/RmV6iiqL39/d/8uQJgAkTJlSvXj0lJSUtLc3Z2Xns2LEqGJ3KrooV4e6O997jaxSo5OjqYu1azJqFNm3Qvj3q1y+NRa/SpZuzZ8/u3bvXwMAAwLRp0xwcHFQ5OhFRSbC3L+1Lgyo6GRsTE5OVleXk5HTnzh35kdDQUEtLS9WMrjZu3sTq1di6FenpoqMQkeZQRdG3atWqb9++hoaGx44dmzJlCoCjR4927959woQJKhhdbaxahfHjoaWFqCh06IDISNGB1FZ6OuLjRYcgKkVUsXRz5MgRAJmZmZGRkfHx8
 QD09fV37drl6uqqgtHVQ1oaVq/G4cPQ0gKADh0wbRr++EN0LHXz9ClGjkRMDMzMEBeHZctQv77oTETiqW6NXldX18HBQV6Xb9KkSXR09O7duz09PVUWoFQLD0ezZrktD8DJCTExQgOpp9mz0alT7rmwmBj07o2jR6Hki0VIpe7cwd27qF0bpWdxWtj3QHBwcN++fUWNXupUrYobN/I3k5L4FrJvY+9e/PYbWreGhweiotCgAa5dE52JyhBJwsiRmDwZhw/jo4+wZInoQP8SdvdKHx8fHx+fV3xCWFjY8ePHCzz4zz//lNfIBqxUCZaW+PprDBqExERMnoypU0VnUjchIYiNxfHjqFABcXHo3Rs2NtDTEx2LypA//0Tlyvjll9zN/v1x4QIaNhSaCYCKZ/SSJKWkpOTk5LzhJ7/8oEKDL4hesQLW1pgyBb/8gq+/5m11i2zrVvTrh2XLIEmwtET79rh8Gfb2omNRGXL8OJ6fvvbsiZcmq2KoYkafnp7+/fffr1mz5u7du5mZmVpaWvb29gMGDJg6dape4RMuJycnJyenAg9evXpVY19Pq1Ri8GAMHiw6h9p68gRDhmDPHri5QUsLWVn48EO+VIpUydwc8fGoXTt3My4OFhZCA/1LFTP60aNHHzp0yNfXNyYmJjMzMy4ubvXq1efOnRs9erQKRqeywt0dvr6YMQNHjyIgAKam6NlTdCYqWwYOxFdfISoKAC5exJ9/wsNDdCYAqpnR+/n5hYWF2fx721hzc3NXV1dnZ2d7e/uVK1eqIID6CQ3Fvn3Q14e39wu326VXcHfH5cto1Qo1auDaNYwblz+zIlKJWrWweDHGj0fig+zqmeHrnbYa77DDhx9CW/B7+aliRm9vb79v374CD+7fv79q1aoqGF39rFuH6dNRqxYqVkTfvjh9WnQg9TF5MgIDMXcujh8vjTccoTLgvfew1ffh4eyWq8ZftvusGx4+RI8eeLMTkyVHFT9nfH19fX
 x8Fi9eXL9+fSMjo7S0tNDQ0KSkpJ07d6pgdDWTk4MVK3D0KHR0AKBNGwwYAH9/0bFKvSNHcOAAjIzQvz84gSCxli/H1Knw8gIAZ2c8fIgDB9Cpk8BEqij6xo0bR0REHDly5M6dOwkJCaampiNGjHBzc9MW/etMaRQdDUfH3JYHULEiMjOFBlIHCxbg7l0MGoTkZPTrhx9/hIuL6ExUhkVEYODA/E0XF1y/rvlFD0BbW7tdu3byx6tWrcr7mAqytsatW5Ck3MtF0tL4ws7XSElBUFD+m/o0aoRRo7Bjh9BMVLbVrYvTp1GtWu5mcDA6dxYaSMQLpr744ouhQ4eqflz1oK0Nb28MH46xY5GejvnzMXmy6Eyl261bcHbO37SxQUqKuDREwKhR6NIFCQmoWxdBQbh3D23aiE3ExZPSZ8IEBAVhwwbo6eHbb1GvnuhApVuNGrh4MX8zOhrGxuLSEAFGRggIwObNOHIETZtKs+cIf6WngKKfN2+e6gdVM23bom1b0SHUhJEROnbE0KEYPBgPH2LxYixfLjoTlXnlyuGjj65exYQJyFiKjAx07YopU4TFEbD+++mnn6p+UNJkU6di6FAEBiIiAn/9hQYNRAciwtOn+PhjrFiBwEAcO4bkZAh81RCXbkiNXbmC//0P0dFo2NB1yhTXihVFByL618WLaNUq94ysQoEvv0SfPhg2TEwYXtFB6uraNYwdi+nTERAADw/4+ODJE9GZiP6VlZX/BhMAlEqRr5pi0ZO6WrkSX3+N2rWhpYW2bdGlCw4eFJ2J6F+NGuHQITx4kLv5ww8ir7Hk0g2pq/v3Ubly/mblyrh/X1waoheVL48ffkCfPqhQAQ8fokULkVdKs+hLu5AQzJ2LlBSYmOCrr9CokehApUYzm8hd42+M9oxEz56oUGH3br5ZC5Uu772HQ4eQkgIDgxeWcVSPRV+q3b6NSZPwxx+wscG9e+jfH+vX81YuAIBvvhkRFdYvbtE/62x
 rz111yHFE09blebkNlUIVKohOwKIv5bZtwxdf5N6ouHJlfP45tm3D+PGiYwkXH4+gIG1//y3AhQvWd4+V//7wl3bTvxMdi6iUYtGXao8ewcQkf9PEBI8eiUtTeoSH4/335Q8bNkTDhlWx/YLYRESlGa+6KdXatsWGDfmb69fzBbMAgOrVERqavxkVBXNzcWmISjvO6Eu11q1x8iQ6dECDBrh0CR07omVL0ZlKA1tbWFpi5kz064e4OMyahWXLRGciKr1Y9KXd9OkYNQq3b2PmzBeWccq6n3/G1q34+WeYmmLtWtjbiw5EVHqx6NWAqSlMTUWHKG0UCvj4wMdHdA4iNcCiVx85Odi0CadOwcYGw4aBN3YhUk8pKaq+5pInY9VH//6IjMTHH6NOHXTrhqgo0YGIqGiWL0fz5hg0CC1aYO9e1Y3LGb2aOHcOJia5L/2sXx+Wlvj2W56BJFIjBw7g3DmcOAGlEunp6N4ddevCzk4VQ3NGryZu3nzhNuvOzoiIEJeGiIps92589hnS07FsGb78EjVqICBARUOz6NVE3bo4dSp/MzgYTk7i0hBRkWlp4dEjuLvD1BQDBiA1FcuXq+jexVy6URP16sHICJ9/Dg8P3LmDNWuwY4foTERUBN2749NPMW0a+vRBcjJiYtC2Lfbvh4dHiQ/NolcfP/2EoCAEB8PGBgEBMDAQHYiIiqBVK5iY4Ntv8dtvkCTMmoXkZFy/zqKnAvim4UTqrGtX2Nigd+/cuxZPm4Y2bVQxLoueiEhFPvkEXbogKQn16yMoCDdvYuFCVYzLk7HqLDtbdAIiKgJDQ/j7o3x5HDwIZ2ds3gyFQhXjckavno4exezZUCiQkYHhwzF4sOhARPRGypUT8P3KoldDMTH46its3w5TUzx7hqFDUbUq1+6JqDBculFDgYEYNCj3Pmc6Opg6Fdu2ic5ERG8jMRFXruDp05IdhTN6NZST88I7DWtpcbGeSO1IEj79FLduoUYN
 nD+PcuWalNxYLHo11LYthgyBjw8MDJCTg6VL0b276ExEVDQrV6JyZfz0EwBkZcHOrmVsrHaNGiUyFpdu1FCVKpg4EZ06oXt3uLqiXj107iw6ExEVTWBg/llZbW3Y2YWEhJQrobE4o1dP7u5wd8ejRzA2Fh2FiN6GkRFSUmBllbv57Jm+gUFJ3fiGM3p1xpYnUlsDBmDaNKSlAcC1a7h71+X990vqnCxn9EREArRqheRkeHvj2TNYWqJVqzUGBkNLaCwWvfqTJGzfjsOHYWyMoUP5NtlE6sLLC15euR8PHx5XcgNx6Ub9ffYZzp3DiBFo0waDBuHiRdGBiKh04YxezcXGIjISfn65m46O+Pxz/P230ExEVLqw6NXcrVuoVy9/s0oVJCaKS1M8IiOxdi2Sk9GmDTw9RachUn9culFztWvjzJn8zbAw2NqKS1MMLl9G//5o0gQDBuDwYUycKDoQkfrjjF7NmZujXTsMHIi+ffHgAXx98ccfojO9k3lzpQ1fXqtW6Qnq1Wu4WMfLC3FxsLQUHYtInbHo1d+UKQgJwaFDMDPDvn3qfXF9VFRCYGI1S1/o6eHMGSxf7uzc4MYNFj3RO2HRa4TGjdG4segQxeHzz60/WHlt3M+1agExMRgw4IxO0GefiU5FpOZY9FSaJCbO9TUeOBCffopKlWz+vPVlqwFPLCz0RcciUm88GUuliSQ5OGD3bjx6hNOnMcJyx4yvtF7/r4jolVj0VJq0b4/Zs81NskeNlGZU8m3m8hS6uqIzEak9Fj2VJtOmwcwMHTqgXTvcv48ffhAdiEgTcI2eSoEHD/DVV7h+HVpaGDkSQUGiAxFpFBY9iZaVhX79MGcOXF3x+DE++QQ6Ovm3eiJ1M3bs2IsXL+rr8xR60YSHhw8ZMqRGybzFFIueRAsJQXY2Nm/GpUsYOhQ//oihQ1n06uvp06dr164tocLSYMOHD8/MzCyhnXONnoRKT8fIkTAzw8iR0NdHly7Q1
 s59LwYiKiac0ZNQf/yBoUPx99+oUQNOTnj6FJMno0UL0bGINAqLXpPduIG5cxEVhYoV8eWXcHYWHehlN2/C2xs1aqB9ezRrhkuXEB2NCxdExyLSKCx6jRUfjyFD4OuLOnVw5w4GD8aqVaheXXSsApycEByM8ePRpg3CwqCjg2HDoKcnOhaRRuEavcbatQsff4w6dQDAzg7Tp2PjRtGZXta3LwICsGgRTp6Evz9CQ9Grl+hMRJqGRa+xEhNRsWL+ZqVKSEgQl6YwOjrYtQuOjjh1CnXrws8PWrznAVEx49KNxmrZEr/9Bg+P3M3Nm+HmJjRQYbS00LOn6BBEmoxFr7GaNUNgIDw88P77uHgR9vbo3l10JllMDKZMQXQ0srPRsyfGjRMdiEjDcelGk82YgVWr0Lo1li3Dd9+JTiPLycHAgfjsMwQFISgIkZHw9RWdiUojSZJq1aplYWHx7Nmzd99beHh47dq1i/qvLCwsFM8xNDS8ePFivXr1AISEhDQu/E0gdu/e3b20TKwAFr3Gs7KCmxuqVBGdI8/166hZM/dtUrS0sHAh/v5bdCYqjS5cuJCSkmJiYhIk9N5HQUFBSf+6d+9e3uP29vZz584VGKxIWPSkWunpKF8+f1NbG1lZ4tKQCv3zD+zs0KFD7p/atbFnzys+fePGjQMGDOjbt++mTZvkRzZs2PDxxx8PGjTIxMSkRYsW165dkx/39fW1t7fX19dv1qxZ3oN//fWXo6Ojubn5qFGjMjIyAEiSNH/+fEtLSzs7u7wfHseOHWvYsKG5ufmHH34YExPzcgwjIyOT5+Q9fvv27a+++gpAeHi4q6vr4sWLbW1t7e3tC/xYCgsLq1y58smTJ9/umBUXFj2plpMTTp3Cw4e5mxs34oMPhAYiVXn6FL1748CB3D9jx+LJk8I+NycnZ9OmTQMHDuzbt+/27dvlpgawZs2a5s2b37hxw9XVtU+fPpIkRUVFjR07du3atVFRUXXq1P
 nuu+8AXL9+ffTo0evWrTt79uzZs2c3bNgA4MaNG1paWnfu3Bk+fPisWbMAJCYment7z5s3LyIiwsTEZODAmQIeYgAAEUhJREFUgW/3zC5evJiVlXXjxo3evXt/+eWXeY/fu3evS5cuK1as+ED0f3KejCXV0tPDkiXo2hWOjkhIgJkZ1+jpZSdOnLCwsGjQoAEAW1tbf39/Ly8vAHXr1h01ahSA+fPn//777xEREVWqVLlx40bVqlUfP35sYWERFRUF4K+//vrwww+bN28OYOXKlY8ePQJgZGQ0adIkbW3tHj16yL8l7N69u02bNp6engAWL15sYWGRnZ2t9eIFvq1bt9bWzu3J5cuX161b9+W0WlpaEydO1NbWHjhw4I4dO+QHk5KS3N3dW7Vq1bVr15I6TG+MRU8q16wZjh/H3bswMcFzvwsT5dm4cWN4eLiVlRWA5OTkzZs3y0Vvb28vf4KOjo6dnV10dLS9vf3vv/++b98+Y2NjPT09IyMjAPfu3XN0dJQ/09nZGYC8N7mylcrclYyoqKg9e/bIowDQ0tJ68OCBtbX180n+/PNP+ecNAAsLi4iIiJfT5u0570cCgKNHj37xxRe//fbbwoULbW1ti+nAvCUWPYmgUMDOTnQIUrn793HuXO7HUVH4t2ELePbs2ZYtW/bv31+rVi0A4eHhnp6e6enpAG7fvi1/TlZWVmRkpLW19ZYtW/bs2XPgwAEzM7MNGzbs3r0bgKWlZd6J0+Dg4IiIiCZNmigUigIDWVtbe3h4/P333wCys7P/+ecfq5ci2djY2L3u/+rLewbQsWPHJUuWPHz48Msvv1y9evWr91DSuEZPJSs1FT//jOnTsXUrJEl0GhKoenXY2mLLltw/CgUaNvzPTwwMDDQyMmrVqpWVlZWVlZWbm5uFhcXevXsBXL58+ddff01ISJg5c6aNjY2jo2NiYqKhoaG+vv6DBw9+/PHHJ0+eAOjZs+f69etPnz5969at8eP
 HJxTyovAuXbocO3Zs3759iYmJ06dPHzNmzH9W9tuR33pl/vz5f//99/nz54trt2+HRU8lKCFe6tTqiVHCbS/3zLAw9O8vOhAJZG6Or7/GokX5fwp5c5JNmzZ5e3vnda5Coejevbu8qu7h4XHw4MHq1asfPnx406ZNSqVy4MCBenp6lStX9vb2njlz5unTp9evX9+gQYPvvvuuX79+DRs2dHJyGjNmzH8OZGVltX79+kmTJlWtWvXs2bPr168v9idta2s7YcKEL774QhI6zVGIHb6oPv/889jY2LzLrahUS0iY2dS/Re1E93r3cPIkvvlm/JYWvXrxbvMabvjw4dOmTSuJd5iSV2Y09dt/+PDh/fv3b9OmTUnsXKVr9JIkpaamGhoa5p0MIU02adI1+8Xj1pqjIpCcDA+PxqNOhIcrWPREKqaKwk1PT1+4cGHNmjXLlStnbGysq6vr6Og4Z86cvGtjSTPduVPrA/OQEACAiQnq1Tt78JF822QiUiVVzOhHjx4dHR3t6+tbr169ChUqpKSkXL169X//+9/o0aNXrlypggAkhlI5/tNsL2+tBw9QsyYCjrdLqKsv+oUjpMYGDBgwYMAA0SnUkiqK3s/PLywszMbGRt40Nzd3dXV1dna2t7dn0WuYM2cQE4NGjVC1KtCrl/mCL/bv+N+GLXq7/ne1idm9r7bwraOIBFBF0dvb2+/bt2/YsGHPP7h///6qVauqYHR6G2FhCAlBlSpwc8ObnVB5eiWiV6cUe+VdB+P4lcY+7XqZjR8/EqtWGfXtMionB82aYf10FNula0RUBKpYo/f19Z03b16dOnV69+49bNiwPn361KtXb/z48b587XvpNHs25s9HVhYOHICHxytuSJIvKel7z4N9xlsvi/Ied8h7l2G/I7tSIiKAoUNx8CCCgrBwIQwNSz46aY7ScJviy5cvd+zY0djY2Nzc3MvL68aNG28dQOyNi1Uxo2/cuHFERMSRI0fu3LmT
 kJBgamo6YsQINze3518uTKVFaCiuXct/e9k//7w9e+1fZiMzM9G5M/Luv53xJOdOwPXKZukGTZ2gp4eAgNMmnUZ+bP3/9u4+qIk7jQP4E5KqCa9BYkaKHeQq1UEPz2EEe6JQjlpJlUFeBGRGMFfb0jJ0HK908A8c4TpcK3K29so5yhVv2lq4ipR2tKeCjrTKIKUOKCkvtW2YthawUF5DE/b+WC7FF2KEJEt++/0Mf2yya/b5ZbPfibubZ4mIVCraty8m70xDQ/yjjwozCJiFfvyR8vJueyY7m+7VOWbC5DbFGzZssHd5dzOZTBqNZvv27SUlJXK5/MCBA3Fxcc3NzTb8UZXDOOgyR5lMFhUVpdVqc3Jydu7cGRUVdfPmTf7HyjC7fPEFRUebH130fFr7r7XLl9PatfT663T4MBFRWfGtqIXXD+zpfXqbZ37gv6mxkfr6Fi4w6fX//2fe3t/9NO/2liEgdno9cRzl5Ez8+frS9euWlhe8TXFPT09XV1dOTk5AQMDChQsLCwsXL17c399vfRktLS0REREFBQXmbjkkUONiwa5nv3TpUnJyslBrhyn5+dHXX5sf7dtHH8a/p9FQZCS99x698w41N1Pl/s4LF+ifLX+s/e53PRu2fZz+HwoPf278H9nZ1N5ORiN9srfh87EQXC8Pd/DyooCAib/58y0tORvaFKvV6tDQ0MTExNOnT4+MjEil0urqar4lvZVlENGXX37Z1tZmPkwtVONiwYI+ISFhcHDQwgI3btyouEt7e/vo6KjDihSj8HCqr6fycurvpytXjF91Kndl8HOkUgoMpJMnKU35iTR4Of/kn7Pk/zWsp/nzf58QWDT4bH7cFxt9r37ervqwTv3QQ8KNApycuU3x8uXL+TbF/PN8m2KVSlVQUKDX6zs6OlQqVXt7+7p16+RyuY+PD9+R2NymOCAg4OjRo3wnS75NsVwu37Jly88//0yT2hQrlcr9+/dfunTJZDJNLuPCh
 QuxsbEHDx5ctGjRU0891dDQ8EBlENHo6OiRI0dCQ0NJ0MbFs/coeW9v79eTvlry5syZs2gW3RaPRTIZVVbSG2/Qu+/SI4/Igv7Wp1LwrYTHx6m9ndatoyHTPOI4kkiIaGiIXI395OFBzz33h5T+Yzod+T9M6mBhBwHObja0KR4bG+M47vnnn+cP/rz//vvh4eEXL160vgwi8vPzmzNnDj8tYOPi2Rv0ISEhd997t7y8fKpGdGAzbm6Um8tP7jlPW7bQK6+QXE5vv01paRQTQ0kFaX/KKny4eHf/kCx/Z9dfg3Uk30pE5OlJoaFCVg6zmJsbffwxNTVNPPzpJ9q//95LzpI2xRUVFaWlpefOnSOiuXPnpqenl5WVNTU1KRQKK8ug2zvUC9i42BFBr9Ppppo1jQuewJEiIsjPj8rLaXiYsrMnYvzv5b7PZqQOq69JyfSXzV+tLMkRukxwAsuW3efsq5m5TTEfzWq1+o42xfHx8UVFRXyb4jNnzkxuU8wndXx8/BNPPJGcnKxSqV566aWpTgdqNJrc3NxTp06tXr36tddeq6ur++yzz8xzo6OjX3zxxby8vLS0tPHx8ZqamsbGxsOHD9fX11tZxh3MjYuXLl2alZW1atWqB34Tp42zP/74lEKhePguD/pSH3zwwVtvvWWPIgHAJrRabUdHx0xeYfv27XxfX7Ps7Gy+xXxMTExCQoK7u3tYWNj169c5juvr64uOjvb29n788cerq6vVavWxY8c4jisrK1u8eLGHh0dGRobBYGhtbX3sscf4V2ttbQ0KCuKnP/3006CgIIVCERkZ2dnZeUclbW1tGo1GrVa7u7uvWbPm1KlTHMdZX0Zzc7N5pdXV1bGxsfx0Xl7e+vXrx8fH73jfampqZvK+WeCINsX8GBQKxaFDh2b4Uvyhm8zMTJsUBgA2x3ybYjuVYdc2xY646kYikWzbtu2+t+MCAAB7cNDJ2KioqKioKMesCwAAJhPgOvrS0l
 LHrxQAnF1aWprgx21mTxkPRICg37Vrl+NXCgAgWrilHwAA4wQI+vz8fMevFABAtAQI+qysLMevFABAtHDoBgCAcbO31809eXp6vvrqq5WVlUIXQjqdbmBgQCqVCl2IQ42MjMybN88Zb7wwE8PDwwqFQugqHG3aox4eHm5ra5s7F/cHfjB6vf6FF16w04s74pexTMrNzd20adOaNWuELsShUlNTi4qKForsliKRkZG1tbVCV+FoIhy1wWCIjY09ffq00IXYHg7dAAAwDkEPAMA4BD0AAOMQ9AAAjEPQAwAwDkE/TS4uLuY7T4qHOEc9+W5w4iHCUUskElYvmMblldM0NDSkUCjEdkX5wMCA+a7H4oFRiwero0bQAwAwTnT/DQcAEBsEPQAA4xD0AACMQ9ADADAOQQ8AwDgEPQAA4xD0AACMQ9Bb68qVK6tWrVIqlRkZGSMjI/dcRqfTubm5Obgwu7I86rNnz65cudLV1XXt2rXXrl0TpELbsjxeaz4DzkhsW5knqj0aQW8Vo9GYkJCQmZnZ0tKi1+uLi4vvXsZkMu3YsWN0dNTx5dmJ5VH/8MMPcXFxe/bs+f777yMjI5OSkoSq01Ysj9eaz4AzEttW5oluj+bACmfPnl26dCk/XVtbu2TJkruXKS4uTkxMlEqlji3NjiyP+vjx42FhYfy0wWCQSCS3bt1ydIk2ZXm81nwGnJHYtjJPbHs0vtFb5ZtvvlmxYgU/vWLFim+//Za7vXVEZ2dnSUlJYWGhENXZi+VRx8TEVFVV8dOXL1/29/f38vISoErbsTze+34GnJTYtjJPbHs0gt4qPT095lZHHh4eY2NjAwMD5rnj4+PPPPNMUVGRh4eHQAXaheVRu7u7L1iwgOO4qqqq1NTUgwcPOnuLN8vjtTzXeYltK/PEtkcj6Kf05ptvenl5eXl5lZaWKpXKwcFB/vlffvlFJpNNPkVz5MgRX19fjUYjUKW2ZP2oiai3tzc+Pj4/P//
 kyZObNm0Sol5bsjze+74bTkpsW5knnj2ah6CfUlZWVl9fX19f344dOwICAszXG7S2tvr7+09uy15TU/PRRx/5+PgEBgaaTCYfH5/Lly8LVPVMWT9qg8Hw5JNPLlu2rL6+PiQkRKB6bcnyeC3PdV5i28o88ezRE4Q7PeBMfv31V19f34qKioGBgc2bN+/du5d/vqKioqurq6enR6/X6/X6q1evuri46PX60dFRYQu2CcujPn78eHBw8I1JjEajsAXPkOXxTjXX2YltK/PEtkcj6K3V0NAQHBzs7e2dnp5u3uqurq7V1dXmZbq7u9k4R29mYdQvv/zyHV8auru7ha125ixv5XvOZYDYtjJPVHs0bjwCAMA4Fg4yAgCABQh6AADGIegBABiHoAcAYByCHgCAcQh6AADGIegBABiHoAcAYByCHgCAcQh6AADGIegBABiHoAcAYByCHgCAcQh6AADGIegBABiHoAcAYByCHgCAcQh6AADGIegBABiHoAcgIiosLIyOjp78jFarzc7O5qc5jgsLC9PpdEKUBjBTCHoAIqLk5OTz5893d3fzD41GY1VV1datW4no3LlzWq22vr5e0AIBpg9BD0BE5O/vv3r16hMnTvAP6+rq5HJ5WFgYETU1NSkUCoVCIWiBANOHoAeYkJKSUl5ezk9XVlYmJia6uLgQ0e7duw8dOqRUKgWtDmD6EPQAExITE+vq6m7evMlxXGVlZVJSktAVAdgGgh5gglqtjoiIOHHiRGNjo0QiCQ0NFboiANuQCV0AwCySkpJSVlbW1dWVlJQkkUiELgfANhD0AL+Ji4vLzMzs6Ogwn5UFYAAO3QD8xtPTc+PGjTKZLCQkROhaAGxGwnGc0DUAAIAd4Rs9AADjEPQAAIxD0AMAMA5BDwDAOAQ9AADjEPQAAIxD0AMAMA5BDwDAOAQ9AADjEPQAAIxD0AMAMA5BDwDAOAQ9AADjEPQAAIxD0AMAMA5BDwDAOAQ9AADj
 EPQAAIz7H8F66bHasieFAAAAAElFTkSuQmCC\" alt\u003d\"plot of chunk unnamed-chunk-1\" width\u003d\"400px\" /\u003e\u003c/p\u003e"
+      },
+      "dateCreated": "Sep 27, 2016 6:14:14 AM",
+      "dateStarted": "Sep 27, 2016 6:42:20 AM",
+      "dateFinished": "Sep 27, 2016 6:42:20 AM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "title": "Create a Gaussian Matrix",
+      "text": "%flinkMahout\n\nval mxRnd3d \u003d Matrices.symmetricUniformView(5000, 3, 1234)\nval drmRand3d \u003d drmParallelize(mxRnd3d)\n\nval drmGauss \u003d drmRand3d.mapBlock() {case (keys, block) \u003d\u003e\n  val blockB \u003d block.like()\n  for (i \u003c- 0 until block.nrow) {\n    val x: Double \u003d block(i, 0)\n    val y: Double \u003d block(i, 1)\n    val z: Double \u003d block(i, 2)\n\n    blockB(i, 0) \u003d x\n    blockB(i, 1) \u003d y\n    blockB(i, 2) \u003d Math.exp(-((Math.pow(x, 2)) + (Math.pow(y, 2)))/2)\n  }\n  keys -\u003e blockB\n}\n\nresourcePool.put(\"flinkGaussDrm\", drm.drmSampleToTSV(drmGauss, 50.0))",
+      "dateUpdated": "Sep 28, 2016 1:53:22 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/scala",
+        "tableHide": true,
+        "title": true
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475021740078_127388926",
+      "id": "20160927-181540_1706054053",
+      "result": {
+        "code": "SUCCESS",
+        "type": "TEXT",
+        "msg": "mxRnd3d: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:0.4586377101191827,1:0.07261898163580698,2:-0.4120814898385057}\n 1 \u003d\u003e\t{0:0.48977896201757654,1:0.2695201068510176,2:0.2035624121801051}\n 2 \u003d\u003e\t{0:0.33215452109376786,1:0.2148377346657124,2:0.22923597484837382}\n 3 \u003d\u003e\t{0:0.4497098649240723,1:0.4331127334380502,2:-0.26063522630725094}\n 4 \u003d\u003e\t{0:-0.03782634247193647,1:-0.32353833540588983,2:-0.4423256266785404}\n 5 \u003d\u003e\t{0:0.15137106418749705,1:0.422446220403861,2:-0.20452218901606223}\n 6 \u003d\u003e\t{0:0.2714115385692545,1:-0.4495233989067956,2:0.13402344186662743}\n 7 \u003d\u003e\t{0:0.02468155133492185,1:0.49474128114887833,2:-0.484577970998106}\n 8 \u003d\u003e\t{0:-0.2269662536373416,1:-0.14808249195411455,2:-0.16159073199184967}\n 9 \u003d\u003e\t{0:0.050870692759856756,1:-0.4797329808849356,2:0.30230792168515175}\n... }\ndrmRand3d: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d 
 org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@448a1f4e\ndrmGauss: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@448a1f4e,\u003cfunction1\u003e,-1,-1,true)\n(3,5000)\n"
+      },
+      "dateCreated": "Sep 27, 2016 6:15:40 AM",
+      "dateStarted": "Sep 28, 2016 1:50:54 PM",
+      "dateFinished": "Sep 28, 2016 1:51:00 PM",
+      "status": "FINISHED",
+      "progressUpdateIntervalMs": 500
+    },
+    {
+      "text": "%spark.r {\"imageWidth\": \"400px\"}\n\nlibrary(scatterplot3d)\n\n\nflinkGaussStr \u003d z.get(\"flinkGaussDrm\")\nflinkData \u003c- read.table(text\u003d flinkGaussStr, sep\u003d\"\\t\", header\u003dFALSE)\n\nscatterplot3d(flinkData, color\u003d\"green\")\n\n",
+      "dateUpdated": "Sep 28, 2016 1:54:56 PM",
+      "config": {
+        "colWidth": 6.0,
+        "graph": {
+          "mode": "table",
+          "height": 300.0,
+          "optionOpen": false,
+          "keys": [],
+          "values": [],
+          "groups": [],
+          "scatter": {},
+          "map": {
+            "baseMapType": "Streets",
+            "isOnline": true,
+            "pinCols": []
+          }
+        },
+        "enabled": true,
+        "editorMode": "ace/mode/r"
+      },
+      "settings": {
+        "params": {},
+        "forms": {}
+      },
+      "apps": [],
+      "jobName": "paragraph_1475023444293_-1038534869",
+      "id": "20160927-184404_773885252",
+      "result": {
+        "code": "SUCCESS",
+        "type": "HTML",
+        "msg": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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

<TRUNCATED>