Window that is able to pin its bounds to parent container

error: pathspec 'flatguiwidgets/src/flatgui/widgets/pinwindow.clj' did not match any file(s) known to git

--- flatguiwidgets/src/flatgui/widgets/pinwindow.clj
+++ flatguiwidgets/src/flatgui/widgets/pinwindow.clj
@@ -0,0 +1,59 @@
+; Copyright (c) 2015 Denys Lebediev and contributors. All rights reserved.
+; The use and distribution terms for this software are covered by the
+; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
+; which can be found in the file LICENSE at the root of this distribution.
+; By using this software in any fashion, you are agreeing to be bound by
+; the terms of this license.
+; You must not remove this notice, or any other, from this software.
+
+(ns flatgui.widgets.pinwindow
+  (:require [flatgui.base :as fg]
+            [flatgui.widgets.window :as window]
+            [flatgui.widgets.resizeablebar :as resizeablebar]
+            [flatgui.util.matrix :as m]))
+
+
+(fg/defevolverfn bounds-pct-evolver :bounds-pct
+  (if (or
+        (nil? old-bounds-pct)
+        (and
+          (= [:this] (fg/get-reason))
+          (or
+            (get-property component [:this] :mouse-capture)
+            (get-property component [:this] :mouse-capture-edges))))
+    (let [container-size (get-property [] :clip-size)       ;TODO :content-size should be here
+          cw (m/x container-size)
+          ch (m/y container-size)
+          pm (get-property [:this] :position-matrix)
+          cs (get-property [:this] :clip-size)]
+      {:x (/ (m/mx-x pm) cw)
+       :y (/ (m/mx-y pm) ch)
+       :w (/ (m/x cs) cw)
+       :h (/ (m/y cs) ch)})
+    old-bounds-pct))
+
+(fg/defevolverfn pinwindow-position-matrix-evolver :position-matrix
+  (let [bounds-pct (get-property [:this] :bounds-pct)]
+    (if (and bounds-pct (= nil (fg/get-reason)) (get-property [:this] :pinned?)) ; TODO why nil, not [] ? FlatGUI bug
+      (let [container-size (get-property [] :clip-size)       ;TODO :content-size should be here
+            cw (m/x container-size)
+            ch (m/y container-size)]
+        (m/translation (* (:x bounds-pct) cw) (* (:y bounds-pct) ch)))
+      (window/window-position-matrix-evolver component))))
+
+(fg/defevolverfn pinwindow-clip-size-evolver :clip-size
+  (let [bounds-pct (get-property [:this] :bounds-pct)]
+    (if (and bounds-pct (= nil (fg/get-reason)) (get-property [:this] :pinned?)) ; TODO why nil, not [] ? FlatGUI bug
+      (let [container-size (get-property [] :clip-size)       ;TODO :content-size should be here
+            cw (m/x container-size)
+            ch (m/y container-size)]
+        (m/defpoint (* (:w bounds-pct) cw) (* (:h bounds-pct) ch)))
+      (resizeablebar/resizeablebar-clip-size-evolver component))))
+
+(fg/defwidget "pinwindow"
+ {:pinned? true
+  :bounds-pct nil
+  :evolvers {:bounds-pct bounds-pct-evolver
+             :position-matrix pinwindow-position-matrix-evolver
+             :clip-size pinwindow-clip-size-evolver}}
+ window/window)


Set `STORE` to "DISK" to use disk storage

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ben-biddington/solace.git/'


Refactor: remove redundant div

Refactor: remove redundant div

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Reefersleep/sleepydo.git/'


Formatting

Formatting

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xcthulhu/clj-bitauth.git/'


Custom select list control

Custom select list control

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sashton/duct-tape.git/'


think i figured out PIDX...

think i figured out PIDX...

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/aamedina/swg.git/'


Add ability to calculate edit distance.

Add ability to calculate edit distance.

error: pathspec 'src/stats/levenshtein.cljs' did not match any file(s) known to git

--- src/stats/levenshtein.cljs
+++ src/stats/levenshtein.cljs
@@ -0,0 +1,35 @@
+(ns cljs-nlp.stats.levenshtein
+  (:use [clojure.string :only [blanks?]]))
+
+(defn create-element
+  [char1 char2 previous-row current-row idx]
+  (if (= char1 char2)
+    (previous-row (- idx 1))
+    (+ 1 (min
+      (previous-row (- idx 1))
+      (previous-row idx)
+      (last current-row)))))
+
+(defn create-row
+  [char1 str2 previous-row current-row]
+  (let [char2 (first str2)
+        idx (count current-row)]
+    (if (= (count current-row) (count previous-row))
+      current-row
+      (recur
+        char1
+        (rest str2)
+        previous-row
+        (conj current-row (create-element char1 char2 previous-row current-row idx))))))
+
+(defn levenshtein
+  "Calculate the edit distance between two strings."
+  ([str1 str2]
+    (let [initial-row (vec (range (inc (count str2))))]
+      (levenshtein 1 initial-row str1 str2)))
+  ([row-no previous-row str1 str2]
+    (let [next-row (create-row (first str1) str2 previous-row [row-no])
+          rest-str1 (subs str1 1)]
+      (if (blank? rest-str1)
+        (last next-row)
+        (recur (inc row-no) next-row rest-str1 str2)))))


update lein plugins

update lein plugins

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/pervezfunctor/lean-dotfiles.git/'


add lein profile

add lein profile

error: pathspec 'lein/profiles.clj' did not match any file(s) known to git

