Add nuvem components.

git-svn-id: https://svn.apache.org/repos/asf/tuscany/sca-cpp/trunk@1444662 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/components/logic/environment.py b/components/logic/environment.py
new file mode 100644
index 0000000..088c905
--- /dev/null
+++ b/components/logic/environment.py
@@ -0,0 +1,37 @@
+#  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.
+
+# Mockup request environment variable for testing
+
+class environment:
+    def __init__(self, name):
+        self.name = name
+        self.value = None
+
+    def get(self, id):
+        return self.value
+
+    def put(self, id, value):
+        self.value = value
+        return True
+
+    def __repr__(self):
+        return repr((self.name, self.value))
+
+def mkenv(name):
+    return environment(name)
+
diff --git a/components/logic/nuvem/__init__.py b/components/logic/nuvem/__init__.py
new file mode 100644
index 0000000..de5c2d1
--- /dev/null
+++ b/components/logic/nuvem/__init__.py
@@ -0,0 +1,17 @@
+#  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.
+
diff --git a/components/logic/nuvem/add.py b/components/logic/nuvem/add.py
new file mode 100644
index 0000000..b302a07
--- /dev/null
+++ b/components/logic/nuvem/add.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, a, b):
+    va = a.get(r)
+    vb = b.get(r)
+    return float(0 if va is None else va) + float(0 if vb is None else vb)
+
diff --git a/components/logic/nuvem/and_.py b/components/logic/nuvem/and_.py
new file mode 100644
index 0000000..048d6c2
--- /dev/null
+++ b/components/logic/nuvem/and_.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, a, b):
+    va = a.get(r)
+    vb = b.get(r)
+    return (False if va is None else bool(va)) and (False if vb is None else bool(vb))
+
diff --git a/components/logic/nuvem/animation.py b/components/logic/nuvem/animation.py
new file mode 100644
index 0000000..3dac880
--- /dev/null
+++ b/components/logic/nuvem/animation.py
@@ -0,0 +1,28 @@
+#  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.
+
+def get(r, msec, loop, content):
+    if r[0:1] == ('setup',):
+        ms = msec.get(r)
+        if ms is None or ms == 0:
+            return ''
+        l = loop.get(r)
+        lv = -1 if l is True else 0 if l is None or l is False else int(l)
+        return 'setupAnimationHandler(' + str(int(ms)) + ', ' + str(lv) + ');'
+
+    return content.get(r)
+
diff --git a/components/logic/nuvem/app.py b/components/logic/nuvem/app.py
new file mode 100644
index 0000000..d17ca78
--- /dev/null
+++ b/components/logic/nuvem/app.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return prop.eval()
+
diff --git a/components/logic/nuvem/append.py b/components/logic/nuvem/append.py
new file mode 100644
index 0000000..20e1c85
--- /dev/null
+++ b/components/logic/nuvem/append.py
@@ -0,0 +1,31 @@
+#  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.
+
+def get(r, a, b):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    va = a.get(r)
+    la = () if va is None else va if isList(va) else (va,)
+    vb = b.get(r)
+    lb = () if vb is None else vb if isList(vb) else (vb,)
+    return la + lb
+
diff --git a/components/logic/nuvem/bsearch.py b/components/logic/nuvem/bsearch.py
new file mode 100644
index 0000000..9ead197
--- /dev/null
+++ b/components/logic/nuvem/bsearch.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, q, s):
+    return s.get((("'q", q.get(r)), ("'format", 'rss')))
+
diff --git a/components/logic/nuvem/bzprofile.py b/components/logic/nuvem/bzprofile.py
new file mode 100644
index 0000000..b91cff2
--- /dev/null
+++ b/components/logic/nuvem/bzprofile.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, bzid, bz):
+    bid = bzid.get(r)
+    return bz.get((bid, '@self', ("'alt", 'json')))
+
diff --git a/components/logic/nuvem/call.py b/components/logic/nuvem/call.py
new file mode 100644
index 0000000..ed02ad0
--- /dev/null
+++ b/components/logic/nuvem/call.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, name, proxy):
+    nv = name.get(r)
+    return proxy.get("'start" if nv is None else nv if nv[0:1] == "'" else "'" + nv, r)
+
diff --git a/components/logic/nuvem/ceil_.py b/components/logic/nuvem/ceil_.py
new file mode 100644
index 0000000..ca63726
--- /dev/null
+++ b/components/logic/nuvem/ceil_.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, x):
+    import math
+    vx = x.get(r)
+    return math.ceil(float(0.0 if vx is None else vx))
+
diff --git a/components/logic/nuvem/comment.py b/components/logic/nuvem/comment.py
new file mode 100644
index 0000000..d17ca78
--- /dev/null
+++ b/components/logic/nuvem/comment.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return prop.eval()
+
diff --git a/components/logic/nuvem/contains.py b/components/logic/nuvem/contains.py
new file mode 100644
index 0000000..d8f4424
--- /dev/null
+++ b/components/logic/nuvem/contains.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, sub, s):
+    vsub = sub.get(r)
+    vs = s.get(r)
+    return ('' if vs is None else str(vs)).find('' if vsub is None else str(vsub)) != -1
+
diff --git a/components/logic/nuvem/cos_.py b/components/logic/nuvem/cos_.py
new file mode 100644
index 0000000..fb32130
--- /dev/null
+++ b/components/logic/nuvem/cos_.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, x):
+    from math import cos
+    vx = x.get(r)
+    return cos(float(0.0 if vx is None else vx))
+
diff --git a/components/logic/nuvem/delete.py b/components/logic/nuvem/delete.py
new file mode 100644
index 0000000..a9a2276
--- /dev/null
+++ b/components/logic/nuvem/delete.py
@@ -0,0 +1,28 @@
+#  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.
+
+def get(r, coll, id):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    idv = id.get(r)
+    return coll.delete(() if idv is None else idv if isList(idv) else (idv,))
+
diff --git a/components/logic/nuvem/divide.py b/components/logic/nuvem/divide.py
new file mode 100644
index 0000000..83f02b1
--- /dev/null
+++ b/components/logic/nuvem/divide.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, a, b):
+    va = a.get(r)
+    vb = b.get(r)
+    return float(0 if va is None else va) / float(1 if vb is None else vb)
+
diff --git a/components/logic/nuvem/email.py b/components/logic/nuvem/email.py
new file mode 100644
index 0000000..d17ca78
--- /dev/null
+++ b/components/logic/nuvem/email.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return prop.eval()
+
diff --git a/components/logic/nuvem/empty.py b/components/logic/nuvem/empty.py
new file mode 100644
index 0000000..6b3d6f8
--- /dev/null
+++ b/components/logic/nuvem/empty.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r):
+    return ()
+
diff --git a/components/logic/nuvem/equals.py b/components/logic/nuvem/equals.py
new file mode 100644
index 0000000..7c777ae
--- /dev/null
+++ b/components/logic/nuvem/equals.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, a, b):
+    va = a.get(r)
+    vb = b.get(r)
+    return (() if va is None else va) == (() if vb is None else vb)
+
diff --git a/components/logic/nuvem/eval_.py b/components/logic/nuvem/eval_.py
new file mode 100644
index 0000000..97ba1f9
--- /dev/null
+++ b/components/logic/nuvem/eval_.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, py, ref):
+    pye = py.get(r)
+    return eval('' if pye is None else pye if isinstance(pye, basestring) else pye[1][0])
diff --git a/components/logic/nuvem/exec_.py b/components/logic/nuvem/exec_.py
new file mode 100644
index 0000000..00cab81
--- /dev/null
+++ b/components/logic/nuvem/exec_.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, py, ref):
+    val = None
+    pys = py.get(r)
+    exec('' if pys is None else pys if isinstance(pys, basestring) else pys[1][0])
+    return val
diff --git a/components/logic/nuvem/false_.py b/components/logic/nuvem/false_.py
new file mode 100644
index 0000000..8cd3528
--- /dev/null
+++ b/components/logic/nuvem/false_.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r):
+    return False
+
diff --git a/components/logic/nuvem/fbalbums.py b/components/logic/nuvem/fbalbums.py
new file mode 100644
index 0000000..64a81a0
--- /dev/null
+++ b/components/logic/nuvem/fbalbums.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, fbid, fb):
+    fid = fbid.get(r)
+    return fb.get((fid, 'albums'))
+
diff --git a/components/logic/nuvem/fbfriends.py b/components/logic/nuvem/fbfriends.py
new file mode 100644
index 0000000..960e422
--- /dev/null
+++ b/components/logic/nuvem/fbfriends.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, fbid, fb):
+    fid = fbid.get(r)
+    return fb.get((fid, 'friends'))
+
diff --git a/components/logic/nuvem/fbgroups.py b/components/logic/nuvem/fbgroups.py
new file mode 100644
index 0000000..cf0fe9c
--- /dev/null
+++ b/components/logic/nuvem/fbgroups.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, fbid, fb):
+    fid = fbid.get(r)
+    return fb.get((fid, 'groups'))
+
diff --git a/components/logic/nuvem/fbprofile.py b/components/logic/nuvem/fbprofile.py
new file mode 100644
index 0000000..c1d2166
--- /dev/null
+++ b/components/logic/nuvem/fbprofile.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, fbid, fb):
+    fid = fbid.get(r)
+    return fb.get((fid,))
+
diff --git a/components/logic/nuvem/filedb.py b/components/logic/nuvem/filedb.py
new file mode 100644
index 0000000..8b69665
--- /dev/null
+++ b/components/logic/nuvem/filedb.py
@@ -0,0 +1,29 @@
+#  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.
+
+def get(id, db, appname):
+    return db.get(("'filedb", appname.eval()) + id)
+
+def post(id, val, db, appname):
+    return db.post(("'filedb", appname.eval()) + id, val)
+
+def put(id, val, db, appname):
+    return db.put(("'filedb", appname.eval()) + id, val)
+
+def delete(id, db, appname):
+    return db.delete(("'filedb", appname.eval()) + id)
+
diff --git a/components/logic/nuvem/filter_.py b/components/logic/nuvem/filter_.py
new file mode 100644
index 0000000..343abcb
--- /dev/null
+++ b/components/logic/nuvem/filter_.py
@@ -0,0 +1,26 @@
+#  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.
+
+def get(r, item, cond, l):
+    iv = item.get(r)
+
+    def cfun(i):
+        return cond.get(((iv, i),) + r)
+
+    vl = l.get(r)
+    return tuple(filter(cfun, () if vl is None else vl))
+
diff --git a/components/logic/nuvem/first.py b/components/logic/nuvem/first.py
new file mode 100644
index 0000000..6a10d5e
--- /dev/null
+++ b/components/logic/nuvem/first.py
@@ -0,0 +1,25 @@
+#  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.
+
+def get(r, l):
+    lv = l.get(r)
+    if lv is None:
+        return None
+    if len(lv) == 0:
+        return None
+    return lv[0]
+
diff --git a/components/logic/nuvem/flkalbum.py b/components/logic/nuvem/flkalbum.py
new file mode 100644
index 0000000..81044c4
--- /dev/null
+++ b/components/logic/nuvem/flkalbum.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, id, flk):
+    idv = id.get(r)
+    return flk.get((("'id", idv), ("'lang", 'en-us'), ("'format", 'json')))
+
diff --git a/components/logic/nuvem/floor_.py b/components/logic/nuvem/floor_.py
new file mode 100644
index 0000000..313e29e
--- /dev/null
+++ b/components/logic/nuvem/floor_.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, x):
+    import math
+    vx = x.get(r)
+    return math.floor(float(0 if vx is None else vx))
+
diff --git a/components/logic/nuvem/format_.py b/components/logic/nuvem/format_.py
new file mode 100644
index 0000000..eb27692
--- /dev/null
+++ b/components/logic/nuvem/format_.py
@@ -0,0 +1,47 @@
+#  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.
+
+def get(r, fmt, args):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def isAssoc(v):
+        if not isList(v):
+            return False
+        if len(v) != 2:
+            return False
+        if isinstance(v[0], basestring) and v[0][0:1] == "'":
+            return True
+        return False
+
+    def trimq(x):
+        if not isinstance(x, basestring):
+            return x
+        return x[1:] if x[0:1] == "'" else x
+
+    l = args.get(r)
+    lv = () if l is None else l
+    la = map(trimq, filter(lambda x: not isAssoc(x), lv))
+    ka = dict(map(lambda x: (x[0][1:], x[1]), filter(lambda x: isAssoc(x), lv)))
+
+    vfmt = fmt.get(r)
+    return ('' if vfmt is None else str(vfmt)).format(*la, **ka)
+
diff --git a/components/logic/nuvem/frames.py b/components/logic/nuvem/frames.py
new file mode 100644
index 0000000..fa446e7
--- /dev/null
+++ b/components/logic/nuvem/frames.py
@@ -0,0 +1,56 @@
+#  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.
+
+def get(r, msec, loop, content):
+    import string
+
+    ms = msec.get(r)
+    if ms is None or ms == 0:
+        return ''
+    l = loop.get(r)
+    lv = 'infinite' if l is True else '1' if l is None or l is False else '{0:g}'.format(l) 
+
+    def keyframe(f):
+        t = f[0]
+        v = f[1]
+
+        def isList(v):
+            if getattr(v, '__iter__', False) == False:
+                return False
+            if isinstance(v, basestring) or isinstance(v, dict):
+                return False
+            return True
+
+        def isAssoc(v):
+            if not isList(v):
+                return False
+            if len(v) != 2:
+                return False
+            if isinstance(v[0], basestring) and v[0][0:1] == "'":
+                return True
+            return False
+
+        if isList(v):
+            return '{0:g}% {{ {1} }}'.format(t, string.join(map(lambda x: (x[0][1:] + ': ' + str(x[1]) + ';') if isAssoc(x) else (str(x) + ';'), v), ' '))
+
+        return '{0:g}% {{ {1} }}'.format(t, v)
+
+    kf = ' '.join(map(keyframe, content.get(r)))
+
+    uid = '{id}'
+    return 'position: absolute; -webkit-animation: {0} {1:g}s ease 0 {2} normal; -moz-animation: {0} {1:g}s ease 0 {2} normal; <style> @-webkit-keyframes {0} {{ {3} }} @-moz-keyframes {0} {{ {3} }} </style>'.format(uid, ms / 1000.0, lv, kf)
+
diff --git a/components/logic/nuvem/gaddress.py b/components/logic/nuvem/gaddress.py
new file mode 100644
index 0000000..8a1c9f8
--- /dev/null
+++ b/components/logic/nuvem/gaddress.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, a, s):
+    return s.get((("'address", str(a.get(r))), ("'sensor", 'true')))
+
diff --git a/components/logic/nuvem/get.py b/components/logic/nuvem/get.py
new file mode 100644
index 0000000..fd84934
--- /dev/null
+++ b/components/logic/nuvem/get.py
@@ -0,0 +1,29 @@
+#  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.
+
+def get(r, coll, id):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    idv = id.get(r)
+    res = coll.get(() if idv is None else idv if isList(idv) else (idv,))
+    return res
+
diff --git a/components/logic/nuvem/ggeopos.py b/components/logic/nuvem/ggeopos.py
new file mode 100644
index 0000000..e222d12
--- /dev/null
+++ b/components/logic/nuvem/ggeopos.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, lat, lng, s):
+    return s.get((("'latlng", str(lat.get(r)) + ',' + str(lng.get(r))), ("'sensor", 'true')))
+
diff --git a/components/logic/nuvem/gimages.py b/components/logic/nuvem/gimages.py
new file mode 100644
index 0000000..089adb1
--- /dev/null
+++ b/components/logic/nuvem/gimages.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, q, s):
+    return s.get((("'v", '1.0'), ("'rsz", 8), ("'q", q.get(r))))
+
diff --git a/components/logic/nuvem/gmap.py b/components/logic/nuvem/gmap.py
new file mode 100644
index 0000000..3642912
--- /dev/null
+++ b/components/logic/nuvem/gmap.py
@@ -0,0 +1,36 @@
+#  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 string
+
+def get(r, markers, s):
+
+    def ismarker(m):
+        return m[1] is not None
+
+    def marker(m):
+        # expecting (label or icon url, (color, loc))
+        label = m[0][1:]
+        deco = m[1][0]
+        loc = string.join(map(str, m[1][1:3]), ',')
+        if deco.find(':') == -1:
+            return ("'markers", 'color:{0}|label:{1}|{2}'.format(deco, label, loc))
+        return ("'markers", 'icon:{0}|{1}'.format(deco, loc))
+    
+    mv = markers.get(r)
+    return s.get((("'size", '320x320'), ("'maptype", 'roadmap'), ("'sensor", 'true')) + tuple(map(marker, filter(ismarker, () if mv is None else mv))))
+
diff --git a/components/logic/nuvem/greater.py b/components/logic/nuvem/greater.py
new file mode 100644
index 0000000..851eda9
--- /dev/null
+++ b/components/logic/nuvem/greater.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, a, b):
+    return a.get(r) > b.get(r)
+
diff --git a/components/logic/nuvem/gsearch.py b/components/logic/nuvem/gsearch.py
new file mode 100644
index 0000000..c213f03
--- /dev/null
+++ b/components/logic/nuvem/gsearch.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, q, s):
+    return s.get((("'v", '1.0'), ("'q", q.get(r))))
+
diff --git a/components/logic/nuvem/gweather.py b/components/logic/nuvem/gweather.py
new file mode 100644
index 0000000..e02062f
--- /dev/null
+++ b/components/logic/nuvem/gweather.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, zip, w):
+    return w.get((("'weather", zip.get(r)),))
+
diff --git a/components/logic/nuvem/host.py b/components/logic/nuvem/host.py
new file mode 100644
index 0000000..d17ca78
--- /dev/null
+++ b/components/logic/nuvem/host.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return prop.eval()
+
diff --git a/components/logic/nuvem/htattrs.py b/components/logic/nuvem/htattrs.py
new file mode 100644
index 0000000..d30bb4a
--- /dev/null
+++ b/components/logic/nuvem/htattrs.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, v):
+    return ("'htattrs", v.get(r))
+
diff --git a/components/logic/nuvem/htbutton.py b/components/logic/nuvem/htbutton.py
new file mode 100644
index 0000000..193cab2
--- /dev/null
+++ b/components/logic/nuvem/htbutton.py
@@ -0,0 +1,50 @@
+#  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 string
+
+def get(r, value):
+    v = value.get(r)
+
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def isAssoc(v):
+        if not isList(v):
+            return False
+        if len(v) != 2:
+            return False
+        if isinstance(v[0], basestring) and v[0][0:1] == "'":
+            return True
+        return False
+
+    def mkbutton(v):
+        vl = filter(lambda x: not isAssoc(x), v)
+        al = (filter(lambda x: isAssoc(x) and x[0] == "'htattrs", v) + (("'htattrs",()),))[0][1]
+        l = (() if len(vl) == 0 else (("'id", vl[0]), ("'value", vl[0])) if len(vl) == 1 else (("'id", vl[0]), ("'value", vl[1]))) + al
+        if len(l) == 0:
+            return ''
+        satts = string.join(map(lambda x: x[0][1:] + '="' + x[1] + '"', filter(lambda x: x[0] == "'id", l)), ' ')
+        batts = string.join(map(lambda x: x[0][1:] + '="' + x[1] + '"', filter(lambda x: x[0] != "'id", l)), ' ')
+        return '<SPAN {0} class="button"><INPUT type="button" {1} class="graybutton"/></SPAN>'.format(satts, batts)
+
+    return mkbutton(()) if v is None else mkbutton(v) if isList(v) and not isAssoc(v) else mkbutton((v,))
+
diff --git a/components/logic/nuvem/htcheck.py b/components/logic/nuvem/htcheck.py
new file mode 100644
index 0000000..5c15b93
--- /dev/null
+++ b/components/logic/nuvem/htcheck.py
@@ -0,0 +1,51 @@
+#  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 string
+
+def get(r, value):
+    v = value.get(r)
+
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def isAssoc(v):
+        if not isList(v):
+            return False
+        if len(v) != 2:
+            return False
+        if isinstance(v[0], basestring) and v[0][0:1] == "'":
+            return True
+        return False
+
+    def mkcheck(v):
+        vl = filter(lambda x: not isAssoc(x), v)
+        al = (filter(lambda x: isAssoc(x) and x[0] == "'htattrs", v) + (("'htattrs",()),))[0][1]
+        l = (() if len(vl) == 0 else (("'id", vl[0]), ("'value", vl[0])) if len(vl) == 1 else (("'id", vl[0]), ("'value", vl[1]))) + al
+        if len(l) == 0:
+            return '';
+        satts = string.join(map(lambda x: x[0][1:] + '="' + x[1] + '"', filter(lambda x: x[0] == "'id", l)), ' ')
+        catts = string.join(map(lambda x: x[0][1:] + '="' + x[1] + '"', filter(lambda x: x[0] != "'id", l)), ' ')
+        text = filter(lambda x: x[0] == "'value", l)[0][1]
+        return '<SPAN {0} class="checkbox"><INPUT type="checkbox" {1}/><SPAN>{2}</SPAN></SPAN>'.format(satts, catts, text)
+
+    return mkcheck(()) if v is None else mkcheck(v) if isList(v) and not isAssoc(v) else mkcheck((v,))
+
diff --git a/components/logic/nuvem/htimg.py b/components/logic/nuvem/htimg.py
new file mode 100644
index 0000000..70c6136
--- /dev/null
+++ b/components/logic/nuvem/htimg.py
@@ -0,0 +1,50 @@
+#  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 string
+
+def get(r, value):
+    v = value.get(r)
+
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def isAssoc(v):
+        if not isList(v):
+            return False
+        if len(v) != 2:
+            return False
+        if isinstance(v[0], basestring) and v[0][0:1] == "'":
+            return True
+        return False
+
+    def mkimg(v):
+        vl = filter(lambda x: not isAssoc(x), v)
+        al = (filter(lambda x: isAssoc(x) and x[0] == "'htattrs", v) + (("'htattrs",()),))[0][1]
+        l = (() if len(vl) == 0 else (("'id", vl[0]), ("'src", vl[0])) if len(vl) == 1 else (("'id", vl[0]), ("'src", vl[1]))) + al
+        if len(l) == 0:
+            return ''
+        satts = string.join(map(lambda x: x[0][1:] + '="' + x[1] + '"', filter(lambda x: x[0] == "'id", l)), ' ')
+        iatts = string.join(map(lambda x: ('style' if x[0] == "'htstyle" else x[0][1:]) + '="' + x[1] + '"', filter(lambda x: x[0] != "'id", l)), ' ')
+        return '<SPAN {0} class="img"><IMG {1}/></SPAN>'.format(satts, iatts)
+
+    return mkimg(()) if v is None else mkimg(v) if isList(v) and not isAssoc(v) else mkimg((v,))
+
diff --git a/components/logic/nuvem/htinline.py b/components/logic/nuvem/htinline.py
new file mode 100644
index 0000000..6e0551a
--- /dev/null
+++ b/components/logic/nuvem/htinline.py
@@ -0,0 +1,26 @@
+#  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 base64
+import string
+
+def get(r, img):
+    v = img.get(r)
+    if v is None:
+        return ''
+    return 'data:' + v[0] + ';base64,' + base64.encodestring(string.join(v[1], ''))
+
diff --git a/components/logic/nuvem/htlink.py b/components/logic/nuvem/htlink.py
new file mode 100644
index 0000000..4865591
--- /dev/null
+++ b/components/logic/nuvem/htlink.py
@@ -0,0 +1,51 @@
+#  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 string
+
+def get(r, value):
+    v = value.get(r)
+
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def isAssoc(v):
+        if not isList(v):
+            return False
+        if len(v) != 2:
+            return False
+        if isinstance(v[0], basestring) and v[0][0:1] == "'":
+            return True
+        return False
+
+    def mklink(v):
+        vl = filter(lambda x: not isAssoc(x), v)
+        al = (filter(lambda x: isAssoc(x) and x[0] == "'htattrs", v) + (("'htattrs",()),))[0][1]
+        l = (() if len(vl) == 0 else (("'id", vl[0]), ("'href", vl[0]), ("'value", vl[0])) if len(vl) == 1 else (("'id", vl[0]), ("'href", vl[0]), ("'value", vl[1])) if len(vl) == 2 else (("'id", vl[0]), ("'href", vl[1]), ("'value", vl[2]))) + al
+        if len(l) == 0:
+            return ''
+        satts = string.join(map(lambda x: x[0][1:] + '="' + x[1] + '"', filter(lambda x: x[0] == "'id", l)), ' ')
+        hatts = string.join(map(lambda x: x[0][1:] + '="' + x[1] + '"', filter(lambda x: x[0] != "'id" and x[0] != "'value", l)), ' ')
+        text = filter(lambda x: x[0] == "'value", l)[0][1]
+        return '<SPAN {0} class="link"><A {1}><SPAN>{2}</SPAN></A></SPAN>'.format(satts, hatts, text)
+
+    return mklink(()) if v is None else mklink(v) if isList(v) and not isAssoc(v) else mklink((v,))
+
diff --git a/components/logic/nuvem/htstyle.py b/components/logic/nuvem/htstyle.py
new file mode 100644
index 0000000..5e52b33
--- /dev/null
+++ b/components/logic/nuvem/htstyle.py
@@ -0,0 +1,47 @@
+#  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 string
+
+def get(r, value):
+    v = value.get(r)
+
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def isAssoc(v):
+        if not isList(v):
+            return False
+        if len(v) != 2:
+            return False
+        if isinstance(v[0], basestring) and v[0][0:1] == "'":
+            return True
+        return False
+
+    if v is None:
+        return ("'htstyle", '')
+
+    if isList(v):
+        lv = (v,) if isAssoc(v) else v
+        return ("'htstyle", string.join(map(lambda x: (x[0][1:] + ': ' + str(x[1]) + ';') if isAssoc(x) else (str(x) + ';'), lv), ' '))
+
+    return ("'htstyle", v + ';')
+
diff --git a/components/logic/nuvem/if_.py b/components/logic/nuvem/if_.py
new file mode 100644
index 0000000..17a261b
--- /dev/null
+++ b/components/logic/nuvem/if_.py
@@ -0,0 +1,24 @@
+#  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.
+
+def get(r, cond, then, els):
+    vc = cond.get(r)
+    if vc:
+        return then.get(r)
+    else:
+        return els.get(r)
+
diff --git a/components/logic/nuvem/insert.py b/components/logic/nuvem/insert.py
new file mode 100644
index 0000000..6a78a81
--- /dev/null
+++ b/components/logic/nuvem/insert.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, first, rest):
+    vf = first.get(r)
+    vr = rest.get(r)
+    return (vf,) + (() if vr is None else vr)
+
diff --git a/components/logic/nuvem/item.py b/components/logic/nuvem/item.py
new file mode 100644
index 0000000..19e565a
--- /dev/null
+++ b/components/logic/nuvem/item.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, v, prop):
+    return ("'" + prop.eval(), v.get(r))
+
diff --git a/components/logic/nuvem/itemnb.py b/components/logic/nuvem/itemnb.py
new file mode 100644
index 0000000..25d4cd6
--- /dev/null
+++ b/components/logic/nuvem/itemnb.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, i, l):
+    lv = l.get(r)
+    vi = i.get(r)
+    return (() if lv is None else lv)[0 if vi is None else int(vi)]
+
diff --git a/components/logic/nuvem/join.py b/components/logic/nuvem/join.py
new file mode 100644
index 0000000..d3bfd86
--- /dev/null
+++ b/components/logic/nuvem/join.py
@@ -0,0 +1,24 @@
+#  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 string
+
+def get(r, sep, l):
+    s = sep.get(r)
+    lv = l.get(r)
+    return string.join(() if lv is None else lv, '' if s is None else s)
+
diff --git a/components/logic/nuvem/keychain.py b/components/logic/nuvem/keychain.py
new file mode 100644
index 0000000..44e6653
--- /dev/null
+++ b/components/logic/nuvem/keychain.py
@@ -0,0 +1,38 @@
+#  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.
+
+def get(r, n, a):
+    nv = n.get(r)
+    ntv = nv[1:] if nv[0:1] == "'" else nv
+    av = a.get(r)
+
+    content = filter(lambda e: e[0] == "'content", av[0])
+    account = filter(lambda e: e[0] == "'account", () if len(content) == 0 else content[0])
+    keys = filter(lambda e: e[0] == "'keys", () if len(account) == 0 else account[0])
+    key = filter(lambda e: e[0] == "'key", () if len(keys) == 0 else keys[0])
+    ekey = () if len(key) == 0 else key[0]
+    akey = () if len(ekey) < 2 else ekey[1]
+
+    def namedkey(k):
+        return len(filter(lambda e: e[0] == "'@name" and e[1] == ntv, k)) != 0
+
+    def keyvalue(k):
+        return filter(lambda e: e[0] == "'@value", k)
+
+    kv = map(keyvalue, filter(namedkey, akey))
+    return None if len(kv) == 0 else kv[0][0][1]
+
diff --git a/components/logic/nuvem/last.py b/components/logic/nuvem/last.py
new file mode 100644
index 0000000..81613ae
--- /dev/null
+++ b/components/logic/nuvem/last.py
@@ -0,0 +1,25 @@
+#  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.
+
+def get(r, l):
+    lv = l.get(r)
+    if lv is None:
+        return None
+    if len(lv) == 0:
+        return None
+    return lv[len(lv) - 1]
+
diff --git a/components/logic/nuvem/left.py b/components/logic/nuvem/left.py
new file mode 100644
index 0000000..1daee39
--- /dev/null
+++ b/components/logic/nuvem/left.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, n):
+    vn = n.get(r)
+    return 'left: {0:g}px'.format(round(0 if vn is None else float(vn), 0))
+
diff --git a/components/logic/nuvem/lesser.py b/components/logic/nuvem/lesser.py
new file mode 100644
index 0000000..622dd36
--- /dev/null
+++ b/components/logic/nuvem/lesser.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, a, b):
+    return a.get(r) < b.get(r)
+
diff --git a/components/logic/nuvem/list_.py b/components/logic/nuvem/list_.py
new file mode 100644
index 0000000..0b6114c
--- /dev/null
+++ b/components/logic/nuvem/list_.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(*args):
+    r = args[0]
+    return tuple(map(lambda x: x.get(r), args[1:len(args) - 1]))
+
diff --git a/components/logic/nuvem/location.py b/components/logic/nuvem/location.py
new file mode 100644
index 0000000..2f45687
--- /dev/null
+++ b/components/logic/nuvem/location.py
@@ -0,0 +1,23 @@
+#  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.
+
+def get(r, content):
+    if r[0:1] == ('setup',):
+        return 'setupLocationHandler();'
+
+    return content.get(r)
+
diff --git a/components/logic/nuvem/lookup.py b/components/logic/nuvem/lookup.py
new file mode 100644
index 0000000..d61d032
--- /dev/null
+++ b/components/logic/nuvem/lookup.py
@@ -0,0 +1,55 @@
+#  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.
+
+# Return a list of name value pairs that match a name
+def get(r, n, l):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def isAssoc(v):
+        return isList(v) and len(v) == 2 and isinstance(v[0], basestring) and v[0][0:1] == "'"
+
+    def lookup(nv, lv):
+        if lv == ():
+            return ()
+
+        # Check if list element is a name value pair assoc
+        a = lv[0]
+        if not isAssoc(a):
+            return lookup(nv, lv[1:])
+
+        # Got a match, return it and lookup rest of the list
+        an = "'" + a[0][2:] if a[0][0:2] == "'@" else a[0]
+        if an == nv:
+            return (a,) + lookup(nv, lv[1:])
+
+        # No match, lookup rest of the list
+        return lookup(nv, lv[1:])
+
+    def qsymbol(x):
+        if not isinstance(x, basestring):
+            return x
+        return x if x[0:1] == "'" else "'" + x
+
+    nv = n.get(r)
+    lv = l.get(r)
+    return lookup(qsymbol(nv), () if lv is None else lv)
+
diff --git a/components/logic/nuvem/lowercase.py b/components/logic/nuvem/lowercase.py
new file mode 100644
index 0000000..461e3ed
--- /dev/null
+++ b/components/logic/nuvem/lowercase.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, s):
+    vs = s.get(r)
+    return ('' if vs is None else str(vs)).lower()
+
diff --git a/components/logic/nuvem/map_.py b/components/logic/nuvem/map_.py
new file mode 100644
index 0000000..4194d62
--- /dev/null
+++ b/components/logic/nuvem/map_.py
@@ -0,0 +1,26 @@
+#  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.
+
+def get(r, item, transform, l):
+    iv = item.get(r)
+
+    def tfun(i):
+        return transform.get(((iv, i),) + r)
+
+    lv = l.get(r)
+    return tuple(map(tfun, () if lv is None else lv))
+
diff --git a/components/logic/nuvem/max_.py b/components/logic/nuvem/max_.py
new file mode 100644
index 0000000..74534fc
--- /dev/null
+++ b/components/logic/nuvem/max_.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, l):
+    lv = l.get(r)
+    return max(() if lv is None else lv)
+
diff --git a/components/logic/nuvem/min_.py b/components/logic/nuvem/min_.py
new file mode 100644
index 0000000..bb0c0bc
--- /dev/null
+++ b/components/logic/nuvem/min_.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, l):
+    lv = l.get(r)
+    return min(() if lv is None else lv)
+
diff --git a/components/logic/nuvem/mod.py b/components/logic/nuvem/mod.py
new file mode 100644
index 0000000..3f0fc05
--- /dev/null
+++ b/components/logic/nuvem/mod.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, n, x):
+    vx = x.get(r)
+    vn = n.get(r)
+    return float(0 if vx is None else vx) % float(1 if vn is None else vn)
+
diff --git a/components/logic/nuvem/multiply.py b/components/logic/nuvem/multiply.py
new file mode 100644
index 0000000..ad60c35
--- /dev/null
+++ b/components/logic/nuvem/multiply.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, a, b):
+    va = a.get(r)
+    vb = b.get(r)
+    return float(0 if va is None else va) * float(0 if vb is None else vb)
+
diff --git a/components/logic/nuvem/name.py b/components/logic/nuvem/name.py
new file mode 100644
index 0000000..f5582dc
--- /dev/null
+++ b/components/logic/nuvem/name.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return "'" + prop.eval()
+
diff --git a/components/logic/nuvem/names.py b/components/logic/nuvem/names.py
new file mode 100644
index 0000000..f30f5d1
--- /dev/null
+++ b/components/logic/nuvem/names.py
@@ -0,0 +1,23 @@
+#  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.
+
+def get(r, l):
+    lv = l.get(r)
+    if lv is None:
+        return lv
+    return tuple(map(lambda p: p[0], lv))
+
diff --git a/components/logic/nuvem/nosqldb.py b/components/logic/nuvem/nosqldb.py
new file mode 100644
index 0000000..6458940
--- /dev/null
+++ b/components/logic/nuvem/nosqldb.py
@@ -0,0 +1,29 @@
+#  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.
+
+def get(id, db, appname):
+    return db.get(("'nosqldb", appname.eval()) + id);
+
+def post(id, val, db, appname):
+    return db.post(("'nosqldb", appname.eval()) + id, val);
+
+def put(id, val, db, appname):
+    return db.put(("'nosqldb", appname.eval()) + id, val);
+
+def delete(id, db, appname):
+    return db.delete(("'nosqldb", appname.eval()) + id);
+
diff --git a/components/logic/nuvem/not_.py b/components/logic/nuvem/not_.py
new file mode 100644
index 0000000..fd20a95
--- /dev/null
+++ b/components/logic/nuvem/not_.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, expr):
+    return not expr.get(r)
+
diff --git a/components/logic/nuvem/nothing.py b/components/logic/nuvem/nothing.py
new file mode 100644
index 0000000..5b144cb
--- /dev/null
+++ b/components/logic/nuvem/nothing.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r):
+    return None
+
diff --git a/components/logic/nuvem/now.py b/components/logic/nuvem/now.py
new file mode 100644
index 0000000..b001511
--- /dev/null
+++ b/components/logic/nuvem/now.py
@@ -0,0 +1,24 @@
+#  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.
+
+def get(r, f):
+    from datetime import datetime
+    fv = f.get(r)
+    if fv is None:
+        return datetime.now().ctime()
+    return datetime.now().strftime(fv)
+
diff --git a/components/logic/nuvem/number.py b/components/logic/nuvem/number.py
new file mode 100644
index 0000000..8548431
--- /dev/null
+++ b/components/logic/nuvem/number.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return float(prop.eval())
+
diff --git a/components/logic/nuvem/or_.py b/components/logic/nuvem/or_.py
new file mode 100644
index 0000000..eea7aa9
--- /dev/null
+++ b/components/logic/nuvem/or_.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, a, b):
+    va = a.get(r)
+    vb = b.get(r)
+    return (False if va is None else bool(va)) or (False if vb is None else bool(vb))
+
diff --git a/components/logic/nuvem/pair.py b/components/logic/nuvem/pair.py
new file mode 100644
index 0000000..dbfd41c
--- /dev/null
+++ b/components/logic/nuvem/pair.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, a, b):
+    return (a.get(r), b.get(r))
+
diff --git a/components/logic/nuvem/param.py b/components/logic/nuvem/param.py
new file mode 100644
index 0000000..c67ab5a
--- /dev/null
+++ b/components/logic/nuvem/param.py
@@ -0,0 +1,28 @@
+#  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.
+
+def get(r, name, params):
+    def lookup(nv, lv):
+        if lv == ():
+            return None
+        a = lv[0]
+        if a[0] == nv:
+            return a[1]
+        return lookup(nv, lv[1:])
+
+    return lookup("'" + name.eval(), params.eval())
+
diff --git a/components/logic/nuvem/params.py b/components/logic/nuvem/params.py
new file mode 100644
index 0000000..d17ca78
--- /dev/null
+++ b/components/logic/nuvem/params.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return prop.eval()
+
diff --git a/components/logic/nuvem/parse.py b/components/logic/nuvem/parse.py
new file mode 100644
index 0000000..d019813
--- /dev/null
+++ b/components/logic/nuvem/parse.py
@@ -0,0 +1,25 @@
+#  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 re
+
+def get(r, expr, s):
+    ev = expr.get(r)
+    sv = s.get(r)
+    m = re.search('' if ev is None else ev, '' if sv is None else sv)
+    return () if m is None else m.groups()
+
diff --git a/components/logic/nuvem/path.py b/components/logic/nuvem/path.py
new file mode 100644
index 0000000..0df2a29
--- /dev/null
+++ b/components/logic/nuvem/path.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, prop):
+    p = prop.eval()
+    return p[2:] if p[0:1] == ('components',) else p
+
diff --git a/components/logic/nuvem/pi_.py b/components/logic/nuvem/pi_.py
new file mode 100644
index 0000000..9a76a0c
--- /dev/null
+++ b/components/logic/nuvem/pi_.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r):
+    from math import pi
+    return pi
+
diff --git a/components/logic/nuvem/picalbum.py b/components/logic/nuvem/picalbum.py
new file mode 100644
index 0000000..d970ff0
--- /dev/null
+++ b/components/logic/nuvem/picalbum.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, id, pic):
+    idv = id.get(r)
+    return pic.get((idv, ("'kind", 'photo'), ("'max-results", 20)))
+
diff --git a/components/logic/nuvem/pixels.py b/components/logic/nuvem/pixels.py
new file mode 100644
index 0000000..f65fcc7
--- /dev/null
+++ b/components/logic/nuvem/pixels.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, n):
+    vn = n.get(r)
+    return '{0:g}px'.format(round(0 if vn is None else float(vn), 0))
+
diff --git a/components/logic/nuvem/post.py b/components/logic/nuvem/post.py
new file mode 100644
index 0000000..cf77469
--- /dev/null
+++ b/components/logic/nuvem/post.py
@@ -0,0 +1,28 @@
+#  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.
+
+def get(r, coll, id, val):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    idv = id.get(r)
+    return coll.post(() if idv is None else idv if isList(idv) else (idv,), val.get(r))
+
diff --git a/components/logic/nuvem/put.py b/components/logic/nuvem/put.py
new file mode 100644
index 0000000..f7c9eea
--- /dev/null
+++ b/components/logic/nuvem/put.py
@@ -0,0 +1,28 @@
+#  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.
+
+def get(r, coll, id, val):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    idv = id.get(r)
+    return coll.put(() if idv is None else idv if isList(idv) else (idv,), val.get(r))
+
diff --git a/components/logic/nuvem/random_.py b/components/logic/nuvem/random_.py
new file mode 100644
index 0000000..d76e88c
--- /dev/null
+++ b/components/logic/nuvem/random_.py
@@ -0,0 +1,33 @@
+#  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.
+
+def get(r, m):
+    import random
+    mv = m.get(r)
+
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    if isList(mv):
+        return random.choice(mv)
+
+    return random.random() * (1.0 if mv is None else mv)
+
diff --git a/components/logic/nuvem/randoms.py b/components/logic/nuvem/randoms.py
new file mode 100644
index 0000000..de99b05
--- /dev/null
+++ b/components/logic/nuvem/randoms.py
@@ -0,0 +1,34 @@
+#  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.
+
+def get(r, n, m):
+    import random
+    mv = m.get(r)
+    nv = n.get(r)
+
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    if isList(mv):
+        return tuple(map(lambda i: random.choice(mv), tuple(range(0, int(0 if nv is None else nv)))))
+
+    return tuple(map(lambda i: random.random() * (1.0 if mv is None else mv), tuple(range(0, int(0 if nv is None else nv)))))
+
diff --git a/components/logic/nuvem/range_.py b/components/logic/nuvem/range_.py
new file mode 100644
index 0000000..cdc7c24
--- /dev/null
+++ b/components/logic/nuvem/range_.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, a, b):
+    va = a.get(r)
+    vb = b.get(r)
+    return tuple(range(int(0 if va is None else va), int(0 if vb is None else vb)))
+
diff --git a/components/logic/nuvem/realm.py b/components/logic/nuvem/realm.py
new file mode 100644
index 0000000..d17ca78
--- /dev/null
+++ b/components/logic/nuvem/realm.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return prop.eval()
+
diff --git a/components/logic/nuvem/reduce_.py b/components/logic/nuvem/reduce_.py
new file mode 100644
index 0000000..ed5e949
--- /dev/null
+++ b/components/logic/nuvem/reduce_.py
@@ -0,0 +1,27 @@
+#  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.
+
+def get(r, item, accum, transform, init, l):
+    iv = item.get(r)
+    av = accum.get(r)
+
+    def tfun(a, i):
+        return transform.get(((av, a), (iv, i)) + r)
+
+    lv = l.get(r)
+    return reduce(tfun, () if lv is None else lv, init.get(r))
+
diff --git a/components/logic/nuvem/replace.py b/components/logic/nuvem/replace.py
new file mode 100644
index 0000000..5ce41fd
--- /dev/null
+++ b/components/logic/nuvem/replace.py
@@ -0,0 +1,23 @@
+#  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.
+
+def get(r, fr, to, s):
+    vfr = fr.get(r)
+    vto = to.get(r)
+    vs = s.get(r)
+    return ('' if vs is None else str(vs)).replace('' if vfr is None else str(vfr), '' if vto is None else str(vto))
+
diff --git a/components/logic/nuvem/rest.py b/components/logic/nuvem/rest.py
new file mode 100644
index 0000000..cd23115
--- /dev/null
+++ b/components/logic/nuvem/rest.py
@@ -0,0 +1,23 @@
+#  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.
+
+def get(r, l):
+    vl = l.get(r)
+    if vl is None:
+        return ()
+    return vl[1:]
+
diff --git a/components/logic/nuvem/reverse.py b/components/logic/nuvem/reverse.py
new file mode 100644
index 0000000..61361e2
--- /dev/null
+++ b/components/logic/nuvem/reverse.py
@@ -0,0 +1,25 @@
+#  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.
+
+def get(r, l):
+    vl = l.get(r)
+    if vl is None:
+        return ()
+    rl = list(vl)
+    rl.reverse()
+    return tuple(rl)
+
diff --git a/components/logic/nuvem/round_.py b/components/logic/nuvem/round_.py
new file mode 100644
index 0000000..f2bbe0d
--- /dev/null
+++ b/components/logic/nuvem/round_.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, n, x):
+    vx = x.get(r)
+    vn = n.get(r)
+    return round(float(0 if vx is None else vx), int(0 if vn is None else vn))
+
diff --git a/components/logic/nuvem/second.py b/components/logic/nuvem/second.py
new file mode 100644
index 0000000..79acf79
--- /dev/null
+++ b/components/logic/nuvem/second.py
@@ -0,0 +1,25 @@
+#  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.
+
+def get(r, l):
+    lv = l.get(r)
+    if lv is None:
+        return lv
+    if len(lv) < 2:
+        return None
+    return lv[1]
+
diff --git a/components/logic/nuvem/select.py b/components/logic/nuvem/select.py
new file mode 100644
index 0000000..bf10a75
--- /dev/null
+++ b/components/logic/nuvem/select.py
@@ -0,0 +1,72 @@
+#  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.
+
+# Return a list of name value pairs that match a name
+# Search through nested lists of name value pairs
+def get(r, p, l):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def isAssoc(v):
+        return isList(v) and len(v) >= 2 and isinstance(v[0], basestring) and v[0][0:1] == "'"
+
+    def lookup(pv, lv):
+        if lv == ():
+            return ()
+        if isAssoc(lv):
+            lv = (lv,)
+
+        # Check if list element is a name value pair assoc
+        a = lv[0]
+        if not isAssoc(a):
+            # Lookup children if any and rest of list
+            if isList(a):
+                return lookup(pv, a) + lookup(pv, lv[1:])
+            return lookup(pv, lv[1:])
+
+        # Path segment match
+        an = "'" + a[0][2:] if a[0][0:2] == "'@" else a[0]
+        if an == pv[0]:
+            # Found leaf, return it and lookup rest of the list
+            if len(pv) == 1:
+                return (a,) + lookup(pv, lv[1:])
+            # Continue to lookup children if any plus rest of the list
+            return lookup(pv[1:], a[1:]) + lookup(pv, lv[1:])
+
+        # No match, lookup any children and rest of the list
+        if (isList(a[1])):
+            return lookup(pv, a[1]) + lookup(pv, a[2:]) + lookup(pv, lv[1:])
+        return lookup(pv, a[2:]) + lookup(pv, lv[1:])
+
+    def qsymbol(x):
+        if not isinstance(x, basestring):
+            return x
+        return x if x[0:1] == "'" else "'" + x
+
+    # Support path as a list or a dot separated string
+    lv = l.get(r)
+    pv = p.get(r)
+    if (isList(pv)):
+        return lookup(map(qsymbol, pv), () if lv is None else lv)
+
+    spv = map(qsymbol, qsymbol(pv)[1:].split('.'))
+    return lookup(spv, () if lv is None else lv)
+
diff --git a/components/logic/nuvem/service.py b/components/logic/nuvem/service.py
new file mode 100644
index 0000000..80b0529
--- /dev/null
+++ b/components/logic/nuvem/service.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, content):
+    return content.get(r)
+
diff --git a/components/logic/nuvem/shuffle_.py b/components/logic/nuvem/shuffle_.py
new file mode 100644
index 0000000..7b55c45
--- /dev/null
+++ b/components/logic/nuvem/shuffle_.py
@@ -0,0 +1,26 @@
+#  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.
+
+def get(r, l):
+    from random import shuffle
+    vl = l.get(r)
+    if vl is None:
+        return ()
+    rl = list(vl)
+    shuffle(rl)
+    return tuple(rl)
+
diff --git a/components/logic/nuvem/sin_.py b/components/logic/nuvem/sin_.py
new file mode 100644
index 0000000..1bbefc7
--- /dev/null
+++ b/components/logic/nuvem/sin_.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, x):
+    from math import sin
+    vx = x.get(r)
+    return sin(float(0 if vx is None else vx))
+
diff --git a/components/logic/nuvem/single.py b/components/logic/nuvem/single.py
new file mode 100644
index 0000000..29e237e
--- /dev/null
+++ b/components/logic/nuvem/single.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, x):
+    return (x.get(r),)
+
diff --git a/components/logic/nuvem/split.py b/components/logic/nuvem/split.py
new file mode 100644
index 0000000..2ff9807
--- /dev/null
+++ b/components/logic/nuvem/split.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, sep, s):
+    vsep = sep.get(r)
+    vs = s.get(r)
+    return tuple(('' if vs is None else str(vs)).split('' if vsep is None else str(vsep)))
+
diff --git a/components/logic/nuvem/sqldb.py b/components/logic/nuvem/sqldb.py
new file mode 100644
index 0000000..184d83a
--- /dev/null
+++ b/components/logic/nuvem/sqldb.py
@@ -0,0 +1,29 @@
+#  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.
+
+def get(id, db, appname):
+    return db.get(("'sqldb", appname.eval()) + id);
+
+def post(id, val, db, appname):
+    return db.post(("'sqldb", appname.eval()) + id, val);
+
+def put(id, val, db, appname):
+    return db.put(("'sqldb", appname.eval()) + id, val);
+
+def delete(id, db, appname):
+    return db.delete(("'sqldb", appname.eval()) + id);
+
diff --git a/components/logic/nuvem/start.py b/components/logic/nuvem/start.py
new file mode 100644
index 0000000..80b0529
--- /dev/null
+++ b/components/logic/nuvem/start.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, content):
+    return content.get(r)
+
diff --git a/components/logic/nuvem/stop.py b/components/logic/nuvem/stop.py
new file mode 100644
index 0000000..80b0529
--- /dev/null
+++ b/components/logic/nuvem/stop.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, content):
+    return content.get(r)
+
diff --git a/components/logic/nuvem/subtract.py b/components/logic/nuvem/subtract.py
new file mode 100644
index 0000000..bb791df
--- /dev/null
+++ b/components/logic/nuvem/subtract.py
@@ -0,0 +1,22 @@
+#  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.
+
+def get(r, a, b):
+    va = a.get(r)
+    vb = b.get(r)
+    return float(0 if va is None else va) - float(0 if vb is None else vb)
+
diff --git a/components/logic/nuvem/sum_.py b/components/logic/nuvem/sum_.py
new file mode 100644
index 0000000..1ecfc79
--- /dev/null
+++ b/components/logic/nuvem/sum_.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, l):
+    vl = l.get(r)
+    return sum(() if vl is None else vl)
+
diff --git a/components/logic/nuvem/text.py b/components/logic/nuvem/text.py
new file mode 100644
index 0000000..d17ca78
--- /dev/null
+++ b/components/logic/nuvem/text.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return prop.eval()
+
diff --git a/components/logic/nuvem/timer.py b/components/logic/nuvem/timer.py
new file mode 100644
index 0000000..97a2367
--- /dev/null
+++ b/components/logic/nuvem/timer.py
@@ -0,0 +1,26 @@
+#  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.
+
+def get(r, msec, content):
+    if r[0:1] == ('setup',):
+        ms = msec.get(r)
+        if ms is None or ms == 0:
+            return ''
+        return 'setupIntervalHandler(' + str(int(ms)) + ');'
+
+    return content.get(r)
+
diff --git a/components/logic/nuvem/top.py b/components/logic/nuvem/top.py
new file mode 100644
index 0000000..87b75e6
--- /dev/null
+++ b/components/logic/nuvem/top.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, n):
+    vn = n.get(r)
+    return 'top: {0:g}px'.format(round(0 if vn is None else float(vn), 0))
+
diff --git a/components/logic/nuvem/transform.py b/components/logic/nuvem/transform.py
new file mode 100644
index 0000000..4973176
--- /dev/null
+++ b/components/logic/nuvem/transform.py
@@ -0,0 +1,26 @@
+#  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.
+
+def get(r, x, y, d):
+    vx = x.get(r)
+    vy = y.get(r)
+    vd = d.get(r)
+    rx = round(float(0 if vx is None else vx), 0)
+    ry = round(float(0 if vy is None else vy), 0)
+    rd = round(float(0 if vd is None else vd), 0)
+    return 'position: absolute; -webkit-transform: translate3d({0:g}px,{1:g}px,0px) rotate({2:g}deg); -moz-transform: translate({0:g}px,{1:g}px) rotate({2:g}deg); -ms-transform: translate({0:g}px,{1:g}px) rotate({2:g}deg); transform: translate({0:g}px,{1:g}px) rotate({2:g}deg)'.format(rx, ry, rd)
+
diff --git a/components/logic/nuvem/transition.py b/components/logic/nuvem/transition.py
new file mode 100644
index 0000000..99c4a1a
--- /dev/null
+++ b/components/logic/nuvem/transition.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, n):
+    vn = n.get(r)
+    return '-webkit-transition: all {0}s'.format(float(0 if vn is None else vn) / 1000.0)
+
diff --git a/components/logic/nuvem/triple.py b/components/logic/nuvem/triple.py
new file mode 100644
index 0000000..72ba3b8
--- /dev/null
+++ b/components/logic/nuvem/triple.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, a, b, c):
+    return (a.get(r), b.get(r), c.get(r))
+
diff --git a/components/logic/nuvem/true_.py b/components/logic/nuvem/true_.py
new file mode 100644
index 0000000..ce806cc
--- /dev/null
+++ b/components/logic/nuvem/true_.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r):
+    return True
+
diff --git a/components/logic/nuvem/twfollowers.py b/components/logic/nuvem/twfollowers.py
new file mode 100644
index 0000000..ff1dff1
--- /dev/null
+++ b/components/logic/nuvem/twfollowers.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, twid, tw):
+    tid = twid.get(r)
+    return tw.get((("'screen_name", tid),))
+
diff --git a/components/logic/nuvem/twfriends.py b/components/logic/nuvem/twfriends.py
new file mode 100644
index 0000000..ff1dff1
--- /dev/null
+++ b/components/logic/nuvem/twfriends.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, twid, tw):
+    tid = twid.get(r)
+    return tw.get((("'screen_name", tid),))
+
diff --git a/components/logic/nuvem/twprofile.py b/components/logic/nuvem/twprofile.py
new file mode 100644
index 0000000..ff1dff1
--- /dev/null
+++ b/components/logic/nuvem/twprofile.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, twid, tw):
+    tid = twid.get(r)
+    return tw.get((("'screen_name", tid),))
+
diff --git a/components/logic/nuvem/twsms.py b/components/logic/nuvem/twsms.py
new file mode 100644
index 0000000..a42eae3
--- /dev/null
+++ b/components/logic/nuvem/twsms.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, sid, tok, fr, to, msg, s):
+    return s.get('app://twsms', ('c', 'send', ("'sid", sid.get(r)), ("'token", tok.get(r)), ("'from", fr.get(r)), ("'to", to.get(r)), ("'msg", msg.get(r))))
+
diff --git a/components/logic/nuvem/twtimeline.py b/components/logic/nuvem/twtimeline.py
new file mode 100644
index 0000000..ff1dff1
--- /dev/null
+++ b/components/logic/nuvem/twtimeline.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, twid, tw):
+    tid = twid.get(r)
+    return tw.get((("'screen_name", tid),))
+
diff --git a/components/logic/nuvem/uppercase.py b/components/logic/nuvem/uppercase.py
new file mode 100644
index 0000000..82bf0da
--- /dev/null
+++ b/components/logic/nuvem/uppercase.py
@@ -0,0 +1,21 @@
+#  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.
+
+def get(r, s):
+    vs = s.get(r)
+    return ('' if vs is None else str(vs)).upper()
+
diff --git a/components/logic/nuvem/url.py b/components/logic/nuvem/url.py
new file mode 100644
index 0000000..82bad01
--- /dev/null
+++ b/components/logic/nuvem/url.py
@@ -0,0 +1,42 @@
+#  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.
+
+def get(r, address, args):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def isAssoc(v):
+        if not isList(v):
+            return False
+        if len(v) != 2:
+            return False
+        if isinstance(v[0], basestring) and v[0][0:1] == "'":
+            return True
+        return False
+
+    l = args.get(r)
+    lv = () if l is None else l
+    la = map(lambda x: str(x), filter(lambda x: not isAssoc(x), lv))
+    ka = map(lambda x: '='.join((x[0][1:], str(x[1]))), filter(lambda x: isAssoc(x), lv))
+
+    va = address.get(r)
+    return ('' if va is None else str(va)) + '/'.join(la) + ('?' if len(ka) != 0 else '') + '&'.join(ka)
+
diff --git a/components/logic/nuvem/user.py b/components/logic/nuvem/user.py
new file mode 100644
index 0000000..d17ca78
--- /dev/null
+++ b/components/logic/nuvem/user.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, prop):
+    return prop.eval()
+
diff --git a/components/logic/nuvem/valueof.py b/components/logic/nuvem/valueof.py
new file mode 100644
index 0000000..60e5878
--- /dev/null
+++ b/components/logic/nuvem/valueof.py
@@ -0,0 +1,35 @@
+#  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.
+
+def get(r, name):
+    def isList(v):
+        if getattr(v, '__iter__', False) == False:
+            return False
+        if isinstance(v, basestring) or isinstance(v, dict):
+            return False
+        return True
+
+    def lookup(n, r):
+        if r == ():
+            return None
+        a = r[0]
+        if isList(a) and a[0] == n:
+            return a[1]
+        return lookup(n, r[1:])
+
+    return lookup("'" + name.eval(), r)
+
diff --git a/components/logic/nuvem/values.py b/components/logic/nuvem/values.py
new file mode 100644
index 0000000..620eab4
--- /dev/null
+++ b/components/logic/nuvem/values.py
@@ -0,0 +1,23 @@
+#  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.
+
+def get(r, l):
+    lv = l.get(r)
+    if lv is None:
+        return lv
+    return tuple(map(lambda p: p[1], lv))
+
diff --git a/components/logic/nuvem/ysearch.py b/components/logic/nuvem/ysearch.py
new file mode 100644
index 0000000..f6d0994
--- /dev/null
+++ b/components/logic/nuvem/ysearch.py
@@ -0,0 +1,20 @@
+#  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.
+
+def get(r, q, s):
+    return s.get((("'appid", 'YahooDemo'), ("'query", q.get(r)), ("'output", 'json')))
+
diff --git a/components/logic/property.py b/components/logic/property.py
new file mode 100644
index 0000000..1cbb4b2
--- /dev/null
+++ b/components/logic/property.py
@@ -0,0 +1,38 @@
+#  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.
+
+# Mockup component properties for testing
+
+class property:
+    def __init__(self, name, l):
+        self.name = name
+        self.l = l
+
+    def __call__(self, *args):
+        return self.l(*args)
+
+    def __getattr__(self, name):
+        if name == "eval":
+            return self
+        raise AttributeError()
+
+    def __repr__(self):
+        return repr((self.name, self.l()))
+
+def mkprop(name, l):
+    return property(name, l)
+
diff --git a/components/logic/reference.py b/components/logic/reference.py
new file mode 100644
index 0000000..fe4a66a
--- /dev/null
+++ b/components/logic/reference.py
@@ -0,0 +1,38 @@
+#  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.
+
+# Mockup component references for testing
+
+class reference:
+    def __init__(self, name, l):
+        self.name = name
+        self.l = l
+
+    def __call__(self, *args):
+        return self.l(*args)
+
+    def __getattr__(self, name):
+        if name == "get" or name == "put":
+            return self
+        raise AttributeError()
+
+    def __repr__(self):
+        return repr((self.name, self.l))
+
+def mkref(name, l):
+    return reference(name, l)
+
diff --git a/components/logic/test.py b/components/logic/test.py
new file mode 100755
index 0000000..a6e3856
--- /dev/null
+++ b/components/logic/test.py
@@ -0,0 +1,295 @@
+#!/usr/bin/python
+#  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.
+
+# Test the simple parallel programming components
+
+import unittest
+from property import *
+from reference import *
+from environment import *
+
+from nuvem import true_
+from nuvem import false_
+from nuvem import number
+from nuvem import text
+from nuvem import comment
+from nuvem import name
+from nuvem import nothing
+from nuvem import item
+from nuvem import single
+from nuvem import pair
+from nuvem import triple
+from nuvem import call
+from nuvem import if_
+from nuvem import and_
+from nuvem import or_
+from nuvem import not_
+from nuvem import equals
+from nuvem import lesser
+from nuvem import greater
+from nuvem import list_
+from nuvem import empty
+from nuvem import first
+from nuvem import second
+from nuvem import rest
+from nuvem import insert
+from nuvem import append
+from nuvem import itemnb
+from nuvem import names
+from nuvem import values
+from nuvem import lookup
+from nuvem import select
+from nuvem import reverse
+from nuvem import shuffle_
+from nuvem import range_
+from nuvem import map_
+from nuvem import valueof
+from nuvem import filter_
+from nuvem import reduce_
+from nuvem import add
+from nuvem import subtract
+from nuvem import multiply
+from nuvem import divide
+from nuvem import random_
+from nuvem import randoms
+from nuvem import sin_
+from nuvem import cos_
+from nuvem import round_
+from nuvem import floor_
+from nuvem import ceil_
+from nuvem import mod
+from nuvem import sum_
+from nuvem import min_
+from nuvem import max_
+from nuvem import host
+from nuvem import path
+from nuvem import params
+from nuvem import param
+from nuvem import user
+from nuvem import realm
+from nuvem import email
+from nuvem import keychain
+from nuvem import url
+from nuvem import contains
+from nuvem import split
+from nuvem import join
+from nuvem import replace
+from nuvem import lowercase
+from nuvem import uppercase
+from nuvem import format_
+from nuvem import parse
+from nuvem import htattrs
+from nuvem import htimg
+from nuvem import htinline
+from nuvem import htlink
+from nuvem import htbutton
+from nuvem import htcheck
+from nuvem import htstyle
+from nuvem import pixels
+from nuvem import left
+from nuvem import top
+from nuvem import transform
+from nuvem import transition
+from nuvem import frames
+from nuvem import eval_
+from nuvem import exec_
+
+def testValues():
+    assert true_.get(()) == True
+    assert false_.get(()) == False
+    assert nothing.get(()) == None
+    assert number.get((), mkprop('value', lambda: 1)) == 1
+    assert text.get((), mkprop('value', lambda: 'abc')) == 'abc'
+    assert comment.get((), mkprop('value', lambda: 'abc')) == 'abc'
+    assert name.get((), mkprop('value', lambda: 'abc')) == "'abc"
+    assert item.get((), mkref('value', lambda r: 'def'), mkprop('name', lambda: 'abc')) == ("'abc", 'def')
+    return True
+
+def testLogic():
+    assert call.get((), mkref('name', lambda r: "'abc"), mkref('proxy', lambda c, r: (c, r))) == ("'abc", ())
+    assert call.get((), mkref('name', lambda r: 'abc'), mkref('proxy', lambda c, r: (c, r))) == ("'abc", ())
+    assert if_.get((), mkref('cond', lambda r: True), mkref('then', lambda r: 'abc'), mkref('els', lambda r: 'def')) == 'abc'
+    assert if_.get((), mkref('cond', lambda r: False), mkref('then', lambda r: 'abc'), mkref('els', lambda r: 'def')) == 'def'
+    assert and_.get((), mkref('a', lambda r: False), mkref('b', lambda r: True)) == False
+    assert and_.get((), mkref('a', lambda r: True), mkref('b', lambda r: True)) == True
+    assert or_.get((), mkref('a', lambda r: False), mkref('b', lambda r: False)) == False
+    assert or_.get((), mkref('a', lambda r: False), mkref('b', lambda r: True)) == True
+    assert not_.get((), mkref('expr', lambda r: False)) == True
+    assert not_.get((), mkref('expr', lambda r: True)) == False
+    assert equals.get((), mkref('a', lambda r: 'abc'), mkref('b', lambda r: 'abc')) == True
+    assert equals.get((), mkref('a', lambda r: 'abc'), mkref('b', lambda r: 'def')) == False
+    assert lesser.get((), mkref('a', lambda r: 'abc'), mkref('b', lambda r: 'abc')) == False
+    assert lesser.get((), mkref('a', lambda r: 'abc'), mkref('b', lambda r: 'def')) == True
+    assert greater.get((), mkref('a', lambda r: 'abc'), mkref('b', lambda r: 'abc')) == False
+    assert greater.get((), mkref('a', lambda r: 'def'), mkref('b', lambda r: 'abc')) == True
+    return True
+
+def testLists():
+    assert single.get((), mkref('x', lambda r: 'abc')) == ('abc',)
+    assert pair.get((), mkref('a', lambda r: 'abc'), mkref('b', lambda r: 'def')) == ('abc', 'def')
+    assert triple.get((), mkref('a', lambda r: 'abc'), mkref('b', lambda r: 'def'), mkref('c', lambda r: 'ghi')) == ('abc', 'def', 'ghi')
+    assert list_.get((), mkref('item', lambda r: None)) == ()
+    assert list_.get((), mkref('item', lambda r: 'abc'), mkref('item', lambda r: None)) == ('abc',)
+    assert list_.get((), mkref('item', lambda r: 'abc'), mkref('item', lambda r: 'def'), mkref('item', lambda r: None)) == ('abc', 'def')
+    assert insert.get((), mkref('first', lambda r: 'abc'), mkref('rest', lambda r: None)) == ('abc',)
+    assert insert.get((), mkref('first', lambda r: 'abc'), mkref('rest', lambda r: ())) == ('abc',)
+    assert insert.get((), mkref('first', lambda r: 'abc'), mkref('rest', lambda r: ('def',))) == ('abc', 'def')
+    assert insert.get((), mkref('first', lambda r: 'abc'), mkref('rest', lambda r: ('def', 'ghi'))) == ('abc', 'def', 'ghi')
+    assert empty.get(()) == ()
+    assert first.get((), mkref('l', lambda r: ('abc', 'def'))) == 'abc'
+    assert second.get((), mkref('l', lambda r: ('abc', 'def'))) == 'def'
+    assert rest.get((), mkref('l', lambda r: ('abc', 'def', 'ghi'))) == ('def', 'ghi')
+    assert rest.get((), mkref('l', lambda r: ('abc',))) == ()
+    assert append.get((), mkref('l', lambda r: ('abc', 'def')), mkref('b', lambda r: ('ghi',))) == ('abc', 'def', 'ghi')
+    assert append.get((), mkref('l', lambda r: 'abc'), mkref('b', lambda r: ('def', 'ghi'))) == ('abc', 'def', 'ghi')
+    assert append.get((), mkref('l', lambda r: ('abc', 'def')), mkref('b', lambda r: 'ghi')) == ('abc', 'def', 'ghi')
+    assert itemnb.get((), mkref('i', lambda r: 1), mkref('l', lambda r: ('abc', 'def', 'ghi'))) == 'def'
+    assert names.get((), mkref('l', lambda r: (("'a", 'abc'), ("'d", 'def'), ("'g", 'ghi'), ("'d", 'def2')))) == ("'a", "'d", "'g", "'d")
+    assert values.get((), mkref('l', lambda r: (("'a", 'abc'), ("'d", 'def'), ("'g", 'ghi'), ("'d", 'def2')))) == ('abc', 'def', 'ghi', 'def2')
+    assert reverse.get((), mkref('l', lambda r: ('abc', 'def', 'ghi'))) == ('ghi', 'def', 'abc')
+    assert shuffle_.get((), mkref('l', lambda r: ('abc', 'def', 'ghi'))) != ()
+    assert range_.get((), mkref('a', lambda r: '1'), mkref('b', lambda r: '4')) == (1, 2, 3)
+
+    assert map_.get((), mkref('item', lambda r: "'i"), mkref('transform', lambda r: valueof.get(r, mkprop('name', lambda: 'i')) * 2), mkref('list', lambda r: (1, 2, 3))) == (2, 4, 6)
+    assert filter_.get((), mkref('item', lambda r: "'i"), mkref('cond', lambda r: valueof.get(r, mkprop('name', lambda: 'i')) % 2 == 0), mkref('list', lambda r: (1, 2, 3, 4))) == (2, 4)
+    assert reduce_.get((), mkref('item', lambda r: "'i"), mkref('accum', lambda r: "'a"), mkref('transform', lambda r: valueof.get(r, mkprop('name', lambda: 'a')) + valueof.get(r, mkprop('name', lambda: 'i'))), mkref('init', lambda r: 0), mkref('list', lambda r: (1, 2, 3, 4))) == 10
+    return True
+
+def testSelect():
+    assert lookup.get((), mkref('n', lambda r: "'d"), mkref('l', lambda r: (("'a", 'abc'), ("'d", 'def'), ("'g", 'ghi'), ("'d", 'def2')))) == (("'d", 'def'), ("'d", 'def2'))
+    assert select.get((), mkref('n', lambda r: "'d.x"), mkref('l', lambda r: (("'a", 'abc'), ("'d", (("'x", 'def'), ("'y", "yyy"))), ("'g", 'ghi'), ("'d", (("'y", 'yyy'), ("'x", 'def2')))))) == (("'x", 'def'), ("'x", 'def2'))
+    assert select.get((), mkref('n', lambda r: "'d.x"), mkref('l', lambda r: (("'a", 'abc'), ("'d", (("'x", 'def'), ("'y", "yyy"))), ("'g", 'ghi'), ("'d", (("'y", 'yyy'), ("'x", 'def2')))))) == (("'x", 'def'), ("'x", 'def2'))
+    assert select.get((), mkref('n', lambda r: ("'d", "'x")), mkref('l', lambda r: (("'a", 'abc'), ("'d", (("'x", 'def'), ("'y", "yyy"))), ("'g", 'ghi'), ("'d", (("'y", 'yyy'), ("'x", 'def2')))))) == (("'x", 'def'), ("'x", 'def2'))
+
+    dnf = (("'status", 'ok'), ("'origin", (''),), ("'dest", ('sc'),), ("'rows", ((("'elements", ((("'status", 'notfound'),),),),),),),)
+    assert select.get((), mkref('n', lambda r: "'status"), mkref('l', lambda r: dnf)) == (("'status", 'ok'), ("'status", 'notfound'))
+    assert select.get((), mkref('n', lambda r: "'rows.elements.status"), mkref('l', lambda r: dnf)) == (("'status", 'notfound'),)
+
+    dok = (("'status", 'ok'), ("'origin", ('scruz'),), ("'dest", ('sc'),), ("'rows", ((("'elements", ((("'status", 'ok'), ("'duration", ("'value", 3761), ("'text", '1 hour 3 mins'),), ("'distance", ("'value", 82923), ("'text", '51.5 mi'),),),),),),),),)
+    assert select.get((), mkref('n', lambda r: "'distance.text"), mkref('l', lambda r: dok)) == (("'text", '51.5 mi'),)
+
+def testMath():
+    assert add.get((), mkref('a', lambda r: 3), mkref('b', lambda r: 2)) == 5
+    assert subtract.get((), mkref('a', lambda r: 3), mkref('b', lambda r: 2)) == 1
+    assert multiply.get((), mkref('a', lambda r: 2), mkref('b', lambda r: 3)) == 6
+    assert divide.get((), mkref('a', lambda r: 3), mkref('b', lambda r: 2)) == 1.5
+    r1 = random_.get((), mkref('m', lambda r: 2))
+    assert r1 >= 0 and r1 <= 2
+    r2 = random_.get((), mkref('m', lambda r: 2))
+    assert r2 >= 0 and r2 <= 2 and r2 != r1
+    r3 = random_.get((), mkref('m', lambda r: ('a', 'b')))
+    assert r3 == 'a' or r3 == 'b'
+    r4 = randoms.get((), mkref('n', lambda r: 5.0), mkref('m', lambda r: 2))
+    assert len(r4) == 5
+    assert r4[0] >= 0 and r4[0] <= 2
+    assert r4[1] >= 0 and r4[1] <= 2 and r4[1] != r4[0]
+    r5 = randoms.get((), mkref('n', lambda r: 5.0), mkref('m', lambda r: ('a', 'b')))
+    assert len(r5) == 5
+    assert r5[0] == 'a' or r5[0] == 'b'
+    assert r5[1] == 'a' or r5[1] == 'b'
+    assert sin_.get((), mkref('x', lambda r: 0.0)) == 0.0
+    assert cos_.get((), mkref('x', lambda r: 0.0)) == 1.0
+    assert round_.get((), mkref('d', lambda r: 2), mkref('x', lambda r: 2.336)) == 2.34
+    assert floor_.get((), mkref('x', lambda r: 2.336)) == 2.0
+    assert ceil_.get((), mkref('x', lambda r: 2.336)) == 3.0
+    assert mod.get((), mkref('n', lambda r: 10), mkref('x', lambda r: 12)) == 2.0
+    assert sum_.get((), mkref('l', lambda r: (1, 2, 3))) == 6
+    assert min_.get((), mkref('l', lambda r: (2, 1, 3))) == 1
+    assert max_.get((), mkref('l', lambda r: (1, 3, 2))) == 3
+    return True
+
+def testHTTP():
+    assert host.get((), mkprop('host', lambda: 'localhost')) == 'localhost'
+    assert path.get((), mkprop('path', lambda: ('abc', 'def'))) == ('abc', 'def')
+    assert params.get((), mkprop('params', lambda: (("'a", 'abc'), ("'d", 'def')))) == (("'a", 'abc'), ("'d", 'def'))
+    assert param.get((), mkprop('n', lambda: "d"), mkprop('params', lambda: (("'a", 'abc'), ("'d", 'def'), ("'g", 'ghi')))) == 'def'
+    assert user.get((), mkprop('user', lambda: 'joe')) == 'joe'
+    assert realm.get((), mkprop('realm', lambda: 'localhost')) == 'localhost'
+    assert email.get((), mkprop('email', lambda: 'joe@localhost')) == 'joe@localhost'
+    kc = (("'entry", ("'title", 'User'), ("'id", 'user'), ("'content", ("'account", ("'description", 'User'), ("'keys", (
+        "'key", ((("'@name", 'key1'), ("'@value", 'value1')), (("'@name", 'key2'), ("'@value", 'value2')), (("'@name", 'key3'), ("'@value", 'value3')))))))),)
+    assert keychain.get((), mkref('n', lambda r: 'key2'), mkref('a', lambda r: kc)) == 'value2'
+    assert keychain.get((), mkref('n', lambda r: 'key4'), mkref('a', lambda r: kc)) is None
+    return True
+
+def testText():
+    assert contains.get((), mkref('sub', lambda r: 'bc'), mkref('s', lambda r: 'abcd')) == True
+    assert split.get((), mkref('sep', lambda r: 'x'), mkref('s', lambda r: 'abcxdef')) == ('abc', 'def')
+    assert join.get((), mkref('sep', lambda r: 'x'), mkref('s', lambda r: ('abc', 'def'))) == 'abcxdef'
+    assert join.get((), mkref('sep', lambda r: None), mkref('s', lambda r: ('abc', 'def'))) == 'abcdef'
+    assert replace.get((), mkref('from', lambda r: 'x'), mkref('to', lambda r: 'y'), mkref('s', lambda r: 'abcxdefxghi')) == 'abcydefyghi'
+    assert replace.get((), mkref('from', lambda r: 'x'), mkref('to', lambda r: None), mkref('s', lambda r: 'abcxdefxghi')) == 'abcdefghi'
+    assert lowercase.get((), mkref('s', lambda r: 'ABC')) == 'abc'
+    assert uppercase.get((), mkref('s', lambda r: 'abc')) == 'ABC'
+    assert format_.get((), mkref('f', lambda r: '{0} + {1} = {r}'), mkref('a', lambda r: (2, 3, ("'r", 5)))) == '2 + 3 = 5'
+    assert parse.get((), mkref('e', lambda r: r'(\w+) (\w+)'), mkref('s', lambda r: 'a b c')) == ('a', 'b')
+    return True
+
+def testAnimation():
+    assert htattrs.get((), mkref('value', lambda r: ("'value", 'abc'))) == ("'htattrs", ("'value", 'abc'))
+    assert htimg.get((), mkref('value', lambda r: 'http://abc.png')) == '<SPAN id="http://abc.png" class="img"><IMG src="http://abc.png"/></SPAN>'
+    assert htimg.get((), mkref('value', lambda r: ('i1', 'http://abc.png'))) == '<SPAN id="i1" class="img"><IMG src="http://abc.png"/></SPAN>'
+    assert htimg.get((), mkref('value', lambda r: ("'htattrs", (("'id", 'i1'), ("'src", 'http://abc.png'), ("'x", 'X'))))) == '<SPAN id="i1" class="img"><IMG src="http://abc.png" x="X"/></SPAN>'
+    assert htimg.get((), mkref('value', lambda r: (("'htattrs", (("'id", 'i1'), ("'src", 'http://abc.png'), ("'x", 'X'))),))) == '<SPAN id="i1" class="img"><IMG src="http://abc.png" x="X"/></SPAN>'
+    assert htinline.get((), mkref('value', lambda r: ('image/png', ('a', 'b')))) == 'data:image/png;base64,YWI=\n'
+    assert htlink.get((), mkref('value', lambda r: ('http://abc'))) == '<SPAN id="http://abc" class="link"><A href="http://abc"><SPAN>http://abc</SPAN></A></SPAN>'
+    assert htlink.get((), mkref('value', lambda r: ('http://abc', 'abc'))) == '<SPAN id="http://abc" class="link"><A href="http://abc"><SPAN>abc</SPAN></A></SPAN>'
+    assert htlink.get((), mkref('value', lambda r: ('h1', 'http://abc', 'abc'))) == '<SPAN id="h1" class="link"><A href="http://abc"><SPAN>abc</SPAN></A></SPAN>'
+    assert htlink.get((), mkref('value', lambda r: ("'htattrs", (("'id", 'h1'), ("'href", 'http://abc'), ("'value", 'abc'), ("'x", "X"))))) == '<SPAN id="h1" class="link"><A href="http://abc" x="X"><SPAN>abc</SPAN></A></SPAN>'
+    assert htlink.get((), mkref('value', lambda r: (("'htattrs", (("'id", 'h1'), ("'href", 'http://abc'), ("'value", 'abc'), ("'x", "X"))),))) == '<SPAN id="h1" class="link"><A href="http://abc" x="X"><SPAN>abc</SPAN></A></SPAN>'
+    assert htbutton.get((), mkref('value', lambda r: ('abc'))) == '<SPAN id="abc" class="button"><INPUT type="button" value="abc" class="graybutton"/></SPAN>'
+    assert htbutton.get((), mkref('value', lambda r: ('b1', 'abc'))) == '<SPAN id="b1" class="button"><INPUT type="button" value="abc" class="graybutton"/></SPAN>'
+    assert htbutton.get((), mkref('value', lambda r: ("'htattrs", (("'id", 'b1'), ("'value", 'abc'), ("'x", 'X'))))) == '<SPAN id="b1" class="button"><INPUT type="button" value="abc" x="X" class="graybutton"/></SPAN>'
+    assert htbutton.get((), mkref('value', lambda r: (("'htattrs", (("'id", 'b1'), ("'value", 'abc'), ("'x", 'X'))),))) == '<SPAN id="b1" class="button"><INPUT type="button" value="abc" x="X" class="graybutton"/></SPAN>'
+    assert htcheck.get((), mkref('value', lambda r: 'abc')) == '<SPAN id="abc" class="checkbox"><INPUT type="checkbox" value="abc"/><SPAN>abc</SPAN></SPAN>'
+    assert htcheck.get((), mkref('value', lambda r: ('c1', 'abc'))) == '<SPAN id="c1" class="checkbox"><INPUT type="checkbox" value="abc"/><SPAN>abc</SPAN></SPAN>'
+    assert htcheck.get((), mkref('value', lambda r: ("'htattrs", (("'id", 'c1'), ("'value", 'abc'), ("'x", 'X'))))) == '<SPAN id="c1" class="checkbox"><INPUT type="checkbox" value="abc" x="X"/><SPAN>abc</SPAN></SPAN>'
+    assert htcheck.get((), mkref('value', lambda r: (("'htattrs", (("'id", 'c1'), ("'value", 'abc'), ("'x", 'X'))),))) == '<SPAN id="c1" class="checkbox"><INPUT type="checkbox" value="abc" x="X"/><SPAN>abc</SPAN></SPAN>'
+    assert htstyle.get((), mkref('value', lambda r: (("'width", '320px'), ("'height", '460px')))) == ("'htstyle", 'width: 320px; height: 460px;')
+    assert htstyle.get((), mkref('value', lambda r: ('width: 320px', ("'height", '460px')))) == ("'htstyle", 'width: 320px; height: 460px;')
+    assert pixels.get((), mkref('value', lambda r: 320.1)) == '320px'
+    assert left.get((), mkref('value', lambda r: 320.1)) == 'left: 320px'
+    assert top.get((), mkref('value', lambda r: 320.1)) == 'top: 320px'
+    assert transform.get((), mkref('x', lambda r: 320.1), mkref('y', lambda r: 480.2), mkref('d', lambda r: 90.3)) == 'position: absolute; -webkit-transform: translate3d(320px,480px,0px) rotate(90deg); -moz-transform: translate(320px,480px) rotate(90deg); -ms-transform: translate(320px,480px) rotate(90deg); transform: translate(320px,480px) rotate(90deg)'
+    assert transition.get((), mkref('value', lambda r: 320.1)) == '-webkit-transition: all 0.3201s'
+    kf = ((0, ('left: 0px', 'top: 0px')), (50, ('left: 10px', 'top: 10px')), (100, (("'left", '20px'), 'top: 20px')))
+    assert frames.get((), mkref('msec', lambda r: 2000), mkref('loop', lambda r: True), mkref('content', lambda r: kf)) == 'position: absolute; -webkit-animation: {id} 2s ease 0 infinite normal; -moz-animation: {id} 2s ease 0 infinite normal; <style> @-webkit-keyframes {id} { 0% { left: 0px; top: 0px; } 50% { left: 10px; top: 10px; } 100% { left: 20px; top: 20px; } } @-moz-keyframes {id} { 0% { left: 0px; top: 0px; } 50% { left: 10px; top: 10px; } 100% { left: 20px; top: 20px; } } </style>'
+    return True
+
+def testEval():
+    assert eval_.get((), mkref('py', lambda r: '1 + 2'), mkref('ref', lambda r: 4)) == 3
+    assert eval_.get((), mkref('py', lambda r: 'ref.get(r) + 2'), mkref('ref', lambda r: 4)) == 6
+    assert eval_.get((5,), mkref('py', lambda r: 'ref.get(r) + r[0] + 2'), mkref('ref', lambda r: 4)) == 11
+    assert exec_.get((), mkref('py', lambda r: 'val = 1 + 2'), mkref('ref', lambda r: 4)) == 3
+    assert exec_.get((), mkref('py', lambda r: 'val = ref.get(r) + 2'), mkref('ref', lambda r: 4)) == 6
+    assert exec_.get((5,), mkref('py', lambda r: 'val = ref.get(r) + r[0] + 2'), mkref('ref', lambda r: 4)) == 11
+    return True
+
+if __name__ == '__main__':
+    print 'Testing...'
+    testValues()
+    testLogic()
+    testLists()
+    testSelect()
+    testMath()
+    testHTTP()
+    testText()
+    testAnimation()
+    testEval()
+    print 'OK'
+