Closed thomas-shares closed 9 years ago
Hm, curious. I'll take a look and see what's going on. My guess is something in the current Whidbey middleware might be funky, but I'll have to take a look to see.
Can you give me a full set of reproduction steps, including versions for LightTable, Leiningen, et al.?
LT --> 0.7.2 lein --version Leiningen 2.5.1 on Java 1.8.0 IBM J9 VM And I assume Clojure 1.6 as that is the default version Leiningen uses.
Let me know if you need more info.
Okay, was able to replicate the problem. Looks like it's actually an issue with pretty - the exception engine we're using, and potentially with how Ultra injects it.
Full stack trace here:
We couldn't connect.
Looks like there was an issue trying to connect to the project. Here's what we got:
final project: {:compile-path /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/target/classes, :group local-client, :global-vars {}, :checkout-deps-shares [:source-paths :test-paths :resource-paths :compile-path #'leiningen.core.classpath/checkout-deps-paths], :ultra {:color-scheme :solarized_dark, :stacktraces false}, :repl-options {:nrepl-context {:interactive-eval {:renderer whidbey.render/render-str}}, :init (do (do (do (do (clojure.core/require (quote ultra.hardcore)) (clojure.core/require (quote whidbey.repl)) (whidbey.repl/init! nil) (ultra.hardcore/configure! {:sort-keys true, :print-fallback :print, :map-delimiter , :print-meta false, :color-scheme :solarized_dark, :stacktraces false}))) (clojure.core/swap! lighttable.nrepl.core/my-settings clojure.core/merge {:name LightTable-REPL, :project (quote {:compile-path /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/target/classes, :group local-client, :global-vars {}, :checkout-deps-shares [:source-paths :test-paths :resource-paths :compile-path #'leiningen.core.classpath/checkout-deps-paths], :ultra {:color-scheme :solarized_dark, :stacktraces false}, :repl-options {:init (do (do (clojure.core/require (quote ultra.hardcore)) (clojure.core/require (quote whidbey.repl)) (whidbey.repl/init! nil) (ultra.hardcore/configure! {:sort-keys true, :print-fallback :print, :map-delimiter , :print-meta false, :color-scheme :solarized_dark, :stacktraces false}))), :nrepl-middleware [clojure.tools.nrepl.middleware.render-values/render-values], :nrepl-context {:interactive-eval {:renderer whidbey.render/render-str}}, :prompt (fn [ns] (str [ ns ]([36mλ[0m)> ))}, :eastwood {:exclude-linters [:constant-test :suspicious-expression :local-shadows-var]}, :dependencies ([org.clojure/clojure 1.5.1] [org.clojure/tools.nrepl 0.2.3 :exclusions ([org.clojure/clojure])] [clojure-complete/clojure-complete 0.2.3 :exclusions ([org.clojure/clojure])] [cljfmt/cljfmt 0.2.0] [jonase/eastwood 0.2.1 :exclusions ([org.clojure/clojure])] [venantius/ultra 0.3.4] [mvxcvi/puget 0.8.1] [mvxcvi/whidbey 1.0.0] [im.chit/hara.class 2.1.8] [im.chit/hara.reflect 2.1.8]), :plugin-repositories [[central {:snapshots false, :url http://repo1.maven.org/maven2/}] [clojars {:url https://clojars.org/repo/}]], :test-selectors {:default (constantly true)}, :target-path /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/target, :name local-client, :deploy-repositories [[clojars {:username :gpg, :url https://clojars.org/repo/, :password :gpg}]], :root /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources, :offline? false, :source-paths (/Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/src), :certificates [clojars.pem], :version 0.0.1, :jar-exclusions [#"^\."], :prep-tasks [javac compile], :repositories [[central {:snapshots false, :url http://repo1.maven.org/maven2/}] [clojars {:url https://clojars.org/repo/}]], :resource-paths (/Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/dev-resources /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/resources), :uberjar-exclusions [#"(?i)^META-INF/[^/]*\.(SF|RSA|DSA)$"], :monkeypatch-clojure-test false, :jvm-opts [], :eval-in :subprocess, :plugins ([lein-kibit/lein-kibit 0.1.2] [lein-bikeshed/lein-bikeshed 0.2.0] [lein-cljfmt/lein-cljfmt 0.2.0] [jonase/eastwood 0.2.1] [lein-pprint/lein-pprint 1.1.1] [venantius/yagni 0.1.3-SNAPSHOT] [venantius/ultra 0.3.4]), :injections ((clojure.core/require (quote ultra.hardcore)) (ultra.hardcore/add-test-hooks! {:sort-keys true, :print-fallback :print, :map-delimiter , :print-meta false, :color-scheme :solarized_dark, :stacktraces false})), :native-path /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/target/native, :description A local light table project, :uberjar-merge-with {META-INF/plexus/components.xml leiningen.uberjar/components-merger, data_readers.clj leiningen.uberjar/clj-map-merger}, :test-paths (/Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/test), :clean-targets [:target-path]})})) (do (clojure.core/require (quote ultra.hardcore)) (clojure.core/require (quote whidbey.repl)) (whidbey.repl/init! nil) (ultra.hardcore/configure! {:sort-keys true, :print-fallback :print, :map-delimiter , :print-meta false, :color-scheme :solarized_dark, :stacktraces false}))), :nrepl-middleware [clojure.tools.nrepl.middleware.render-values/render-values lighttable.nrepl.handler/lighttable-ops], :prompt (fn [ns] (str [ ns ]([36mλ[0m)> ))}, :eastwood {:exclude-linters [:constant-test :suspicious-expression :local-shadows-var]}, :dependencies ([org.clojure/clojure 1.5.1] [org.clojure/tools.nrepl 0.2.3 :exclusions ([org.clojure/clojure])] [clojure-complete/clojure-complete 0.2.3 :exclusions ([org.clojure/clojure])] [cljfmt/cljfmt 0.2.0] [jonase/eastwood 0.2.1 :exclusions ([org.clojure/clojure])] [lein-light-nrepl/lein-light-nrepl 0.1.0] [org.clojure/tools.reader 0.8.3] [venantius/ultra 0.3.4] [mvxcvi/puget 0.8.1] [mvxcvi/whidbey 1.0.0] [im.chit/hara.class 2.1.8] [im.chit/hara.reflect 2.1.8]), :plugin-repositories [[central {:snapshots false, :url http://repo1.maven.org/maven2/}] [clojars {:url https://clojars.org/repo/}]], :test-selectors {:default (constantly true)}, :target-path /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/target, :name local-client, :deploy-repositories [[clojars {:username :gpg, :url https://clojars.org/repo/, :password :gpg}]], :root /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources, :offline? false, :source-paths (/Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/src), :certificates [clojars.pem], :version 0.0.1, :jar-exclusions [#"^\."], :prep-tasks [javac compile], :repositories [[central {:snapshots false, :url http://repo1.maven.org/maven2/}] [clojars {:url https://clojars.org/repo/}]], :resource-paths (/Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/dev-resources /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/resources), :uberjar-exclusions [#"(?i)^META-INF/[^/]*\.(SF|RSA|DSA)$"], :monkeypatch-clojure-test false, :jvm-opts [], :eval-in :subprocess, :plugins ([lein-kibit/lein-kibit 0.1.2] [lein-bikeshed/lein-bikeshed 0.2.0] [lein-cljfmt/lein-cljfmt 0.2.0] [jonase/eastwood 0.2.1] [lein-pprint/lein-pprint 1.1.1] [venantius/yagni 0.1.3-SNAPSHOT] [venantius/ultra 0.3.4]), :injections ((clojure.core/require (quote ultra.hardcore)) (ultra.hardcore/add-test-hooks! {:sort-keys true, :print-fallback :print, :map-delimiter , :print-meta false, :color-scheme :solarized_dark, :stacktraces false})), :native-path /Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/target/native, :description A local light table project, :uberjar-merge-with {META-INF/plexus/components.xml leiningen.uberjar/components-merger, data_readers.clj leiningen.uberjar/clj-map-merger}, :test-paths (/Applications/LightTable.app/Contents/Resources/app.nw/plugins/clojure/runner/resources/test), :clean-targets [:target-path]}
Exception in thread "main" java.lang.RuntimeException: Unable to resolve symbol: some? in this context, compiling:(io/aviso/columns.clj:189:11)
at clojure.lang.Compiler.analyze(Compiler.java:6380)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3573)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6562)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$IfExpr$Parser.parse(Compiler.java:2664)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$IfExpr$Parser.parse(Compiler.java:2677)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6009)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$IfExpr$Parser.parse(Compiler.java:2669)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$IfExpr$Parser.parse(Compiler.java:2677)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$IfExpr$Parser.parse(Compiler.java:2677)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$IfExpr$Parser.parse(Compiler.java:2677)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6009)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6009)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6009)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5139)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3751)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6558)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.access$100(Compiler.java:37)
at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:529)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
at clojure.lang.Compiler.analyze(Compiler.java:6361)
at clojure.lang.Compiler.analyze(Compiler.java:6322)
at clojure.lang.Compiler.eval(Compiler.java:6623)
at clojure.lang.Compiler.load(Compiler.java:7064)
at clojure.lang.RT.loadResourceScript(RT.java:370)
at clojure.lang.RT.loadResourceScript(RT.java:361)
at clojure.lang.RT.load(RT.java:440)
at clojure.lang.RT.load(RT.java:411)
at clojure.core$load$fn__5018.invoke(core.clj:5530)
at clojure.core$load.doInvoke(core.clj:5529)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invoke(core.clj:5336)
at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
at clojure.core$load_lib.doInvoke(core.clj:5374)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$load_libs.doInvoke(core.clj:5417)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$require.doInvoke(core.clj:5496)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at io.aviso.exception$eval7687$loading__4910__auto____7688.invoke(exception.clj:1)
at io.aviso.exception$eval7687.invoke(exception.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6619)
at clojure.lang.Compiler.eval(Compiler.java:6608)
at clojure.lang.Compiler.load(Compiler.java:7064)
at clojure.lang.RT.loadResourceScript(RT.java:370)
at clojure.lang.RT.loadResourceScript(RT.java:361)
at clojure.lang.RT.load(RT.java:440)
at clojure.lang.RT.load(RT.java:411)
at clojure.core$load$fn__5018.invoke(core.clj:5530)
at clojure.core$load.doInvoke(core.clj:5529)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invoke(core.clj:5336)
at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
at clojure.core$load_lib.doInvoke(core.clj:5374)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$load_libs.doInvoke(core.clj:5413)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$require.doInvoke(core.clj:5496)
at clojure.lang.RestFn.invoke(RestFn.java:482)
at ultra.colorscheme$eval7681$loading__4910__auto____7682.invoke(colorscheme.clj:1)
at ultra.colorscheme$eval7681.invoke(colorscheme.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6619)
at clojure.lang.Compiler.eval(Compiler.java:6608)
at clojure.lang.Compiler.load(Compiler.java:7064)
at clojure.lang.RT.loadResourceScript(RT.java:370)
at clojure.lang.RT.loadResourceScript(RT.java:361)
at clojure.lang.RT.load(RT.java:440)
at clojure.lang.RT.load(RT.java:411)
at clojure.core$load$fn__5018.invoke(core.clj:5530)
at clojure.core$load.doInvoke(core.clj:5529)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invoke(core.clj:5336)
at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
at clojure.core$load_lib.doInvoke(core.clj:5374)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$load_libs.doInvoke(core.clj:5413)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$require.doInvoke(core.clj:5496)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at ultra.hardcore$set_colorscheme_BANG_.invoke(hardcore.clj:51)
at clojure.lang.Var.invoke(Var.java:423)
at clojure.lang.AFn.applyToHelper(AFn.java:167)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.lang.Compiler.macroexpand1(Compiler.java:6468)
at clojure.lang.Compiler.macroexpand(Compiler.java:6529)
at clojure.lang.Compiler.eval(Compiler.java:6603)
at clojure.lang.Compiler.eval(Compiler.java:6582)
at clojure.core$eval.invoke(core.clj:2852)
at ultra.hardcore$run_configuration.invoke(hardcore.clj:61)
at ultra.hardcore$configure_BANG_.invoke(hardcore.clj:76)
at user$eval7677.invoke(form-init5896597690388462996.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6619)
at clojure.lang.Compiler.eval(Compiler.java:6609)
at clojure.lang.Compiler.eval(Compiler.java:6609)
at clojure.lang.Compiler.eval(Compiler.java:6608)
at clojure.lang.Compiler.eval(Compiler.java:6608)
at clojure.lang.Compiler.eval(Compiler.java:6609)
at clojure.lang.Compiler.eval(Compiler.java:6608)
at clojure.lang.Compiler.load(Compiler.java:7064)
at clojure.lang.Compiler.loadFile(Compiler.java:7020)
at clojure.main$load_script.invoke(main.clj:294)
at clojure.main$init_opt.invoke(main.clj:299)
at clojure.main$initialize.invoke(main.clj:327)
at clojure.main$null_opt.invoke(main.clj:362)
at clojure.main$main.doInvoke(main.clj:440)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:419)
at clojure.lang.AFn.applyToHelper(AFn.java:163)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.main.main(main.java:37)
Caused by: java.lang.RuntimeException: Unable to resolve symbol: some? in this context
at clojure.lang.Util.runtimeException(Util.java:219)
at clojure.lang.Compiler.resolveIn(Compiler.java:6874)
at clojure.lang.Compiler.resolve(Compiler.java:6818)
at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6779)
at clojure.lang.Compiler.analyze(Compiler.java:6343)
... 175 more
clojure.lang.ExceptionInfo: Subprocess failed {:exit-code 1}
at clojure.core$ex_info.invoke(core.clj:4327)
at leiningen.core.eval$fn__3532.invoke(eval.clj:226)
at clojure.lang.MultiFn.invoke(MultiFn.java:231)
at leiningen.core.eval$eval_in_project.invoke(eval.clj:326)
at clojure.lang.AFn.applyToHelper(AFn.java:167)
at clojure.lang.AFn.applyTo(AFn.java:151)
at clojure.core$apply.invoke(core.clj:619)
at leiningen.repl$repl.doInvoke(repl.clj:261)
at clojure.lang.RestFn.invoke(RestFn.java:425)
at leiningen.light_nrepl$light.doInvoke(light_nrepl.clj:56)
at clojure.lang.RestFn.invoke(RestFn.java:423)
at leiningen.light_nrepl$_main.doInvoke(light_nrepl.clj:68)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at leiningen.light_nrepl.main(Unknown Source)
After looking at the stacktrace my best guess is that this problem arises from the fact that LightTable is still on Clojure 1.5.1, while some?
, which is in Pretty and is the root of this exception, was introduced in Clojure 1.6.0.
This leaves two options: go to the authors of Pretty and ask them to sub out (some? ...)
with (not (nil? ... ))
, or bang on LightTable's door and try to get them to update to Clojure 1.6.0 (if not 1.7.0)! In my opinion, the latter is the more reasonable option, since LT is now two major Clojure versions behind.
Since I am in control of neither of those two parties, I'm afraid I have to flag this as a wontfix
- though, for what it's worth, I'm planning on dropping the dependency on Pretty for the next major release of Ultra.
Just wanted to note that I tested this out - the ultimate culprit is the reference to (some? width)
found here - https://github.com/AvisoNovate/pretty/blob/master/src/io/aviso/columns.clj#L189 - if you replace it with (not (nil? width))
and do lein install
then the LT instarepl works fine.
Hi,
I recently updated to the latest version of ultra and now my LightTable instarepl doesn't come up. I am getting this error:
We couldn't connect. Looks like there was an issue trying to connect to the project. Here's what we got: final project: {:compile-path /home/veen/.config/LightTable/plugins/Clojure/runner/resources/target/classes, :group local-client, :global-vars {}, :checkout-deps-shares [:source-paths :test-paths :resource-paths :compile-path #'leiningen.core.classpath/checkout-deps-paths], :ultra {:color-scheme :solarized_dark}, :repl-options {:nrepl-context {:interactive-eval {:renderer whidbey.render/render-str}}, :nrepl-middleware [clojure.tools.nrepl.middleware.render-values/render-values lighttable.nrepl.handler/lighttable-ops
We had a problem like this recently and that was fixed by an update to Ultra I think.
Thomas