--- lein/profiles.clj
+++ lein/profiles.clj
@@ -0,0 +1,26 @@
+{:user
+ {:plugins      [[venantius/ultra "0.4.1"]
+                 [refactor-nrepl "2.2.0"]
+                 [cider/cider-nrepl "0.11.0"]]
+  :dependencies [[spyscope "0.1.4"]
+                 [org.clojure/tools.namespace "0.2.11"]
+                 [io.aviso/pretty "0.1.26"]
+                 [im.chit/vinyasa "0.4.7"]]
+  :injections
+  [(require 'spyscope.core)
+   (require '[vinyasa.inject :as inject])
+   (require 'io.aviso.repl)
+   (inject/in ;; the default injected namespace is `.`
+
+    ;; note that `:refer, :all and :exclude can be used
+    [vinyasa.inject :refer [inject [in inject-in]]]
+
+    ;; imports all functions in vinyasa.pull
+    [vinyasa.maven pull]
+
+    [vinyasa.reflection .> .? .* .% .%> .& .>ns .>var]
+
+    [clojure.tools.namespace.repl]
+
+    [clojure.pprint pprint]
+    [clojure.java.shell sh])]}}


Add test for type search.

Add test for type search.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mtravers/incidents.git/'


Check that email is not blank

Check that email is not blank

For consistency with `:phone` check

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/election-notification-works.git/'


search concated words

search concated words

error: pathspec 'src/clj/xl/substring_with_concatenation_of_all_words.clj' did not match any file(s) known to git

--- src/clj/xl/substring_with_concatenation_of_all_words.clj
+++ src/clj/xl/substring_with_concatenation_of_all_words.clj
@@ -0,0 +1,73 @@
+
+(ns
+  ^{:doc "
+    You are given a string, s, and a list of words, words, that are all of the same length.
+    Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once
+    and without any intervening characters.
+
+    For example, given:
+    s: 'barfoothefoobarman'
+    words: ['foo', 'bar']
+
+    You should return the indices: [0,9].
+           (order does not matter).
+
+    Solution:
+      for i from 0 to word length -1:
+        scanning words aligned by i, looking for matched words list.
+        advancing left when necessary.
+    Time: O(n)
+    "
+    }
+  xl.substring-with-concatenation-of-all-words)
+
+(defn find-indices [s words]
+  (let [wl (count (first words))
+        word-count (count words)
+        sl (count s)]
+    (reduce
+      (fn [results rem]
+        (reduce
+          (fn [results m]
+            (let [left (:left results)
+                  next-word-end (+ left (* (inc m) wl))]
+              (if (> next-word-end wl)
+                (reduced results)
+                (let [next-word-begin (+ left (* m wl))
+                      next-word (.substring s next-word-begin next-word-end)
+                      word-index (find-word next-word words)
+                      matched (:matched results)]
+                  (cond
+                    (neg? word-index) (assoc results :left next-word-end :matched {})
+                    (matched word-index)
+                      (let [
+                            prev-index (get matched word-index)
+                            new-matched (->> matched (remove #(<= (second %) prev-index)) (into {}))
+                            new-matched (assoc new-matched word-index next-word-begin)
+                            ]
+                        (assoc results
+                          :left (+ word-index wl)
+                          :matched new-matched
+                          ))
+                    :else
+                      (if (= word-count (dec (count matched)))
+                        (let [new-matched (remove #(= left (second %)) matched)
+                              new-matched (assoc new-matched word-index next-word-begin)]
+                          (assoc results :left (+ left wl) :matched new-matched :indices (conj (:indices result) left))
+                          )
+                        )
+                    )
+                  )
+                )
+              )
+            )
+          (assoc results :left 0 :matched {})
+          (range (/ sl wl))
+          )
+        )
+      {:indices []}
+      (range wl)
+      )
+    )
+  )
+


unit tests for outbound

unit tests for outbound

error: pathspec 'server/feed13/test/feed/services/outbound_test.clj' did not match any file(s) known to git

--- server/feed13/test/feed/services/outbound_test.clj
+++ server/feed13/test/feed/services/outbound_test.clj
@@ -0,0 +1,24 @@
+(ns feed.services.outbound-test
+  (:use clojure.test)
+  (:require [mockery.core :refer [with-mock with-mocks]]
+            [feed.services.outbound :as o]))
+
+(deftest get-outbound-test
+  (testing "testing get outbound"
+    (with-mock _
+      {:target :feed.daos.outbound/fetch
+       :return [{:from 1 :occurred "2021-02-18" :subject "test" :story "test story"}]}
+      (is (= (:subject (first (o/fetch 1))) "test")))))
+
+(deftest create-outbound-test
+  (testing "testing create outbound"
+    (with-mocks
+      [dao {:target :feed.daos.outbound/create
+       	    :return {:from 1 :occurred "2021-02-18" :subject "test" :story "test story"}}
+       fri-svc {:target :feed.services.friends/fetch
+                :return [{:id 1 :from 1 :to 2}]}
+       inb-svc {:target :feed.services.inbound/create
+       	        :return {:from 1 :to 2 :occurred "2021-02-18" :subject "test" :story "test story"}}
+       es-dao {:target :feed.daos.search/index
+       	       :return []}]
+      (is (= (:subject (o/create 1 "2021-02-18" "test" "test story")) "test")))))


Copy lazytest.watch from pre-abstractions master branch

error: pathspec 'src/main/clojure/lazytest/watch.clj' did not match any file(s) known to git

--- src/main/clojure/lazytest/watch.clj
+++ src/main/clojure/lazytest/watch.clj
@@ -0,0 +1,58 @@
+(ns lazytest.watch
+  (:gen-class)
+  (:use [lazytest.attach :only (all-groups)]
+	[lazytest.run :only (run-tests)]
+	[lazytest.report :only (report)]
+	[clojure.contrib.find-namespaces
+	 :only (find-clojure-sources-in-dir
+		read-file-ns-decl)]
+	[clojure.java.io :only (file)]
+	[clojure.string :only (split join)])
+  (:import (java.util.concurrent ScheduledThreadPoolExecutor TimeUnit)
+	   (java.util.regex Pattern)
+	   (java.io File)))
+
+(defn find-sources
+  [dirs]
+  {:pre [(coll? dirs)
+	 (every? (fn [d] (instance? java.io.File d)) dirs)]}
+  (mapcat find-clojure-sources-in-dir dirs))
+
+(defn namespace-for-file [f]
+  (second (read-file-ns-decl f)))
+
+(defn newer-sources [dirs timestamp]
+  (filter #(> (.lastModified %) timestamp) (find-sources dirs)))
+
+(defn newer-namespaces [dirs timestamp]
+  (remove nil? (map namespace-for-file (newer-sources dirs timestamp))))
+
+(defn reload-and-run [dirs timestamp-atom reporter]
+  (try
+    (let [names (newer-namespaces dirs @timestamp-atom)]
+      (when (seq names)
+	(reset! timestamp-atom (System/currentTimeMillis))
+	(println)
+	(println "======================================================================")
+	(println "Reloading" (join ", " names))
+	(doseq [n names] (remove-ns n))
+	(doseq [n names] (require n :reload))
+	(println "Running examples at" (java.util.Date.))
+	(reporter (map run-tests (all-groups)))))
+    (catch Exception e
+      (println "ERROR:" e))))
+
+(defn start [dirs & options]
+  (let [dirs (map file dirs)
+	{:keys [reporter delay], :or {delay 500, reporter report}} options
+	last-run-timestamp (atom 0)
+	runner #(reload-and-run dirs last-run-timestamp reporter)]
+    (doto (ScheduledThreadPoolExecutor. 1)
+      (.scheduleWithFixedDelay runner 0 delay TimeUnit/MILLISECONDS))))
+
+(defn -main [& args]
+  (println "Classpath contains the following:")
+  (doseq [c (split (System/getProperty "java.class.path")
+		   (Pattern/compile File/pathSeparator))]
+    (println c))
+  (start args))


update carbonite, tools.cli, and jgrapht dependencies to released versions

--- storm-core/project.clj
+++ storm-core/project.clj
@@ -18,12 +18,12 @@
                  [ring/ring-jetty-adapter "0.3.11"]
                  [org.clojure/tools.logging "0.2.3"]
                  [org.clojure/math.numeric-tower "0.0.1"]
-                 [storm/carbonite "1.5.0"]
+                 [com.twitter/carbonite "1.3.2"]
                  [org.yaml/snakeyaml "1.11"]
                  [org.apache.httpcomponents/httpclient "4.1.1"]
-                 [storm/tools.cli "0.2.2"]
+                 [org.clojure/tools.cli "0.2.2"]
                  [com.googlecode.disruptor/disruptor "2.10.1"]
-                 [storm/jgrapht "0.8.3"]
+                 [org.jgrapht/jgrapht-core "0.9.0"]
                  [com.google.guava/guava "13.0"]
                  [ch.qos.logback/logback-classic "1.0.6"]
                  [org.slf4j/log4j-over-slf4j "1.6.6"]


Animación instragram

Animación instragram

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/just-cloud/uxtweet-client.git/'


cleanup

cleanup

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/m1dnight/clojbot.git/'


Added tests for authn.

Added tests for authn.

error: pathspec 'test/kixi/hecuba/api/entities_test.clj' did not match any file(s) known to git

--- test/kixi/hecuba/api/entities_test.clj
+++ test/kixi/hecuba/api/entities_test.clj
@@ -0,0 +1,64 @@
+(ns kixi.hecuba.api.entities-test
+  (:require [kixi.hecuba.api.entities :refer :all]
+            [clojure.test :refer :all]))
+
+(deftest admin-can-get
+  (is (allowed?* 1 5 #{} #{} #{:kixi.hecuba.security/admin} :get)))
+
+(deftest admin-can-post
+  (is (allowed?* 1 5 #{} #{} #{:kixi.hecuba.security/admin} :post)))
+
+(deftest admin-can-delete
+  (is (allowed?* 1 5 #{} #{} #{:kixi.hecuba.security/admin} :delete)))
+
+(deftest super-admin-can-get
+  (is (allowed?* 1 5 #{} #{} #{:kixi.hecuba.security/super-admin} :get)))
+
+(deftest super-admin-can-post
+  (is (allowed?* 1 5 #{} #{} #{:kixi.hecuba.security/super-admin} :post)))
+
+(deftest super-admin-can-delete
+  (is (allowed?* 1 5 #{} #{} #{:kixi.hecuba.security/super-admin} :delete)))
+
+(deftest user-cannot-get
+  (is (false?
+       (allowed?* 1 5 #{} #{} #{:kixi.hecuba.security/user} :get))))
+
+(deftest user-in-different-programme-can-not-get
+  (is (false? (allowed?* 1 5 #{2} #{} #{:kixi.hecuba.security/user} :get))))
+
+(deftest user-in-programme-can-get
+  (is (allowed?* 1 5 #{1} #{} #{:kixi.hecuba.security/user} :get)))
+
+(deftest user-in-different-project-can-not-get
+  (is false? (allowed?* 1 5 #{} #{4}  #{:kixi.hecuba.security/user} :get)))
+
+(deftest user-in-project-can-get
+  (is (allowed?* 1 5 #{} #{5}  #{:kixi.hecuba.security/user} :get)))
+
+(deftest user-in-project-can-not-post
+  (is (false? (allowed?* 1 5 #{} #{5}  #{:kixi.hecuba.security/user} :post))))
+
+(deftest user-in-programme-and-project-can-not-post
+  (is (false? (allowed?* 1 5 #{1} #{5}  #{:kixi.hecuba.security/user} :post))))
+
+(deftest user-in-programme-and-project-can-not-delete
+  (is (false? (allowed?* 1 5 #{1} #{5}  #{:kixi.hecuba.security/user} :delete))))
+
+(deftest programme-manager-in-project-and-programme-can-post
+  (is (allowed?* 1 5 #{1} #{5}  #{:kixi.hecuba.security/programme-manager} :post)))
+
+(deftest programme-manager-in-programme-can-post
+  (is (allowed?* 1 5 #{1} #{}  #{:kixi.hecuba.security/programme-manager} :post)))
+
+(deftest programme-manager-in-project-can-post
+  (is (allowed?* 1 5 #{} #{5}  #{:kixi.hecuba.security/programme-manager} :post)))
+
+(deftest programme-manager-in-different-programme-can-not-post
+  (is (false? (allowed?* 1 5 #{2} #{688}  #{:kixi.hecuba.security/programme-manager} :post))))
+
+(deftest project-manager-in-project-can-post
+  (is (allowed?* 1 5 #{} #{5}  #{:kixi.hecuba.security/project-manager} :post)))
+
+(deftest project-manager-in-different-project-can-not-post
+  (is (false? (allowed?* 1 5 #{} #{4}  #{:kixi.hecuba.security/project-manager} :post))))


partial example

partial example

error: pathspec 'src/sandbox/fbuilder/partial.clj' did not match any file(s) known to git

--- src/sandbox/fbuilder/partial.clj
+++ src/sandbox/fbuilder/partial.clj
@@ -0,0 +1,9 @@
+(ns sandbox.fbuilder.partial)
+
+(defn tax-for-state [state amount]
+  (cond
+    (= :ny state) (* amount 0.0645)
+    (= :pa state) (* amount 0.045)))
+
+(def ny-tax (partial tax-for-state :ny))
+(def pa-tax (partial tax-for-syate :pa))


Add puzzle input for day 2 part 2

Add puzzle input for day 2 part 2

error: pathspec 'src/advent_2016/day_02/part_2.cljs' did not match any file(s) known to git


egde definition and test

egde definition and test

error: pathspec 'Breadth' did not match any file(s) known to git
error: pathspec 'First' did not match any file(s) known to git
error: pathspec 'Search' did not match any file(s) known to git
error: pathspec 'Shortest' did not match any file(s) known to git
error: pathspec 'Reach.clj' did not match any file(s) known to git


Starting exercises file @ Ch. 3

Starting exercises file @ Ch. 3

error: pathspec 'Exercises/exercises.clj' did not match any file(s) known to git

--- Exercises/exercises.clj
+++ Exercises/exercises.clj
@@ -0,0 +1,37 @@
+;; Clojure Exercises (from Chapter 3, Clojure For The Brave And True)
+
+; ------------------------------------------------------------------------------
+
+; "These exercises are meant to be a fun way to test your Clojure knowledge and
+; to learn more Clojure functions. The first three can be completed using only
+; the information presented in this chapter, but the last three will require you
+; to use functions that haven’t been covered so far. Tackle the last three if
+; you’re really itching to write more code and explore Clojure’s standard
+; library. If you find the exercises too difficult, revisit them after reading
+; Chapters 4 and 5—you’ll find them much easier."
+
+; (1) Use the str, vector, list, hash-map, and hash-set functions.
+
+; (2) Write a function that takes a number and adds 100 to it.
+
+; (3) Write a function, `dec-maker`, that works exactly like the
+; function `inc-maker` except with subtraction:
+(def dec9 (dec-maker 9))
+(dec9 10)
+; => 1
+
+; (4) Write a function, mapset, that works like map
+; except the return value is a set:
+(mapset inc [1 1 2 2])
+; => #{2 3}
+
+; (5) Create a function that’s similar to symmetrize-body-parts except that it
+; has to work with weird space aliens with radial symmetry. Instead of two eyes,
+; arms, legs, and so on, they have five.
+
+; (6) Create a function that generalizes symmetrize-body-parts and the function
+; you created in Exercise 5. The new function should take a collection of body
+; parts and the number of matching body parts to add. If you’re completely new
+; to Lisp languages and functional programming, it probably won’t be obvious
+; how to do this. If you get stuck, just move on to the next chapter and revisit
+; the problem later.


Added leiningen credentials file template.

error: pathspec 'lein/credentials.clj' did not match any file(s) known to git

--- lein/credentials.clj
+++ lein/credentials.clj
@@ -0,0 +1,2 @@
+{#"my\.datomic\.com" {:username "evansp2@gmail.com" :password <PASSWORD>}
+ #"https://clojars.org/repo" {:username "evanspa" :password <PASSWORD>}}


Strip out dead test code.

Strip out dead test code.

This code was disabled while porting from the old to new query style, but was
accidentally left in place.  This eliminates the block of code.

Signed-off-by: Daniel Pittman <3d0f3b9ddcacec30c4008c5e030e6c13a478cb4f@puppetlabs.com>

--- test/com/puppetlabs/cmdb/test/query/resource.clj
+++ test/com/puppetlabs/cmdb/test/query/resource.clj
@@ -55,60 +55,6 @@
                          ["=" "type" "File"]
                          ["not" ["=" "tag" "fitzroy"]]]))))

-
-(comment
-(deftest query->sql-where
-  (testing "comparisons"
-    (doseq [[input expect] {;; without a path
-                            ["=" "title" "whatever"]
-                            ["(title = ?)" "whatever"]
-                            ;; with a path to the field
-                            ["=" ["node" "certname"] "example"]
-                            ["(node_certname = ?)" "example"]
-                            }]
-      (is (= (s/query->sql-where input) expect))))
-  (testing "degenerate grouping"
-    (is (= (s/query->sql-where ["and" ["=" "tag" "one"]]) ["(tag = ?)" "one"]))
-    (is (= (s/query->sql-where ["or"  ["=" "tag" "one"]]) ["(tag = ?)" "one"])))
-  (testing "grouping"
-    (doseq [[input expect] {;; simple and, or
-                            ["and" ["=" "title" "one"] ["=" "title" "two"]]
-                            ["(title = ?) AND (title = ?)" "one" "two"]
-                            ["or" ["=" "title" "one"] ["=" "title" "two"]]
-                            ["(title = ?) OR (title = ?)" "one" "two"]
-                            ;; more terms...
-                            ["and" ["=" "title" "one"]
-                                   ["=" "title" "two"]
-                                   ["=" "title" "three"]
-                                   ["=" "title" "two"]
-                                   ["=" "title" "one"]]
-                            [(str "(title = ?) AND (title = ?) AND (title = ?)"
-                                  " AND (title = ?) AND (title = ?)")
-                             "one" "two" "three" "two" "one"]
-                            }]
-      (is (= (s/query->sql-where input) expect) (str input))))
-  (testing "negation"
-    (doseq [[input expect] {;; negate one item
-                            ["not" ["=" "title" "whatever"]]
-                            ["NOT (title = ?)" "whatever"]
-                            ;; multiple items
-                            ["not" ["=" "title" "whatever"] ["=" "title" "banana"]]
-                            ["NOT ((title = ?) OR (title = ?))" "whatever" "banana"]
-                            }]
-      (is (= (s/query->sql-where input) expect) (str input))))
-  (testing "real world query"
-    (is (= (s/query->sql-where ["and"
-                                ["not" ["=" ["node" "certname"] "example.local"]]
-                                ["=" "exported" true]
-                                ["=" "tag" "yellow"]])
-           ["NOT (node_certname = ?) AND (exported = ?) AND (tag = ?)"
-            "example.local" true "yellow"])))
-  (testing "composite field formatting"
-    (is (= (s/query->sql-where ["=" ["node" "certname"] "example.local"])
-           ["(node_certname = ?)" "example.local"]))
-    (is (= (s/query->sql-where ["=" ["parameter" "ensure"] "running"])
-           ["(parameter_name = ? AND parameter_value = ?)" "ensure" "running"]))))
-)

 (deftest query->sql
   (query/ring-init)                     ; connect to the database


Don't crash emacs when loading huge db.

Don't crash emacs when loading huge db.


bide-kud goian

bide-kud goian

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lnmnd/magnet.bez.git/'


Order messages in the sql query by id.

Order messages in the sql query by id.

This makes sure the messages are sorted chronologically.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/couragelabs/crispy-tatertot.git/'


Add button to logistics:get-notified

Add button to logistics:get-notified

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/starcity-properties/odin.git/'


Starte Clojure port of Azulenoid generator.

error: pathspec 'clojure/org/gavrog/clojure/azulenoids.clj' did not match any file(s) known to git


[TH] restore this to pair destructuring

[TH] restore this to pair destructuring

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/election-authority-works.git/'


Add a basic app view

Add a basic app view

error: pathspec 'src/trak/ui/app.cljs' did not match any file(s) known to git

--- src/trak/ui/app.cljs
+++ src/trak/ui/app.cljs
@@ -0,0 +1,27 @@
+(ns trak.ui.app
+  (:require [rum.core :as rum]
+            [datascript.core :as d]
+            [trak.utils :as utils]
+            [trak.db :as db]))
+
+
+(defn album-artists [artists]
+  (map (fn [artist]
+         [:a {:href (:href artist) :key (:id artist)} (:name artist) [:br]]) artists))
+
+(rum/defc album-card [album]
+  [:.card
+   [:.card-image [:img.img-responsive {:src (:url (first (:album/images album)))}]]
+   [:.card-header [:h4.card-title (:album/name album)]
+    [:h6.card-subtitle (album-artists (:album/artists album))]]
+   [:.card-body "Available markets " (map (fn [m] (str m " ")) (:album/available_markets album))]])
+
+(rum/defc albums [*db]
+  (let [albums (db/get-albums *db)]
+    [:.columns (map (fn [album] [:.column.col-6.col-xs-12 {:key (:db/id album)} (album-card album)]) albums)]))
+
+(rum/defc app [*db]
+  (when-let [match (utils/current-path *db)]
+    (utils/info "Application mounted. Matched: " match)
+    (cond
+      (= (:handler (utils/current-path *db)) :index) (albums *db))))


list all the gift card sponsors in prizes

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clojurecup/cc2014-frontend.git/'


Track deletion events in order to expire file position cache items.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/cstorey/nrod.git/'


Add experiments file

Add experiments file

error: pathspec 'src/angelic/scripts/experiments_11aaai.clj' did not match any file(s) known to git

--- src/angelic/scripts/experiments_11aaai.clj
+++ src/angelic/scripts/experiments_11aaai.clj
@@ -0,0 +1,68 @@
+(ns angelic.scripts.experiments-11aaai
+ (:require [edu.berkeley.ai [util :as util]]
+	   [edu.berkeley.ai.util [charts :as charts] [datasets :as datasets] [experiments :as experiments]]
+           [angelic [env :as env] [hierarchy :as hierarchy] [sas :as sas]]
+           [angelic.search.textbook :as textbook]
+           [angelic.domains.discrete-manipulation :as dm]
+           [angelic.search.implicit
+            [ah-astar :as aha]
+            [sahtn :as sahtn]
+            [dash-astar-opt :as dao]]))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Setup ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(def *exp-result* ::ExpResult)
+
+(defstruct exp-result
+  :class :experiment :commit-id :timeout? :memout? :output :printed :init-ms :ms :mb
+  :next-count :opt-count :pess-count :ref-count :plan-count)
+
+(defmethod experiments/setup-experiment-result ::ExpResult [experiment]
+  (env/reset-next-counter)
+  (hierarchy/reset-ref-counter))
+
+(defmethod experiments/make-experiment-result ::ExpResult
+  [experiment setup-info timeout? memout? output printed init-ms ms mb]
+  (struct exp-result ::ExpResult
+          experiment (util/git-commit-id) timeout? memout? output printed init-ms ms mb
+          (util/sref-get env/*next-counter*)
+          (util/sref-get env/*optimistic-counter*)
+          (util/sref-get env/*pessimistic-counter*)
+          (util/sref-get hierarchy/*ref-counter*)
+          (util/sref-get hierarchy/*plan-counter*)))
+
+
+;;;;;;;;;;;;;;;;;; Discrete manipulation experiments ;;;;;;;;;;;;;;;;;;;;;
+
+(def alg-forms
+     {:sahtn   (fn [m] `(sahtn/sahtn ~'init #{'top 'navh 'navv}))
+      :aha*    (fn [m] `(aha/ah-a* ~'init true))
+      :dash-a* (fn [m] `(dao/implicit-dash-a*-opt ~'init :gather true :d true :s :eager :dir :right
+                                                  :choice-fn rand-nth))})
+
+(defn make-dm-exp-set []
+  (experiments/make-experiment-set "11aaai-dm"
+    [:product
+     [:objects [1 2 3 4 5 6]]
+     [:rand    [1 2 3]]
+     [:alg     (keys alg-forms)]]
+    (fn [m]
+      `(dm/make-discrete-manipulation-hierarchy
+        (dm/make-random-hard-discrete-manipulation-env ~(:objects m) ~(:rand m))))
+    (fn [m] ((util/safe-get alg-forms (:alg m)) m))
+    'angelic.scripts.experiments-11aaai nil #_ 10 60 512 false ::ExpResult))
+
+(defonce *dm-results* nil)
+(defn read-results []
+  (def *dm-results*
+       (experiments/experiment-set-results->dataset
+        (experiments/read-experiment-set-results (make-dm-exp-set)))))
+
+
+
+;(use '[edu.berkeley.ai.util experiments cluster] 'angelic.aaai10)
+;(run-experiment-set-cluster (make-exp-set))
+
+; (plot (ds->chart (experiment-set-results->dataset res) [:alg] :objects :ms {:key "top left" } {} first))
+


Begin on hiccup transformations.

Begin on hiccup transformations.

error: pathspec 'src/clj/com/hypirion/subtex/pass/hiccup.clj' did not match any file(s) known to git

--- src/clj/com/hypirion/subtex/pass/hiccup.clj
+++ src/clj/com/hypirion/subtex/pass/hiccup.clj
@@ -0,0 +1,102 @@
+(ns com.hypirion.subtex.pass.hiccup
+  (:require [com.hypirion.subtex.pass :as pass])
+  (:import (java.util ArrayList)))
+
+(defn transform-invoke
+  [name f]
+  (fn [rf]
+    (fn ([] (rf))
+      ([res] (rf res))
+      ([res input]
+       (if (and (identical? (:type input) :invoke)
+                (= name (:name input)))
+         (rf res (apply f (:args input)))
+         (rf res input))))))
+
+(defn vectorize-invoke
+  [name vect]
+  (fn [rf]
+    (fn ([] (rf))
+      ([res] (rf res))
+      ([res input]
+       (if (and (identical? (:type input) :invoke)
+                (= name (:name input)))
+         (rf res [vect (-> input :args first :value seq)])
+         (rf res input))))))
+
+(def h1 (vectorize-invoke "\\title" :h1))
+(def h2 (vectorize-invoke "\\section" :h2))
+(def h3 (vectorize-invoke "\\subsection" :h3))
+(def h4 (vectorize-invoke "\\subsubsection" :h4))
+
+(def strong (vectorize-invoke "\\textbf" :strong))
+(def em (vectorize-invoke "\\emph" :em))
+(def sub (vectorize-invoke "\\textsubscript" :sub))
+(def sup (vectorize-invoke "\\textsuperscript" :sub))
+
+(def common-invokes
+  (apply comp (map pass/reenterable [h1 h2 h3 h4 strong em sub sup])))
+
+(defn- to-li [subrf]
+  (let [val [:li (seq (pass/sub-complete @subrf))]]
+    (vreset! subrf ::none)
+    val))
+
+(defn none? [val] ;; inline
+  (identical? ::none val))
+
+(def item-to-li
+  (pass/reenterable
+   (fn [rf]
+     (let [in-item (volatile! ::none)]
+       (fn ([] (rf))
+         ([res]
+          (let [res (if (none? @in-item)
+                      res
+                      (let [v (to-li in-item)]
+                        (unreduced (rf res v))))]
+            (rf res)))
+         ([res input]
+          (cond (and (not (none? @in-item)) (identical? (:type input) :invoke)
+                     (= "\\item" (:name input)))
+                (rf res (to-li in-item))
+
+                (not (none? @in-item))
+                (do (vswap! in-item pass/sub-step input) res)
+
+                (and (identical? (:type input) :invoke)
+                     (= "\\item" (:name input)))
+                (do (vreset! in-item (pass/subreduction rf)) res)
+
+                :otherwise
+                (rf res input))))))))
+
+(defn itemize-to-ul
+  "Everything not directly inside a [:li ...] is collateral damage. Also, args
+  are ignored."
+  [rf]
+  (fn ([] (rf))
+    ([res]
+     (rf res))
+    ([res input]
+     (if (and (identical? (:type input) :env)
+              (= "itemize" (:name input)))
+       (rf res [:ul (filter #(and (vector? %)
+                                  (identical? (first %) :li))
+                            (:value input))])
+       (rf res input)))))
+
+(defn enumerate-to-ol
+  "Everything not directly inside a [:li ...] is collateral damage. Also, args
+  are ignored."
+  [rf]
+  (fn ([] (rf))
+    ([res]
+     (rf res))
+    ([res input]
+     (if (and (identical? (:type input) :env)
+              (= "enumerate" (:name input)))
+       (rf res [:ol (filter #(and (vector? %)
+                                  (identical? (first %) :li))
+                            (:value input))])
+       (rf res input)))))


fix deposit overdue calculation

fix deposit overdue calculation


dump in resources code from argo

dump in resources code from argo

error: pathspec 'src/cljs/infinitelives/pixi/resources.cljs' did not match any file(s) known to git

--- src/cljs/infinitelives/pixi/resources.cljs
+++ src/cljs/infinitelives/pixi/resources.cljs
@@ -0,0 +1,155 @@
+(ns infinitielives.pixi.resources)
+
+;; where we store all the loaded textures keyed by name
+(defonce !textures (atom {}))
+
+(defn progress-texture
+  "Draws an empty box that can serve as a default progress bar for preloading images"
+  [fraction {:keys [empty-colour full-colour
+                    border-colour border-width draw-border
+                    width height
+                    highlight highlight-offset highlight-width
+                    lowlight lowlight-offset lowlight-width]
+             :or {empty-colour 0x000000
+                  full-colour 0x808080
+                  border-colour 0xffffff
+                  border-width 2
+                  draw-border false
+                  width 600
+                  height 40
+                  highlight-offset 0
+                  highlight-width 1
+                  lowlight-offset 0
+                  lowlight-width 1
+                  }
+             :as options}]
+  (let [box (PIXI/Graphics.)]
+    (doto box
+      (.beginFill empty-colour)
+      (.lineStyle 0 border-colour)
+      (.drawRect 0 0 width height)
+      (.lineStyle 0 border-colour)
+      (.beginFill full-colour)
+      (.drawRect border-width border-width (* (if (< fraction 1) fraction 1) (- width border-width border-width)) (- height border-width border-width ))
+      .endFill)
+
+    (let [bw (* (if (< fraction 1) fraction 1) width)
+          x1 (+ border-width highlight-offset)
+          x2 (- bw highlight-offset)
+          y1 (+ border-width lowlight-offset)
+          y2 (- height border-width lowlight-offset)]
+      (when (> bw 0)
+        (when highlight
+          (doto box
+              (.lineStyle highlight-width highlight)
+              (.moveTo x1 y2)
+              (.lineTo x1 y1)
+              (.lineTo x2 y1)))
+        (when lowlight
+          (doto box
+            (.lineStyle lowlight-width lowlight)
+            (.moveTo x1 y2)
+            (.lineTo x2 y2)
+            (.lineTo x2 y1)))))
+
+    (when draw-border
+      (doto box
+        (.lineStyle border-width border-colour)
+        (.drawRect 0 0 width height)))
+
+    (.generateTexture box false)))
+
+
+(defn add-prog-bar [stage options]
+  (let [s (sprite/make-sprite (progress-texture 0 options))]
+    (set! (.-alpha s) 0)
+    (.addChild stage s)
+    s))
+
+
+(defn get-texture [key scale]
+  (scale (key @!textures)))
+
+
+;; setup a pixi texture keyed by the tail of its filename
+(defn- register-texture
+  [url img]
+  (when (ends-with? url ".png")
+    (swap! =textures=
+           assoc (url-keyword url)
+           {
+            :linear
+            (PIXI/Texture.fromImage
+             url true (aget js/PIXI.scaleModes "LINEAR"))
+
+            ;; this is a hack adding # to the tail of a url so pixi doesnt use the other
+            ;; linear version
+            ;; SEE: https://github.com/GoodBoyDigital/pixi.js/issues/1724
+            :nearest
+            (PIXI/Texture.fromImage
+             (str url "#") true (aget js/PIXI.scaleModes "NEAREST"))})))
+
+(defn load-urls
+  "loads each url in the passed in list as an image. Updates the progress
+as it goes with
+  a percentage and a thumbnail. Once complete, displays all the images
+fullsize."
+  [urls progress-bar & options]
+  (let [options (into {} options)]
+    (let [finished (chan)                         ;; make our channel to
+          num-urls (count urls)                   ;; how many urls
+          images (doall                           ;; start loading all the urls
+                  (map (fn [src]
+                         (let [i (js/Image.)]
+                           (set! (.-onload i) #(put! finished [src i]))
+                           (set! (.-onerror i) #(put! finished [src i]))
+                           (set! (.-onabort i) #(js/alert "abort"))
+                           (set! (.-src i) src)
+                           i))
+                       urls))]
+      (go
+        (loop [i 1]
+          (let [[url img] (<! finished)] ;; a new image has finished loading
+            (when (:debug-delay options)
+              (<! (timeout (* (:debug-delay options) 1000)))) ;; artificial random delay (up to 1 ec)
+
+            ;; setup a pixi texture keyed by the tail of its filename
+            (register-texture url img)
+
+            ;; update progress bar and add image
+            (.setTexture progress-bar
+                         (progress-texture (/ i num-urls) options))
+
+            ;; more images?
+            (when (< i num-urls)
+              (recur (inc i)))))))))
+
+(defn load-resources [s urls & {:keys [fade-in fade-out]
+                      :or {fade-in 0.5 fade-out 0.5}
+                      :as options}]
+  (log "!")
+  (let [c (chan)
+        b (add-prog-bar s options)]
+    (go
+      ;; fade in
+      (log "fade in")
+      (<! (sprite/fadein b :duration fade-in))
+      (log "done")
+
+      ;; show load progress
+      (<! (apply (partial load-urls urls b) options))
+
+      ;; load is done. return message
+      (>! c true)
+
+      ;; delay a tiny bit
+      (<! (timeout 300))
+
+      ;; fadeout
+      (<! (sprite/fadeout b :duration fade-out))
+
+      ;; remove progress bar sprite
+      (.removeChild s b)
+
+      (close! c))
+    c))


Update dependency test

Update dependency test

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tobias/clojars-web.git/'


Version 1.14.0-SNAPSHOT

Version 1.14.0-SNAPSHOT

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject org.zalando.stups/friboo "1.13.0"
+(defproject org.zalando.stups/friboo "1.14.0-SNAPSHOT"
   :description "A utility library to write microservices in clojure."
   :url "https://github.com/zalando-stups/friboo"


Version 0.0.17-SNAPSHOT

Version 0.0.17-SNAPSHOT

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject pe-jdbc-utils "0.0.16"
+(defproject pe-jdbc-utils "0.0.17-SNAPSHOT"
   :description "A Clojure library of helper functions when working with JDBC."
   :url "https://github.com/evanspa/pe-jdbc-utils"
   :license {:name "MIT"


프로젝트 웹사이트 주소 수정

프로젝트 웹사이트 주소 수정

--- project.clj
+++ project.clj
@@ -1,6 +1,6 @@
 (defproject tufdown "0.1.0-SNAPSHOT"
   :description "a markdown-like language and parser for TufteCSS"
-  :url "https://github.com/hatemogi/instaparse-practice"
+  :url "https://github.com/hatemogi/tufdown"
   :license {:name "Eclipse Public License"
             :url "http://www.eclipse.org/legal/epl-v10.html"}
   :dependencies [[org.clojure/clojure "1.8.0"]


Prepare for next release cycle.

Prepare for next release cycle.

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject onyx-app/lein-template "0.10.0.0-beta10"
+(defproject onyx-app/lein-template "0.10.0.0-SNAPSHOT"
   :description "Onyx Leiningen application template"
   :url "https://github.com/onyx-platform/onyx-template"
   :license {:name "MIT License"


Update prismatic/schema.

Update prismatic/schema.

--- project.clj
+++ project.clj
@@ -14,7 +14,7 @@
                  [com.draines/postal "1.11.1"]
                  [version-clj "0.1.0"]
                  [clojurewerkz/quartzite "1.3.0"]
-                 [prismatic/schema "0.3.0"]
+                 [prismatic/schema "0.3.1"]
                  [com.stuartsierra/component "0.2.2"]

                  ; ClojureScript


Version 0.2.3

Version 0.2.3

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject sbsk "0.2.3-SNAPSHOT"
+(defproject sbsk "0.2.3"
   :description "FIXME: write description"
   :url "http://example.com/FIXME"
   :license {:name "Eclipse Public License"


redo workspace tests

redo workspace tests

error: pathspec 'test/com/billpiel/sayid/workspace_test.clj' did not match any file(s) known to git

--- test/com/billpiel/sayid/workspace_test.clj
+++ test/com/billpiel/sayid/workspace_test.clj
@@ -0,0 +1,132 @@
+(ns com.billpiel.sayid.workspace-test
+  (:require [clojure.test :as t]
+            [com.billpiel.sayid.workspace :as ws]
+            [com.billpiel.sayid.test-utils :as t-utils]))
+
+(def ^:dynamic *shelf*)
+(def ^:dynamic *ws*)
+
+(defn fixture
+  [f]
+  (with-redefs [gensym (t-utils/mock-gensym-fn)]
+    (binding [*shelf* '$ws
+              *ws* (atom (ws/default-workspace))]
+      (f)
+      (remove-ns *shelf*))))
+
+(t/use-fixtures :each fixture)
+
+(t/deftest save-as
+  (t/testing "ws save-as"
+        (t/is (= (ws/deep-deref! (ws/save-as! *ws*
+                                              *shelf*
+                                              'test1))
+                 {:children []
+                  :depth 0
+                  :id :root10
+                  :path [:root10]
+                  :traced {:ns #{}, :fn #{}, :inner-fn #{}}
+                  :ws-slot '$ws/test1
+                  :arg-map nil})))
+
+      (ws/reset-to-nil! *ws*)
+
+      (t/testing "saved successful?"
+        (t/is (= (ws/deep-deref! @(ns-resolve (the-ns *shelf*)
+                                              'test1))
+                 {:children []
+                  :depth 0
+                  :id :root10
+                  :path [:root10]
+                  :traced {:ns #{}, :fn #{}, :inner-fn #{}}
+                  :ws-slot '$ws/test1
+                  :arg-map nil}))))
+
+(t/deftest load-with-symbol
+  (t/testing "load with symbol"
+    (ws/save-as! *ws* *shelf* 'test1)
+    (ws/reset-to-nil! *ws*)
+
+    (ws/load! *ws* *shelf* 'test1)
+
+    (t/is (= (ws/deep-deref! *ws*)
+             {:children []
+              :depth 0
+              :id :root10
+              :path [:root10]
+              :traced {:ns #{}, :fn #{}, :inner-fn #{}}
+              :ws-slot '$ws/test1
+              :arg-map nil}))))
+
+(t/deftest load-with-value
+  (t/testing "load with value"
+    (ws/save-as! *ws* *shelf* 'test1)
+    (ws/reset-to-nil! *ws*)
+
+    (t/testing "; start with nil"
+      (t/is (= (ws/deep-deref! *ws*)
+               nil)))
+
+    (t/testing "; loading"
+      (ws/load! *ws* *shelf* @(ns-resolve '$ws 'test1))
+      (t/is (= (ws/deep-deref! *ws*)
+               {:children []
+                :depth 0
+                :id :root10
+                :path [:root10]
+                :traced {:ns #{}, :fn #{}, :inner-fn #{}}
+                :ws-slot '$ws/test1
+                :arg-map nil})))))
+
+(t/deftest load-with-keyword
+  (t/testing "load with keyword"
+    (ws/save-as! *ws* *shelf* 'test1)
+    (ws/reset-to-nil! *ws*)
+
+    (t/testing "; start with nil"
+      (t/is (= (ws/deep-deref! *ws*)
+               nil)))
+
+    (t/testing "; loading"
+      (ws/load! *ws* *shelf* :test1)
+
+      (t/is (= (ws/deep-deref! *ws*)
+               {:children []
+                :depth 0
+                :id :root10
+                :path [:root10]
+                :traced {:ns #{}, :fn #{}, :inner-fn #{}}
+                :ws-slot '$ws/test1
+                :arg-map nil})))))
+
+(t/deftest forced-load
+  (t/testing "forced load"
+    (ws/save-as! *ws* *shelf* 'test1)
+    (ws/reset-to-nil! *ws*)
+    (ws/init! *ws*)
+
+
+    (ws/load! *ws* *shelf* 'test1)
+    => (throws Exception)
+
+    (t/testing "; didn't overwrite"
+      (t/is (= (ws/deep-deref! *ws*)
+               {:children []
+                :depth 0
+                :id :root11
+                :path [:root11]
+                :traced {:ns #{}, :fn #{}, :inner-fn #{}}
+                :ws-slot nil
+                :arg-map nil})))
+
+    (t/testing "; loading"
+      (ws/load! *ws* *shelf* 'test1 :f)
+
+      (t/is (= (ws/deep-deref! *ws*)
+               {:children []
+                :depth 0
+                :id :root10
+                :path [:root10]
+                :traced {:ns #{}, :fn #{}, :inner-fn #{}}
+                :ws-slot '$ws/test1
+                :arg-map nil})))))


Added remaining test module

Added remaining test module

error: pathspec 'test/emender_jenkins/process_info_test.clj' did not match any file(s) known to git

--- test/emender_jenkins/process_info_test.clj
+++ test/emender_jenkins/process_info_test.clj
@@ -0,0 +1,25 @@
+;
+;  (C) Copyright 2016  Pavel Tisnovsky
+;
+;  All rights reserved. This program and the accompanying materials
+;  are made available under the terms of the Eclipse Public License v1.0
+;  which accompanies this distribution, and is available at
+;  http://www.eclipse.org/legal/epl-v10.html
+;
+;  Contributors:
+;      Pavel Tisnovsky
+;
+
+(ns emender-jenkins.process-info-test
+  (:require [clojure.test :refer :all]
+            [emender-jenkins.process-info :refer :all]))
+
+;
+; Common functions used by tests.
+;
+
+(defn callable?
+    "Test if given function-name is bound to the real function."
+    [function-name]
+    (clojure.test/function? function-name))
+


CMR-688: Added personnel to UMM collections and initial DIF support. Mistakenly used upcoming DIF schema for Personnel. Need to revert to old schema.

error: pathspec 'umm-lib/src/cmr/umm/dif/collection/personnel.clj' did not match any file(s) known to git

--- umm-lib/src/cmr/umm/dif/collection/personnel.clj
+++ umm-lib/src/cmr/umm/dif/collection/personnel.clj
@@ -0,0 +1,99 @@
+(ns cmr.umm.dif.collection.personnel
+  "Provides functions to parse and generate DIF Personnel elements."
+  (:require [clojure.data.xml :as x]
+            [cmr.common.xml :as cx]
+            [cmr.umm.collection :as c]))
+
+(defn xml-elem->Phone
+  [phone-element]
+  (let [number (cx/string-at-path phone-element [:Number])
+        num-type (cx/string-at-path phone-element [:Type])]
+    (c/map->Phone {:number number
+                   :number-type num-type})))
+
+(defn xml-elem->Address
+  [addr-element]
+  (let [city (cx/string-at-path addr-element [:City])
+        state-province (cx/string-at-path addr-element [:State_Province])
+        country (cx/string-at-path addr-element [:Country])
+        postal-code (cx/string-at-path addr-element [:Postal_Code])
+        street-address-lines (cx/strings-at-path addr-element [:Street_Address])]
+    (c/map->Address {:city city
+                     :state-province state-province
+                     :country country
+                     :postal-code postal-code
+                     :street-address-lines street-address-lines})))
+
+(defn xml-elem->ContactPerson
+  [person-element]
+  (let [first-name (cx/string-at-path person-element [:First_Name])
+        middle-name (cx/string-at-path person-element [:Middle_Name])
+        last-name (cx/string-at-path person-element [:Last_Name])
+        addresses (map xml-elem->Address
+                       (cx/elements-at-path
+                         person-element
+                         [:Address]))
+        phones (map xml-elem->Phone
+                    (cx/elements-at-path
+                      person-element
+                      [:Phone]))
+        emails (cx/strings-at-path person-element [:Email])]
+    (c/map->ContactPerson {:first-name first-name
+                           :middle-name middle-name
+                           :last-name last-name
+                           :addresses addresses
+                           :phones phones
+                           :emails emails})))
+
+(defn xml-elem->personnel
+  [collection-element]
+  (let [personnel-element (cx/element-at-path collection-element [:Personnel])
+        roles (cx/strings-at-path personnel-element [:Role])
+        contacts (map xml-elem->ContactPerson
+                      (cx/elements-at-path
+                        personnel-element
+                        [:Contact_Person]))
+        contacts (for [index (range (count contacts))]
+                   (assoc (nth contacts index) :role (nth roles index)))]
+    (not-empty contacts)))
+
+(defn generate-phone
+  [phone]
+  (let [{:keys [number number-type]} phone]
+    (x/element :Phone {}
+               (x/element :Number {} number)
+               (x/element :Type {} number-type))))
+
+(defn generate-address
+  [address]
+  (let [{:keys [city state-province country postal-code street-address-lines]} address]
+    (x/element :Address {}
+               (x/element :City {} city)
+               (for [line street-address-lines]
+                 (x/element :Street_Address {} line))
+               (x/element :State_Province {} state-province)
+               (x/element :Postal_Code {} postal-code)
+               (x/element :Country {} country))))
+
+(defn generate-contact-person
+  [contact-person]
+  (let [{:keys [first-name middle-name last-name addresses phones emails]} contact-person]
+    (x/element :Contact_Person {}
+               (when first-name
+                 (x/element :First_Name {} first-name))
+               (when middle-name
+                 (x/element :Middle_Name {} middle-name))
+               (x/element :Last_Name {} last-name)
+               (map generate-address addresses)
+               (map generate-phone phones)
+               (for [email emails]
+                 (x/element :Email {} email)))))
+
+(defn generate-personnel
+  [personnel]
+  (when (not-empty personnel)
+    (x/element :Personnel {}
+               (for [contact-person personnel]
+                 (x/element :Role {} (:role contact-person)))
+               (for [contact-person personnel]
+                 (generate-contact-person contact-person)))))


Whitespace fix. I'm crazy like that.

Whitespace fix. I'm crazy like that.

--- src/leiningen/jar.clj
+++ src/leiningen/jar.clj
@@ -35,11 +35,10 @@
   (let [root (str (unix-path (:root project)) \/)
         noroot  #(trim-leading-str (unix-path %) root)
         [resources classes src]
-          (map noroot (map project [:resources-path :compile-path :source-path]))]
+        (map noroot (map project [:resources-path :compile-path :source-path]))]
   (doseq [child (file-seq (file (:path spec)))]
     (when-not (.isDirectory child)
-      (let [path (reduce trim-leading-str
-                         (unix-path (str child))
+      (let [path (reduce trim-leading-str (unix-path (str child))
                          [root resources classes src "/"])]
         (.putNextEntry jar-os (JarEntry. path))
         (copy child jar-os))))))


Logging that we are sending results.

Logging that we are sending results.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/couragelabs/coachbot.git/'


Add specs for the query language used in e.g. defview

We were referring to this syntax as "properties spec" or "properties
destructuring syntax" for defview before. Since it is about to become
a general-purpose query langauge that will also be used in other places,
we now refer to uses of the syntax as "queries".

error: pathspec 'src/main/workflo/macros/specs/query.cljc' did not match any file(s) known to git

--- src/main/workflo/macros/specs/query.cljc
+++ src/main/workflo/macros/specs/query.cljc
@@ -0,0 +1,127 @@
+(ns workflo.macros.specs.query
+  (:require #?(:cljs [cljs.spec :as s]
+               :clj  [clojure.spec :as s])
+            #?(:cljs [cljs.spec.impl.gen :as gen]
+               :clj  [clojure.spec.gen :as gen])
+            [workflo.macros.props.util :as util]))
+
+;;;; Basics
+
+(s/def ::property-name
+  symbol?)
+
+;;;; Simple properties
+
+(s/def ::simple-property
+  ::property-name)
+
+;;;; Links
+
+(s/def ::link-id
+  ::s/any)
+
+(s/def ::link
+  (s/tuple ::property-name ::link-id))
+
+;;;; Joins
+
+(s/def ::model-name
+  (s/with-gen
+    util/capitalized-symbol?
+    #(s/gen '#{User UserList Feature})))
+
+(s/def ::model-join
+  (s/with-gen
+    (s/and (s/map-of ::property-name ::model-name)
+           util/one-item?)
+    #(gen/map (s/gen ::property-name)
+              (s/gen ::model-name)
+              {:num-elements 1})))
+
+(s/def ::unlimited-recursion
+  #{'... ''...})
+
+(s/def ::limited-recursion
+  (s/and integer? pos?))
+
+(s/def ::recursion
+  (s/or :unlimited ::unlimited-recursion
+        :limited ::limited-recursion))
+
+(s/def ::recursive-join
+  (s/with-gen
+    (s/and (s/map-of ::property-name ::recursion)
+           util/one-item?)
+    #(gen/map (s/gen ::property-name)
+              (s/gen ::recursion)
+              {:num-elements 1})))
+
+(s/def ::properties-join
+  (s/with-gen
+    (s/and (s/map-of ::property-name ::query)
+           util/one-item?)
+    #(gen/map (s/gen ::property-name)
+              (s/gen '#{[user] [user [id name email]]})
+              {:num-elements 1})))
+
+(s/def ::join
+  (s/or :model-join ::model-join
+        :recursive-join ::recursive-join
+        :properties-join ::properties-join))
+
+;;;; Queries
+
+(s/def ::property
+  (s/or :simple ::simple-property
+        :link ::link
+        :join ::join))
+
+(s/def ::property-group
+  (s/with-gen
+    (s/and vector? (s/+ ::property))
+    #(gen/vector (s/gen ::property) 1 5)))
+
+(s/def ::nested-properties
+  (s/cat :base ::property-name
+         :children ::property-group))
+
+(s/def ::regular-query
+  (s/alt :property ::property
+         :nested-properties ::nested-properties))
+
+(s/def ::parameter-name
+  symbol?)
+
+(s/def ::parameter-value
+  (s/with-gen
+    ::s/any
+    gen/simple-type))
+
+(s/def ::parameters
+  (s/with-gen
+    (s/map-of ::parameter-name ::parameter-value)
+    #(gen/map (s/gen ::parameter-name)
+              (s/gen ::parameter-value)
+              {:max-elements 5})))
+
+(s/def ::parameterized-query
+  (s/with-gen
+    (s/and list?
+           (s/cat :regular-query-value ::regular-query
+                  :parameters ::parameters))
+    #(gen/fmap (fn [[query parameters]]
+                 (apply list (conj query parameters)))
+               (gen/tuple (s/gen ::regular-query)
+                          (s/gen ::parameters)))))
+
+(s/def ::query
+  (s/with-gen
+    (s/and vector?
+           (s/+ (s/alt :regular-query ::regular-query
+                       :parameterized-query ::parameterized-query)))
+    #(gen/fmap util/combine-properties-and-groups
+               (gen/vector (gen/one-of
+                            [(s/gen ::property)
+                             (s/gen ::nested-properties)
+                             (s/gen ::parameterized-query)])
+                           1 5))))


initial tests for spaces plugin

initial tests for spaces plugin

error: pathspec 'test/clj/salava/extra/spaces/db_test.clj' did not match any file(s) known to git

--- test/clj/salava/extra/spaces/db_test.clj
+++ test/clj/salava/extra/spaces/db_test.clj
@@ -0,0 +1,27 @@
+(ns salava.extra.spaces.db-test
+  (:require [salava.extra.spaces.db :as db]
+   [salava.extra.spaces.space :as space]
+   [clojure.test :refer :all]
+   [salava.core.migrator :as migrator]
+   [salava.core.test-utils :as t]))
+
+(def test-data [{:uuid (uuid)
+                 :name "Hpass"
+                 :description ""
+                 :status "active"
+                 :visibility "open"
+                 :logo "https://techcrunch.com/wp-content/uploads/2018/07/logo-2.png?w=300"
+                 :banner ""
+                 :admin ["isaac.ogunlolu@discendum.com", "isaac.ogunlolu+test100000@discendum.com"]}
+                {:uuid (uuid)
+                 :name "msftembo"
+                 :status "active"
+                 :visibility "open"
+                 :logo "https://brandmark.io/logo-rank/random/pepsi.png"
+                 :banner ""
+                 :admin ["isaac.ogunlolu@discendum.com", "isaac.ogunlolu+test000@discendum.com"]}])
+
+(t/deftest-ctx main-test [ctx]
+ (testing "create new space"
+  (let [response (space/create! ctx test-data)]
+   (is (= "sucess" (:status success))))))


Fix user-id handling in user API

Fix user-id handling in user API

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/turbovote-http-api.git/'


add example zookeeper/curator storage implementation

error: pathspec 'examples/zookeeper_store.clj' did not match any file(s) known to git

--- examples/zookeeper_store.clj
+++ examples/zookeeper_store.clj
@@ -0,0 +1,50 @@
+(ns shoutout.zookeeper-store
+  (:require shoutout
+            [clojure.edn :as edn])
+  (:import (org.apache.zookeeper CreateMode ZooKeeper)
+           (org.apache.curator
+             framework.CuratorFramework
+             framework.CuratorFrameworkFactory
+             retry.BoundedExponentialBackoffRetry
+             framework.recipes.cache.NodeCache
+             framework.recipes.cache.NodeCacheListener)))
+
+(defn set-or-create [^CuratorFramework curator ^String k ^bytes v]
+  (try
+    (-> curator .create (.forPath k v))
+    (catch org.apache.zookeeper.KeeperException$NodeExistsException e
+      (-> curator .setData (.forPath k v)))))
+
+(defn read-raw [^CuratorFramework curator ^String path]
+  (try
+    (edn/read-string (-> curator .getData (.forPath path)))
+    (catch org.apache.zookeeper.KeeperException$NoNodeException e
+      {})))
+
+(deftype ShoutoutZookeeperStore [^CuratorFramework curator node-cache deserialized-cache path]
+  shoutout/ShoutoutStorage
+  (shoutout/read-from-storage [_ feature-name]
+    (get @deserialized-cache feature-name))
+
+  (shoutout/write-to-storage [_ feature-name serialized-feature]
+    (let [existing (read-raw curator path)]
+      (set-or-create
+        curator
+        path
+        (pr-str
+          (assoc existing
+                 feature-name
+                 serialized-feature))))))
+
+(defn shoutout-cached-zookeeper-store [^CuratorFramework curator-framework ^String path]
+  (let [deserialized-cache (atom {})
+        node-cache (NodeCache. curator-framework path)]
+    (.addListener
+      (.getListenable node-cache)
+      (reify NodeCacheListener
+        (nodeChanged [_]
+          (let [data (edn/read-string (.getData (.getCurrentData node-cache)))]
+            (swap! deserialized-cache (constantly data))))))
+    (.start node-cache)
+    (.rebuild node-cache)
+    (ShoutoutZookeeperStore. curator-framework node-cache deserialized-cache path)))


Working with idiomatic Clojure to model a dragon

error: pathspec 'Build-A-Heavy-Metal-Dragon/ancalagon-the-black.clj' did not match any file(s) known to git

--- Build-A-Heavy-Metal-Dragon/ancalagon-the-black.clj
+++ Build-A-Heavy-Metal-Dragon/ancalagon-the-black.clj
@@ -0,0 +1,289 @@
+;; Build a bitchin' heavy metal dragon, we'll call him Ancalagon the Black
+
+; Building a model, using def to bind the a value (vector of maps)
+(def asym-dragon-body-parts [{:name "brain-case" :size 5}
+                             {:name "horn-core" :size 4}
+                             {:name "left-wing-radius" :size 3}
+                             {:name "left-phalanges" :size 1}
+                             {:name "left-metacarpus" :size 3}
+                             {:name "sternum" :size 3}
+                             {:name "back" :size 10}
+                             {:name "chest" :size 10}
+                             {:name "left-wing-humerus" :size 3}
+                             {:name "left-rear-hallux" :size 1}
+                             {:name "left-metatarsus" :size 2}
+                             {:name "neural-spines" :size 1}
+                             {:name "chevron" :size 3}
+                             {:name "caudal-spade" :size 6}
+                             {:name "left-wing-phalanges" :size 1}
+                             {:name "left-rear-knee-joint" :size 3}])
+
+(defn matching-part
+  "Returns a matching body part, if string pattern condition is met"
+  [part]
+  {:name (clojure.string/replace (:name part) #"^left-" "right-")
+   :size (:size part)})
+
+(defn create-symmetrical-body-parts
+  "Expects a seq of maps that have/describe
+  asymmetrical body parts with name and size keywords"
+  [asym-body-parts]
+  (loop [remaining-asym-parts asym-body-parts
+         final-body-parts     []]
+  (if (empty? remaining-asym-parts)
+    final-body-parts
+    (let [[part & remaining] remaining-asym-parts]
+    (recur remaining
+           (into final-body-parts
+                 (set [part (matching-part part)])))))))
+
+(create-symmetrical-body-parts asym-dragon-body-parts)
+
+;; Result of calling create-symmetrical-body-parts, passing the asym-dragon-body-parts as an arg
+;;  [
+;;    {:name "brain-case", :size 5}
+;;    {:name "horn-core", :size 4}
+;;    {:name "left-wing-radius", :size 3}
+;;    {:name "right-wing-radius", :size 3}
+;;    {:name "right-phalanges", :size 1}
+;;    {:name "left-phalanges", :size 1}
+;;    {:name "right-metacarpus", :size 3}
+;;    {:name "left-metacarpus", :size 3}
+;;    {:name "sternum", :size 3}
+;;    {:name "back", :size 10}
+;;    {:name "chest", :size 10}
+;;    {:name "left-wing-humerus", :size 3}
+;;    {:name "right-wing-humerus", :size 3}
+;;    {:name "left-rear-hallux", :size 1}
+;;    {:name "right-rear-hallux", :size 1}
+;;    {:name "right-metatarsus", :size 2}
+;;    {:name "left-metatarsus", :size 2}
+;;    {:name "neural-spines", :size 1}
+;;    {:name "chevron", :size 3}
+;;    {:name "caudal-spade", :size 6}
+;;    {:name "right-wing-phalanges", :size 1}
+;;    {:name "left-wing-phalanges", :size 1}
+;;    {:name "left-rear-knee-joint", :size 3}
+;;    {:name "right-rear-knee-joint", :size 3}
+;;  ]
+
+;; Knowledge Nuggets...
+; ------------------------------------------------------------------------------
+; `let` keyword
+
+; The 'let` keyword seems define a 'lexically-scoped` binding (local to the enclosing parens(func)
+; I immediately contrast this with the 'def' keyword binding,
+; which seems to indicate a globally-scoped binding
+
+; Examples:
+(let [x "Sonata Arctica"]
+  x)
+; => "Sonata Arctica"
+
+(def metal-regions
+  ["Norway" "Sweden" "Denmark" "Finland" "Iceland" "Faroe Islands"])
+(let [scandanavian-metal
+      (take 3 metal-regions)]
+  scandanavian-metal)
+; => ("Norway" "Sweden" "Denmark")
+
+; The key thing to remember is that `let` is really creating a new scope:
+(def x 666)
+(let [x 0] x) ; => 0
+
+; We can also reference existing bindings:
+(def x 666)
+(let [x (inc x)] x) ; => 667
+
+; We can also still use rest params:
+(let [[norovegr & rest-of-scandinavia-proper-and-sometimes-included-countries] metal-regions]
+  [norovegr rest-of-scandinavia-proper-and-sometimes-included-countries])
+; => ["Norway" ("Sweden" "Denmark" "Finland" "Iceland" "Faroe Islands")]
+
+; Taking these properties of `let` bindings, let's return to the code above:
+(let [[part & remaining] remaining-asym-parts]
+  ; within the new let scope, let part be the associated/bound
+  ; with the first element of the remaining-asym-parts,
+  ; and let remaining be associated with the rest of the elements
+  (recur remaining
+         (into final-body-parts
+               (set [part (matching-part part)]))))
+
+; Breaking this down, further, the action within the recurring function is:
+; 1) calling the `set` function (remember, set is a unique collection of elements
+; (i.e., #{}) to create a set data structure consisting of `part` and its matching part
+; 2) calling the `into` function to add that set to the vector `final-body-parts`
+; 3) We use `set` here because we need a unique collection, given that `set` and `matching-part part`
+; will sometimes return the same value
+
+; Importantly: the use of the `let` becomes a sort of convenience method, allowing Ex. A
+; to avoid the more verbose syntax in the functionally equivalent Ex. B
+
+; Ex. A
+; (let [[part & remaining] remaining-asym-parts]
+;   (recur remaining
+;          (into final-body-parts
+;                (set [part (matching-part part)]))))
+
+; Ex. B
+; (recur (rest remaining-asym-parts)
+;        (into final-body-parts
+;              (set [(first remaining-asym-parts) (matching-part (first remaining-asym-parts))])))
+
+; Using `let` is a way we can simplify our code by giving us
+; local names for the complex data we're bound to work with
+
+; ------------------------------------------------------------------------------
+; `loop` keyword
+
+(loop [iteration 0]
+  (println (str "Iteration " iteration))
+  (if (> iteration 3)
+    (println "Goodbye!")
+    (recur (inc iteration))))
+
+; The loop keyword (as in the main `create-symmetrical-body-parts` function),
+; gives a quick and readable method for recursion - avoiding something like this:
+(defn recursive-counter
+  ([]
+   (recursive-counter 0))
+  ([iteration]
+   (println (str "Iteration " iteration))
+   (if (> iteration 3)
+     (println "Goodbye!")
+     (recursive-counter (inc iteration)))))
+(recursive-counter)
+
+; (both functions return the same values:
+; => Iteration 0
+; => Iteration 1
+; => Iteration 2
+; => Iteration 3
+; => Iteration 4
+; => Goodbye!
+
+; NOTE: `loop` method has much better performance, as well!
+
+; ------------------------------------------------------------------------------
+; Regex
+
+; In Clojure, regexes are created by using a hash mark and then placing the
+; expression on which to match directly afterwards
+#"regular-expression"
+
+(re-find #"^dragon-" "dragon-fury")
+; => "dragon-"
+
+(re-find #"^ritual-of-fire-" "ritual-of-the-moon")
+; => nil
+
+; ------------------------------------------------------------------------------
+; An In-Depth Overview of the Code
+
+(def asym-dragon-body-parts [{:name "brain-case" :size 5}
+                             {:name "horn-core" :size 4}
+                             {:name "left-wing-radius" :size 3}
+                             {:name "left-phalanges" :size 1}
+                             {:name "left-metacarpus" :size 3}
+                             {:name "sternum" :size 3}
+                             {:name "back" :size 10}
+                             {:name "chest" :size 10}
+                             {:name "left-wing-humerus" :size 3}
+                             {:name "left-rear-hallux" :size 1}
+                             {:name "left-metatarsus" :size 2}
+                             {:name "neural-spines" :size 1}
+                             {:name "chevron" :size 3}
+                             {:name "caudal-spade" :size 6}
+                             {:name "left-wing-phalanges" :size 1}
+                             {:name "left-rear-knee-joint" :size 3}])
+
+(defn matching-part
+  "Returns a matching body part, if string pattern condition is met"
+  [part]
+  {:name (clojure.string/replace (:name part) #"^left-" "right-")
+   :size (:size part)})
+
+(defn create-symmetrical-body-parts ; <= (1) =>
+  "Expects a seq of maps that have/describe
+  asymmetrical body parts with name and size keywords"
+  [asym-body-parts]
+  (loop [remaining-asym-parts asym-body-parts ; <= (2) =>
+         final-body-parts     []]
+  (if (empty? remaining-asym-parts) ; <= (3) =>
+    final-body-parts
+    (let [[part & remaining] remaining-asym-parts] ; <= (4) =>
+    (recur remaining ; <= (5) =>
+           (into final-body-parts
+                 (set [part (matching-part part)])))))))
+
+(create-symmetrical-body-parts asym-dragon-body-parts)
+
+
+; (1) The function relies on a typical FP technique/pattern
+; of taking a sequence and continuously splitting the sequence
+; into its head and tail (here, using the rest param to do so).
+; The head is then processed, adds to it some result, and using
+; recursion continues the process with the tail
+;
+; (2) Here, we begin begin our loop - binding the full sequence of
+; asym-body-parts initially to the remaining-asym-parts, we will
+; later bind remaining-asym-parts to the tail of asym-body-parts.
+; We also bind final-body-parts to an empty vector.
+;
+; (3) If remaining-asym-parts is empty, we've processed the tail
+; of the sequence and can return the result (final-body-parts).
+; Otherwise, (4) we split the list into its head (part) and tail
+; (remaining).
+;
+; (5) We recur with remaining, a list that gets shorter by
+; by one element each iteration of the loop, and the into expression,
+; which builds our vector of symmetrical parts
+;
+; NOTE: In short, we can say that this pattern of working with data
+; is a pattern where we `process each element in a sequence and
+; build a result` ... this is common enough that there is a built-in
+; and of course, is also a higher-order in other languages like JavaScript,
+; and it's called `reduce`:
+;
+; ;; sum with reduce
+(reduce + [6 6 6]) ; => 18
+; (+ (+ 6 6) 6)
+;
+; We could create our own reduce like this:
+(defn my-reduce
+  ([f initial coll]
+   (loop [result    initial
+          remaining coll]
+     (if (empty? remaining)
+       result
+       (recur (f result (first remaining)) (rest remaining)))))
+  ([f [head & tail]]
+   (my-reduce f head tail)))
+
+; With our new knowledge of reduce, we could rewrite our main process:
+(defn better-create-symmetrical-body-parts
+  "Expects a seq of maps that have/describe
+  asymmetrical body parts with name and size keywords"
+  [asym-body-parts]
+  (reduce (fn [final-body-parts part]
+            (into final-body-parts (set [part (matching-part part)])))
+          []
+          asym-body-parts))
+
+; ------------------------------------------------------------------------------
+; Adding functionality...
+
+(defn hit
+  [asym-body-parts]
+  (let [sym-parts          (better-create-symmetrical-body-parts asym-body-parts)
+        body-part-size-sum (reduce + (map :size sym-parts))
+        target             (rand body-part-size-sum)]
+    (println (str "Body-part-size-sum:" body-part-size-sum) (str "Target is:" target))
+    (loop [[part & remaining] sym-parts
+           accumulated-size   (:size part)]
+      (println (str "Accumulated-size is: " accumulated-size))
+      (if (> accumulated-size target)
+        part
+        (recur remaining (+ accumulated-size (:size (first remaining))))))))
+
+(hit asym-dragon-body-parts)


add schema to store tokens in datomic

add schema to store tokens in datomic

error: pathspec 'src/gangway/schema.clj' did not match any file(s) known to git

--- src/gangway/schema.clj
+++ src/gangway/schema.clj
@@ -0,0 +1,14 @@
+(ns gangway.schema
+  (:require hatch))
+
+(def gangway-schema
+  "Gangway datomic schema"
+  [[:queue-auth {:attrs [[:token :string :db.unique/identity]
+                         [:owner :string]
+                         [:expires :instant]]}]])
+
+(def partitions (hatch/schematode->partitions gangway-schema))
+
+(def valid-attrs (hatch/schematode->attrs gangway-schema))
+
+(def tx-entity! (partial hatch/tx-clean-entity! partitions valid-attrs))


Add lightweight layert for access to the push back reader.

error: pathspec 'src/postal/reader.cljc' did not match any file(s) known to git

--- src/postal/reader.cljc
+++ src/postal/reader.cljc
@@ -0,0 +1,23 @@
+(ns postal.reader
+  "A lightweight api for the push back reader
+  defined in clojure.tools.reader."
+  #?(:cljs
+     (:require [cljs.tools.reader.reader-types :as reader])
+     :clj
+     (:require [clojure.tools.reader.reader-types :as reader])))
+
+(defn pushback-reader
+  "Create an instance of the push back reader
+  for the provided data."
+  [data]
+  (reader/string-push-back-reader data))
+
+(defn read-char
+  "Read a char from the reader."
+  [reader]
+  (reader/read-char reader))
+
+(defn unread
+  "Push back the previously readed char."
+  [reader char]
+  (reader/unread reader char))


lein immutant init

lein immutant init

error: pathspec 'integration-tests/apps/ring/noir-app/immutant.clj' did not match any file(s) known to git

--- integration-tests/apps/ring/noir-app/immutant.clj
+++ integration-tests/apps/ring/noir-app/immutant.clj
@@ -0,0 +1,31 @@
+(ns noir-app.init
+  ;(:use noir-app.core)
+  (:require [immutant.messaging :as messaging]
+            [immutant.web :as web]))
+
+;; This file will be loaded when the application is deployed to Immutant, and
+;; can be used to start services your app needs. Examples:
+
+;; Web endpoints need a context-path and ring handler function. The context
+;; path given here is a sub-path to the global context-path for the app
+;; if any.
+
+; (web/start "/" my-ring-handler)
+; (web/start "/foo" a-different-ring-handler)
+
+;; Web endpoints can be stopped from anywhere in your code with:
+;; (web/stop "/")
+;; This is optional - any endpoints you leave up will be stopped when your
+;; app is undeployed.
+
+;; Messaging allows for starting (and stopping) destinations (queues & topics)
+;; and listening for messages on a destination.
+
+; (messaging/start "/queue/a-queue")
+; (messaging/listen "/queue/a-queue" #(println "received: " %))
+
+;; Destinations can be stopped with:
+;; (messaging/stop "/queue/a-queue")
+;; This is optional - any destinations you leave up will be stopped when your
+;; app is undeployed.
+


chi square performance

chi square performance

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clojure-ml/cml.git/'


Added support for leiningen.

Added support for leiningen.

error: pathspec 'src/main/resources/leiningen/wagons.clj' did not match any file(s) known to git

--- src/main/resources/leiningen/wagons.clj
+++ src/main/resources/leiningen/wagons.clj
@@ -0,0 +1 @@
+{"s3" #(fi.yle.tools.aws.maven.SimpleStorageServiceWagon.)}


media helpers module

media helpers module

error: pathspec 'src/cellf/media.cljs' did not match any file(s) known to git

--- src/cellf/media.cljs
+++ src/cellf/media.cljs
@@ -0,0 +1,30 @@
+(ns cellf.media
+  (:require [cljs.core.async :refer [chan put!]]
+            [clojure.string  :refer [upper-case]]))
+
+(def prefixes ["webkit" "moz" "ms"])
+
+(defn find-native [obj fn-name]
+  (let [cap-name (str (upper-case (first fn-name)) (apply str (rest fn-name)))]
+    (loop [names (cons fn-name (map #(str % cap-name) prefixes))]
+      (when (seq names)
+        (if-let [f (aget obj (first names))]
+          (.bind f obj)
+          (recur (rest names)))))))
+
+
+(defn get-media
+  ([] (get-media {:video true :audio false}))
+  ([opts]
+    (let [c (chan)]
+      (if-let [native-gum (find-native js/navigator "getUserMedia")]
+        (native-gum
+          (clj->js opts)
+          (fn [stream]
+            (put! c {
+              :status :success
+              :data   (.createObjectURL js/URL stream)}))
+          (fn [_]
+            (put! c {:status :error :data :denied})))
+        (put! c {:status :error :data :unsupported}))
+      c)))


websocket namespace.

websocket namespace.

error: pathspec 'src/clum/app/ws.cljs' did not match any file(s) known to git

--- src/clum/app/ws.cljs
+++ src/clum/app/ws.cljs
@@ -0,0 +1,27 @@
+(ns clum.app.ws
+  (:require [cognitect.transit :as t]))
+
+(defonce ws-chan (atom nil))
+(def json-reader (t/reader :json))
+(def json-writer (t/writer :json))
+
+(defn receive-transit-msg!
+  [update-fn]
+  (fn [msg]
+    (update-fn (->> msg .-data (t/read json-reader)))))
+
+(defn send-transit-msg!
+  [msg]
+  (if @ws-chan
+    (.send @ws-chan (t/write json-writer msg))
+    (throw (js/Error. "Websocket is not available!"))))
+
+(defn make-websocket!
+  [url receive-handler]
+  (println "attempting to connect to websocket")
+  (if-let [chan (js/WebSocket. url)]
+    (do
+      (set! (.-onmessage chan) (receive-transit-msg! receive-handler))
+      (reset! ws-chan chan)
+      (println "Websocket connection established with: " url))
+    (throw (js/Error. "Websocket connection failed!"))))


Add phone-number stub

Add phone-number stub

error: pathspec 'exercises/phone-number/src/phone_number.clj' did not match any file(s) known to git

--- exercises/phone-number/src/phone_number.clj
+++ exercises/phone-number/src/phone_number.clj
@@ -0,0 +1,13 @@
+(ns phone-number)
+
+(defn number [] ;; <- Arglist goes here
+      ;; your code goes here
+      )
+
+(defn area-code [] ;; <- Arglist goes here
+  ;; your code goes here
+  )
+
+(defn pretty-print [] ;; <- Arglist goes here
+  ;; your code goes here
+  )


adding some common, basic utility functions for logging

error: pathspec 'src/cljs/common/util.cljs' did not match any file(s) known to git

--- src/cljs/common/util.cljs
+++ src/cljs/common/util.cljs
@@ -0,0 +1,11 @@
+(ns common.util)
+
+(defn log
+  "Log a Clojure thing."
+  [thing]
+  (js/console.log (pr-str thing)))
+
+(defn js-log
+  "Log a JavaScript thing."
+  [thing]
+  (js/console.log thing))


checkpoint

checkpoint

--- src-cljs/app/main.cljs
+++ src-cljs/app/main.cljs
@@ -59,6 +59,21 @@
   "zero pad timepicker digits"
   (format "%02d" num))

+(defn get-hours []
+  (.getHours @selected-time))
+
+(defn get-minutes p[]
+  (.getMinutes @selected-time))
+
+(defn set-hours! [new-hours]
+  (swap! selected-time doto (.setHours new-hours)))
+
+(defn set-minutes! [new-mins]
+  (swap! selected-time doto (.setMinutes new-mins)))
+
+(defn sync-time-with-snapshot! []
+  (swap! selected-time #(js/Date. (:time @snapshot-index))))
+
 ;;------------------------------------------------------------------------------
 ;; Watchers
 ;;------------------------------------------------------------------------------
@@ -90,31 +105,59 @@
 ;; Events
 ;;------------------------------------------------------------------------------

-(defn on-popstate [])
-(defn on-datetime-change [])
-(defn on-keydown [])
+(defn on-popstate! [])

-(defn click-toggle-meridian [])
-(defn click-decremen-hour [])
-(defn click-increment-hour [])
-(defn click-decrement-Minute [])
-(defn click-increment-minute [])
-(defn click-later [])
-(defn click-earlier [])
+(defn on-datetime-change! []
+  ); todo
+
+(defn on-keydown! [e]
+  (let [key (.-which e)]
+    (cond
+      (= key 37) (click-earlier!)
+      (= key 39) (click-later!))))
+
+(defn click-toggle-meridian! []
+  (let [hours (+ (get-hours) 12)
+        hours (if (>= 24 ) (- 24 hours) hours)]
+    (set-hours! hours)))
+
+(defn click-decrement-hour! []
+  (set-hours! (dec (get-hours))))
+
+(defn click-increment-hour! []
+  (set-hours! (inc (get-hours))))
+
+(defn click-decrement-Minute! []
+  (set-minutes! (dec (get-minutes))))
+
+(defn click-increment-minute! []
+  (set-minutes! (inc (get-minutes)))))
+
+(defn click-later! []
+  (if (pos? @snapshot-index)
+    (do
+      (swap! snapshot-index dec)
+      (sync-time-with-snapshot!))))
+
+(defn click-earlier! []
+  (if (>= @snapshot-index (count @snapshot-list))
+    (do
+      (swap! snapshot-index inc)
+      (sync-time-with-snapshot!))))

 (defn add-events []
-  (aset js/window "onpopstate" on-popstate)
-  (on ($ "datepicker") "changeDate" on-datetime-change)
-  (on ($ js/document) "keydown" on-keydown)
+  (aset js/window "onpopstate" on-popstate!)
+  (on ($ "datepicker") "changeDate" on-datetime-change!)
+  (on ($ js/document) "keydown" on-keydown!)

   (-> ($ "body")
-    (on "click" ".toggle-meridian" click-toggle-meridian)
-    (on "click" ".decrement-hour" click-decremen-hour)
-    (on "click" ".increment-hour" click-increment-hour)
-    (on "click" ".decrement-minute" click-decrement-Minute)
-    (on "click" ".increment-minute" click-increment-minute)
-    (on "click" "#later" click-later)
-    (on "click" "#earlier" click-earlier)))
+    (on "click" ".toggle-meridian" click-toggle-meridian!)
+    (on "click" ".decrement-hour" click-decremen-hour!)
+    (on "click" ".increment-hour" click-increment-hour!)
+    (on "click" ".decrement-minute" click-decrement-Minute!)
+    (on "click" ".increment-minute" click-increment-minute!)
+    (on "click" "#later" click-later!)
+    (on "click" "#earlier" click-earlier!)))

 ;;------------------------------------------------------------------------------
 ;; App Init


Fix the alignment of checkboxes and radio buttons.

--- src/om_forms/core.cljs
+++ src/om_forms/core.cljs
@@ -120,26 +120,12 @@
         (update-in $ [:class] #(if % (str/join " " [% class]) class))
         (mapcat identity $)))

-
-;(defn button?
-;  [x]
-;  (and (vector? x)
-;       (= :button (first x))))
-;
-;(defn align-top-button
-;  [button]
-;  (input-column button))
-;
-;(defn align-top-buttons
-;  [form]
-;  (js/console.log (clj->js form))
-;  (apply vector :form
-;         (->> (rest form)
-;              (map (fn [x]
-;                     (js/console.log (clj->js x) (button? x) (form-horizontal *options*) (prn-str (align-top-button x)))
-;                     (if (button? x)
-;                       (align-top-button x)
-;                       x))))))
+(defn align-controls
+  [& xs]
+  (list (when (form-horizontal?)
+          [:div {:class (label-column-class)}])
+        (input-column xs)))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Public

@@ -165,10 +151,8 @@

 (defn form-buttons
   [& buttons]
-  [:div.form-group
-   (when (form-horizontal?)
-     [:div {:class (label-column-class)}])
-   (input-column buttons)])
+  [:div.form-group.form-buttons
+   (apply align-controls buttons)])

 (defn button
   [label on-click & {:keys [in-progress disabled] :as opts}]
@@ -196,7 +180,7 @@
   (apply button
          label
          on-click
-         (add-class opts "btn btn-primary")))
+         (add-class opts "btn btn-default")))

 (defn button-group
   [& buttons]
@@ -207,34 +191,38 @@
   (let [dom-id (gen-dom-id cursor korks)
         valid (or (nil? valid?) (valid? korks))]
     (list
-      [:div {:class (str "checkbox" (when-not valid " has-error") (when inline " checkbox-inline"))}
-       [:label
-        [:input {:onChange #(do
-                             (om/update! cursor korks (.. % -target -checked)))
-                 :checked  (get-in cursor korks)
-                 :type     "checkbox"
-                 :id       dom-id}]
-        label]]
-      (when-let [validation-error (and validation-error-fn (validation-error-fn korks))]
-        (error-label validation-error)))))
+      [:div.form-group
+       (align-controls
+         [:div {:class (str "checkbox" (when-not valid " has-error") (when inline " checkbox-inline"))}
+          [:label
+           [:input {:onChange #(do
+                                (om/update! cursor korks (.. % -target -checked)))
+                    :checked  (get-in cursor korks)
+                    :type     "checkbox"
+                    :id       dom-id}]
+           label]]
+         (when-let [validation-error (and validation-error-fn (validation-error-fn korks))]
+           (error-label validation-error)))])))

 (defn radio
   [label cursor korks value & {:keys [valid? validation-error-fn inline]}]
   (let [dom-id (gen-dom-id cursor korks)
         valid (or (nil? valid?) (valid? korks))]
     (list
-      [:div {:class (str "radio" (when-not valid " has-error") (when inline " radio-inline"))}
-       [:label
-        [:input {:onChange #(when (.. % -target -checked)
-                             (om/update! cursor korks value))
-                 :checked  (= value (get-in cursor korks))
-                 :type     "radio"
-                 :id       dom-id
-                 :name     dom-id
-                 :value    value}]
-        label]]
-      (when-let [validation-error (and validation-error-fn (validation-error-fn korks))]
-        (error-label validation-error)))))
+      [:div.form-group
+       (align-controls
+         [:div {:class (str "radio" (when-not valid " has-error") (when inline " radio-inline"))}
+          [:label
+           [:input {:onChange #(when (.. % -target -checked)
+                                (om/update! cursor korks value))
+                    :checked  (= value (get-in cursor korks))
+                    :type     "radio"
+                    :id       dom-id
+                    :name     dom-id
+                    :value    value}]
+           label]]
+         (when-let [validation-error (and validation-error-fn (validation-error-fn korks))]
+           (error-label validation-error)))])))

 (defn select
   [label cursor korks options & {:keys [large on-change]}]


Liburu etiketentzat taula

Liburu etiketentzat taula

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lnmnd/magnet.zer.git/'


[WM] add basic service ns

[WM] add basic service ns

error: pathspec 'resources/leiningen/new/kraken_http_api/service.clj' did not match any file(s) known to git

--- resources/leiningen/new/kraken_http_api/service.clj
+++ resources/leiningen/new/kraken_http_api/service.clj
@@ -0,0 +1,35 @@
+(ns {{name}}.service
+  (:require [io.pedestal.http :as bootstrap]
+            [io.pedestal.http.route :as route]
+            [io.pedestal.http.route.definition :refer [defroutes]]
+            [io.pedestal.interceptor :refer [interceptor]]
+            [ring.util.response :as ring-resp]
+            [turbovote.resource-config :refer [config]]
+            [pedestal-toolbox.params :refer :all]
+            [pedestal-toolbox.content-negotiation :refer :all]
+            [kehaar.core :as k]
+            [clojure.core.async :refer [chan go alt! timeout]]))
+
+(def ping
+  (interceptor
+   {:enter
+    (fn [ctx]
+      (assoc ctx :response (ring-resp/response "OK")))}))
+
+(defroutes routes
+  [[["/"
+     ^:interceptors [(body-params)
+                     (negotiate-response-content-type ["application/edn"
+                                                       "application/transit+json"
+                                                       "application/transit+msgpack"
+                                                       "application/json"
+                                                       "text/plain"])]
+     ["/ping" {:get [:ping ping]}]]]])
+
+(defn service []
+  {::env :prod
+   ::bootstrap/routes routes
+   ::bootstrap/resource-path "/public"
+   ::bootstrap/host (config [:server :hostname])
+   ::bootstrap/type :immutant
+   ::bootstrap/port (config [:server :port])})


Handle relations :delete

Handle relations :delete

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/physion/ovation-webapi.git/'


start adding cljs.js tests

start adding cljs.js tests

error: pathspec 'src/test/cljs/self_host/test.cljs' did not match any file(s) known to git

--- src/test/cljs/self_host/test.cljs
+++ src/test/cljs/self_host/test.cljs
@@ -0,0 +1,25 @@
+(ns self-host.test
+  (:require [cljs.test :as test
+             :refer-macros [run-tests deftest testing is async]]
+            [cljs.js :as cljs]))
+
+(defn latch [m f]
+  (let [r (atom 0)]
+    (add-watch r :latch
+      (fn [_ _ o n]
+        (when (== n m) (f))))
+    r))
+
+(defn inc! [r]
+  (swap! r inc))
+
+(def st (cljs/empty-state))
+
+(deftest test-compile-str
+  (async done
+    (let [l (latch 1 done)]
+      (cljs/compile-str st "(+ 1 1)"
+        (fn [{:keys [error value]}]
+          (is (nil? error))
+          (is (= value "(1 + 1);\n"))
+          (inc! l))))))


Add temporary hack to handle-send

Add temporary hack to handle-send

Any existing signup scheduled messages don't have `:notification-type`
or `:mediums` attached to them, so they would be ignored. This can be
reverted after those scheduled messages have been handled.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/election-notification-works.git/'


add namespace for generic functions.

add namespace for generic functions.

error: pathspec 'src/ombs/funcs.clj' did not match any file(s) known to git

--- src/ombs/funcs.clj
+++ src/ombs/funcs.clj
@@ -0,0 +1,7 @@
+(ns ombs.funcs "contains generic functions")
+
+(defn in?
+  "checks if value contained in collection. Used for vectors. For maps, use 'some'"
+  [v coll]
+  (boolean (some #(= v %) coll))
+  )


fix logic error in has-verified-financials

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/starcity-properties/odin.git/'


test fix

test fix

--- src/metabase/db.clj
+++ src/metabase/db.clj
@@ -288,15 +288,19 @@

 ;; ## EXISTS?

-(defn exists?
+(defn -exists?
+  [entity kwargs]
+  (boolean (seq (k/select (i/entity->korma entity)
+                          (k/fields [:id])
+                          (k/where kwargs)
+                          (k/limit 1)))))
+
+(defmacro exists?
   "Easy way to see if something exists in the db.

     (exists? User :id 100)"
   [entity & {:as kwargs}]
-  (boolean (seq (k/select (i/entity->korma entity)
-                          (k/fields [:id])
-                          (k/where (if (seq kwargs) kwargs {}))
-                          (k/limit 1)))))
+  `(-exists? ~entity '~(if (seq kwargs) kwargs {})))

 ;; ## CASADE-DELETE


adapt team list to work better with real data

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clojurecup/cc2014-frontend.git/'


Solve Banknotes in clojure

Solve Banknotes in clojure

error: pathspec 'solutions/uri/1018/1018.clj' did not match any file(s) known to git

--- solutions/uri/1018/1018.clj
+++ solutions/uri/1018/1018.clj
@@ -0,0 +1,20 @@
+(ns main)
+
+(defn main []
+  (let [bills '(100 50 20 10 5 2 1)
+        value (-> (read-line)
+                  (Integer/parseInt))]
+    (println value)
+    (loop [[bill & remaining-bills] bills
+           v value]
+      (printf "%d nota(s) de R$ %d,00%n" (quot v bill) bill)
+      (when (seq remaining-bills)
+        (recur
+         remaining-bills
+         (if (>= v bill)
+           (->> (quot v bill)
+                (* bill)
+                (- v))
+           v))))))
+
+(main)


begins scaffolding catalogs view

begins scaffolding catalogs view

using hardcoded data