From e2185c19291c9e3078d9546a0a0d66d4767800f8 Mon Sep 17 00:00:00 2001 From: Parth <67057645+parth-io@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:51:36 +0800 Subject: [PATCH 1/5] fix(nostrand): pin load-path roots to the directory they were added in (#187) -load-path kept paths as text and resolved it against the current directory at each flush. A change in directory would make the paths wrong. Use absolute paths as the default instead. --- nostrand/nostrand/core.clj | 49 ++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/nostrand/nostrand/core.clj b/nostrand/nostrand/core.clj index e85eaffe..4df82bc2 100644 --- a/nostrand/nostrand/core.clj +++ b/nostrand/nostrand/core.clj @@ -1,27 +1,45 @@ (ns - ^{:author "Ramsey Nasser" - :doc "Core nostrand API containing load path, assemblies, and dependency functions."} - nostrand.core + ^{:author "Ramsey Nasser" + :doc "Core nostrand API containing load path, assemblies, and dependency functions."} + nostrand.core (:require [clojure.string :as string] [nostrand.deps.basis :as basis] [nostrand.deps.submodules :as submodules]) (:import [System.IO Directory Path File])) +(defn- absolute-path + "path as an absolute path with no trailing separator, resolved against the + cwd of this call, so a later cwd change cannot move a root already added." + [path] + (when (string/blank? (str path)) + (throw (ex-info "Load path entry is blank" {:path path}))) + (let [full (Path/GetFullPath (str path))] + (if (and (> (count full) 1) + (string/ends-with? full (str Path/DirectorySeparatorChar))) + (subs full 0 (dec (count full))) + full))) + +(defn- path-list + "Absolute entries of a PathSeparator-joined list. Blank entries are dropped + rather than rejected: they come from a stray separator, not a named path." + [s] + (into [] (comp (remove string/blank?) (map absolute-path)) + (string/split (or s "") (re-pattern (str Path/PathSeparator))))) + (def -assembly-path (atom (string/split (or (Environment/GetEnvironmentVariable "MONO_PATH") ".") (re-pattern (str Path/PathSeparator))))) (def -load-path - (atom (string/split (or (Environment/GetEnvironmentVariable "CLOJURE_LOAD_PATH") ".") - (re-pattern (str Path/PathSeparator))))) + (atom (path-list (Environment/GetEnvironmentVariable "CLOJURE_LOAD_PATH")))) (defonce ^{:private true :doc "*load-paths* as the runtime left it, set when this namespace is first loaded, so a host must load nostrand.core before adding any project root."} -base-load-paths (vec *load-paths*)) -(defn- absolute-load-path [] - (into [] (comp (map #(Path/GetFullPath %)) (distinct)) @-load-path)) +(defn- load-path-roots [] + (into [] (distinct) @-load-path)) (defn resolve-assembly-load [asm] (let [candidates (for [prefix @-assembly-path @@ -34,22 +52,23 @@ (assembly-load-from full-asm-path)))) (defn update-load-path [] - (let [abs-paths (absolute-load-path)] + (let [roots (load-path-roots)] ;; CLOJURE_LOAD_PATH gets absolute roots (like *load-paths*), so a loader - ;; scanning it finds files from any cwd, matching ClojureCLR. + ;; scanning it finds files from any cwd, matching ClojureCLR. Prefer nil + ;; over "", to unset the variable when there are no paths. (Environment/SetEnvironmentVariable - "CLOJURE_LOAD_PATH" - (string/join Path/PathSeparator abs-paths)) + "CLOJURE_LOAD_PATH" + (when (seq roots) (string/join Path/PathSeparator roots))) (alter-var-root #'*load-paths* (constantly - (into abs-paths (remove (set abs-paths)) -base-load-paths))))) + (into roots (remove (set roots)) -base-load-paths))))) (defn set-load-path [val] - (reset! -load-path val) + (reset! -load-path (mapv absolute-path val)) (update-load-path)) (defn add-load-path [path] - (swap! -load-path conj path) + (swap! -load-path conj (absolute-path path)) (update-load-path)) (defn add-assembly-path [path] @@ -84,7 +103,7 @@ source path, so matching it would take in every assembly beneath it." [] (let [cwd (dir-prefix (Path/GetFullPath ".")) - prefixes (->> (absolute-load-path) + prefixes (->> (load-path-roots) distinct (filter #(Directory/Exists %)) (map dir-prefix) From 1e5f8c2f88ed0d808adaba701dd61c189d70033d Mon Sep 17 00:00:00 2001 From: Parth <67057645+parth-io@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:52:17 +0800 Subject: [PATCH 2/5] fix(nostrand): pin assembly search roots to the directory they were added in (#187) Similar to -load-path, use absolute paths as the default. --- nostrand/Nostrand.cs | 7 +++++-- nostrand/nostrand/core.clj | 15 +++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/nostrand/Nostrand.cs b/nostrand/Nostrand.cs index 5b9919fe..7b4b8d80 100644 --- a/nostrand/Nostrand.cs +++ b/nostrand/Nostrand.cs @@ -168,8 +168,11 @@ public static void Main(string[] args) { AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolver.Resolve; - RT.var("nostrand.core", "load-path").invoke(Directory.GetCurrentDirectory()); - + var projectRoot = Directory.GetCurrentDirectory(); + + RT.var("nostrand.core", "load-path").invoke(projectRoot); + RT.var("nostrand.core", "assembly-path").invoke(projectRoot); + if (File.Exists("deps.edn") || File.Exists("deps-clr.edn")) { RT.var("nostrand.core", "establish-deps-edn").invoke(); diff --git a/nostrand/nostrand/core.clj b/nostrand/nostrand/core.clj index 4df82bc2..fe41c6e6 100644 --- a/nostrand/nostrand/core.clj +++ b/nostrand/nostrand/core.clj @@ -8,14 +8,13 @@ (:import [System.IO Directory Path File])) (defn- absolute-path - "path as an absolute path with no trailing separator, resolved against the - cwd of this call, so a later cwd change cannot move a root already added." + "Resolve the absolute path against the current cwd, in case the cwd changes later." [path] (when (string/blank? (str path)) (throw (ex-info "Load path entry is blank" {:path path}))) (let [full (Path/GetFullPath (str path))] (if (and (> (count full) 1) - (string/ends-with? full (str Path/DirectorySeparatorChar))) + (string/ends-with? full (str Path/DirectorySeparatorChar))) ; remove trailing separator (subs full 0 (dec (count full))) full))) @@ -26,9 +25,9 @@ (into [] (comp (remove string/blank?) (map absolute-path)) (string/split (or s "") (re-pattern (str Path/PathSeparator))))) +;; The host seeds the real project root at boot: a cwd here would be the host's. (def -assembly-path - (atom (string/split (or (Environment/GetEnvironmentVariable "MONO_PATH") ".") - (re-pattern (str Path/PathSeparator))))) + (atom (path-list (Environment/GetEnvironmentVariable "MONO_PATH")))) (def -load-path (atom (path-list (Environment/GetEnvironmentVariable "CLOJURE_LOAD_PATH")))) @@ -72,7 +71,11 @@ (update-load-path)) (defn add-assembly-path [path] - (swap! -assembly-path conj path)) + (swap! -assembly-path conj (absolute-path path))) + +(defn set-assembly-path + [val] + (reset! -assembly-path (mapv absolute-path val))) (defn load-path [& paths] (doseq [p paths] From 9b0f981d9aa4133d0b6a5f7566340e49efbbffaf Mon Sep 17 00:00:00 2001 From: Parth <67057645+parth-io@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:52:39 +0800 Subject: [PATCH 3/5] fix(nostrand): resolve a project's own coords against its deps file (#187) resolve-deps seeded the root deps map with ".". The project's own :local/root and :paths then resolved against the process cwd. A deps file's coords must resolve against its own directory. --- nostrand/nostrand/deps/basis.clj | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/nostrand/nostrand/deps/basis.clj b/nostrand/nostrand/deps/basis.clj index 88b8d0bb..6b67bde8 100644 --- a/nostrand/nostrand/deps/basis.clj +++ b/nostrand/nostrand/deps/basis.clj @@ -129,10 +129,10 @@ full sha it abbreviates are treated as equal). A coord's :exclusions prune those libs from its subtree, and an entry in overrides replaces a lib's coord wherever it is encountered (a JVM->CLR fork swap), without seeding a root - dependency for libs absent from the tree. Returns - lib -> {:coord :resolved-sha :paths}." - [cache deps overrides] - (loop [queue (vec (for [[lib coord] deps] [lib coord "." #{}])) + dependency for libs absent from the tree. Relative coords resolve against base, + a dependency's against its checkout. Returns lib -> {:coord :resolved-sha :paths}." + [cache base deps overrides] + (loop [queue (vec (for [[lib coord] deps] [lib coord base #{}])) out {} skipped []] (if-let [[lib coord0 base excluded] (first queue)] @@ -205,8 +205,11 @@ and return {:paths :libs :classpath-paths}." ([] (create-basis (project-deps-file) [])) ([deps-file aliases] - (let [{:keys [paths deps overrides]} (merge-aliases (read-project-deps deps-file) aliases) - libs (resolve-deps (cache-root) deps overrides)] + (let [base (Path/GetDirectoryName (Path/GetFullPath deps-file)) + {:keys [paths deps overrides]} (merge-aliases (read-project-deps deps-file) aliases) + ;; :local/root resolves against base too, in resolve-deps. + paths (mapv #(resolve-root base %) paths) + libs (resolve-deps (cache-root) base deps overrides)] {:paths paths :libs libs :classpath-paths (concat paths (mapcat :paths (vals libs)))}))) From 95e854748fb7542b378cb1257ac831aa732cc567 Mon Sep 17 00:00:00 2001 From: Parth <67057645+parth-io@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:53:20 +0800 Subject: [PATCH 4/5] fix(nostrand): take the project root explicitly instead of reading the cwd (#187) project-deps-file read the current directory. A host with a different cwd found no deps file, and EstablishProject returned null. establish-project now takes the root and resets both searches to it, so a second call switches projects. --- CHANGELOG.md | 1 + nostrand/Nostrand.cs | 10 +--- nostrand/nostrand/core.clj | 88 +++++++++++++++++++++----------- nostrand/nostrand/deps/basis.clj | 28 +++++----- nostrand/nostrand/tasks.clj | 10 ++-- 5 files changed, 80 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4845859f..df2edc2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### Nostrand - `nos` ships its own eight namespaces as committed `nostrand.*.clj.dll` instead of compiling them in memory at every startup, so a short invocation starts roughly twice as fast. `bb build-runtime` recompiles them - [#183](https://github.com/flybot-sg/magic/issues/183). - `*load-paths*` holds each root once, and `set-load-path` drops roots it no longer names - [#182](https://github.com/flybot-sg/magic/issues/182). +- Load-path and assembly roots pin to the directory they were added from, and `establish-project` takes the project root explicitly instead of reading the process directory; it owns both searches, so a second call switches projects rather than searching the first one first - [#187](https://github.com/flybot-sg/magic/issues/187). ## v0.13.0 - 2026-09-09 diff --git a/nostrand/Nostrand.cs b/nostrand/Nostrand.cs index 7b4b8d80..4b826efd 100644 --- a/nostrand/Nostrand.cs +++ b/nostrand/Nostrand.cs @@ -168,15 +168,7 @@ public static void Main(string[] args) { AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolver.Resolve; - var projectRoot = Directory.GetCurrentDirectory(); - - RT.var("nostrand.core", "load-path").invoke(projectRoot); - RT.var("nostrand.core", "assembly-path").invoke(projectRoot); - - if (File.Exists("deps.edn") || File.Exists("deps-clr.edn")) - { - RT.var("nostrand.core", "establish-deps-edn").invoke(); - } + RT.var("nostrand.core", "establish-project").invoke(Directory.GetCurrentDirectory()); RT.PostBootstrapInit(); diff --git a/nostrand/nostrand/core.clj b/nostrand/nostrand/core.clj index fe41c6e6..53a44323 100644 --- a/nostrand/nostrand/core.clj +++ b/nostrand/nostrand/core.clj @@ -25,18 +25,35 @@ (into [] (comp (remove string/blank?) (map absolute-path)) (string/split (or s "") (re-pattern (str Path/PathSeparator))))) -;; The host seeds the real project root at boot: a cwd here would be the host's. -(def -assembly-path - (atom (path-list (Environment/GetEnvironmentVariable "MONO_PATH")))) +;; No cwd default: the cwd here is the host's; establish-project seeds the root. +(def ^:private -env-assembly-path + (path-list (Environment/GetEnvironmentVariable "MONO_PATH"))) -(def -load-path - (atom (path-list (Environment/GetEnvironmentVariable "CLOJURE_LOAD_PATH")))) +(def ^:private -env-load-path + (path-list (Environment/GetEnvironmentVariable "CLOJURE_LOAD_PATH"))) + +(def -assembly-path (atom -env-assembly-path)) + +(def -load-path (atom -env-load-path)) (defonce ^{:private true :doc "*load-paths* as the runtime left it, set when this namespace is first loaded, so a host must load nostrand.core before adding any project root."} -base-load-paths (vec *load-paths*)) +(def ^:private -project-root + (atom nil)) + +(defn project-root + "Directory the project deps file and its relative :paths resolve against." + [] + (or @-project-root + (throw (ex-info "No project root: establish-project has not run" {})))) + +(defn project-deps-file + [] + (basis/project-deps-file (project-root))) + (defn- load-path-roots [] (into [] (distinct) @-load-path)) @@ -102,15 +119,14 @@ (defn loaded-assembly-files "The files of the assemblies this process loaded from under a source path. - The current directory sits on the load path to resolve task files, not as a + The project root sits on the load path to resolve task files, not as a source path, so matching it would take in every assembly beneath it." [] - (let [cwd (dir-prefix (Path/GetFullPath ".")) + (let [root (dir-prefix (project-root)) prefixes (->> (load-path-roots) - distinct (filter #(Directory/Exists %)) (map dir-prefix) - (remove #(= cwd %)))] + (remove #(= root %)))] (for [asm (.GetAssemblies AppDomain/CurrentDomain) :let [file (assembly-file asm)] :when (and file (under-any? prefixes file))] @@ -125,23 +141,37 @@ `(reference* ~(mapv str asms))) (defn establish-deps-edn - "Resolve a deps.edn (with the given aliases) and put every resolved - source path on the load path. Returns the basis. The 0-arity is the - boot entry point: it activates the aliases under the :nos/aliases key, - and when :nos/submodule-paths is present also adds the source paths of - the vendored git submodules (its value is a path prefix to restrict to, - or true for every submodule)." - ([] - (let [deps-file (basis/project-deps-file) - deps-edn (basis/read-project-deps deps-file) - b (establish-deps-edn deps-file (:nos/aliases deps-edn []))] - (when-let [root (:nos/submodule-paths deps-edn)] - (when (File/Exists ".gitmodules") - (apply load-path - (submodules/submodule-paths (slurp ".gitmodules") - (when (string? root) root))))) - b)) - ([deps-file aliases] - (let [{:keys [classpath-paths] :as b} (basis/create-basis deps-file aliases)] - (apply load-path classpath-paths) - b))) + "Resolve deps-file (with the given aliases) and put every resolved source + path on the load path. Returns the basis." + [deps-file aliases] + (let [{:keys [classpath-paths] :as b} (basis/create-basis deps-file aliases)] + (apply load-path classpath-paths) + b)) + +(defn establish-project + "Make root the project root and reset both searches to the env-var roots + plus root, replacing any previous project, then add the source paths from + root's deps file. + extra-roots are source roots searched after root; they do not join the + assembly search. Returns the basis, or nil when root has no deps file." + ([root] (establish-project root nil)) + ([root extra-roots] + (let [root (absolute-path root)] + (when-not (Directory/Exists root) + (throw (ex-info (str "Project root is not a directory: " root) {:root root}))) + (reset! -project-root root) + (set-load-path (into (conj -env-load-path root) extra-roots)) + (set-assembly-path (conj -env-assembly-path root)) + (let [deps-file (basis/project-deps-file root)] + (when (File/Exists deps-file) + (let [deps-edn (basis/read-project-deps deps-file) + b (establish-deps-edn deps-file (:nos/aliases deps-edn [])) + ;; A path prefix to restrict the submodules to, or true for all. + sub (:nos/submodule-paths deps-edn) + modules (Path/Combine root ".gitmodules")] + (when (and sub (File/Exists modules)) + (apply load-path + (map #(Path/Combine root %) + (submodules/submodule-paths (slurp modules) + (when (string? sub) sub))))) + b)))))) diff --git a/nostrand/nostrand/deps/basis.clj b/nostrand/nostrand/deps/basis.clj index 6b67bde8..b14dc6fe 100644 --- a/nostrand/nostrand/deps/basis.clj +++ b/nostrand/nostrand/deps/basis.clj @@ -183,10 +183,11 @@ (str (Environment/GetEnvironmentVariable "HOME") "/.nostrand/gitlibs"))) (defn project-deps-file - "deps-clr.edn if present, else deps.edn. Matches cljr, which reads - deps-clr.edn in place of deps.edn." - [] - (if (File/Exists "deps-clr.edn") "deps-clr.edn" "deps.edn")) + "Absolute path of the deps file in dir: deps-clr.edn if present, else + deps.edn, as cljr prefers." + [dir] + (let [clr (Path/Combine dir "deps-clr.edn")] + (if (File/Exists clr) clr (Path/Combine dir "deps.edn")))) (defn read-project-deps "Parse the project deps file, naming it in the error when it is missing @@ -203,13 +204,12 @@ (defn create-basis "Read deps-file, fold in the selected aliases, resolve transitively, and return {:paths :libs :classpath-paths}." - ([] (create-basis (project-deps-file) [])) - ([deps-file aliases] - (let [base (Path/GetDirectoryName (Path/GetFullPath deps-file)) - {:keys [paths deps overrides]} (merge-aliases (read-project-deps deps-file) aliases) - ;; :local/root resolves against base too, in resolve-deps. - paths (mapv #(resolve-root base %) paths) - libs (resolve-deps (cache-root) base deps overrides)] - {:paths paths - :libs libs - :classpath-paths (concat paths (mapcat :paths (vals libs)))}))) + [deps-file aliases] + (let [base (Path/GetDirectoryName (Path/GetFullPath deps-file)) + {:keys [paths deps overrides]} (merge-aliases (read-project-deps deps-file) aliases) + ;; :local/root resolves against base too, in resolve-deps. + paths (mapv #(resolve-root base %) paths) + libs (resolve-deps (cache-root) base deps overrides)] + {:paths paths + :libs libs + :classpath-paths (concat paths (mapcat :paths (vals libs)))})) diff --git a/nostrand/nostrand/tasks.clj b/nostrand/nostrand/tasks.clj index 7f997c4b..b046cd37 100644 --- a/nostrand/nostrand/tasks.clj +++ b/nostrand/nostrand/tasks.clj @@ -99,7 +99,7 @@ Usage: nos print-basis ; base :deps only nos print-basis :clr :test ; with aliases" [& aliases] - (let [{:keys [paths libs classpath-paths]} (basis/create-basis (basis/project-deps-file) (vec aliases))] + (let [{:keys [paths libs classpath-paths]} (basis/create-basis (nos/project-deps-file) (vec aliases))] (pprint/pprint {:aliases (vec aliases) :paths paths @@ -189,7 +189,7 @@ compile or test instead of hand-listing it. Read-only; does not touch the load path. (tasks/project-namespaces [:test])" - ([aliases] (project-namespaces (basis/project-deps-file) aliases)) + ([aliases] (project-namespaces (nos/project-deps-file) aliases)) ([deps-file aliases] (paths-namespaces (:paths (basis/create-basis deps-file (vec aliases)))))) @@ -200,7 +200,7 @@ namespaces from either source (e.g. test-dir tooling that must not load)." [namespaces aliases exclude basis] (->> (or namespaces - (paths-namespaces (:paths (or basis (basis/create-basis (basis/project-deps-file) (vec aliases)))))) + (paths-namespaces (:paths (or basis (basis/create-basis (nos/project-deps-file) (vec aliases)))))) (remove (set exclude)))) (def ^:private clj-assembly-suffixes [".clj.dll" ".cljc.dll" ".cljr.dll"]) @@ -275,7 +275,7 @@ (defn build [] (tasks/compile-project :aliases [:clr]))" [& {:keys [namespaces exclude aliases out csharp-out clean? flags] :or {out "build" clean? false flags production-flags}}] - (let [basis (when (seq aliases) (nos/establish-deps-edn (basis/project-deps-file) aliases)) + (let [basis (when (seq aliases) (nos/establish-deps-edn (nos/project-deps-file) aliases)) nses (task-namespaces namespaces aliases exclude basis)] (with-bindings (assoc flags #'*compile-path* out) (println "Compiling into DLL dir:" *compile-path*) @@ -315,7 +315,7 @@ (defn run-tests [] (tasks/run-clojure-tests :aliases [:clr :test]))" [& {:keys [namespaces exclude re aliases flags exit? exclude-vars] :or {flags production-flags exit? true}}] - (let [basis (when (seq aliases) (nos/establish-deps-edn (basis/project-deps-file) aliases)) + (let [basis (when (seq aliases) (nos/establish-deps-edn (nos/project-deps-file) aliases)) nses (task-namespaces namespaces aliases exclude basis)] (with-bindings flags (doseq [ns nses] From d26aad63c8b9dcbcfc7c02bbbc0bc58e50ff44e7 Mon Sep 17 00:00:00 2001 From: Parth <67057645+parth-io@users.noreply.github.com> Date: Tue, 22 Sep 2026 15:53:42 +0800 Subject: [PATCH 5/5] chore(bootstrap): refresh the nostrand DLLs for the cwd-independence fixes (#187) --- magic-compiler/dll-sources.edn | 6 +++--- nostrand/references/nostrand.core.clj.dll | Bin 34304 -> 43008 bytes .../references/nostrand.deps.basis.clj.dll | Bin 44032 -> 44544 bytes nostrand/references/nostrand.tasks.clj.dll | Bin 80896 -> 80896 bytes 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/magic-compiler/dll-sources.edn b/magic-compiler/dll-sources.edn index bb751606..bdbec139 100644 --- a/magic-compiler/dll-sources.edn +++ b/magic-compiler/dll-sources.edn @@ -68,11 +68,11 @@ magic.spells.lift_keywords {:source "magic-compiler/src/magic/spells/lift_keywords.clj", :sha256 "907dc9a166b32a95d237440b5875a186de05e7786390a8fba095382611eaf75e"} magic.spells.lift_vars {:source "magic-compiler/src/magic/spells/lift_vars.clj", :sha256 "1dafcdadb721c083f867e6935b9cb9ea3bdc2e2e7a8f07cd3c0daae9f4293ead"} magic.util {:source "magic-compiler/src/magic/util.clj", :sha256 "62d16cbc45160f486776f6c0c240bf6762846bbcbb59cf1cd45d409defe9c7d7"} - nostrand.core {:source "nostrand/nostrand/core.clj", :sha256 "908042526658ea1a8a20684d1e2b8c9a72336522273973ac7b3eab71142f4c1b"} - nostrand.deps.basis {:source "nostrand/nostrand/deps/basis.clj", :sha256 "0c66338b1923de0298a19e5d7202d450653949f22983a80b9bfa62199b143e4e"} + nostrand.core {:source "nostrand/nostrand/core.clj", :sha256 "457214655318fb5f8eede402ffe5828ae4fa8da0214b5fedb2296d271c96b971"} + nostrand.deps.basis {:source "nostrand/nostrand/deps/basis.clj", :sha256 "5e7181e2ddae6edde623e51aa3fa68d60e17dae7285929448b06a02c7eedccd8"} nostrand.deps.git {:source "nostrand/nostrand/deps/git.clj", :sha256 "f10234b211298a2c5b79b9e067ecb54227b3a1df11938e7e264a979d5326f5e7"} nostrand.deps.nuget {:source "nostrand/nostrand/deps/nuget.clj", :sha256 "589591b8b9fde3af2a7d9e6f0f5e3195a6249833d4f992f80dba90f4507959a0"} nostrand.deps.shell {:source "nostrand/nostrand/deps/shell.clj", :sha256 "623bd8876470a09fcbe652d7de51152e6ecf3b89df38b03bbd7c867137212271"} nostrand.deps.submodules {:source "nostrand/nostrand/deps/submodules.clj", :sha256 "adf03193ee08b2a44854f19e049fa0892f1cad1fabfb419ad88330c8ce6b7684"} nostrand.repl {:source "nostrand/nostrand/repl.clj", :sha256 "05755d291b897f6ffe62587d034d534c71f00b9c504e8081538a1e819aecb4de"} - nostrand.tasks {:source "nostrand/nostrand/tasks.clj", :sha256 "1fec0b7038e4c57801747cd73a08553d3de01b71fc427d7cbd8766f5ce8a4616"}} + nostrand.tasks {:source "nostrand/nostrand/tasks.clj", :sha256 "b8348ef34e5b16bbb823a66108ff8b321b56d36656cba37650a1e77062a5f7f8"}} diff --git a/nostrand/references/nostrand.core.clj.dll b/nostrand/references/nostrand.core.clj.dll index b6c95f3a410c4eee5fc3a8e29ad682fbd236c332..42adb865d5a593a1afb0d40c87337832270e12e6 100755 GIT binary patch literal 43008 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 literal 34304 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 LGJjAU8WMj4T8*VD delta 7890 zcmbVQ3v`s#wcckYnI!W_GWqj@#AK2%m=_^|0FwYA#1P&g5KsgwuY@ELk}yPxBL9Sk zih$*D@I`qDB7&uAIu`2#iv@)gibb)~3tX$Ut9lpf)_Uz)*J~|z?|o+ee~_-OuFhJs zbH4rUz0W>-pL72C(|g6zd&#nGk2t)2@2B=Rp9cUBeh5 zRugOFOt)63BVUNi&$8rW8ur4aE0+M+yw){-B)pb2wAhtJ#K;|EMv4HZ*lPqeQ(Vg_ zt}_@j#r2%x27@tEe27vM56iMzt>6)ZHxu1x=w=zoKg!8(qU6P9`P$f9Vz!`_UEeIP zjx7=oVNHu|Nz{yuT;BSsQa6RpkH$4{*DR|alUu8busy1I(Xn=)<@)vO`or>aRo>tq zqVWN5wiV52lTbSkEqw;qsNtG$W;Ksmq_ncIfYx)P;pe3973 z4cm^9zQ3n-aKog*m<`*>4SU>R%!WO|4SSLs_LRY!4SU+qnGM^;4f_!{Y`2^_Mw4S| z5kNw%fBTCx3vRX(fbVQlKp>74&(id zFQkX@0mEmf;q$EgON|yd$d(;+bU4y;jF%;Z@geeDgwX$LR9J_T<7^uYpTmsJ$VV8H zlZyEQ#lRiWUYFzJwUjput0v=Ez9}!@ zJjaRo0WIHeFmI6#UAp|`uJAm+FmxBFkzA$|GG~G|_HBa+TEfgP4c&|ZVckhXcPuTe zJ0(|4&;sum%qnUl$9|V|>nVo^jl52yF7oEnN_W7Wc&*z3+&V49JbEiz@J_Vb`0Ph@ z#-I%ghi=88Q!hs8(y5;4BJFiU#p|-N?$)W4w;9C03#X3DFF@lh$#|dmk0I8nIuSP4 z$fh$LZMt*Nrt?-D4UYBo$fI?w;!T+{agdj4XL`78?$~G)G5JH#w9|z`bLj8N1rvvf zpUE8)hl{u6yAwxmrfg5p#*olmZ%?;PfYTO z=jD5o$_uHY5i=(0&!d8i;dZEMP{LZ0eo79RoK{GiD8f8Wr-OF0d9wbh?3kRMMpuB> zowSCIzn0=oQ8(-ha?j*}g>-bxP_b@Xw(YTatcy2Qr@P^RH_h$9%i5wJmY+;663

7*8>5!Olv!lSq`>7$NDy__+vyucb-T(W-wZFJgltL)mlI;I;g1j)d zEUFb}mt_NrWXAM&0vPFbb@AX6KeX%5;Hq)D@S|NTbpbxyAsWl#KjJ~Fp*Vrvmi%{X zC2k(j$=a*nK zY3`^q7z3AID061|#Btd$JyYH{vqye8Grgc67ov($XWYWSGIWcL3*)RTo23moN6aX! zn!m$fevLZnRJe8-r5e~U8;4vmE7?b}%tGlDz=ZxM^PtOWmMhy5-m?Aj_$*H%g*L7A zv$85ZeK;Q@`_)#Q(xLzJ@Fyv}|95%P*O)2#<($SA%g1^0twx{4I*9j0+8|Y!Xb)Z$ zAh)Lsvv~UDw%PN=FXXk^zU5k}8wP|bo9xf>VrTeycpej@%@xM)F*cu%zhPWu*k535 zKKtHBtg1eVY;Xp9?+3E)R!v;whsTHX@Cf|Yu)5u_`iOM=i1?279D80ebjRFb-R}(D zLE2Aj_aBDtV=Ro)T{d*}ct(`&3hJ<<0i&f_X)JiLK=iSwONU~at?5j_74YTG&7|$1 zm6pI}l6&(TbDatP=5|{EgcipnCF^>x|KgQk!sKbw~46NL}WuFz~?*!D97`H(;HD z=+qf=LU*)z-Sf&0%{;T7;-!=~rxBX!k;m-v zYT7#&BR97}E}l1R=x`ij4`3^P>+p-uekj8)tphg!M1{um7vRUilk*%Rkn1=k;^DXM zL&6SMlCZV-Ie$NW9OgR? zGYh6O=fDQLU>4LfDq%Dm8rkyp7@B@A+`(KEb8`_>L$@(EAMQd9=ikfZeC!U9rM0p#969#Gdgcbk(S-f5fw?KnorjIg&1LR9Jj&d9=C0yN&|r65oY3GU zmKRxm!SY*{0nJWyDa+ef-pTR-mRng~VfhWqA&wzvKZ0eogM4SQ^t0xHoAjHR-N&*I zr4{-e6)3YD%P_gkfe8ANVWh#Ic`TeXL9TNu$_Y5O!e}SCt#DEjkyA#d)x+!>mg`tP z!f|%7e34~1^#Dz9l2sR3e$Fz^MS7Z216sWmM!A-Ok{ZlmwvFXJ7p3w7%VR8$vpmQ0 zLzbViR5ez${G5F;P5_<%&LA`5MdjS^gJG zdm`Cqk_^C52DCmaj8CK@PeJ)_hKq>yuSEz%W~6$ zF=~4r=kW!WU$IPdQ`gmo_3?PNoA^(8=I&mT#cE=D}wYq{8+%dU!PDFiJlqwWflEvvF=A zz?m1;O>HVDBAo@!C>_Mx@4%f=J4nS)Xp1*&zpp7{PM%S$;A+& zSkdtNFtTR~8+^tnl_T3=L%tc=2Fdh87g901gyw<@@{WNGO2_uG@VBCn1+FF*?kXl^ zOE1E4EHp8ygFd;UIpY@cwnHtwUE=B~a|d{aGQ#*rnlmQ$+2^BfOeyK=;9+u3lQeStY~EzK{;H zN`Z#Tu-DrmuT+-}Z z_1V{n!El0gsORSw|vqhMhO(kApl zdk9gO3g}^^!c@ZUC4e6lrVJAagZEB6lENE z7;%&URKvDTGF7=%<3B?Psi4&m%Sbh*8hk5=Q!5+~wTx6UHE_yLoQhHd*Z4I{MX7MLLRr1MoFd5a+o%4JXTV% z>sX_t(!3XlaENps?Zkf#KsCznluIMVWNE=)kNBDkB`(uuT*P=v#CT`K_(VMU_M;SV zA|Bru!a!y85fe%(%?Ir8DM~AR&a9~qCpR^L;><)D)+n3tiKJ0dX_RbXJ<4f@g9>rl zP1Br1d1D~u_NNFvjV<^?mMlYK8C;$tl7b(i%v&MosgM)3SzHq?;SptGjHnY0qE$R1 zwuqp(BK{zAIy1zk;MmTq)?m@fFQS8^?*G=7Is%$|mbBm7)Z7GZ-Oc_53(88%OUr|k zdY21%Vy#cw*Ud}n@^{|Tyrg?UQ*+nK1xwr7n?YXaPL`fkQL=U2q+s8=$1^O}5?QHgYY;OlzbfNVkv}ne0C%(&h(4rZ&EAfrD8OI&LvxiQJ;M0fg zBKX{q%Oc+vW64bFeJnP{mdT$eLA3>#@X6gzrzGsDeQ8W?(n%G{V!E(Prr5X$ST9tm?O+OnG~%VdOo4{Z6H~HMP8? z&NkY$CniO5owwKFhQG~TM_yTPKZE!hp-}KE=K?)N|ytlip9-bC`S{ z<}dBkXJY<`iT8>u!Q(yZ*a`d0-3|lZr%-eZ_=0$v_^Vl?PH&RV_MzVDqkZ`LWYv(@ z;D)Pxc#kJCUUs~r7JIhsh3ZbztTi1 zh3ZH?IppaXNRS`%Hk7J~2bD@3=~Bz+fKNtvgKODfVZ zGvxC~E9rr!i+8egQhi1dz)5vJr#Yz9eq*LTn##PZJ&@9_bU7l(aidnpmm-AVd$qMk^91NujZ_dOUqB`*(q z4gK~d$}wkGf8XyE6Y~C%EHP#0j!dso56NTdLFSEh1}BVtuovz-fX8cx)byteKEIej%3g!a&Om+f+c%ocQ=WF^gr5&(cbJ{fhR=|p$+cgGyN_NQjktZRuza$2J;uSV)R!Y@Z!+r#yZO%eIS z9}n8ef7T@0;n|ub`Qu`av={yM++tNx+M$M9FNOw=m&^2juDd3mwg%ESiGDF4Hi=u} EUqScxX8-^I delta 2421 zcma)-eN0tl9LImpy;m^IxZHE@3zvJ#DHyCpHKL&b885m_K_J#z8bi4f4Y_#lZMs#S zo8?AxYsKl!x%DdO71n{gV*SQTA?4Cc$r`cUyuY+egsf<3t?kCMt;*R8YX+RSRub&6K7I6| z{1mRh`Z>J*j)X4QBl7Rfy%S(XT`bbl)*J=-w^`QrY^C(->)`7SfZcYf%UZ)*`yUc1Fi~whTMz#B+D~#C_JoY())?M?Q+?5o>>$2HtklpsK>9qH_aL~st(c?QTLu)WbXCaM{^nLo(q zmKIV2cbBZ>zn!W*rUtN6l?{r+`v2Kw1aM5|srVok+(66ti ztP`Wvi;Qti{+9wK9urWYBU%3>wGA#y+F?%dH@K5$LW+)&W^#mSWtX#P9*lWCV-BS( z``5C=MyVZ8FPSJ}pU3?6WWfCXq{~?5#kH6_d~UkfL=T-ttK%Lh_mOKbdf>##3z`b7s<)(-w}#B8_cL4Nal;Xv5aVXiGG^ zJraH{v@OQg_LkO=mGVn{nzd!7c8U4JtlvB`n{7?cR+l)9qrZR9yZ?CA-opLH!1!;6 P`ZHFGKG82$i@(J`J|qQX